rk
2026-03-23 6cfc2e4258089c953b67054229170c1178585590
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.business.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -65,6 +66,7 @@
import java.net.UnknownHostException;
import java.util.*;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
@@ -168,6 +170,9 @@
    @Autowired
    private IntegralMapper integralMapper;
    private final static String GOODS_ORDER_CREATE_LOCK = "goods:order:create:lock:";
    @Override
    public Integer create(Goodsorder goodsorder) {
@@ -281,12 +286,22 @@
                    Constants.UserActionType.CHANGE_ORDER_KD,
                    userActionMapper,
                    update.getEditDate(),
                    new String[]{goodsorder.getKdInfo()},
                    StringUtils.isNotBlank(goodsorder.getKdInfo())?new String[]{query.getKdInfo()}:null,
                    JSONObject.toJSONString(update) ,
                    query.getKdName()+"(单号:"+query.getKdCode()+")",
                    goodsorder.getKdName()+"(单号:"+goodsorder.getKdCode()+")");
        }
        //发送发货站内信
        Notice notice = Notice.getNotice(
                Constants.NoticeType.NOTICE_ORDER_SEND,
                query.getMemberId(),
                goodsorder.getId()
        );
        notice.setContent(notice.getContent().replace("{param}",goodsorder.getCode().toString()));
        noticeMapper.insert(notice);
      /*  // TODO 发送微信模板消息
        Member member=memberMapper.selectById(query.getMemberId());
@@ -720,6 +735,13 @@
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public PayResponse orderPay(ShopOrderPayRequest orderPayRequest,MemberCouponServiceImpl memberCouponService){
        String lockKey  = GOODS_ORDER_CREATE_LOCK + orderPayRequest.getMemberId();
        //判断前端是否在同一页面创建了两次订单
        if (redisTemplate.hasKey(lockKey)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"正在创建订单,请勿重复调用!");
        } else {
            redisTemplate.opsForValue().set(lockKey, "", 5, TimeUnit.SECONDS);
        }
        Member member = memberMapper.selectById(orderPayRequest.getMemberId());
        Goodsorder goodsorder = new Goodsorder();
@@ -765,12 +787,13 @@
            if(Objects.isNull(member.getBindShopId())){
                memberMapper.update(new UpdateWrapper<Member>().lambda()
                        .set(Member::getBindShopId,shop.getId())
                        .set(Member::getBindShopDate,new Date())
                        .eq(Member::getId,member.getId())
                );
            }
            goodsorder.setPickUpShopId(shop.getId());
            goodsorder.setDistributionShopId(shop.getId());
            goodsorder.setLinkname(member.getName());
            goodsorder.setLinkname(StringUtils.isNotBlank(member.getName())?member.getName():member.getNickname());
            goodsorder.setLinkphone(member.getPhone());
            if(Objects.isNull(member.getBindShopId())){
                member.setBindShopId(shop.getId());
@@ -798,8 +821,8 @@
        }
        goodsorder.setPrice(orderPayConfirmResponse.getPayAmount());
        goodsorder.setTotalPrice(orderPayConfirmResponse.getAmount());
        goodsorder.setUseIntegral(orderPayConfirmResponse.getDeductIntegral());
        goodsorder.setIntegral(orderPayConfirmResponse.getIntegralAmount());
        goodsorder.setUseIntegral(Constants.equalsInteger(orderPayRequest.getUseIntegral(),Constants.ONE)?orderPayConfirmResponse.getDeductIntegral():BigDecimal.ZERO);
        goodsorder.setIntegral(Constants.equalsInteger(orderPayRequest.getUseIntegral(),Constants.ONE)?orderPayConfirmResponse.getIntegralAmount():BigDecimal.ZERO);
        goodsorder.setMailPrice(orderPayConfirmResponse.getMailAmount());
        goodsorder.setPayMethod(goodsorder.getPrice().compareTo(BigDecimal.ZERO)>Constants.ZERO?Constants.ZERO:Constants.ONE);
        goodsorder.setGoodsNum(orderPayRequest.getPayDetailRequestList().stream().mapToInt(PayDetailRequest::getGoodsNum).sum());
@@ -813,8 +836,8 @@
                    .eq(MemberCoupon::getId,orderPayConfirmResponse.getMemberCoupon().getId())
            );
        }
        goodsorder.setReturnCustomerIntegral(getBackIntegral(goodsorder.getPrice(),Constants.ONE));
        goodsorder.setReturnMemberIntegral(getBackIntegral(goodsorder.getPrice(),Constants.ZERO));
        goodsorder.setReturnCustomerIntegral(getBackIntegral(goodsorder.getPrice().subtract(goodsorder.getMailPrice()),Constants.ONE));
        goodsorder.setReturnMemberIntegral(getBackIntegral(goodsorder.getPrice().subtract(goodsorder.getMailPrice()),Constants.ZERO));
        goodsorderMapper.insert(goodsorder);
        List<OrderGoodsCalculateResponse> goodsCalculateList  = orderPayConfirmResponse.getGoodsCalculateList();
        if(CollectionUtils.isEmpty(goodsCalculateList)){
@@ -822,25 +845,28 @@
        }
        List<GoodsorderDetail> goodsOrderDetailList = new ArrayList<>();
        BigDecimal shopSettlement = BigDecimal.ZERO;
        for (OrderGoodsCalculateResponse payDetailRequest:goodsCalculateList) {
        for (int i = 0; i < goodsCalculateList.size(); i++) {
            OrderGoodsCalculateResponse payDetailRequest = goodsCalculateList.get(i);
            //查询商品
            GoodsSku goodsSku = goodsSkuMapper.selectById(payDetailRequest.getSkuId());
            if(Objects.isNull(goodsSku)){
            if(Objects.isNull(goodsSku)||!Constants.equalsInteger(goodsSku.getIsdeleted(),Constants.ZERO)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品SKU信息!");
            }
            Goods goods = goodsMapper.selectById(goodsSku.getGoodsId());
            if(Objects.isNull(goods)){
                throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到商品信息!");
            }
            if(goods.getStatus().equals(Constants.ONE)){
            if(!Constants.equalsInteger(goods.getStatus(),Constants.ZERO)||!Constants.equalsInteger(goods.getIsdeleted(),Constants.ZERO)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品已删除或已下架,无法下单");
            }
            if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品库存不足,无法下单!");
            if(Objects.nonNull(goodsSku.getStock())){
                if(goodsSku.getStock().compareTo(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum())))<Constants.ZERO){
                    throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在商品库存不足,无法下单!");
                }
                //商品库存扣除
                goodsSku.setStock(goodsSku.getStock().subtract(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum()))));
                goodsSkuMapper.updateById(goodsSku);
            }
            //商品库存扣除
            goodsSku.setStock(goodsSku.getStock().subtract(new BigDecimal(Constants.formatIntegerNum(payDetailRequest.getGoodsNum()))));
            goodsSkuMapper.updateById(goodsSku);
            GoodsorderDetail goodsOrderDetail = new GoodsorderDetail();
            goodsOrderDetail.setCreator(member.getId());
            goodsOrderDetail.setCreateDate(new Date());
@@ -872,10 +898,10 @@
                //经销商优惠承担占比
                BigDecimal shopRate = new BigDecimal("100").subtract(platformConfigDTO.getTotalRate());
                //计算经销商优惠承担金额  (优惠券抵扣金额 + 积分抵扣金额) * 占比比例
                BigDecimal shopDeductAmount = payDetailRequest.getCouponDeductCash().add(payDetailRequest.getIntegralDeductCash())
                BigDecimal shopDeductAmount = payDetailRequest.getCouponDeductCash().add(Constants.equalsInteger(orderPayRequest.getUseIntegral(),Constants.ONE)?payDetailRequest.getIntegralDeductCash():BigDecimal.ZERO)
                        .multiply(shopRate).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP);
                //根据经销商销售模式 计算应结算金额
                if(shop.getSaleType().equals(Constants.ONE)){
                if(Constants.equalsInteger(shop.getSaleType(),Constants.ONE)&&Constants.equalsInteger(goodsorder.getReceiveType(),Constants.ONE)){
                    goodsOrderDetail.setShopSettlement(goodsOrderDetail.getPrice().subtract(shopDeductAmount));
                }else {
                    //平台铺货
@@ -918,10 +944,15 @@
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"商品价格发生变化,请刷新后重新支付!");
        }
        //存在现金支付
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
            return this.wxPay(goodsorder,member);
            goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
                    .set(Goodsorder::getShopSettlement,shopSettlement)
                    .eq(Goodsorder::getId,goodsorder.getId())
            );
            PayResponse payResponse = this.wxPay(goodsorder,member);
            payResponse.setLockKey(lockKey);
            return payResponse;
        }
        //无现金支付
        goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
@@ -929,17 +960,17 @@
                .set(Goodsorder::getShopSettlement,shopSettlement)
                .set(Goodsorder::getPayStatus,Constants.OrderStatus.PAY_DONE.getKey())
                .set(Goodsorder::getPayDate,DateUtil.getCurrDateTime())
                .set(Goodsorder::getId,goodsorder.getId())
                .eq(Goodsorder::getId,goodsorder.getId())
        );
        PayResponse payResponse = new PayResponse();
        payResponse.setOrderId(goodsorder.getId());
        payResponse.setPayType(Constants.ONE);
        //发送通知
        if(Objects.nonNull(goodsorder.getPickUpShopId())){
            //发送站内信 - 经销商
            noticeService.orderPayNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getReceiveType());
        }
        payResponse.setLockKey(lockKey);
//        //发送通知
//        if(Objects.nonNull(goodsorder.getPickUpShopId())){
//            //发送站内信 - 经销商
//            noticeService.orderPayNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getReceiveType());
//        }
        return payResponse;
    }
@@ -1087,7 +1118,7 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到订单信息");
        }
        if(memberOrderResponse.getOrderStatus().equals(Constants.OrderStatus.WAIT_PAY.getKey())){
            memberOrderResponse.setCountdown(memberOrderResponse.getCancelDate().getTime()>System.currentTimeMillis()?memberOrderResponse.getCancelDate().getTime()-System.currentTimeMillis():Constants.ZERO);
            memberOrderResponse.setCountdown(memberOrderResponse.getCancelOptDate().getTime()>System.currentTimeMillis()?memberOrderResponse.getCancelOptDate().getTime()-System.currentTimeMillis():Constants.ZERO);
        }
        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
@@ -1205,6 +1236,10 @@
        goodsorder.setCancelInfo(cancelInfo);
        goodsorder.setCancelUser(optUserId);
        goodsorderMapper.updateById(goodsorder);
        if(Constants.equalsInteger(goodsorder.getReceiveType(),Constants.ONE)){
            //释放核销码
            this.releaseExchangeCode(goodsorder.getExchangeCode());
        }
        String goodsName = "";
        List<GoodsorderDetail> goodsorderDetailList =  goodsorderDetailMapper.selectList(new QueryWrapper<GoodsorderDetail>().eq("ORDER_ID",goodsorder.getId()));
        if(!Objects.isNull(goodsorderDetailList)&&goodsorderDetailList.size()>Constants.ZERO){
@@ -1232,20 +1267,8 @@
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void cancelOrderNew(Integer orderId,Integer optUserId,String cancelInfo){
        if(Objects.isNull(orderId)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
        if(Objects.isNull(goodsorder)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_PAY.getKey())
            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey()) )){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单取消失败:订单状态已流转!");
        }
    public void cancel(Goodsorder goodsorder,Integer optUserId,String cancelInfo){
        if(Constants.formatBigdecimal(goodsorder.getPrice()).compareTo(BigDecimal.ZERO)>Constants.ZERO
                && Constants.equalsObject(goodsorder.getPayStatus(),Constants.ONE) ){
            //微信现金退款
@@ -1265,10 +1288,10 @@
            fundMapper.insert(fund);
        }
        //订单已支付状态 , 使用了积分 且积分使用大于0
        if(goodsorder.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
        if(goodsorder.getUseIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
            //更新余额信息 添加积分变动记录
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(goodsorder.getIntegral());
            dealIntegralRequest.setIntegralNum(goodsorder.getUseIntegral());
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getMemberId());
            dealIntegralRequest.setObjId(goodsorder.getId());
@@ -1282,6 +1305,10 @@
        goodsorder.setCancelInfo(StringUtils.isBlank(cancelInfo)?"用户主动取消":cancelInfo);
        goodsorder.setCancelUser(optUserId);
        goodsorderMapper.updateById(goodsorder);
        if(Constants.equalsInteger(goodsorder.getReceiveType(),Constants.ONE)){
            //释放核销码
            this.releaseExchangeCode(goodsorder.getExchangeCode());
        }
        String goodsName = "";
        List<GoodsorderDetail> goodsorderDetailList =  goodsorderDetailMapper.selectList(new QueryWrapper<GoodsorderDetail>().eq("ORDER_ID",goodsorder.getId()));
        if(!Objects.isNull(goodsorderDetailList)&&goodsorderDetailList.size()>Constants.ZERO){
@@ -1291,7 +1318,7 @@
                    Goods goods = goodsMapper.selectById(goodsSku.getGoodsId());
                    goodsName = goods.getName();
                }
                if(!Objects.isNull(goodsSku)){
                if(!Objects.isNull(goodsSku)&&Objects.nonNull(goodsSku.getStock())){
                    goodsSku.setStock(goodsSku.getStock().add(new BigDecimal(Constants.formatIntegerNum(goodsorderDetail.getGoodsNum()))));
                    goodsSkuMapper.updateById(goodsSku);
                }
@@ -1299,9 +1326,9 @@
        }
        // 用户主动取消 发送经销商站内消息
        if(Objects.nonNull(goodsorder.getPickUpShopId())&&StringUtils.isBlank(cancelInfo)){
            noticeService.orderCancelNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getCode().toString());
        }
//        if(Objects.nonNull(goodsorder.getPickUpShopId())&&StringUtils.isBlank(cancelInfo)){
//            noticeService.orderCancelNotice(goodsorder.getPickUpShopId(),goodsorder.getId(),goodsorder.getCode().toString());
//        }
        //查询优惠券信息记录
        if(!Objects.isNull(goodsorder.getCouponId())){
@@ -1311,7 +1338,25 @@
                memberCouponMapper.updateById(memberCoupon);
            }
        }
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void cancelOrderNew(Integer orderId,Integer optUserId,String cancelInfo){
        if(Objects.isNull(orderId)){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
        if(Objects.isNull(goodsorder)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(!(Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.WAIT_PAY.getKey())
            || Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey()) )){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"订单取消失败:订单状态已流转!");
        }
        this.cancel(goodsorder,optUserId,cancelInfo);
    }
@@ -1381,7 +1426,6 @@
            if(Objects.isNull(orderGoodsCalculateResponse.getCouponDeductCash())){
                orderGoodsCalculateResponse.setCouponDeductCash(BigDecimal.ZERO);
            }
//            orderGoodsCalculateResponse.setIntegralDeductCash(BigDecimal.ZERO);
        }
        //订单总金额
        BigDecimal amount = BigDecimal.ZERO;
@@ -1403,12 +1447,16 @@
                amount = amount.add(response.getSkuAmount());
            }
        }
        MemberCoupon memberCoupon = new MemberCoupon();
        MemberCoupon memberCoupon = null;
        orderPayConfirmResponse.setCouponAmount(couponAmount);
        //获取可以使用的优惠券
        List<MemberCoupon> memberCouponList = memberCouponService.getApplyCoupon(request.getPayDetailRequestList(),request.getMemberId());
        if(CollectionUtils.isNotEmpty(memberCouponList)){
            orderPayConfirmResponse.setMemberCouponList(memberCouponList);
            if(Objects.nonNull(request.getCouponId())&&Constants.equalsInteger(request.getCouponId(),-Constants.ONE)&&Objects.nonNull(memberCouponList)){
                request.setCouponId(memberCouponList.get(Constants.ZERO).getId());
            }
            //如果选择了优惠券,则判断选择的优惠券是否有效
            if(Objects.nonNull(request.getCouponId())){
                List<MemberCoupon>  memberCoupons = memberCouponList.stream().filter(i->Constants.equalsInteger(i.getId(),request.getCouponId())).collect(Collectors.toList());
@@ -1417,18 +1465,23 @@
                }
                memberCoupon = memberCoupons.get(Constants.ZERO);
                couponAmount = memberCoupon.getValidAmount();
                memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount);
//                memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount);
                orderPayConfirmResponse.setMemberCoupon(memberCoupon);
            }
        }else {
            if(Objects.nonNull(request.getCouponId())){
            if(Objects.nonNull(request.getCouponId())&&!Constants.equalsInteger(request.getCouponId(),-Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"无可用优惠券,请刷新查看");
            }
        }
        if(Objects.nonNull(memberCoupon)){
            //计算优惠券占比
            memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount);
        }
        //查询用户总积分
        Member member = memberMapper.selectById(request.getMemberId());
        //最低可用启用积分
        BigDecimal minimumIntegral = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.MINIMUM_AVAILABLE_INTEGRAL).getCode());
        BigDecimal minimumIntegral = new BigDecimal(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET,Constants.INTERALSET_MININTEGRALPRICELIMIT).getCode());
        //积分可使用状态  大于0 大于最小可用配置积分值
        orderPayConfirmResponse.setIntegralStatus(
                (member.getIntegral().compareTo(BigDecimal.ZERO)<=Constants.ZERO||
@@ -1438,7 +1491,10 @@
        orderPayConfirmResponse.setDeductIntegral(deductIntegral);
        orderPayConfirmResponse.setIntegralAmount(integralAmount);
        if(Constants.equalsInteger(orderPayConfirmResponse.getIntegralStatus(),Constants.ZERO)){
            //计算积分占比
            integralAmount = this.calculateIntegralRata(orderPayConfirmResponse,goodsCalculateList,member.getIntegral());
        }else{
            orderPayConfirmResponse.setSurplusIntegral(member.getIntegral());
        }
        //邮费金额
@@ -1452,7 +1508,7 @@
                    }
                    Areas areas = areasMapper.selectOne(new QueryWrapper<Areas>().lambda()
                            .eq(Areas::getIsdeleted,Constants.ZERO)
                            .eq(Areas::getId,StringUtils.leftPad(addr.getAreaId().toString().substring(0,2),6,"0"))
                            .eq(Areas::getId,StringUtils.rightPad(addr.getAreaId().toString().substring(0,2),6,"0"))
                            .isNotNull(Areas::getYunFeeId)
                            .last(" limit 1 ")
                    );
@@ -1469,7 +1525,7 @@
                BigDecimal totalWeight = goodsCalculateList.stream().map(i->
                        i.getWeight().multiply(new BigDecimal(i.getGoodsNum().toString()))
                ).reduce(BigDecimal.ZERO,BigDecimal::add);
                if(totalWeight.compareTo(mailConfigResponse.getWeight0())>=Constants.ZERO){
                if(totalWeight.compareTo(mailConfigResponse.getWeight0())<=Constants.ZERO){
                    mailAmount = mailConfigResponse.getFee0();
                }else{
                    //超重重量
@@ -1492,7 +1548,7 @@
            orderPayConfirmResponse.setIntegralAmount(integralAmount);
        }
        //使用优惠券 减去优惠券抵扣金额
        if(Objects.nonNull(request.getCouponId())){
        if(Objects.nonNull(orderPayConfirmResponse.getMemberCoupon())){
            orderPayConfirmResponse.setCouponAmount(couponAmount);
        }
        //实际支付金额 减去优惠券、积分抵扣金额
@@ -1522,12 +1578,12 @@
        if(Constants.equalsInteger(type,Constants.ZERO)){
            if( Constants.equalsInteger(platformConfigDTO.getReturnMemberIntegralStatus(),Constants.ZERO)
                && Objects.nonNull(platformConfigDTO.getReturnMemberIntegral())){
                integralBack = payAmount.multiply(platformConfigDTO.getReturnMemberIntegral()).divide(BigDecimal.ONE,0,BigDecimal.ROUND_DOWN);
                integralBack = payAmount.divide(platformConfigDTO.getReturnMemberIntegral(),2,BigDecimal.ROUND_DOWN);
            }
        }else{
            if( Constants.equalsInteger(platformConfigDTO.getReturnShopIntegralStatus(),Constants.ZERO)
                    && Objects.nonNull(platformConfigDTO.getReturnShopIntegral())){
                integralBack = payAmount.multiply(platformConfigDTO.getReturnShopIntegral()).divide(BigDecimal.ONE,0,BigDecimal.ROUND_DOWN);
                integralBack = payAmount.divide(platformConfigDTO.getReturnShopIntegral(),2,BigDecimal.ROUND_DOWN);
            }
        }
        return integralBack;
@@ -1544,9 +1600,15 @@
    public BigDecimal  calculateIntegralRata(OrderPayConfirmResponse orderPayConfirmResponse,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalIntegral){
        //当前选择商品最大可用积分抵扣的金额
        BigDecimal maxDeductionCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(Objects.isNull(i.getCouponDeductCash())?BigDecimal.ZERO:i.getCouponDeductCash())
                .multiply(i.getDeductRata()).multiply(new BigDecimal("0.01"))).reduce(BigDecimal.ZERO,BigDecimal::add);
                .multiply(i.getDeductRata()).divide(new BigDecimal("100"),2,RoundingMode.DOWN)).reduce(BigDecimal.ZERO,BigDecimal::add);
        //积分-现金兑换比例(XXX积分抵扣1元)
        BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.INTEGRAL_EXCHANGE_CASH_RATA).getCode());
        BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET,Constants.INTERALSET_DEDUCTINTEGRALLIMIT).getCode());
        //积分最大可抵扣金额
        BigDecimal deductionCash = totalIntegral.divide(cashToIntegralRata,2,RoundingMode.DOWN);
        BigDecimal surDeductionCash = deductionCash;
        BigDecimal goodUseIntegral = BigDecimal.ZERO;
        BigDecimal surUseIntegral = totalIntegral;
        //当前选择商品抵扣需要使用的积分
        BigDecimal maxDeductionIntegral =  maxDeductionCash.multiply(cashToIntegralRata);
        //获取当前需要支付的现金总额
@@ -1556,14 +1618,27 @@
        //循环下单商品列表 计算应该使用的积分值
        BigDecimal realDeductionCash = BigDecimal.ZERO;
        for (int j = 0; j < goodsCalculateList.size(); j++) {
            BigDecimal deductionCash = goodsCalculateList.get(j).getSkuAmount().subtract(goodsCalculateList.get(j).getCouponDeductCash());
            goodsCalculateList.get(j).setIntegralMaxDeductCash(deductionCash);
            //获取最大可抵扣金额
            BigDecimal goodDeductionCash = goodsCalculateList.get(j).getSkuAmount().subtract(goodsCalculateList.get(j).getCouponDeductCash())
                    .multiply(goodsCalculateList.get(j).getDeductRata()).divide(new BigDecimal("100"),2,RoundingMode.DOWN);
            goodsCalculateList.get(j).setIntegralMaxDeductCash(goodDeductionCash);
            BigDecimal rata = goodDeductionCash.divide(maxDeductionCash,2,BigDecimal.ROUND_HALF_UP);
            //如果剩余积分大于可以使用积分 则直接满额计算 反之 剩余积分不能满足全部抵扣 单独计算每个商品占比
            if(totalIntegral.compareTo(maxDeductionIntegral)<Constants.ZERO){
                deductionCash  = deductionCash.divide(payCash).multiply(totalIntegral);
                if(Constants.equalsInteger(j+1,goodsCalculateList.size())){
                    goodDeductionCash = surDeductionCash;
                    goodUseIntegral = surUseIntegral;
                }else{
                    goodDeductionCash  = (goodDeductionCash.multiply(deductionCash)).divide(maxDeductionCash,2,BigDecimal.ROUND_HALF_UP);
                    surDeductionCash = surDeductionCash.subtract(goodDeductionCash);
                    goodUseIntegral = (goodDeductionCash.multiply(totalIntegral)).divide(maxDeductionCash,2,BigDecimal.ROUND_HALF_UP);
                    surUseIntegral = totalIntegral.subtract(goodUseIntegral);
                }
            }
            goodsCalculateList.get(j).setIntegralDeductCash(deductionCash);
            realDeductionCash = realDeductionCash.add(deductionCash);
            goodsCalculateList.get(j).setIntegralDeductCash(goodDeductionCash);
            goodsCalculateList.get(j).setIntegralDeduct(goodUseIntegral);
            realDeductionCash = realDeductionCash.add(goodDeductionCash);
        }
        //剩余积分值
        orderPayConfirmResponse.setSurplusIntegral(totalIntegral);
@@ -1663,6 +1738,7 @@
        this.orderAddMemberIntegral(goodsorder);
        //经销商 结算金额
        this.orderAddShopCash(goodsorder);
    }
@@ -1710,7 +1786,22 @@
                if(Objects.isNull(coupon)||Constants.equalsInteger(coupon.getIsdeleted(),Constants.ONE)&&num>Constants.ZERO){
                    continue;
                }
                if(coupon.getNum()>Constants.ZERO){
                    //查询已领取数量
                    Integer getNum = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>().lambda()
                            .eq(MemberCoupon::getIsdeleted,Constants.ZERO)
                            .eq(MemberCoupon::getCouponId,couponId)
                            .ne(MemberCoupon::getGetMethod,Constants.TWO)
                    ).intValue();
                    if(getNum >= coupon.getNum()){
                        continue;
                    }
                    if(num>(coupon.getNum() - getNum)){
                        num = coupon.getNum().intValue() - getNum;
                    }
                }
                MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,inviteMember,new Date(),Constants.ONE,null);
                for (int i = 0; i < num; i++) {
                    //满减卷不会生成maxPrice 需要根据优惠券减少金额设置
                    if(Constants.equalsInteger(coupon.getCouponType(),Constants.ZERO)){
@@ -1725,14 +1816,19 @@
                couponNoticeRequest.setMemberCoupon(memberCoupon);
                couponNoticeRequest.setNum(num);
                requestList.add(couponNoticeRequest);
                Notice notice = Notice.getNotice(Constants.NoticeType.COUPON,
                        member.getId(),null);
                notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon,num)));
                noticeMapper.insert(notice);
            }
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
                memberCouponJoinMapper.insert(memberCouponList);
            }
            if(CollectionUtils.isNotEmpty(requestList)){
                //发送站内信
                noticeService.couponNotice(inviteMember.getId(),requestList);
            }
//            if(CollectionUtils.isNotEmpty(requestList)){
//                //发送站内信
//                noticeService.couponNotice(inviteMember.getId(),requestList);
//            }
        }
        inviteRecordMapper.update(new UpdateWrapper<InviteRecord>().lambda()
                .set(InviteRecord::getFirstOrderStatus,Constants.ONE)
@@ -1771,12 +1867,14 @@
        if(Objects.isNull(shop)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到订单关联经销商信息,请联系管理员");
        }
//        if(!Constants.equalsInteger(shop.getMemberId(),memberId)){
//            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"["+shop.getName()+"]非您绑定的经销商,无法进行该操作!");
//        }
        if(!Constants.equalsInteger(shop.getId(),memberId)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"对不起,当前订单核销门店为["+shop.getName()+"],您无法进行该操作!");
        }
        goodsorder.setStatus(Constants.OrderStatus.DONE.getKey());
        goodsorder.setDoneDate(new Date());
        goodsorderMapper.updateById(goodsorder);
        //释放核销码
        this.releaseExchangeCode(goodsorder.getExchangeCode());
        //存在现金支付 赠送 积分
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
            //赠送消费者积分
@@ -1788,6 +1886,15 @@
            //经销商 结算金额
            this.orderAddShopCash(goodsorder);
        }
        //发送核销通知
        Notice notice = Notice.getNotice(
                Constants.NoticeType.NOTICE_ORDER_WRITE_OFF,
                goodsorder.getMemberId(),
                goodsorder.getId()
        );
        notice.setContent(notice.getContent().replace("{param}",goodsorder.getCode().toString()));
        noticeMapper.insert(notice);
    }
@@ -1799,11 +1906,10 @@
        if(Objects.isNull(goodsorder.getDistributionShopId()) || Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ONE)){
            return;
        }
        BigDecimal backIntegral = getBackIntegral(goodsorder.getPrice(),Constants.ONE);
        if (backIntegral.compareTo(BigDecimal.ZERO) > 0) {
        if (goodsorder.getReturnCustomerIntegral().compareTo(BigDecimal.ZERO) > 0) {
            //更新余额信息 添加积分变动记录
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(backIntegral);
            dealIntegralRequest.setIntegralNum(goodsorder.getReturnCustomerIntegral());
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getDistributionShopId());
            dealIntegralRequest.setObjId(goodsorder.getId());
@@ -1848,11 +1954,10 @@
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ONE)){
            return;
        }
        BigDecimal backIntegral = getBackIntegral(goodsorder.getPrice(),Constants.ZERO);
        if (backIntegral.compareTo(BigDecimal.ZERO) > 0) {
        if (goodsorder.getReturnMemberIntegral().compareTo(BigDecimal.ZERO) > 0) {
            //更新余额信息 添加积分变动记录
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(backIntegral);
            dealIntegralRequest.setIntegralNum(goodsorder.getReturnMemberIntegral());
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(goodsorder.getMemberId());
            dealIntegralRequest.setObjId(goodsorder.getId());
@@ -1911,8 +2016,6 @@
        if(!goodsorder.getStatus().equals(Constants.OrderStatus.DONE.getKey())){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"操作失败:订单未完成,无法退款!");
        }
    }
@@ -2153,7 +2256,7 @@
                        .eq(Notice::getIsdeleted,Constants.ZERO)
                        .eq(Notice::getMemberId,member.getId())
                        .eq(Notice::getStatus,Constants.ZERO)
                )>=Constants.ZERO?Constants.ZERO:Constants.ONE
                )>Constants.ZERO?Constants.ZERO:Constants.ONE
        );
        return homeInfoResponse;
@@ -2222,4 +2325,113 @@
    @Override
    public String createExchangeCode(){
        List<Goodsorder> goodsorderList = goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda()
                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
                .eq(Goodsorder::getReceiveType,Constants.ONE)
                .isNotNull(Goodsorder::getExchangeCode)
                .in(Goodsorder::getStatus,Constants.OrderStatus.WAIT_RECEIVE.getKey(),
                Constants.OrderStatus.WAIT_PAY.getKey(),
                Constants.OrderStatus.PAY_DONE.getKey())
        );
        String exchangeCode = UniqueVerificationCodeGenerator.generateNumericCode();
        if(CollectionUtils.isNotEmpty(goodsorderList)){
            Boolean flag = true;
            while (flag){
                String finalExchangeCode = exchangeCode;
                flag = goodsorderList.stream().filter(i->i.getExchangeCode().equals(finalExchangeCode)).count()>0L?true:false;
                if(flag){
                    exchangeCode = UniqueVerificationCodeGenerator.generateNumericCode();
                }
            }
        }
        RedisUtil.addObject(redisTemplate,Constants.RedisKeys.EXCHANGE_KEY+exchangeCode,exchangeCode);
        return exchangeCode;
    }
    /**
     * 释放核销码
     * @param code
     */
    public void releaseExchangeCode(String code){
        if(StringUtils.isNotBlank(code)){
            RedisUtil.deleteObject(redisTemplate,Constants.RedisKeys.EXCHANGE_KEY+code);
        }
    }
    /**
     * 订单未支付超时自动取消
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoCancelOrder(){
        List<Goodsorder> goodsorderList = goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda()
                .eq(Goodsorder::getIsdeleted, Constants.ZERO)
                .eq(Goodsorder::getStatus, Constants.OrderStatus.WAIT_PAY.getKey())
                        .apply(" CREATE_DATE <  DATE_SUB(NOW(), INTERVAL 15 MINUTE) ")
        );
        if(CollectionUtils.isNotEmpty(goodsorderList)){
            for (Goodsorder goodsorder:goodsorderList) {
                this.cancel(goodsorder,null,"订单未支付超时自动取消");
            }
        }
    }
    /**
     * 自动完成 7 天未确认收货的物流发货订单
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void autoCompleteOrder(){
        //查询发货后 7 天未确认收货的订单数据(仅处理快递配送订单)
        List<Goodsorder> goodsOrderList = goodsorderMapper.selectList(
                new QueryWrapper<Goodsorder>()
                        .eq("STATUS", Constants.OrderStatus.WAIT_RECEIVE.getKey())
                        .eq("RECEIVE_TYPE", Constants.ZERO)  // 仅处理快递配送订单
                        .isNotNull("KD_CODE")  // 有物流单号
                        .ne("KD_CODE", "")  // 物流单号不为空
                        .apply(" KD_DATE IS NOT NULL ")  // 有发货时间
                        .apply(" NOW() >= DATE_SUB(KD_DATE, INTERVAL -7 DAY) ")  // 发货后 7 天
        );
        if (!goodsOrderList.isEmpty()) {
            for (Goodsorder order : goodsOrderList) {
                try {
                    Goodsorder updateOrder = new Goodsorder();
                    updateOrder.setId(order.getId());
                    updateOrder.setStatus(Constants.OrderStatus.DONE.getKey());
                    updateOrder.setDoneDate(new Date());
                    updateOrder.setDoneInfo("发货 7 天后系统自动确认收货");
                    goodsorderMapper.updateById(updateOrder);
                    //存在现金支付 赠送 积分
                    if(Constants.equalsInteger(updateOrder.getPayMethod(),Constants.ZERO)){
                        //赠送消费者积分
                        this.orderAddMemberIntegral(order);
                        //下单完成 根据信息确认是否需要赠送邀请者优惠券
                        this.orderDoneRewardInviteCoupon(order);
                        //经销商 添加赠送积分
                        this.orderAddShopIntegral(order);
                        //经销商 结算金额
                        this.orderAddShopCash(order);
                    }
                    System.out.println("订单自动完成:订单 ID=" + order.getId() + ", 订单编号=" + order.getCode());
                } catch (Exception e) {
                    System.out.println("订单自动完成失败:订单 ID=" + order.getId() + ", 错误:" + e.getMessage());
                }
            }
        }
    }
}