xiaoyong931011
2023-08-31 384d14ce56375402eb682bc231220926b74dda04
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -17,8 +17,11 @@
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;
@@ -63,14 +66,15 @@
    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;
@@ -78,6 +82,9 @@
    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)
@@ -206,25 +213,19 @@
        /**
         * 使用积分折扣现金
         */
        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);
@@ -282,40 +283,42 @@
        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(new BigDecimal("0.01"));
                unipayDto.setAmount(orderInfo.getAmount());
                unipayDto.setFrpCode("ALIPAY_H5");
                unipayDto.setTradeMerchantNo("777184100385821");
@@ -330,14 +333,12 @@
                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());
                break;
            case "3":
                payResultStr = balancePay(orderInfo, payOrderDto.getTradePwd(), "balance");
@@ -347,12 +348,23 @@
                orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
                orderInfo.setPayTime(new Date());
                orderInfo.setPayResult("1");
                this.baseMapper.updateById(orderInfo);
                changeWallet(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);
                //发送补贴消息
                agentProducer.sendPerkMoneyMsg(orderInfo.getId());
                //发送代理自动升级消息
                agentProducer.sendAutoLevelUpMsg(member.getId());
//                agentProducer.sendPerkMoneyMsg(orderInfo.getId());
//                //发送代理自动升级消息
//                agentProducer.sendAutoLevelUpMsg(member.getId());
                break;
            case "4":
                if (orderInfo.getOrderType() != 2) {
@@ -420,144 +432,6 @@
        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) {
@@ -742,7 +616,7 @@
        MallOrderRefundOperation operation = new MallOrderRefundOperation();
        operation.setOrderId(orderInfo.getId());
        operation.setRefundId(orderRefund.getId());
        operation.setContent(StrUtil.format("用户:{}提交退款申请", member.getName()));
        operation.setContent(StrUtil.format("用户:{}提交退款申请", member.getPhone()));
        mallOrderRefundOperationMapper.insert(operation);
    }
@@ -763,7 +637,7 @@
        MallOrderRefundOperation operation = new MallOrderRefundOperation();
        operation.setOrderId(refundExpressDto.getId());
        operation.setRefundId(orderRefund.getId());
        operation.setContent(StrUtil.format("用户:{}提交物流信息,快递公司:{},单号:{}", member.getName(), refundExpressDto.getExpressCom(), refundExpressDto.getExpressNo()));
        operation.setContent(StrUtil.format("用户:{}提交物流信息,快递公司:{},单号:{}", member.getPhone(), refundExpressDto.getExpressCom(), refundExpressDto.getExpressNo()));
        mallOrderRefundOperationMapper.insert(operation);
    }
@@ -842,21 +716,58 @@
        }
        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("积分不足");
        }
        /**
         * 使用积分折扣现金
         */
        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(
@@ -865,42 +776,12 @@
            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){
                    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(starGet.compareTo(BigDecimal.ZERO) != 0 && starGet.compareTo(star) <= 0){
        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+"积分");
                    return new FebsResponse().success().message("购买套餐不会获得贡献点");
//                    throw new FebsException("无法购买套餐");
                }
            }
        }
        return new FebsResponse().success();