|  |  |  | 
|---|
|  |  |  | import cc.mrbird.febs.mall.entity.*; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.mapper.*; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.service.*; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.vo.ApiShopApplyVo; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.vo.OrderDetailVo; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.vo.OrderListVo; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.vo.OrderRefundVo; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.vo.*; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.model.AgreementPayDto; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.model.AgreementSignDto; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.model.LaKaLaCreateOrderReqDate; | 
|---|
|  |  |  | 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.LaKaLaService; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.service.UnipayService; | 
|---|
|  |  |  | import cc.mrbird.febs.rabbit.producter.AgentProducer; | 
|---|
|  |  |  | import cn.hutool.core.collection.CollUtil; | 
|---|
|  |  |  | 
|---|
|  |  |  | import org.springframework.transaction.annotation.Transactional; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.math.BigDecimal; | 
|---|
|  |  |  | import java.math.BigInteger; | 
|---|
|  |  |  | import java.text.DecimalFormat; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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 LaKaLaService laKaLaService; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private final MallMemberBankSignMapper mallMemberBankSignMapper; | 
|---|
|  |  |  | private final MallMemberBankMapper mallMemberBankMapper; | 
|---|
|  |  |  | private final MallShopApplyMapper mallShopApplyMapper; | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.baseMapper.updateById(orderInfo); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | agentProducer.sendOrderCancelDelayMsg(orderInfo.getId(), 15 * 60 * 1000L); | 
|---|
|  |  |  | return orderInfo.getId(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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())) { | 
|---|
|  |  |  | //                    payResultStr = orderInfo.getPayOrderNo(); | 
|---|
|  |  |  | //                } else { | 
|---|
|  |  |  | //                    payResultStr = payService.aliPay(orderInfo); | 
|---|
|  |  |  | LaKaLaCreateOrderReqDate laKaLaCreateOrderReqDate = new LaKaLaCreateOrderReqDate(); | 
|---|
|  |  |  | //订单编号 | 
|---|
|  |  |  | laKaLaCreateOrderReqDate.setOut_order_no(orderInfo.getOrderNo()); | 
|---|
|  |  |  | //订单金额,分计 | 
|---|
|  |  |  | laKaLaCreateOrderReqDate.setTotal_amount(orderInfo.getAmount().multiply(new BigDecimal(100)).longValue()); | 
|---|
|  |  |  | List<MallOrderItem> itemsLKL = orderInfo.getItems(); | 
|---|
|  |  |  | //商品名称 | 
|---|
|  |  |  | if(CollUtil.isEmpty(itemsLKL)){ | 
|---|
|  |  |  | laKaLaCreateOrderReqDate.setOrder_info("商品"); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | laKaLaCreateOrderReqDate.setOrder_info(itemsLKL.get(0).getGoodsName()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | payResultStr = laKaLaService.verifyCreateOrder(laKaLaCreateOrderReqDate); | 
|---|
|  |  |  | JSONObject parseObj = JSONUtil.parseObj(payResultStr); | 
|---|
|  |  |  | String code = parseObj.get("code").toString(); | 
|---|
|  |  |  | if (!"true".equals(code)) { | 
|---|
|  |  |  | throw new FebsException("跳转收银台失败"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | orderInfo.setPayOrderNo(parseObj.get("payOrderNo").toString()); | 
|---|
|  |  |  | orderInfo.setPayMethod("拉卡拉支付"); | 
|---|
|  |  |  | orderInfo.setPayResult("2"); | 
|---|
|  |  |  | //                UnipayDto unipayDto = new UnipayDto(); | 
|---|
|  |  |  | //                unipayDto.setAmount(orderInfo.getAmount()); | 
|---|
|  |  |  | //                unipayDto.setFrpCode("ALIPAY_H5"); | 
|---|
|  |  |  | //                unipayDto.setTradeMerchantNo("777184100385821"); | 
|---|
|  |  |  | //                unipayDto.setOrderNo(orderInfo.getOrderNo()); | 
|---|
|  |  |  | //                List<MallOrderItem> items = orderInfo.getItems(); | 
|---|
|  |  |  | //                if(CollUtil.isEmpty(items)){ | 
|---|
|  |  |  | //                    unipayDto.setProductName("商品"); | 
|---|
|  |  |  | //                }else{ | 
|---|
|  |  |  | //                    unipayDto.setProductName(items.get(0).getGoodsName()); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | UnipayDto unipayDto = new UnipayDto(); | 
|---|
|  |  |  | //                unipayDto.setAmount(new BigDecimal("0.01")); | 
|---|
|  |  |  | unipayDto.setAmount(orderInfo.getAmount()); | 
|---|
|  |  |  | unipayDto.setFrpCode("ALIPAY_H5"); | 
|---|
|  |  |  | unipayDto.setTradeMerchantNo("777184100385821"); | 
|---|
|  |  |  | unipayDto.setOrderNo(orderInfo.getOrderNo()); | 
|---|
|  |  |  | List<MallOrderItem> items = orderInfo.getItems(); | 
|---|
|  |  |  | if(CollUtil.isEmpty(items)){ | 
|---|
|  |  |  | unipayDto.setProductName("商品"); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | unipayDto.setProductName(items.get(0).getGoodsName()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String unipayStr = unipayService.unipay(unipayDto); | 
|---|
|  |  |  | if("fail" == unipayStr){ | 
|---|
|  |  |  | throw new FebsException("支付失败"); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | //                    JSONUtil.parseObj(unipayStr); | 
|---|
|  |  |  | JSONObject jsonObject = JSONUtil.parseObj(unipayStr); | 
|---|
|  |  |  | payResultStr = (String) jsonObject.get("r7_TrxNo"); | 
|---|
|  |  |  | rcResult = (String) jsonObject.get("rc_Result"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | orderInfo.setPayOrderNo(payResultStr); | 
|---|
|  |  |  | orderInfo.setPayMethod("支付宝支付"); | 
|---|
|  |  |  | //                agentProducer.sendOrderReturn(orderInfo.getId()); | 
|---|
|  |  |  | //                String unipayStr = unipayService.unipay(unipayDto); | 
|---|
|  |  |  | //                if("fail" == unipayStr){ | 
|---|
|  |  |  | //                    throw new FebsException("支付失败"); | 
|---|
|  |  |  | //                }else{ | 
|---|
|  |  |  | //                    JSONObject jsonObject = JSONUtil.parseObj(unipayStr); | 
|---|
|  |  |  | //                    payResultStr = (String) jsonObject.get("r7_TrxNo"); | 
|---|
|  |  |  | //                    rcResult = (String) jsonObject.get("rc_Result"); | 
|---|
|  |  |  | //                } | 
|---|
|  |  |  | //                orderInfo.setPayOrderNo(payResultStr); | 
|---|
|  |  |  | //                orderInfo.setPayMethod("支付宝支付"); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "3": | 
|---|
|  |  |  | payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance"); | 
|---|
|  |  |  | 
|---|
|  |  |  | orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue()); | 
|---|
|  |  |  | orderInfo.setPayTime(new Date()); | 
|---|
|  |  |  | orderInfo.setPayResult("1"); | 
|---|
|  |  |  | this.baseMapper.updateById(orderInfo); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | changeWallet(orderInfo.getId(), member.getId()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | agentProducer.sendAutoLevelUpMsg(member.getId()); | 
|---|
|  |  |  | //                agentProducer.sendOrderReturn(orderInfo.getId()); | 
|---|
|  |  |  | commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue()); | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 插入一条待处理记录 | 
|---|
|  |  |  | * mq处理之后,更新状态 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | MallMqRecord mallMqRecord = new MallMqRecord(); | 
|---|
|  |  |  | mallMqRecord.setOrderId(orderInfo.getId()); | 
|---|
|  |  |  | mallMqRecord.setState(2); | 
|---|
|  |  |  | mallMqRecord.setRetryTimes(2); | 
|---|
|  |  |  | mallMqRecord.setCreateTime(orderInfo.getPayTime()); | 
|---|
|  |  |  | mallMqRecordMapper.insert(mallMqRecord); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case "4": | 
|---|
|  |  |  | if (orderInfo.getOrderType() != 2) { | 
|---|
|  |  |  | 
|---|
|  |  |  | map.put("rcResult", rcResult); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 支付金额后的操作 | 
|---|
|  |  |  | *      减少积分,增加流水 | 
|---|
|  |  |  | *      购买套餐后,升级会员等级 | 
|---|
|  |  |  | *      增加支付金额流水 | 
|---|
|  |  |  | *      增加补贴额度 | 
|---|
|  |  |  | *      增加贡献值,增加流水 | 
|---|
|  |  |  | *      产生一条业绩记录 | 
|---|
|  |  |  | * @param orderId | 
|---|
|  |  |  | * @param memberId | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public void changeWallet(Long orderId,Long memberId){ | 
|---|
|  |  |  | MallOrderInfo orderInfo = this.baseMapper.selectById(orderId); | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | memberWalletService.add(starSum, memberId, "star"); | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public boolean judgeCreateOrder(AddOrderDto addOrderDto) { | 
|---|
|  |  |  | boolean flag = false; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public FebsResponse judgeCreateOrder(AddOrderDto addOrderDto) { | 
|---|
|  |  |  | Long memberId = LoginUserUtil.getLoginUser().getId(); | 
|---|
|  |  |  | if (CollUtil.isEmpty(addOrderDto.getItems())) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | throw new FebsException("请选择购买商品"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | boolean hasTc = false; | 
|---|
|  |  |  | //总的折扣积分数量 | 
|---|
|  |  |  | BigDecimal total = BigDecimal.ZERO; | 
|---|
|  |  |  | for (AddOrderItemDto item : addOrderDto.getItems()) { | 
|---|
|  |  |  | MallGoodsSku sku = mallGoodsSkuMapper.selectSkuInfoById(item.getSkuId()); | 
|---|
|  |  |  | BigDecimal amount = sku.getPresentPrice().multiply(BigDecimal.valueOf(item.getCnt())); | 
|---|
|  |  |  | total = total.add(amount); | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /* | 
|---|
|  |  |  | 获取单个商品的折扣积分数量 | 
|---|
|  |  |  | = 现价 * 数量 * 折扣现金比例 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | 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("积分不足"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 使用积分折扣现金 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
|---|
|  |  |  | DataDictionaryEnum.SCORE_CHANGE.getType(), | 
|---|
|  |  |  | DataDictionaryEnum.SCORE_CHANGE.getCode() | 
|---|
|  |  |  | ); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //最大折扣金额对应需要的总积分数目 | 
|---|
|  |  |  | 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+"积分"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(hasTc){ | 
|---|
|  |  |  | //系统设置的个人贡献点最大值 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | BigDecimal star = new BigDecimal(mallMemberWallet.getStar()); | 
|---|
|  |  |  | if(starGet.compareTo(BigDecimal.ZERO) != 0 && starGet.compareTo(star) <= 0){ | 
|---|
|  |  |  |  | 
|---|
|  |  |  | return new FebsResponse().success().message("购买套餐不会获得贡献点"); | 
|---|
|  |  |  | //                    throw new FebsException("无法购买套餐"); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return new FebsResponse().success(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public ApiScoreSetVo myScoreSet() { | 
|---|
|  |  |  | ApiScoreSetVo apiScoreSetVo = new ApiScoreSetVo(); | 
|---|
|  |  |  | DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( | 
|---|
|  |  |  | DataDictionaryEnum.SCORE_PERCENT.getType(), | 
|---|
|  |  |  | DataDictionaryEnum.SCORE_PERCENT.getCode() | 
|---|
|  |  |  | 
|---|
|  |  |  | DataDictionaryEnum.SCORE_CHANGE.getType(), | 
|---|
|  |  |  | DataDictionaryEnum.SCORE_CHANGE.getCode() | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore(); | 
|---|
|  |  |  | if(ObjectUtil.isNotEmpty(scorePercentDic)){ | 
|---|
|  |  |  | //商品的现金折扣比例 | 
|---|
|  |  |  | BigDecimal scorePercent = new BigDecimal(scorePercentDic.getValue()).divide(new BigDecimal(100), BigDecimal.ROUND_DOWN); | 
|---|
|  |  |  | //最大折扣金额对应需要的总积分数目 | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | if(scorePercentMaxAmount.compareTo(score) < 0){ | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | flag = true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return flag; | 
|---|
|  |  |  | apiScoreSetVo.setScorePercent(new BigDecimal(scorePercentDic.getValue()).multiply(BigDecimal.valueOf(0.01)).setScale(2,BigDecimal.ROUND_DOWN)); | 
|---|
|  |  |  | apiScoreSetVo.setScoreChange(new BigDecimal(scoreChangeDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN)); | 
|---|
|  |  |  | return apiScoreSetVo; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|