|  |  | 
 |  |  | import cc.mrbird.febs.pay.model.AgreementPayDto; | 
 |  |  | import cc.mrbird.febs.pay.model.AgreementSignDto; | 
 |  |  | import cc.mrbird.febs.pay.model.UnipayDto; | 
 |  |  | import cc.mrbird.febs.pay.service.IAliPayService; | 
 |  |  | import cc.mrbird.febs.pay.service.IPayService; | 
 |  |  | import cc.mrbird.febs.pay.service.UnipayService; | 
 |  |  | import cc.mrbird.febs.rabbit.producter.AgentProducer; | 
 |  |  | 
 |  |  |     private final MallOrderRefundMapper mallOrderRefundMapper; | 
 |  |  |     private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper; | 
 |  |  |     private final MallShoppingCartMapper mallShoppingCartMapper; | 
 |  |  |     private final IApiMallMemberService memberService; | 
 |  |  |     private final IMallMoneyFlowService mallMoneyFlowService; | 
 |  |  |     private final RedisUtils redisUtils; | 
 |  |  |  | 
 |  |  |     private final AgentProducer agentProducer; | 
 |  |  |     private final IPayService payService; | 
 |  |  |     private final IAliPayService payService; | 
 |  |  |     private final IMallAchieveService mallAchieveService; | 
 |  |  |     private final UnipayService unipayService; | 
 |  |  |     private final IPayService wechatPayService; | 
 |  |  |  | 
 |  |  |     private final MallMemberBankSignMapper mallMemberBankSignMapper; | 
 |  |  |     private final MallMemberBankMapper mallMemberBankMapper; | 
 |  |  | 
 |  |  |     private final DataDictionaryCustomMapper dataDictionaryCustomMapper; | 
 |  |  |     private final MallAchieveRecordMapper mallAchieveRecordMapper; | 
 |  |  |     private final MallMemberWalletMapper mallMemberWalletMapper; | 
 |  |  |     private final MallMqRecordMapper mallMqRecordMapper; | 
 |  |  |  | 
 |  |  |     private final ICommonService commonService; | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     @Transactional(rollbackFor = Exception.class) | 
 |  |  | 
 |  |  |         /** | 
 |  |  |          * 使用积分折扣现金 | 
 |  |  |          */ | 
 |  |  |         DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  |                 DataDictionaryEnum.SCORE_PERCENT.getType(), | 
 |  |  |                 DataDictionaryEnum.SCORE_PERCENT.getCode() | 
 |  |  |         ); | 
 |  |  |         DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  |                 DataDictionaryEnum.SCORE_CHANGE.getType(), | 
 |  |  |                 DataDictionaryEnum.SCORE_CHANGE.getCode() | 
 |  |  |         ); | 
 |  |  |         BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore(); | 
 |  |  |         orderInfo.setScoreCnt(score); | 
 |  |  |         if(ObjectUtil.isNotEmpty(scorePercentDic)){ | 
 |  |  |             BigDecimal scoreChange = BigDecimal.ONE; | 
 |  |  |             if(ObjectUtil.isNotEmpty(scoreChangeDic)){ | 
 |  |  |                 scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |             } | 
 |  |  |             //折扣现金 | 
 |  |  |             BigDecimal scorePercentAmount = score.divide(scoreChange,BigDecimal.ROUND_DOWN).setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |             orderInfo.setScoreAmount(scorePercentAmount); | 
 |  |  |         BigDecimal scoreChange = BigDecimal.ONE; | 
 |  |  |         if(ObjectUtil.isNotEmpty(scoreChangeDic)){ | 
 |  |  |             scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |         } | 
 |  |  |         //折扣现金 | 
 |  |  |         BigDecimal scorePercentAmount = score.divide(scoreChange,BigDecimal.ROUND_DOWN).setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |         orderInfo.setScoreAmount(scorePercentAmount); | 
 |  |  |         orderInfo.setAmount(total); | 
 |  |  |         if(2 == deliverType){ | 
 |  |  |             orderInfo.setDeliverType(2); | 
 |  |  | 
 |  |  |         String rcResult = ""; | 
 |  |  |         switch (payOrderDto.getType()) { | 
 |  |  |             case "1": | 
 |  |  |                 UnipayDto unipayDtoWx = new UnipayDto(); | 
 |  |  | //                unipayDto.setAmount(new BigDecimal("0.01")); | 
 |  |  |                 unipayDtoWx.setAmount(orderInfo.getAmount()); | 
 |  |  |                 unipayDtoWx.setFrpCode("WEIXIN_APP3"); | 
 |  |  |                 unipayDtoWx.setTradeMerchantNo("777180800385820"); | 
 |  |  |                 unipayDtoWx.setOrderNo(orderInfo.getOrderNo()); | 
 |  |  |                 List<MallOrderItem> itemsWx = orderInfo.getItems(); | 
 |  |  |                 if(CollUtil.isEmpty(itemsWx)){ | 
 |  |  |                     unipayDtoWx.setProductName("商品"); | 
 |  |  |                     orderInfo.setName("商品"); | 
 |  |  |                 }else{ | 
 |  |  |                     unipayDtoWx.setProductName(itemsWx.get(0).getGoodsName()); | 
 |  |  |                     orderInfo.setName(itemsWx.get(0).getGoodsName()); | 
 |  |  |                 } | 
 |  |  |                 String unipayStrWx = unipayService.unipay(unipayDtoWx); | 
 |  |  |                 if("fail" == unipayStrWx){ | 
 |  |  |                     throw new FebsException("支付失败"); | 
 |  |  |                 }else{ | 
 |  |  | //                    JSONUtil.parseObj(unipayStr); | 
 |  |  |                     JSONObject jsonObject = JSONUtil.parseObj(unipayStrWx); | 
 |  |  |                     payResultStr = (String) jsonObject.get("r7_TrxNo"); | 
 |  |  |                     rcResult = (String) jsonObject.get("rc_Result"); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 payResultStr = wechatPayService.pay(orderInfo); | 
 |  |  |                 orderInfo.setPayOrderNo(payResultStr); | 
 |  |  | //                orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo()); | 
 |  |  | //                orderInfo.setPayImage(payOrderDto.getPayImage()); | 
 |  |  |                 orderInfo.setPayMethod("微信支付"); | 
 |  |  |                 orderInfo.setPayResult("2"); | 
 |  |  |                 break; | 
 |  |  |             case "2": | 
 |  |  | //                if (StrUtil.isNotBlank(orderInfo.getPayOrderNo())) { | 
 |  |  | 
 |  |  |                 orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); | 
 |  |  |                 orderInfo.setPayTime(new Date()); | 
 |  |  |                 orderInfo.setPayResult("1"); | 
 |  |  |                 this.baseMapper.updateById(orderInfo); | 
 |  |  |  | 
 |  |  |                 changeWallet(orderInfo.getId()); | 
 |  |  |                 //发送补贴消息 | 
 |  |  |                 agentProducer.sendPerkMoneyMsg(orderInfo.getId()); | 
 |  |  |                 commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue()); | 
 |  |  |  | 
 |  |  |                 //发送直推返利消息 | 
 |  |  |                 agentProducer.sendOrderReturn(orderInfo.getId()); | 
 |  |  |                 //发送代理自动升级消息 | 
 |  |  |                 agentProducer.sendAutoLevelUpMsg(member.getId()); | 
 |  |  |                 break; | 
 |  |  | 
 |  |  |         map.put("rcResult", rcResult); | 
 |  |  |  | 
 |  |  |         return map; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 支付金额后的操作 | 
 |  |  |      *      减少积分,增加流水 | 
 |  |  |      *      购买套餐后,升级会员等级 | 
 |  |  |      *      增加支付金额流水 | 
 |  |  |      *      增加补贴额度 | 
 |  |  |      *      增加贡献值,增加流水 | 
 |  |  |      *      产生一条业绩记录 | 
 |  |  |      * @param orderId | 
 |  |  |      */ | 
 |  |  |     @Override | 
 |  |  |     public void changeWallet(Long orderId){ | 
 |  |  |         MallOrderInfo orderInfo = this.baseMapper.selectById(orderId); | 
 |  |  |         Long memberId = orderInfo.getMemberId(); | 
 |  |  |         boolean hasTc = false; | 
 |  |  |         //总贡献值 | 
 |  |  |         BigDecimal starSum = BigDecimal.ZERO; | 
 |  |  |         /** | 
 |  |  |          * 总补贴额度 | 
 |  |  |          * 所有合伙人补贴至消费礼包的三倍额度需要复购一次。 | 
 |  |  |          */ | 
 |  |  |         BigDecimal scoreSum = BigDecimal.ZERO; | 
 |  |  |         List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId()); | 
 |  |  |         if (CollUtil.isNotEmpty(orderItems)) { | 
 |  |  |             for (MallOrderItem orderItem : orderItems) { | 
 |  |  |                 MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); | 
 |  |  |                 /** | 
 |  |  |                  * 购买套餐赠送贡献值 | 
 |  |  |                  * 补贴3倍额度 | 
 |  |  |                  */ | 
 |  |  |                 if (mallGoods.getIsNormal() == 2) { | 
 |  |  |                     hasTc = true; | 
 |  |  |                     BigDecimal star = mallGoods.getStar()==null ? BigDecimal.ZERO : mallGoods.getStar(); | 
 |  |  |                     starSum = starSum.add(star); | 
 |  |  |                     scoreSum = scoreSum.add( | 
 |  |  |                             new BigDecimal(mallGoods.getPresentPrice()) | 
 |  |  |                                     .multiply(new BigDecimal(3)) | 
 |  |  |                                     .abs() | 
 |  |  |                                     .setScale(2,BigDecimal.ROUND_DOWN)); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             /** | 
 |  |  |              * 增加贡献值,增加流水 | 
 |  |  |              */ | 
 |  |  |             if (starSum.compareTo(BigDecimal.ZERO) > 0) { | 
 |  |  |                 //系统设置的个人贡献点最大值 | 
 |  |  |                 DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  |                         DataDictionaryEnum.STAR_GET.getType(), | 
 |  |  |                         DataDictionaryEnum.STAR_GET.getCode()); | 
 |  |  |                 if(ObjectUtil.isNotEmpty(starGetDic)){ | 
 |  |  |                     String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue(); | 
 |  |  |                     BigDecimal starGet = new BigDecimal(starGetStr); | 
 |  |  |  | 
 |  |  |                     MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); | 
 |  |  |                     BigDecimal star = new BigDecimal(mallMemberWallet.getStar()); | 
 |  |  |                     if(starGet.compareTo(star.add(starSum)) < 0){ | 
 |  |  |                         if(starGet.compareTo(star) > 0){ | 
 |  |  |                             BigDecimal subtract = starGet.subtract(star); | 
 |  |  |                             if(subtract.compareTo(starSum) < 0){ | 
 |  |  |                                 starSum = subtract; | 
 |  |  |                             } | 
 |  |  |                             mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); | 
 |  |  |                             mallMoneyFlowService.addMoneyFlow( | 
 |  |  |                                     memberId, | 
 |  |  |                                     starSum, | 
 |  |  |                                     MoneyFlowTypeEnum.STAR.getValue(), | 
 |  |  |                                     orderInfo.getOrderNo(), | 
 |  |  |                                     FlowTypeEnum.STAR.getValue()); | 
 |  |  |                         } | 
 |  |  |                     }else{ | 
 |  |  |                         mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); | 
 |  |  |                         mallMoneyFlowService.addMoneyFlow( | 
 |  |  |                                 memberId, | 
 |  |  |                                 starSum, | 
 |  |  |                                 MoneyFlowTypeEnum.STAR.getValue(), | 
 |  |  |                                 orderInfo.getOrderNo(), | 
 |  |  |                                 FlowTypeEnum.STAR.getValue()); | 
 |  |  |                     } | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             /** | 
 |  |  |              * 增加补贴额度 | 
 |  |  |              */ | 
 |  |  |             if (scoreSum.compareTo(BigDecimal.ZERO) > 0) { | 
 |  |  |                 memberWalletService.add(scoreSum, memberId, "totalScore"); | 
 |  |  |                 mallMoneyFlowService.addMoneyFlow( | 
 |  |  |                         memberId, | 
 |  |  |                         scoreSum, | 
 |  |  |                         MoneyFlowTypeEnum.TOTAL_SCORE.getValue(), | 
 |  |  |                         orderInfo.getOrderNo(), | 
 |  |  |                         FlowTypeEnum.TOTAL_SCORE.getValue()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         /** | 
 |  |  |          * 购买套餐后,升级会员等级 | 
 |  |  |           */ | 
 |  |  |         if (hasTc) { | 
 |  |  |             MallMember mallMember = memberMapper.selectById(memberId); | 
 |  |  |             if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { | 
 |  |  |                 mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); | 
 |  |  |                 memberMapper.updateById(mallMember); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         /** | 
 |  |  |          * 增加支付金额流水 | 
 |  |  |          */ | 
 |  |  |         mallMoneyFlowService.addMoneyFlow( | 
 |  |  |                 memberId, | 
 |  |  |                 orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).negate(), | 
 |  |  |                 MoneyFlowTypeEnum.PAY.getValue(), | 
 |  |  |                 orderInfo.getOrderNo(), | 
 |  |  |                 FlowTypeEnum.BALANCE.getValue()); | 
 |  |  |         /** | 
 |  |  |          * 减少积分,增加流水 | 
 |  |  |          */ | 
 |  |  |         int reduce = memberWalletService.reduce(orderInfo.getScoreCnt(), memberId, "prizeScore"); | 
 |  |  |         if (reduce == 2) { | 
 |  |  |             throw new FebsException("积分不足"); | 
 |  |  |         } | 
 |  |  |         mallMoneyFlowService.addMoneyFlow( | 
 |  |  |                 memberId, | 
 |  |  |                 orderInfo.getScoreCnt().negate(), | 
 |  |  |                 MoneyFlowTypeEnum.PAY.getValue(), | 
 |  |  |                 orderInfo.getOrderNo(), | 
 |  |  |                 FlowTypeEnum.PRIZE_SCORE.getValue()); | 
 |  |  |         /** | 
 |  |  |          * 产生一条业绩记录 | 
 |  |  |          */ | 
 |  |  |         MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); | 
 |  |  |         mallAchieveRecord.setMemberId(memberId); | 
 |  |  |         mallAchieveRecord.setAchieveTime(new Date()); | 
 |  |  |         mallAchieveRecord.setAmount(orderInfo.getAmount().subtract(orderInfo.getScoreAmount())); | 
 |  |  |         mallAchieveRecord.setOrderId(orderId); | 
 |  |  |         mallAchieveRecord.setPayTime(orderInfo.getPayTime()); | 
 |  |  |         mallAchieveRecordMapper.insert(mallAchieveRecord); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static void main(String[] args) { | 
 |  |  | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         boolean hasTc = false; | 
 |  |  |         //总的折扣积分数量 | 
 |  |  |         BigDecimal total = BigDecimal.ZERO; | 
 |  |  |         for (AddOrderItemDto item : addOrderDto.getItems()) { | 
 |  |  |                 MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); | 
 |  |  |                 MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId()); | 
 |  |  |                 /** | 
 |  |  |                  * 贡献点判断 | 
 |  |  |             MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); | 
 |  |  |             if(ObjectUtil.isEmpty(sku)){ | 
 |  |  |                 throw new FebsException("商品已更新,请重新下单"); | 
 |  |  |             } | 
 |  |  |             MallGoods mallGoods = mallGoodsMapper.selectById(sku.getGoodsId()); | 
 |  |  |             if(ObjectUtil.isEmpty(mallGoods)){ | 
 |  |  |                 throw new FebsException("商品已更新,请重新下单"); | 
 |  |  |             } | 
 |  |  |             /** | 
 |  |  |              * 贡献点判断 | 
 |  |  |              */ | 
 |  |  |             if (mallGoods.getIsNormal() == 2) { | 
 |  |  |                 hasTc = true; | 
 |  |  |             } | 
 |  |  |                 /* | 
 |  |  |                 获取单个商品的折扣积分数量 | 
 |  |  |                     = 现价 * 数量 * 折扣现金比例 | 
 |  |  |                  */ | 
 |  |  |                 if (mallGoods.getIsNormal() == 2) { | 
 |  |  |                     hasTc = true; | 
 |  |  |                 } | 
 |  |  |                 BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())); | 
 |  |  |                 total = total.add(amount); | 
 |  |  |             BigDecimal scorePercent = new BigDecimal(mallGoods.getScorePercent()).multiply(new BigDecimal(0.01)); | 
 |  |  |             BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())).multiply(scorePercent); | 
 |  |  |             total = total.add(amount); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore(); | 
 |  |  |  | 
 |  |  |         MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); | 
 |  |  |         BigDecimal prizeScore = mallMemberWallet.getPrizeScore(); | 
 |  |  |         if(prizeScore.compareTo(score) < 0){ | 
 |  |  |             throw new FebsException("积分不足"); | 
 |  |  |         } | 
 |  |  |         if(hasTc){ | 
 |  |  |             //系统设置的个人贡献点最大值 | 
 |  |  |             DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  | 
 |  |  |             if(ObjectUtil.isNotEmpty(starGetDic)){ | 
 |  |  |                 String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue(); | 
 |  |  |                 BigDecimal starGet = new BigDecimal(starGetStr); | 
 |  |  |  | 
 |  |  |                 MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); | 
 |  |  |                 BigDecimal star = new BigDecimal(mallMemberWallet.getStar()); | 
 |  |  |                 if(starGet.compareTo(star) <= 0){ | 
 |  |  |                 if(starGet.compareTo(BigDecimal.ZERO) != 0 && starGet.compareTo(star) <= 0){ | 
 |  |  |                     throw new FebsException("无法购买套餐"); | 
 |  |  |                 } | 
 |  |  |                 BigDecimal prizeScore = mallMemberWallet.getPrizeScore(); | 
 |  |  |                 if(prizeScore.compareTo(score) < 0){ | 
 |  |  |                     throw new FebsException("积分不足"); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         /** | 
 |  |  |          * 使用积分折扣现金 | 
 |  |  |          */ | 
 |  |  |         DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  |                 DataDictionaryEnum.SCORE_PERCENT.getType(), | 
 |  |  |                 DataDictionaryEnum.SCORE_PERCENT.getCode() | 
 |  |  |         ); | 
 |  |  |         DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
 |  |  |                 DataDictionaryEnum.SCORE_CHANGE.getType(), | 
 |  |  |                 DataDictionaryEnum.SCORE_CHANGE.getCode() | 
 |  |  |         ); | 
 |  |  |  | 
 |  |  |         if(ObjectUtil.isNotEmpty(scorePercentDic)){ | 
 |  |  |             //商品的现金折扣比例 | 
 |  |  |             BigDecimal scorePercent = new BigDecimal(scorePercentDic.getValue()).multiply(BigDecimal.valueOf(0.01)); | 
 |  |  |             //最大折扣金额对应需要的总积分数目 | 
 |  |  |             BigDecimal scorePercentMaxAmount = total.multiply(scorePercent); | 
 |  |  |             BigDecimal scoreChange = BigDecimal.ONE; | 
 |  |  |             if(ObjectUtil.isNotEmpty(scoreChangeDic)){ | 
 |  |  |                 scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |             } | 
 |  |  |             scorePercentMaxAmount = scorePercentMaxAmount.multiply(scoreChange).setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |             if(scorePercentMaxAmount.compareTo(score) < 0){ | 
 |  |  |                 throw new FebsException("最多可使用"+scorePercentMaxAmount+"积分"); | 
 |  |  |             } | 
 |  |  |         //最大折扣金额对应需要的总积分数目 | 
 |  |  |         BigDecimal scorePercentMaxAmount = total; | 
 |  |  |         BigDecimal scoreChange = BigDecimal.ONE; | 
 |  |  |         if(ObjectUtil.isNotEmpty(scoreChangeDic)){ | 
 |  |  |             scoreChange = new BigDecimal(scoreChangeDic.getValue()).abs().setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |         } | 
 |  |  |         scorePercentMaxAmount = scorePercentMaxAmount.multiply(scoreChange).setScale(2,BigDecimal.ROUND_DOWN); | 
 |  |  |         if(scorePercentMaxAmount.compareTo(score) < 0){ | 
 |  |  |             throw new FebsException("最多可使用"+scorePercentMaxAmount+"积分"); | 
 |  |  |         } | 
 |  |  |         return new FebsResponse().success(); | 
 |  |  |     } |