diff --git a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml index bbf75ad80..f08777c63 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/pom.xml +++ b/pjcloud-app-server/pjcloud-app-server-biz/pom.xml @@ -115,6 +115,12 @@ alipay-sdk-java 4.40.251.ALL + + + com.github.binarywang + wx-java-miniapp-spring-boot-starter + 4.7.0 + diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java new file mode 100644 index 000000000..941c1b7dc --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MinWechatConfiguration.java @@ -0,0 +1,38 @@ +package com.bsd.pjcloud.app.config; + +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; +import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Slf4j +@Configuration +@EnableConfigurationProperties(MiniWechatConf.class) +public class MinWechatConfiguration { + + private final MiniWechatConf properties; + + @Autowired + public MinWechatConfiguration(MiniWechatConf properties) { + this.properties = properties; + } + + + @Bean + public WxMaService wxMaService() { + + WxMaDefaultConfigImpl wxMaDefaultConfig = new WxMaDefaultConfigImpl(); + wxMaDefaultConfig.setAppid(properties.getAppId()); + wxMaDefaultConfig.setSecret(properties.getAppSecret()); + wxMaDefaultConfig.setMsgDataFormat("JSON"); + + WxMaService maService = new WxMaServiceImpl(); + maService.setWxMaConfig(wxMaDefaultConfig); + return maService; + } + +} diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java new file mode 100644 index 000000000..d18af0b63 --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/config/MiniWechatConf.java @@ -0,0 +1,18 @@ +package com.bsd.pjcloud.app.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 微信小程序配置 + */ +@Data +@ConfigurationProperties(prefix = "mini-wechat-pay") +public class MiniWechatConf { + /** + * 应用ID + */ + private String appId; + + private String appSecret; +} diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java index 04ee43189..589d0e7db 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java @@ -24,6 +24,7 @@ import com.bsd.pjcloud.admin.api.dto.UserTokenDTO; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteTokenService; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; +import com.bsd.pjcloud.app.api.dto.AppUserDTO; import com.bsd.pjcloud.app.service.AppUserService; import com.bsd.pjcloud.canteen.api.feign.RemoteCanteenSpuService; import com.bsd.pjcloud.canteen.api.feign.RemoteDailyMenuService; @@ -33,6 +34,7 @@ import com.bsd.pjcloud.canteen.entity.CanteenSpuEntity; import com.bsd.pjcloud.canteen.vo.app.CanteenOnlineSpuAppVO; import com.bsd.pjcloud.canteen.vo.app.DailyMenuAppVO; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartyAuthService; import com.bsd.pjcloud.thirdparty.dto.SHJNSSODTO; @@ -387,12 +389,13 @@ public class AppUserAutoLoginController { // return appUserService.importUser(excelVOList, bindingResult); // } // -// @Operation(summary = "注册app用户表", description = "注册app用户表") -// @SysLog("注册app用户表") -// @Inner(value = false) -// @PostMapping("/register") -// public R register(@RequestBody AppUserDTO appUser) { -// return appUserService.registerAppUser(appUser); -// } + +//@Operation(summary = "注册app用户表", description = "注册app用户表") +//@SysLog("注册app用户表") +//@Inner(value = false) +//@PostMapping("/register") +//public R register(@RequestBody AppUserDTO appUser) { +// return appUserService.registerAppUser(appUser); +//} } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java index d9d5e622d..e095d7dd0 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/handler/MiniWechatLoginHandler.java @@ -17,18 +17,15 @@ package com.bsd.pjcloud.app.handler; -import cn.hutool.http.HttpUtil; -import cn.hutool.json.JSONUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; +import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.app.api.constant.AppUserTypeEnum; import com.bsd.pjcloud.app.api.dto.AppUserInfo; -import com.bsd.pjcloud.app.api.entity.AppSocialDetails; import com.bsd.pjcloud.app.api.entity.AppUser; import com.bsd.pjcloud.app.mapper.AppSocialDetailsMapper; import com.bsd.pjcloud.app.service.AppUserService; -import com.bsd.pjcloud.common.core.constant.SecurityConstants; -import com.bsd.pjcloud.common.core.constant.enums.LoginTypeEnum; -import com.bsd.pjcloud.common.core.exception.CheckedException; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -47,6 +44,8 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { private final AppSocialDetailsMapper appSocialDetailsMapper; + private final WxMaService wxMaService; + /** * 小程序登录传入code *

@@ -57,20 +56,16 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { */ @Override public String identify(String code) { - AppSocialDetails condition = new AppSocialDetails(); - condition.setType(LoginTypeEnum.MINI_APP.getType()); - AppSocialDetails socialDetails = appSocialDetailsMapper.selectOne(new QueryWrapper<>(condition)); - - String url = String.format(SecurityConstants.MINI_APP_AUTHORIZATION_CODE_URL, socialDetails.getAppId(), - socialDetails.getAppSecret(), code); - String result = HttpUtil.get(url); - log.debug("微信小程序响应报文:{}", result); - - if (JSONUtil.parseObj(result).containsKey("openid")) { - return JSONUtil.parseObj(result).get("openid").toString(); - } else { - log.error("微信小程序登录失败:{}", result); - throw new CheckedException("微信小程序登录失败"); + try { + WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code); + if (ObjectUtil.isNotEmpty(session) && ObjectUtil.isNotEmpty(session.getOpenid())) { + return session.getOpenid(); + } + return null; + } catch (Exception e) { + e.printStackTrace(); + log.error("微信小程序登录失败:{}", e.getMessage()); + return null; } } @@ -83,22 +78,22 @@ public class MiniWechatLoginHandler extends AbstractLoginHandler { @Override public AppUserInfo info(String openId) { AppUser user = appUserService.getOne(Wrappers.query().lambda().eq(AppUser::getOpenid, openId)); - - // 未注册用户自动注册 - if (Objects.isNull(user)) { - log.info("微信小程序未绑定:{},创建新的用户", openId); + if (ObjectUtil.isEmpty(user)) { + log.info("微信小程序openId:{},创建新的用户", openId); + String name = "微信游客-" + openId; AppUser appUser = new AppUser(); appUser.setOpenid(openId); - appUser.setUsername(openId); + appUser.setUserType(AppUserTypeEnum.MINI_ALIPAY.getType()); + appUser.setUsername(name); + appUser.setName(name); appUser.setCreateBy(openId); appUser.setUpdateBy(openId); appUserService.saveOrUpdate(appUser); - - AppUserInfo appUserDTO = new AppUserInfo(); - appUserDTO.setAppUser(appUser); - return appUserDTO; + return appUserService.findUserInfo(user); } + if (ObjectUtil.isEmpty(user.getLoginExtJson())) { + } return appUserService.findUserInfo(user); } diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml index 645bbb4f6..9a29f8834 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/resources/application.yml @@ -24,3 +24,7 @@ mini-ali-pay: alipay-public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnCB+N172m5gxf1Rolfx5LErSiVwQCh0XQdDrVy6aTuVF5EtdqahSHtADyEPsBWudMBhzCfqpoZvfnvH7a+PED6uZ3DoXt7ETh8TmNM5yc+WTnD8pSphQvuHDJ3zMks489KNxiX6sXag71k9H1MXklJGPOUaljHqy/QlRn2ZLT7pFgaFH9LEcVoQBPIOurUn95078h848RFD30jZFW3fakxUGAGVVZaHH62z5OEWOmcA+CwxsEDMa1XMt02RGXgAAq4WOj+BqOGiFmhM8rnrUMchTyvx4umOzGvbF2Y9irN3aBZ5lfg+bzYcJpIOMzlM/V00LnEWzCblJzXNyH4hJQIDAQAB callback-url: https://rj4jv5rwqs.by.takin.cc/hard/hard-ali-pay/callback # callback-url: https://stgl.pj.gov.cn/api/hard/hard-ali-pay/callback + +mini-wechat-pay: + app-id: wx95481f43b14565e5 + app-secret: 0aee1289b5ae14c0c69b8f5e9a4e518e diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java index 6bc48e680..c0e050c3e 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiStatusEnum.java @@ -7,14 +7,15 @@ import lombok.Getter; import java.util.Arrays; /** - * 第三方面密类型 + * 第三方免密支付状态 */ @AllArgsConstructor @Getter public enum HardThirdMiStatusEnum { CREATE_ORDER("10", "创建订单"), - PAY("20", "支付订单"), + PAY_SUCCESS("20", "支付成功"), + PAY_ERROR("21", "支付失败"), REFUND("30", "取消/退款"), ; diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java index bebfaf775..ee88facb8 100644 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/constant/HardThirdMiTypeEnum.java @@ -7,7 +7,7 @@ import lombok.Getter; import java.util.Arrays; /** - * 第三方面密类型 + * 第三方免密类型 */ @AllArgsConstructor @Getter diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java new file mode 100644 index 000000000..797f734d8 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/dto/HardThirdMiOrderDto.java @@ -0,0 +1,26 @@ +package com.bsd.pjcloud.hard.api.dto; + +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +public class HardThirdMiOrderDto extends HardThirdMiOrderEntity { + + /** + * 创建订单时间 + */ + private LocalDateTime[] createOrderTimeList; + + /** + * 支付时间 + */ + private LocalDateTime[] payOrderTimeList; + + /** + * 退款时间 + */ + private LocalDateTime[] refundOrderTimeList; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java index 088f26f7c..fd358d074 100755 --- a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/entity/HardThirdMiOrderEntity.java @@ -19,7 +19,6 @@ import java.time.LocalDateTime; @Schema(description = "硬件商品免密订单") public class HardThirdMiOrderEntity extends Model { - /** * 编号 */ @@ -63,6 +62,18 @@ public class HardThirdMiOrderEntity extends Model { @Schema(description = "订单id") private Long orderId; + /** + * 退款id + */ + @Schema(description = "退款id") + private Long refundId; + + /** + * 设备id + */ + @Schema(description = "设备id") + private Long hardId; + /** * 外部订单号 */ @@ -117,6 +128,12 @@ public class HardThirdMiOrderEntity extends Model { @Schema(description = "支付金额") private int payPrice; + /** + * 退款金额 + */ + @Schema(description = "退款金额") + private int refundPrice; + /** * 原始 sign json 数据 */ diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java new file mode 100644 index 000000000..40de0040d --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/HardThirdMiOrderVo.java @@ -0,0 +1,30 @@ +package com.bsd.pjcloud.hard.api.vo; + +import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.api.vo.base.BaseHardInterface; +import lombok.Data; + +import java.util.List; + +@Data +public class HardThirdMiOrderVo extends HardThirdMiOrderEntity implements BaseHardInterface { + + /** + * 用户相关 + */ + private String username; + + private String userMobile; + + private String userAvatar; + + /** + * 设备相关 + */ + private String hardName; + + private String hardType; + + private List hardTypeCodes; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java index 8e71e9e24..c2e0a6c59 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/HardThirdMiOrderController.java @@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiOrderDto; import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; import com.bsd.pjcloud.hard.service.HardThirdMiOrderService; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; @@ -55,6 +57,15 @@ public class HardThirdMiOrderController { return R.ok(); } + /** + * 退款 + */ + @Operation(summary = "退款", description = "退款") + @GetMapping("/refund") + public R refund(@RequestParam("id") Long id) { + hardThirdMiOrderService.refund(id); + return R.ok(); + } /** * 分页查询 @@ -62,9 +73,8 @@ public class HardThirdMiOrderController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/page") @PreAuthorize("@pms.hasPermission('thirdmi_hardThirdMiOrder_view')") - public R getHardThirdMiOrderPage(@ParameterObject Page page, @ParameterObject HardThirdMiOrderEntity hardThirdMiOrder) { - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); - return R.ok(hardThirdMiOrderService.page(page, wrapper)); + public R> getHardThirdMiOrderPage(@ParameterObject Page page, @ParameterObject HardThirdMiOrderDto dto) { + return R.ok(hardThirdMiOrderService.scopePageJoin(page, dto, null)); } /** diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java index 4cc7c22ff..32ed228ac 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/HardThirdMiOrderMapper.java @@ -1,9 +1,14 @@ package com.bsd.pjcloud.hard.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiOrderDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; +import com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; @Mapper public interface HardThirdMiOrderMapper extends PjcloudBaseMapper { @@ -19,4 +24,6 @@ public interface HardThirdMiOrderMapper extends PjcloudBaseMapper scopePageJoin(Page page, @Param("dto") HardThirdMiOrderDto dto, DataScope dataScope); } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java index b09b04179..0aaff8392 100755 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/HardThirdMiOrderService.java @@ -1,22 +1,35 @@ package com.bsd.pjcloud.hard.service; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; +import com.bsd.pjcloud.common.data.datascope.DataScope; +import com.bsd.pjcloud.hard.api.dto.HardThirdMiOrderDto; import com.bsd.pjcloud.hard.api.dto.HardThirdMiPayDto; import com.bsd.pjcloud.hard.api.entity.HardThirdMiOrderEntity; -import jakarta.validation.constraints.NotNull; +import com.bsd.pjcloud.hard.api.vo.HardThirdMiOrderVo; public interface HardThirdMiOrderService extends IService { + /** + * 分页查询 + */ + Page scopePageJoin(Page page, HardThirdMiOrderDto dto, DataScope dataScope); + /** * 刷新订单 */ - void refresh(Long id); + HardThirdMiOrderEntity refresh(Long id); /** * 后台支付 */ void adminPay(HardThirdMiPayDto dto); + /** + * 退款 + */ + void refund(Long id); + /** * 根据授权id查询授权订单 */ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java index ca534d629..f3ed72c60 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/MiniAlipayService.java @@ -17,6 +17,11 @@ public interface MiniAlipayService { */ String miDynamicSign(Long userId, UserTypeEnum userType, Long authId); + /** + * 免密授权(需要押金) + */ + ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long userId, UserTypeEnum userType, Long authId); + /** * 查询免密授权 */ @@ -45,6 +50,6 @@ public interface MiniAlipayService { /** * 支付宝免密(取消/退款) */ - AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price); + AlipayTradeRefundResponse miCancelOrRefund(HardThirdMiOrderEntity thirdOrder); } diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java index 8d203a8b3..d3d6c8ebe 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/HardAuthServiceImpl.java @@ -2,6 +2,7 @@ package com.bsd.pjcloud.hard.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alipay.api.response.AlipayTradeCreateResponse; +import com.alipay.api.response.ZhimaCreditPayafteruseCreditbizorderCreateResponse; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -150,7 +151,6 @@ public class HardAuthServiceImpl extends ServiceImpl implements HardThirdMiOrderService { + private final HardManagerMapper hardManagerMapper; + private final MiniAlipayService miniAlipayService; + private final RemoteUserService userService; + + /** + * 分页查询 + */ + @Override + public Page scopePageJoin(Page page, HardThirdMiOrderDto dto, DataScope dataScope) { + Page pageList = baseMapper.scopePageJoin(page, dto, dataScope); + disposeList(pageList.getRecords()); + return pageList; + } + /** * 刷新订单 */ @Override - public void refresh(Long id) { + public HardThirdMiOrderEntity refresh(Long id) { HardThirdMiOrderEntity order = baseMapper.selectById(id); if (ObjectUtil.isEmpty(order)) { throw new RuntimeException("订单不存在"); @@ -37,7 +68,7 @@ public class HardThirdMiOrderServiceImpl extends ServiceImpl list) { + if (ObjectUtil.isEmpty(list)) return; + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + // 用户部门 + CompletableFuture userFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List userIds = list.stream().map(HardThirdMiOrderVo::getUserId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(userIds)) { + List userList = userService.getUserDeptByIds(userIds).getData(); + if (ObjectUtil.isNotEmpty(userList)) { + Map map = CollectionUtils.convertMap(userList, UserVO::getUserId); + for (HardThirdMiOrderVo item : list) { + UserVO userVO = map.get(item.getUserId()); + if (ObjectUtil.isEmpty(userVO)) continue; + item.setUsername(userVO.getName()); + item.setUserMobile(userVO.getPhone()); + item.setUserAvatar(userVO.getAvatar()); + } + } + } + }); + // 设备 + CompletableFuture deviceFuture = CompletableFuture.runAsync(() -> { + RequestContextHolder.setRequestAttributes(requestAttributes); + List hardIds = list.stream().map(HardThirdMiOrderVo::getHardId).filter(ObjectUtil::isNotEmpty).distinct().toList(); + if (ObjectUtil.isNotEmpty(hardIds)) { + HardManagerDto hardManagerDto = new HardManagerDto(); + hardManagerDto.setIds(hardIds); + List hardList = hardManagerMapper.list(hardManagerDto); + if (ObjectUtil.isNotEmpty(hardList)) { + HardUtil.convertHardList(list, CollectionUtils.convertMap(hardList, HardManagerEntity::getId)); + } + } + }); + CompletableFuture.allOf(userFuture, deviceFuture).join(); + } + } \ No newline at end of file diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java index 7b6491e44..d310d8218 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/ali/MiniAlipayServiceImpl.java @@ -126,6 +126,51 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { } } + /** + * 免密授权(需要押金) + */ + @Override + public ZhimaCreditPayafteruseCreditbizorderCreateResponse miDynamicCreate(Long userId, UserTypeEnum userType, Long authId) { + int depositPricePrice = 300; + + HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity(); + thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType()); + thirdOrder.setAuthId(authId); + thirdOrder.setUserId(userId); + thirdOrder.setDepositPrice(depositPricePrice); + thirdOrder.setUserType(userType.getStatus()); + thirdOrder.setCreateOrderTime(LocalDateTime.now()); + thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); + + ZhimaCreditPayafteruseCreditbizorderCreateRequest request = new ZhimaCreditPayafteruseCreditbizorderCreateRequest(); + ZhimaCreditPayafteruseCreditbizorderCreateModel model = new ZhimaCreditPayafteruseCreditbizorderCreateModel(); + model.setOutOrderNo(String.valueOf(authId)); + model.setAmountType("RISK_AMOUNT"); + model.setZmServiceId(conf.getZmServiceId()); + model.setCategoryId("credit_pay_after_use"); + model.setOrderAmount(new BigDecimal(depositPricePrice).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString()); + model.setProductCode("CREDIT_PAY_AFTER_USE"); + model.setSubject("浦江智能柜芝麻先享"); + model.setBody("浦江智能柜芝麻先享"); + request.setBizModel(model); + + System.out.println(JSONUtil.toJsonStr(model)); + try { + ZhimaCreditPayafteruseCreditbizorderCreateResponse response = getClient().sdkExecute(request); + if (!response.isSuccess()) { + log.error("|免密授权(需要押金)|失败,json|{}", response.getBody()); + return null; + } + return response; + } catch (Exception e) { + e.printStackTrace(); + log.error("|免密授权(需要押金)|异常", e); + return null; + } finally { + hardThirdMiOrderMapper.insert(thirdOrder); + } + } + /** * 查询面密授权 */ @@ -209,7 +254,6 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { // 一般是芝麻信用评估不通过、未开通等 if (List.of("ZHIMA_CHECK_NO_PASS", "ZHIMA_EVALUATE_NO_PASS", "CREDIT_AGREEMENT_INVALID").contains(response.getCode())) { - miDynamicCreate(authId, orderId); } response.getCode(); @@ -256,10 +300,13 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { */ @Override public AlipayTradeCreateResponse miCreateOrder(String openId, Long authId, Long userId, UserTypeEnum userType) { + int depositPricePrice = 10; + HardThirdMiOrderEntity thirdOrder = new HardThirdMiOrderEntity(); thirdOrder.setBizType(HardThirdMiTypeEnum.MI_ALIPAY.getType()); thirdOrder.setAuthId(authId); thirdOrder.setUserId(userId); + thirdOrder.setDepositPrice(depositPricePrice); thirdOrder.setUserType(userType.getStatus()); thirdOrder.setCreateOrderTime(LocalDateTime.now()); thirdOrder.setOrderStatus(HardThirdMiStatusEnum.CREATE_ORDER.getType()); @@ -273,7 +320,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { // 设置订单附加信息 bizContent.putOnce("body", "浦江智能柜芝麻先享"); // 设置订单金额 - bizContent.putOnce("total_amount", 0.01); + bizContent.putOnce("total_amount", new BigDecimal(depositPricePrice).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).toString()); // 固定 bizContent.putOnce("product_code", "JSAPI_PAY"); // 用户登录id @@ -344,11 +391,12 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { updateObj.setPayOrderTime(LocalDateTime.now()); updateObj.setOrderPrice(totalPrice); updateObj.setPayPrice(totalPrice); + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY_ERROR.getType()); AlipayTradeOrderPayRequest request = new AlipayTradeOrderPayRequest(); AlipayTradeOrderPayModel model = new AlipayTradeOrderPayModel(); model.setOutRequestNo(String.valueOf(thirdOrder.getOrderId())); - model.setTradeNo(thirdOrder.getOutOrderNo()); + model.setTradeNo(thirdOrder.getThirdOrderNo()); model.setFulfillmentAmount(new BigDecimal(totalPrice).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP).toString()); model.setOrderPayMode("CREDIT_FULFILLMENT_ZM"); try { @@ -360,7 +408,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { } log.info("|支付宝免密扣款|成功,json|{}", response.getBody()); if (ObjectUtil.equals(response.getCode(), "10000")) { - updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY.getType()); + updateObj.setOrderStatus(HardThirdMiStatusEnum.PAY_SUCCESS.getType()); return true; } return false; @@ -369,9 +417,7 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { log.error("|支付宝免密扣款|异常", e); return false; } finally { - if (ObjectUtil.isNotEmpty(updateObj.getOrderStatus())) { - hardThirdMiOrderMapper.updateById(updateObj); - } + hardThirdMiOrderMapper.updateById(updateObj); } } @@ -379,15 +425,15 @@ public class MiniAlipayServiceImpl implements MiniAlipayService { * 支付宝免密(取消/退款) */ @Override - public AlipayTradeRefundResponse miCancelOrRefund(String authId, String refundId, int price) { + public AlipayTradeRefundResponse miCancelOrRefund(HardThirdMiOrderEntity thirdOrder) { AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); JSONObject bizContent = new JSONObject(); // 订单总金额 - bizContent.putOnce("refund_amount", new BigDecimal(price).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); + bizContent.putOnce("refund_amount", new BigDecimal(thirdOrder.getRefundId()).divide(BigDecimal.valueOf(thirdOrder.getRefundPrice()), 2, RoundingMode.HALF_UP)); // 商家订单唯一号 - bizContent.putOnce("out_trade_no", authId); - bizContent.putOnce("out_request_no", refundId); + bizContent.putOnce("out_trade_no", String.valueOf(thirdOrder.getAuthId())); + bizContent.putOnce("out_request_no", String.valueOf(thirdOrder.getRefundId())); //扩展参数 JSONObject extendParam = new JSONObject(); extendParam.putOnce("is_fulfilled", "true"); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java index 005de5e37..ffa2b0e86 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/service/impl/order/HardOrderServiceImpl.java @@ -976,14 +976,6 @@ public class HardOrderServiceImpl extends ServiceImpl + + select a.id, + a.biz_type, + a.user_id, + a.user_type, + a.auth_id, + a.flow_id, + a.order_id, + a.refund_id, + a.hard_id, + a.out_order_no, + a.third_order_no, + a.create_order_time, + a.pay_order_time, + a.refund_order_time, + a.order_status, + a.deposit_price, + a.order_price, + a.pay_price, + a.refund_price, + a.org_sign_json, + a.org_order_json, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.del_flag, + a.tenant_id + + + + a.del_flag = '0' + + and a.biz_type = #{dto.bizType} + + + and a.user_id = #{dto.userId} + + + and a.hard_id = #{dto.hardId} + + + and a.user_type = #{dto.userType} + + + and a.order_status = #{dto.orderStatus} + + + and a.create_order_time between #{dto.createOrderTimeList[0]} and #{dto.createOrderTimeList[1]} + + + and a.pay_order_time between #{dto.payOrderTimeList[0]} and #{dto.payOrderTimeList[1]} + + + and a.refund_order_time between #{dto.refundOrderTimeList[0]} and #{dto.refundOrderTimeList[1]} + + + + + \ No newline at end of file diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java index 6a5c5a410..29f3e19b2 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/controller/RegisterController.java @@ -26,12 +26,12 @@ public class RegisterController { private final SysUserService userService; - /** - * 注册用户 - * - * @param userDto 用户信息 - * @return success/false - */ +// /** +// * 注册用户 +// * +// * @param userDto 用户信息 +// * @return success/false +// */ // @SysLog("注册用户") // @PostMapping("/user") // @ConditionalOnProperty(name = "register.user", matchIfMissing = true) @@ -39,6 +39,14 @@ public class RegisterController { // return userService.registerUser(userDto); // } + /** + * 注册普通用户 + */ + @SysLog("注册用户") + @PostMapping("/default-user") + public R registerDefaultUser(@RequestBody UserDTO userDto) { + return userService.registerDefaultUser(userDto); + } /** diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java index 16fd28f7d..ed989c10f 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/SysUserService.java @@ -136,6 +136,11 @@ public interface SysUserService extends IService { */ R registerUser(UserDTO userDto); + /** + * 注册普通用户 + */ + R registerDefaultUser(UserDTO userDto); + /** * 锁定用户 * diff --git a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java index 6b3cc21f2..6d72daab1 100644 --- a/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java +++ b/pjcloud-upms/pjcloud-upms-biz/src/main/java/com/bsd/pjcloud/admin/service/impl/SysUserServiceImpl.java @@ -753,6 +753,71 @@ public class SysUserServiceImpl extends ServiceImpl impl return R.ok(true); } + /** + * 注册用户 赋予用户默认角色 + */ + @Override + @Transactional(rollbackFor = Exception.class) + public R registerDefaultUser(UserDTO userDto) { + userDto.setPhone(userDto.getUsername()); + // 判断用户名是否存在 + boolean usernameExists = this.exists(Wrappers.lambdaQuery().eq(SysUser::getUsername, userDto.getUsername())); + if (usernameExists) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, userDto.getUsername()); + return R.failed(message); + } + // 判断手机号是否存在 + boolean phoneExists = this.exists(Wrappers.lambdaQuery().eq(SysUser::getPhone, userDto.getPhone())); + if (phoneExists) { + String message = MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, userDto.getPhone()); + return R.failed(message); + } + SysUser sysUser = new SysUser(); + BeanUtils.copyProperties(userDto, sysUser); + + sysUser.setLockFlag(UserStateEnum.NORMAL.getCode()); + sysUser.setCreateBy(userDto.getUsername()); + sysUser.setUpdateBy(userDto.getUsername()); + sysUser.setPassword(ENCODER.encode(userDto.getPassword())); + sysUser.setPasswordModifyTime(LocalDateTime.now()); + sysUser.setProcessStatus(TaskCheckStatusEnum.RESULT.getCode()); + sysUser.setProcessTime(LocalDateTime.now()); + sysUser.setStaffingType(UserStaffingTypeEnum.NONE_STAFFING.getType()); + baseMapper.insert(sysUser); + + // 如果角色为空,赋默认角色 + if (CollUtil.isEmpty(userDto.getRole())) { + // 获取默认角色编码 + String defaultRole = ParamResolver.getStr("USER_DEFAULT_ROLE"); + // 默认角色 + SysRole sysRole = sysRoleService.getOne(Wrappers.lambdaQuery().eq(SysRole::getRoleCode, defaultRole)); + userDto.setRole(Collections.singletonList(sysRole.getRoleId())); + } + + // 插入用户角色关系表 + userDto.getRole().stream().map(roleId -> { + SysUserRole userRole = new SysUserRole(); + userRole.setUserId(sysUser.getUserId()); + userRole.setRoleId(roleId); + return userRole; + }).forEach(sysUserRoleMapper::insert); + + // 创建用户默认钱包、保证线程header + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); + CompletableFuture.runAsync(() -> { + try { + RequestContextHolder.setRequestAttributes(requestAttributes); + // 创建钱包 + remoteWalletService.createWallet(sysUser.getUserId()); + // 通知钱包 + remoteWalletService.userChange(sysUser.getUserId(), Boolean.FALSE); + } catch (Exception e) { + log.error("|{}|创建用户钱包失败error:|{}|", TAG, e.getMessage()); + } + }); + return R.ok(null); + } + /** * 锁定用户 * diff --git a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java index f57be8b94..84e9f053c 100644 --- a/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java +++ b/pjcloud-wallet/pjcloud-wallet-api/src/main/java/com/bsd/pjcloud/wallet/api/vo/recharge/WalletRechargeInvoiceVo.java @@ -7,6 +7,11 @@ import lombok.Data; @Data public class WalletRechargeInvoiceVo extends WalletRechargeInvoiceEntity { + /** + * 申请人相关 + */ + private String applyUsername; + private String totalPriceCnStr; private Boolean isCheckUser; diff --git a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java index bae0b1833..250f56d1e 100644 --- a/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java +++ b/pjcloud-wallet/pjcloud-wallet-biz/src/main/java/com/bsd/pjcloud/wallet/service/impl/recharge/WalletRechargeInvoiceServiceImpl.java @@ -19,6 +19,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.entity.SysDept; +import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.admin.api.feign.RemoteDeptService; import com.bsd.pjcloud.admin.api.feign.RemoteFileService; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; @@ -567,5 +568,18 @@ public class WalletRechargeInvoiceServiceImpl extends ServiceImpl applyUserIds = list.stream().map(WalletRechargeInvoiceVo::getApplyUserId).distinct().filter(ObjectUtil::isNotEmpty).toList(); + if (ObjectUtil.isNotEmpty(applyUserIds)) { + List userData = remoteUserService.getInnerUserById(applyUserIds).getData(); + if (ObjectUtil.isNotEmpty(userData)) { + Map userMap = CollectionUtils.convertMap(userData, SysUser::getUserId); + for (WalletRechargeInvoiceVo v : list) { + SysUser target = userMap.get(v.getApplyUserId()); + if (ObjectUtil.isEmpty(target)) continue; + v.setApplyUsername(target.getName()); + } + } + } } } \ No newline at end of file