diff --git a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/properties/AliPayProperties.java b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/properties/AliPayProperties.java index 44d11e9f3..d435f161e 100644 --- a/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/properties/AliPayProperties.java +++ b/yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/properties/AliPayProperties.java @@ -36,5 +36,9 @@ public class AliPayProperties { * 回调地址. */ private String notifyUrl; + /** + * 回调地址. + */ + private String refundNotify; } diff --git a/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/AlipayNotifyParamRequest.java b/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/AlipayNotifyParamRequest.java deleted file mode 100644 index 7a91102f1..000000000 --- a/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/AlipayNotifyParamRequest.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.yudao.module.shop.request.member; - -import lombok.Data; -import lombok.experimental.Accessors; - -import java.io.Serializable; -import java.util.Date; - -/** - * @Title:AlipayNotifyParamRequest - * @Description: TODO - * @author: tangqian - * @date: 2023/5/19 10:27 - * @version: V1.0.0 - */ -@Data -@Accessors(chain = true) -public class AlipayNotifyParamRequest implements Serializable { - private static final long serialVersionUID = 5839750515063699319L; - private String appId; - private String tradeNo; // 支付宝交易凭证号 - private String outTradeNo; // 原支付请求的商户订单号 - private String outBizNo; // 商户业务ID,主要是退款通知中返回退款申请的流水号 - private String buyerId; // 买家支付宝账号对应的支付宝唯一用户号。以2088开头的纯16位数字 - private String buyerLogonId; // 买家支付宝账号 - private String sellerId; // 卖家支付宝用户号 - private String sellerEmail; // 卖家支付宝账号 - private String tradeStatus; // 交易目前所处的状态,见交易状态说明 - private String totalAmount; // 本次交易支付的订单金额 - private String receiptAmount; // 商家在交易中实际收到的款项 - private String buyerPayAmount; // 用户在交易中支付的金额 - private String refundFee; // 退款通知中,返回总退款金额,单位为元,支持两位小数 - private String subject; // 商品的标题/交易标题/订单标题/订单关键字等 - private String body; // 该订单的备注、描述、明细等。对应请求时的body参数,原样通知回来 - private Date gmtCreate; // 该笔交易创建的时间。格式为yyyy-MM-dd HH:mm:ss - private Date gmtPayment; // 该笔交易的买家付款时间。格式为yyyy-MM-dd HH:mm:ss - private Date notifyTime; // 通知时间。格式为yyyy-MM-dd HH:mm:ss - private Date gmtRefund; // 该笔交易的退款时间。格式为yyyy-MM-dd HH:mm:ss.S - private Date gmtClose; // 该笔交易结束时间。格式为yyyy-MM-dd HH:mm:ss - private String fundBillList; // 支付成功的各个渠道金额信息,array - private String passbackParams; // 公共回传参数,如果请求时传递了该参数,则返回给商户时会在异步通知时将该参数原样返回。 - private String authAppId; - private String notifyId; - private String notifyType; - private String version; - private String invoiceAmount;//交易中可给用户开具发票的金额 -} diff --git a/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/OrderContentRequest.java b/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/OrderContentRequest.java index 9120c416d..73c9fe6d7 100644 --- a/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/OrderContentRequest.java +++ b/yudao-module-mall/yudao-module-shop-api/src/main/java/cn/iocoder/yudao/module/shop/request/member/OrderContentRequest.java @@ -7,6 +7,7 @@ import lombok.experimental.Accessors; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import java.io.Serializable; import java.util.List; @@ -43,7 +44,7 @@ public class OrderContentRequest implements Serializable { private static final long serialVersionUID = -4967251473044468810L; @Schema(description = "订单id") @NotNull(message = "挡位id不能为空") - private String gearId; + private Long gearId; @Schema(description = "档位名称") @NotEmpty(message = "挡位名称不能为空") diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/notify/WxPayNotifyController.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/notify/WxPayNotifyController.java index ac69a1215..5b338c907 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/notify/WxPayNotifyController.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/notify/WxPayNotifyController.java @@ -1,8 +1,12 @@ package cn.iocoder.yudao.module.shop.controller.admin.notify; +import cn.hutool.core.util.NumberUtil; import cn.hutool.json.JSONUtil; +import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderDO; +import cn.iocoder.yudao.module.shop.dal.mysql.recharge.RechargeOrderMapper; import cn.iocoder.yudao.module.shop.service.order.StoreOrderService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.binarywang.wxpay.bean.notify.OriginNotifyResponse; import com.github.binarywang.wxpay.bean.notify.SignatureHeader; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; @@ -19,6 +23,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; /** @@ -38,6 +43,8 @@ public class WxPayNotifyController { @Autowired private StoreOrderService storeOrderService; + @Autowired + private RechargeOrderMapper rechargeOrderMapper; /** @@ -113,13 +120,21 @@ public class WxPayNotifyController { log.info("退款原始通知=" + JSONUtil.toJsonPrettyStr(jsonData)); try { //解密后的数据 - v3Result = wxPayService.parseRefundNotifyV3Result(JSONUtil.toJsonPrettyStr(notifyResponse), this.getRequestHeader(request)); + v3Result = wxPayService.parseRefundNotifyV3Result(jsonData, this.getRequestHeader(request)); WxPayRefundNotifyV3Result.DecryptNotifyResult result = v3Result.getResult(); log.info("退款通知=" + JSONUtil.toJsonPrettyStr(result)); //退款状态 - if (StringUtils.equals("SUCCESS", result.getRefundId())) { + if (StringUtils.equals("SUCCESS", result.getRefundStatus())) { log.info("微信退款回调成功"); // 验证相关参数-金额 + // 用户支付金额 + BigDecimal payerTotal = NumberUtil.div(result.getAmount().getPayerTotal() + "", "100", 2); + // 处理相关逻辑 + RechargeOrderDO orderDO = rechargeOrderMapper.selectOne(Wrappers.lambdaQuery().eq(RechargeOrderDO::getOrderId, result.getOutRefundNo())); + if (payerTotal.compareTo(orderDO.getPayPrice()) != 0) { + log.error("支付金额不匹配,订单实际支付金额:{},微信入参验证金额:{}", orderDO.getPayPrice(), payerTotal); + return "failure"; + } // 修改订单状态 // 写入 response.setStatus(HttpServletResponse.SC_OK); diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/RechargeOrderInfoController.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/RechargeOrderInfoController.java index df0328b74..e6873800b 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/RechargeOrderInfoController.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/RechargeOrderInfoController.java @@ -27,6 +27,7 @@ import cn.iocoder.yudao.module.shop.controller.admin.recharge.vo.*; import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.RechargeOrderInfoDO; import cn.iocoder.yudao.module.shop.convert.recharge.RechargeOrderInfoConvert; import cn.iocoder.yudao.module.shop.service.recharge.RechargeOrderInfoService; +import sun.rmi.runtime.Log; @Tag(name = "管理后台 - 订单购物详情") @RestController @@ -40,7 +41,7 @@ public class RechargeOrderInfoController { @PostMapping("/create") @Operation(summary = "创建订单购物详情") @PreAuthorize("@ss.hasPermission('shop:recharge-order-info:create')") - public CommonResult createRechargeOrderInfo(@Valid @RequestBody RechargeOrderInfoCreateReqVO createReqVO) { + public CommonResult createRechargeOrderInfo(@Valid @RequestBody RechargeOrderInfoCreateReqVO createReqVO) { return success(rechargeOrderInfoService.createRechargeOrderInfo(createReqVO)); } diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/vo/RechargeGearRespVO.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/vo/RechargeGearRespVO.java index 0c1ac5524..9a6adde4d 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/vo/RechargeGearRespVO.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/admin/recharge/vo/RechargeGearRespVO.java @@ -11,7 +11,7 @@ import java.time.LocalDateTime; public class RechargeGearRespVO extends RechargeGearBaseVO { @Schema(description = "主键", required = true, example = "3324") - private String id; + private Long id; @Schema(description = "创建时间", required = true) private LocalDateTime createTime; diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/app/buy/TopUpOrderController.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/app/buy/TopUpOrderController.java index 9e1dad4cd..4b944f022 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/app/buy/TopUpOrderController.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/controller/app/buy/TopUpOrderController.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.shop.controller.app.buy; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated; +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.shop.request.member.OrderContentRequest; import cn.iocoder.yudao.module.shop.request.member.RefundRequest; import cn.iocoder.yudao.module.shop.response.member.InitOrderResponse; @@ -38,6 +39,7 @@ public class TopUpOrderController { log.info("initOrder会员充值===>{}", request); return CommonResult.success(storeOrderService.memberTopUp(request, servletRequest)); } + @TenantIgnore @PreAuthenticated @Operation(summary = "退款") @RequestMapping(value = "/memberRefund", method = RequestMethod.POST) @@ -45,6 +47,7 @@ public class TopUpOrderController { log.info("memberRefund会员退款===>{}", request); return CommonResult.success(storeOrderService.memberRefund(request, servletRequest)); } + @TenantIgnore @PreAuthenticated @Operation(summary = "申请退款") @RequestMapping(value = "/memberApplyRefund", method = RequestMethod.POST) diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderDO.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderDO.java index d4d8d4efe..656f909bd 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderDO.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderDO.java @@ -169,4 +169,14 @@ public class RechargeOrderDO extends BaseDO { private String updater; private Boolean deleted; + /** + * 推广员id + */ + private Long promoterId; + + /** + * 组织id + */ + private Long deptId; + } diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderInfoDO.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderInfoDO.java index 9abb9b89c..7824e1fee 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderInfoDO.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/dal/dataobject/recharge/RechargeOrderInfoDO.java @@ -28,7 +28,7 @@ public class RechargeOrderInfoDO extends BaseDO { * 主键 */ @TableId - private Integer id; + private Long id; /** * 充值订单id */ @@ -36,7 +36,7 @@ public class RechargeOrderInfoDO extends BaseDO { /** * 充值档位 */ - private Integer rechargeGearId; + private Long rechargeGearId; /** * 订单号 */ @@ -74,5 +74,19 @@ public class RechargeOrderInfoDO extends BaseDO { private String updater; private LocalDateTime createTime; private LocalDateTime updateTime; + /** + * 推广员id + */ + private Long promoterId; + + /** + * 组织id + */ + private Long deptId; + + /** + * 用户id + */ + private Long uid; } diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/order/impl/StoreOrderServiceImpl.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/order/impl/StoreOrderServiceImpl.java index 9146cdb12..d282a5652 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/order/impl/StoreOrderServiceImpl.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/order/impl/StoreOrderServiceImpl.java @@ -1,6 +1,5 @@ package cn.iocoder.yudao.module.shop.service.order.impl; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; @@ -15,9 +14,9 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils; import cn.iocoder.yudao.framework.pay.properties.AliPayProperties; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; -import cn.iocoder.yudao.module.infra.api.config.ApiConfigApi; import cn.iocoder.yudao.module.member.api.user.MemberUserApi; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.member.api.user.dto.PromoterDTO; import cn.iocoder.yudao.module.shop.dal.dataobject.express.ExpressDO; import cn.iocoder.yudao.module.shop.dal.dataobject.order.StoreOrder; import cn.iocoder.yudao.module.shop.dal.dataobject.recharge.PhoneRecordDO; @@ -27,7 +26,6 @@ import cn.iocoder.yudao.module.shop.dal.mysql.order.StoreOrderMapper; import cn.iocoder.yudao.module.shop.dal.mysql.recharge.PhoneRecordMapper; import cn.iocoder.yudao.module.shop.dal.mysql.recharge.RechargeOrderInfoMapper; import cn.iocoder.yudao.module.shop.dal.mysql.recharge.RechargeOrderMapper; -import cn.iocoder.yudao.module.shop.request.member.AlipayNotifyParamRequest; import cn.iocoder.yudao.module.shop.request.member.OrderContentRequest; import cn.iocoder.yudao.module.shop.request.member.RefundRequest; import cn.iocoder.yudao.module.shop.request.order.StoreOrderRefundRequest; @@ -43,7 +41,9 @@ import cn.iocoder.yudao.module.shop.service.order.StoreOrderService; import cn.iocoder.yudao.module.shop.service.order.StoreOrderStatusService; import cn.iocoder.yudao.module.shop.support.StrategySupport; import cn.iocoder.yudao.module.shop.support.pay.IPayStrategy; -import cn.iocoder.yudao.module.shop.utils.*; +import cn.iocoder.yudao.module.shop.utils.CommonPage; +import cn.iocoder.yudao.module.shop.utils.OrderUtil; +import cn.iocoder.yudao.module.shop.utils.RedisUtil; import cn.iocoder.yudao.module.shop.vo.order.LogisticsResultVo; import cn.iocoder.yudao.module.shop.vo.order.StoreDateRangeSqlPram; import cn.iocoder.yudao.module.shop.vo.order.StoreOrderInfoOldVo; @@ -61,7 +61,6 @@ import com.github.pagehelper.PageInfo; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.error.WxErrorException; -import me.chanjar.weixin.common.service.WxOAuth2Service; import me.chanjar.weixin.mp.api.WxMpService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; @@ -75,12 +74,12 @@ import org.springframework.util.CollectionUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.BufferedWriter; import java.io.IOException; -import java.io.OutputStreamWriter; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; /** @@ -1154,12 +1153,13 @@ public class StoreOrderServiceImpl extends ServiceImpl>>>>>>>>>>>>>支付宝订单交易成功!订单号:{}<<<<<<<<<<<<<<<<<<<<", orderId); return "success"; } else { @@ -1253,6 +1264,8 @@ public class StoreOrderServiceImpl extends ServiceImpl params = new HashMap(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) { @@ -1338,7 +1351,7 @@ public class StoreOrderServiceImpl extends ServiceImpl orderInfos = request.getOrderInfos(); orderDO.setOrderId(code); @@ -1357,6 +1370,8 @@ public class StoreOrderServiceImpl extends ServiceImpl infoDOS = new ArrayList<>(); orderInfos.forEach(info -> { @@ -1368,16 +1383,31 @@ public class StoreOrderServiceImpl extends ServiceImpl orderInfos = request.getOrderInfos(); + Assert.isTrue(!CollectionUtils.isEmpty(orderInfos), "订单信息不能为空!"); + List collect = orderInfos.stream().map(OrderContentRequest.OrderInfo::getGearId).collect(Collectors.toList()); + List infoDOS = rechargeOrderInfoMapper.selectList(Wrappers.lambdaQuery() + .eq(RechargeOrderInfoDO::getUid, user.getId()) + .in(RechargeOrderInfoDO::getRechargeGearId, collect)); + if (!CollectionUtils.isEmpty(infoDOS)) { + Map> collect1 = infoDOS.stream().collect(Collectors.groupingBy(RechargeOrderInfoDO::getRechargeGearId)); + orderInfos.forEach(info -> { + Assert.isTrue(CollectionUtils.isEmpty(collect1.get(info.getGearId())), "该挡位:" + info.getName() + "你已购买,请勿重复操作"); + }); + } if (StringUtils.isNotBlank(request.getUserPhone()) && StringUtils.isNotBlank(request.getConfirmPhone())) { Assert.isTrue(StringUtils.equals(request.getUserPhone(), request.getConfirmPhone()), "输入号码不一致!"); + Assert.isTrue(Pattern.matches("^[1][3,4,5,7,8][0,1,2,4,5,6,7,8,9][0-9]{8}$", request.getUserPhone()), "手机号前三位不能是190或193!"); MemberUserRespDTO userByMobile = userService.getUserByMobile(request.getUserPhone()); // 初始化一个账号 if (Objects.isNull(userByMobile)) { diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeGearServiceImpl.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeGearServiceImpl.java index 42beda78e..dab8315ec 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeGearServiceImpl.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeGearServiceImpl.java @@ -106,7 +106,7 @@ public class RechargeGearServiceImpl implements RechargeGearService { RechargeOrderDO orderDO = orderMapper.selectOne(Wrappers.lambdaQuery().eq(RechargeOrderDO::getUid, loginUser.getId()).last("LIMIT 1")); if (Objects.nonNull(orderDO)) { List infoDOS = orderInfoMapper.selectList(Wrappers.lambdaQuery().eq(RechargeOrderInfoDO::getOrderNo, orderDO.getOrderId())); - Map> collect = infoDOS.stream().collect(Collectors.groupingBy(RechargeOrderInfoDO::getRechargeGearId)); + Map> collect = infoDOS.stream().collect(Collectors.groupingBy(RechargeOrderInfoDO::getRechargeGearId)); rechargeGearRespVOS.forEach(vo -> { List infoDOS1 = collect.get(vo.getId()); if (!CollectionUtils.isEmpty(infoDOS1)) { diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoService.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoService.java index 07247bf0c..c3cd32244 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoService.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoService.java @@ -19,7 +19,7 @@ public interface RechargeOrderInfoService { * @param createReqVO 创建信息 * @return 编号 */ - Integer createRechargeOrderInfo(@Valid RechargeOrderInfoCreateReqVO createReqVO); + Long createRechargeOrderInfo(@Valid RechargeOrderInfoCreateReqVO createReqVO); /** * 更新订单购物详情 diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoServiceImpl.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoServiceImpl.java index 16a7e0063..eef1934e7 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoServiceImpl.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/service/recharge/RechargeOrderInfoServiceImpl.java @@ -29,7 +29,7 @@ public class RechargeOrderInfoServiceImpl implements RechargeOrderInfoService { private RechargeOrderInfoMapper rechargeOrderInfoMapper; @Override - public Integer createRechargeOrderInfo(RechargeOrderInfoCreateReqVO createReqVO) { + public Long createRechargeOrderInfo(RechargeOrderInfoCreateReqVO createReqVO) { // 插入 RechargeOrderInfoDO rechargeOrderInfo = RechargeOrderInfoConvert.INSTANCE.convert(createReqVO); rechargeOrderInfoMapper.insert(rechargeOrderInfo); diff --git a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/support/pay/AliPayStrategy.java b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/support/pay/AliPayStrategy.java index 4f562faa0..ffd6cfaeb 100644 --- a/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/support/pay/AliPayStrategy.java +++ b/yudao-module-mall/yudao-module-shop-biz/src/main/java/cn/iocoder/yudao/module/shop/support/pay/AliPayStrategy.java @@ -72,7 +72,7 @@ public class AliPayStrategy implements IPayStrategy { bizContent.put("trade_no", orderDO.getPaySerialNumber()); bizContent.put("refund_amount", orderDO.getPayPrice()); bizContent.put("out_request_no", orderDO.getOrderId()); - + bizContent.put("notify_url",aliPayProperties.getRefundNotify()); request.setBizContent(bizContent.toString()); AlipayTradeRefundResponse response = null; try { diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java index 5499cccf3..8e511b3a4 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.member.api.user; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserBillDTO; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.member.api.user.dto.PromoterDTO; import java.util.Collection; import java.util.List; @@ -80,4 +81,6 @@ public interface MemberUserApi { void saveMemberUser(String phone); + + PromoterDTO getPromoterDOByUserId(Long userId); } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java index 78d070873..a9ea59d13 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/MemberUserRespDTO.java @@ -36,5 +36,8 @@ public class MemberUserRespDTO { */ private String mobile; - + /** + * 推广员id + */ + private Long promoterId; } diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/PromoterDTO.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/PromoterDTO.java new file mode 100644 index 000000000..aec281dd2 --- /dev/null +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/dto/PromoterDTO.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.member.api.user.dto; + +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * @Title:PromoterDTO + * @Description: TODO + * @author: tangqian + * @date: 2023/5/19 14:06 + * @version: V1.0.0 + */ +@Data +public class PromoterDTO { + /** + * 编号 + */ + private Long id; + /** + * 组织id + */ + private Long deptId; + /** + * 会员id + */ + private Long userId; +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java index 50858f1cf..0091bffb4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApiImpl.java @@ -4,8 +4,11 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; +import cn.iocoder.yudao.module.member.api.user.dto.PromoterDTO; import cn.iocoder.yudao.module.member.convert.user.UserConvert; +import cn.iocoder.yudao.module.member.dal.dataobject.promoter.PromoterDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; +import cn.iocoder.yudao.module.member.service.promoter.PromoterService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; import com.thoughtworks.xstream.core.SecurityUtils; import org.springframework.stereotype.Service; @@ -26,6 +29,8 @@ public class MemberUserApiImpl implements MemberUserApi { @Resource private MemberUserService userService; + @Resource + private PromoterService promoterService; @Override @TenantIgnore @@ -102,6 +107,15 @@ public class MemberUserApiImpl implements MemberUserApi { userService.saveMemberUser(phone); } + @Override + public PromoterDTO getPromoterDOByUserId(Long userId) { + PromoterDTO promoterDTO = new PromoterDTO(); + PromoterDO promoterDO = promoterService.getPromoterDOByUserId(userId); + promoterDTO.setDeptId(promoterDO.getDeptId()); + promoterDO.setId(promoterDO.getId()); + return promoterDTO; + } + /** * 获取个人资料 * diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterService.java index d43e6bcae..8f00e968d 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterService.java @@ -86,4 +86,5 @@ public interface PromoterService { */ PromoterImportRespVO importUserList(List importUsers, boolean isUpdateSupport); + PromoterDO getPromoterDOByUserId(Long userId); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterServiceImpl.java index 93c891c78..da5fd7568 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/promoter/PromoterServiceImpl.java @@ -16,6 +16,7 @@ import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; + import javax.annotation.Resource; import javax.validation.Validator; @@ -24,6 +25,7 @@ import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.util.*; + import cn.iocoder.yudao.module.member.controller.admin.promoter.vo.*; import cn.iocoder.yudao.module.member.dal.dataobject.promoter.PromoterDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -62,20 +64,20 @@ public class PromoterServiceImpl implements PromoterService { public Long createPromoter(PromoterCreateReqVO createReqVO) { //判断手机号是否注册 MemberUserDO memberUserDO = memberUserService.getUserByMobile(createReqVO.getMobile()); - if(memberUserDO==null){ + if (memberUserDO == null) { //创建用户 memberUserDO = new MemberUserDO(); memberUserDO.setNickname(createReqVO.getNickname()); memberUserDO.setMobile(createReqVO.getMobile()); memberUserDO.setStatus(createReqVO.getStatus()); - memberUserDO.setPassword(createReqVO.getMobile().substring(createReqVO.getMobile().length()-6)); - memberUserService.createUserIfAbsent(createReqVO.getMobile(),createReqVO.getNickname(),getClientIP()); + memberUserDO.setPassword(createReqVO.getMobile().substring(createReqVO.getMobile().length() - 6)); + memberUserService.createUserIfAbsent(createReqVO.getMobile(), createReqVO.getNickname(), getClientIP()); } // 插入 PromoterDO promoter = PromoterConvert.INSTANCE.convert(createReqVO); promoter.setTenantId(SecurityFrameworkUtils.getLoginUser().getTenantId()); - Long count = promoterMapper.selectCount(Wrappers.lambdaQuery(PromoterDO.class).eq(PromoterDO::getUserId,memberUserDO.getId())); - if(count>0){ + Long count = promoterMapper.selectCount(Wrappers.lambdaQuery(PromoterDO.class).eq(PromoterDO::getUserId, memberUserDO.getId())); + if (count > 0) { throw new ServiceException(PROMOTER_EXISTS); } promoter.setUserId(memberUserDO.getId()); @@ -94,9 +96,9 @@ public class PromoterServiceImpl implements PromoterService { PromoterDO updateObj = PromoterConvert.INSTANCE.convert(updateReqVO); promoterMapper.updateById(updateObj); MemberUserDO memberUserDO = memberUserService.getUserByMobile(updateReqVO.getMobile()); - if(memberUserDO!=null&&!promoterDO.getUserId().equals(memberUserDO.getId())){ + if (memberUserDO != null && !promoterDO.getUserId().equals(memberUserDO.getId())) { throw new ServiceException(ErrorCodeConstants.USER_PHONE_EXISTS); - }else { + } else { memberUserDO.setMobile(updateReqVO.getMobile()); memberUserDO.setNickname(updateReqVO.getNickname()); memberUserService.updateById(memberUserDO); @@ -131,8 +133,8 @@ public class PromoterServiceImpl implements PromoterService { */ @Override public Boolean checkIsPromoterByUserId(Long userId) { - Long count = this.promoterMapper.selectCount(Wrappers.lambdaQuery(PromoterDO.class).eq(PromoterDO::getUserId,userId)); - return count>0; + Long count = this.promoterMapper.selectCount(Wrappers.lambdaQuery(PromoterDO.class).eq(PromoterDO::getUserId, userId)); + return count > 0; } @Override @@ -143,14 +145,14 @@ public class PromoterServiceImpl implements PromoterService { @Override public PageResult getPromoterPage(PromoterPageReqVO pageReqVO) { Page page = new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); - if(StrUtil.isNotBlank(pageReqVO.getDeptId())){ + if (StrUtil.isNotBlank(pageReqVO.getDeptId())) { DeptRespDTO deptRespDTO = deptApi.getDept(Long.parseLong(pageReqVO.getDeptId())); - if(deptRespDTO!=null){ + if (deptRespDTO != null) { pageReqVO.setDeptId(deptRespDTO.getParentOrganizationIds()); } } - promoterMapper.findListPage(page,pageReqVO); + promoterMapper.findListPage(page, pageReqVO); return new PageResult<>(page.getRecords(), page.getTotal()); } @@ -174,37 +176,37 @@ public class PromoterServiceImpl implements PromoterService { PromoterImportRespVO respVO = PromoterImportRespVO.builder().createUsernames(new ArrayList<>()) .updateUsernames(new ArrayList<>()).failureUsernames(new LinkedHashMap<>()).build(); List deptRespDTOList = deptApi.getDeptList(); - Map nameList = deptRespDTOList.stream().collect(toMap(DeptRespDTO::getParentOrganizationName, value -> value,(value1,value2)->value1)); + Map nameList = deptRespDTOList.stream().collect(toMap(DeptRespDTO::getParentOrganizationName, value -> value, (value1, value2) -> value1)); importUsers.forEach(importUser -> { try { - ValidationUtils.validate(validator,importUser); + ValidationUtils.validate(validator, importUser); } catch (ServiceException ex) { respVO.getFailureUsernames().put(importUser.getNickName(), ex.getMessage()); return; } //判断手机号是否注册 MemberUserDO memberUserDO = memberUserService.getUserByMobile(importUser.getMobile()); - if(memberUserDO==null){ + if (memberUserDO == null) { //创建用户 memberUserDO = new MemberUserDO(); memberUserDO.setNickname(importUser.getNickName()); memberUserDO.setMobile(importUser.getMobile()); - memberUserDO.setPassword(importUser.getMobile().substring(importUser.getMobile().length()-6)); + memberUserDO.setPassword(importUser.getMobile().substring(importUser.getMobile().length() - 6)); memberUserDO.setStatus(1); - memberUserService.createUserIfAbsent(importUser.getMobile(),importUser.getNickName(),getClientIP()); + memberUserService.createUserIfAbsent(importUser.getMobile(), importUser.getNickName(), getClientIP()); } // 插入 PromoterDO promoter = new PromoterDO(); promoter.setTenantId(SecurityFrameworkUtils.getLoginUser().getTenantId()); promoter.setUserId(memberUserDO.getId()); promoter.setCreateTime(LocalDateTime.now()); - Long count = promoterMapper.selectCount(Wrappers.lambdaQuery(PromoterDO.class).eq(PromoterDO::getUserId,memberUserDO.getId())); - if(count>0){ + Long count = promoterMapper.selectCount(Wrappers.lambdaQuery(PromoterDO.class).eq(PromoterDO::getUserId, memberUserDO.getId())); + if (count > 0) { respVO.getFailureUsernames().put(importUser.getNickName(), "已经是推广员"); return; } DeptRespDTO deptRespDTO = nameList.get(importUser.getOrgName()); - if(deptRespDTO==null){ + if (deptRespDTO == null) { respVO.getFailureUsernames().put(importUser.getNickName(), "组织不存在"); return; } @@ -215,6 +217,12 @@ public class PromoterServiceImpl implements PromoterService { }); return respVO; } + + @Override + public PromoterDO getPromoterDOByUserId(Long userId) { + return promoterMapper.selectOne(Wrappers.lambdaQuery().eq(PromoterDO::getUserId, userId).last("LIMIT 1")); + } + /** * 对密码进行加密 *