From e4f9739d74323aacf09d139700f22a383910ee97 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 04 三月 2026 10:38:32 +0800
Subject: [PATCH] 合并

---
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java |  277 +++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 215 insertions(+), 62 deletions(-)

diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
index 5068fc0..7f9c503 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
+++ b/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) {
@@ -287,6 +292,16 @@
                     goodsorder.getKdName()+"(鍗曞彿锛�"+goodsorder.getKdCode()+")");
 
         }
+
+        //鍙戦�佸彂璐х珯鍐呬俊
+        Notice notice = Notice.getNotice(
+                Constants.NoticeType.NOTICE_ORDER_SEND,
+                goodsorder.getMemberId(),
+                goodsorder.getId()
+        );
+        notice.setContent(notice.getContent().replace("{param}",goodsorder.getCode().toString()));
+        noticeMapper.insert(notice);
+
 
       /*  // TODO 鍙戦�佸井淇℃ā鏉挎秷鎭�
         Member member=memberMapper.selectById(query.getMemberId());
@@ -507,6 +522,9 @@
         queryWrapper.le(pageWrap.getModel().getEndtime()!=null,Goodsorder::getCreateDate, pageWrap.getModel().getEndtime());
         queryWrapper.eq(pageWrap.getModel().getReceiveType()!=null,Goodsorder::getReceiveType,pageWrap.getModel().getReceiveType());
         queryWrapper.eq(pageWrap.getModel().getPayOrderId()!=null,Goodsorder::getPayOrderId,pageWrap.getModel().getPayOrderId());
+        if (StringUtils.isNotBlank(pageWrap.getModel().getGoodsName())) {
+            queryWrapper.exists("select gs.id  from goodsorder_detail gs  where gs.order_id=t.id and gs.isdeleted=0 and gs.NAME like '%"+pageWrap.getModel().getGoodsName()+"%' ");
+        }
     }
 
 
@@ -586,6 +604,7 @@
         Utils.MP.blankToNull(pageWrap.getModel());
 
         queryWrapper.selectAll(Goodsorder.class)
+         .eq(pageWrap.getModel().getReceiveType()!=null,Goodsorder::getReceiveType,pageWrap.getModel().getReceiveType())
          .eq(pageWrap.getModel().getDistributionShopId()!=null,Goodsorder::getDistributionShopId,pageWrap.getModel().getDistributionShopId())
          .eq(pageWrap.getModel().getStatus()!=null,Goodsorder::getStatus,pageWrap.getModel().getStatus())
          .eq(pageWrap.getModel().getCode()!=null,Goodsorder::getCode,pageWrap.getModel().getCode())
@@ -716,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(),"姝e湪鍒涘缓璁㈠崟锛岃鍕块噸澶嶈皟鐢紒");
+        } else {
+            redisTemplate.opsForValue().set(lockKey, "", 5, TimeUnit.SECONDS);
+        }
         Member member = memberMapper.selectById(orderPayRequest.getMemberId());
 
         Goodsorder goodsorder = new Goodsorder();
@@ -727,6 +753,8 @@
         goodsorder.setMemberId(member.getId());
         goodsorder.setType(Constants.ZERO);
         goodsorder.setStatus(Constants.ZERO);
+        goodsorder.setReceiveType(orderPayRequest.getReceiveType());
+        goodsorder.setCouponPrice(BigDecimal.ZERO);
         Shop shop = null;
         if(Constants.equalsInteger(orderPayRequest.getReceiveType(),Constants.ZERO)){
             //鏌ヨ鏀惰揣鍦板潃
@@ -764,6 +792,8 @@
             }
             goodsorder.setPickUpShopId(shop.getId());
             goodsorder.setDistributionShopId(shop.getId());
+            goodsorder.setLinkname(member.getName());
+            goodsorder.setLinkphone(member.getPhone());
             if(Objects.isNull(member.getBindShopId())){
                 member.setBindShopId(shop.getId());
                 member.setBindShopDate(new Date());
@@ -782,6 +812,7 @@
         payConfirmRequest.setAddressId(orderPayRequest.getAddressId());
         payConfirmRequest.setMemberId(member.getId());
         payConfirmRequest.setCouponId(orderPayRequest.getCouponId());
+        payConfirmRequest.setUseIntegral(orderPayRequest.getUseIntegral());
         //閫氳繃鏀粯纭鎺ュ彛鑾峰彇鐢熸垚鏀粯淇℃伅
         OrderPayConfirmResponse orderPayConfirmResponse = this.orderPayConfirm(payConfirmRequest,memberCouponService);
         if(Objects.isNull(orderPayConfirmResponse)){
@@ -789,10 +820,11 @@
         }
         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());
         if(Objects.nonNull(orderPayConfirmResponse.getMemberCoupon())){
             sumPrice = sumPrice.subtract(orderPayConfirmResponse.getMemberCoupon().getPrice());
             goodsorder.setCouponId(orderPayConfirmResponse.getMemberCoupon().getId());
@@ -811,17 +843,18 @@
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏃犳槑缁嗘暟鎹�,璇锋鏌ラ�夋嫨鏁版嵁锛�");
         }
         List<GoodsorderDetail> goodsOrderDetailList = new ArrayList<>();
+        BigDecimal shopSettlement = BigDecimal.ZERO;
         for (OrderGoodsCalculateResponse payDetailRequest:goodsCalculateList) {
             //鏌ヨ鍟嗗搧
             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){
@@ -843,6 +876,7 @@
             goodsOrderDetail.setCouponDeduct(payDetailRequest.getCouponDeductCash());
             goodsOrderDetail.setIntegralDeduct(payDetailRequest.getIntegralDeductCash());
             goodsOrderDetail.setOrderId(goodsorder.getId());
+            goodsOrderDetail.setGoodsId(goodsSku.getGoodsId());
 
             //鍒ゆ柇闂ㄥ簵鏄惁璁剧疆鍟嗗搧鐨勪环鏍间俊鎭�
             if(Objects.nonNull(goodsorder.getDistributionShopId())){
@@ -856,7 +890,6 @@
                 if(Objects.isNull(shopGoodsRelation)){
                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝缁忛攢鍟嗘湭缁戝畾["+goods.getName()+"]鍟嗗搧锛岃鑱旂郴绠$悊鍛橈紒");
                 }
-
                 PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
                 //缁忛攢鍟嗕紭鎯犳壙鎷呭崰姣�
                 BigDecimal shopRate = new BigDecimal("100").subtract(platformConfigDTO.getTotalRate());
@@ -867,8 +900,11 @@
                 if(shop.getSaleType().equals(Constants.ONE)){
                     goodsOrderDetail.setShopSettlement(goodsOrderDetail.getPrice().subtract(shopDeductAmount));
                 }else {
+                    //骞冲彴閾鸿揣
                     goodsOrderDetail.setShopSettlement(
-                            shopGoodsRelation.getPrice().subtract(shopGoodsRelation.getPrice()).subtract(shopDeductAmount));
+                            goodsOrderDetail.getPrice()
+                                    .subtract(shopGoodsRelation.getPrice())
+                                    .subtract(shopDeductAmount));
                 }
                 if(goodsOrderDetail.getShopSettlement().compareTo(BigDecimal.ZERO)<Constants.ZERO){
                     goodsOrderDetail.setShopSettlement(BigDecimal.ZERO);
@@ -876,12 +912,16 @@
             }else{
                 goodsOrderDetail.setShopSettlement(BigDecimal.ZERO);
             }
+            shopSettlement = shopSettlement.add(goodsOrderDetail.getShopSettlement());
             goodsOrderDetailList.add(goodsOrderDetail);
             //鍒犻櫎璐墿杞﹀晢鍝�
             shopcartMapper.delete(new QueryWrapper<Shopcart>().lambda()
                     .eq(Shopcart::getMemberId,member.getId())
                     .eq(Shopcart::getGoodsSkuId,goodsOrderDetail.getGoodsSkuId())
             );
+        }
+        if(CollectionUtils.isNotEmpty(goodsOrderDetailList)){
+            goodsorderDetailMapper.insert(goodsOrderDetailList);
         }
         //绉垎鍙樺姩璁板綍
         if(goodsorder.getUseIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO){
@@ -893,19 +933,23 @@
             dealIntegralRequest.setObjId(goodsorder.getId());
             dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
             dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER);
-            integralService.dealIntegral(dealIntegralRequest);
+            integralService.dealIntegral(dealIntegralRequest,null);
         }
 
         if(goodsorder.getPrice().compareTo(orderPayRequest.getTitlePrice())!=Constants.ZERO){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧浠锋牸鍙戠敓鍙樺寲锛岃鍒锋柊鍚庨噸鏂版敮浠橈紒");
         }
+
         //瀛樺湪鐜伴噾鏀粯
         if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
-            return this.wxPay(goodsorder,member);
+            PayResponse payResponse = this.wxPay(goodsorder,member);
+            payResponse.setLockKey(lockKey);
+            return payResponse;
         }
         //鏃犵幇閲戞敮浠�
         goodsorderMapper.update(null,new UpdateWrapper<Goodsorder>().lambda()
                 .set(Goodsorder::getStatus,Constants.ONE)
+                .set(Goodsorder::getShopSettlement,shopSettlement)
                 .set(Goodsorder::getPayStatus,Constants.OrderStatus.PAY_DONE.getKey())
                 .set(Goodsorder::getPayDate,DateUtil.getCurrDateTime())
                 .set(Goodsorder::getId,goodsorder.getId())
@@ -913,12 +957,12 @@
         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;
     }
@@ -993,7 +1037,7 @@
             request.setBody("骞冲彴鍟嗗煄");
             request.setAttach("shopGoods");
             request.setOutTradeNo(goodsorder.getCode().toString());
-            request.setTotalFee(BaseWxPayRequest.yuanToFen(goodsorder.getPrice().toString()));
+            request.setTotalFee(1);//BaseWxPayRequest.yuanToFen(goodsorder.getPrice().toString()));
           //  request.setTotalFee(2);
             request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
             request.setSpbillCreateIp(this.getIpAddr());
@@ -1066,7 +1110,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();
@@ -1176,7 +1220,7 @@
             dealIntegralRequest.setObjId(goodsorder.getId());
             dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
             dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER_CANCEL);
-            integralService.dealIntegral(dealIntegralRequest);
+            integralService.dealIntegral(dealIntegralRequest,null);
         }
         //璁㈠崟淇℃伅鍙栨秷
         goodsorder.setStatus(Constants.OrderStatus.CLOSE.getKey());
@@ -1184,6 +1228,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){
@@ -1211,20 +1259,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) ){
             //寰俊鐜伴噾閫�娆�
@@ -1244,17 +1280,16 @@
             fundMapper.insert(fund);
         }
         //璁㈠崟宸叉敮浠樼姸鎬� 锛� 浣跨敤浜嗙Н鍒� 涓旂Н鍒嗕娇鐢ㄥぇ浜�0
-        if(goodsorder.getIntegral().compareTo(BigDecimal.ZERO)>Constants.ZERO
-                &&Constants.equalsInteger(goodsorder.getStatus(),Constants.OrderStatus.PAY_DONE.getKey())){
+        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());
             dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
             dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_ORDER_CANCEL);
-            integralService.dealIntegral(dealIntegralRequest);
+            integralService.dealIntegral(dealIntegralRequest,null);
         }
         //璁㈠崟淇℃伅鍙栨秷
         goodsorder.setStatus(Constants.OrderStatus.CLOSE.getKey());
@@ -1262,6 +1297,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){
@@ -1279,9 +1318,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())){
@@ -1291,6 +1330,26 @@
                 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);
+
     }
 
     public BigDecimal getDeductAmount(List<PayDetailRequest> requestList){
@@ -1339,6 +1398,7 @@
         OrderPayConfirmResponse orderPayConfirmResponse = new OrderPayConfirmResponse();
         List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
                 new MPJLambdaWrapper<Goods>()
+                        .selectAll(Goods.class)
                         .selectAs(GoodsSku::getPrice,Goods::getSkuPrice)
                         .selectAs(GoodsSku::getId,Goods::getSkuId)
                         .selectAs(GoodsSku::getIntegralRate,Goods::getDeductRata)
@@ -1349,8 +1409,16 @@
         if(CollectionUtils.isEmpty(goodsList)){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鏈尮閰嶅埌鍟嗗搧淇℃伅");
         }
-        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
 
+        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
+        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
+                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
+        for (OrderGoodsCalculateResponse orderGoodsCalculateResponse:goodsCalculateList) {
+            orderGoodsCalculateResponse.setSkuImg(StringUtils.isNotBlank(orderGoodsCalculateResponse.getSkuImg())?fullUrl+orderGoodsCalculateResponse.getSkuImg():null);
+            if(Objects.isNull(orderGoodsCalculateResponse.getCouponDeductCash())){
+                orderGoodsCalculateResponse.setCouponDeductCash(BigDecimal.ZERO);
+            }
+        }
         //璁㈠崟鎬婚噾棰�
         BigDecimal amount = BigDecimal.ZERO;
         //浼樻儬鍒告姷鎵i噾棰�
@@ -1377,13 +1445,16 @@
         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());
                 if(CollectionUtils.isEmpty(memberCoupons)){
                     throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"閫夋嫨鐨勪紭鎯犲埜鏃犳晥锛岃鍒锋柊閲嶈瘯");
                 }
-                memberCoupon = memberCouponList.get(Constants.ZERO);
+                memberCoupon = memberCoupons.get(Constants.ZERO);
                 couponAmount = memberCoupon.getValidAmount();
                 memberCouponService.calculateCouponRata(memberCoupon,goodsCalculateList,amount);
                 orderPayConfirmResponse.setMemberCoupon(memberCoupon);
@@ -1396,7 +1467,7 @@
         //鏌ヨ鐢ㄦ埛鎬荤Н鍒�
         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||
@@ -1407,6 +1478,8 @@
         orderPayConfirmResponse.setIntegralAmount(integralAmount);
         if(Constants.equalsInteger(orderPayConfirmResponse.getIntegralStatus(),Constants.ZERO)){
             integralAmount = this.calculateIntegralRata(orderPayConfirmResponse,goodsCalculateList,member.getIntegral());
+        }else{
+            orderPayConfirmResponse.setSurplusIntegral(member.getIntegral());
         }
 
         //閭垂閲戦
@@ -1420,7 +1493,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 ")
                     );
@@ -1437,7 +1510,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{
                     //瓒呴噸閲嶉噺
@@ -1490,12 +1563,12 @@
         if(Constants.equalsInteger(type,Constants.ZERO)){
             if( Constants.equalsInteger(platformConfigDTO.getReturnMemberIntegralStatus(),Constants.ZERO)
                 && Objects.nonNull(platformConfigDTO.getReturnMemberIntegral())){
-                integralBack = payAmount.divide(platformConfigDTO.getReturnMemberIntegral(),0,BigDecimal.ROUND_DOWN);
+                integralBack = payAmount.multiply(platformConfigDTO.getReturnMemberIntegral()).divide(BigDecimal.ONE,0,BigDecimal.ROUND_DOWN);
             }
         }else{
             if( Constants.equalsInteger(platformConfigDTO.getReturnShopIntegralStatus(),Constants.ZERO)
                     && Objects.nonNull(platformConfigDTO.getReturnShopIntegral())){
-                integralBack = payAmount.divide(platformConfigDTO.getReturnShopIntegral(),0,BigDecimal.ROUND_DOWN);
+                integralBack = payAmount.multiply(platformConfigDTO.getReturnShopIntegral()).divide(BigDecimal.ONE,0,BigDecimal.ROUND_DOWN);
             }
         }
         return integralBack;
@@ -1511,20 +1584,22 @@
      */
     public BigDecimal  calculateIntegralRata(OrderPayConfirmResponse orderPayConfirmResponse,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalIntegral){
         //褰撳墠閫夋嫨鍟嗗搧鏈�澶у彲鐢ㄧН鍒嗘姷鎵g殑閲戦
-        BigDecimal maxDeductionCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(i.getCouponDeductCash())
-                .multiply(i.getDeductRata()).multiply(new BigDecimal("0.01"))).reduce(BigDecimal.ZERO,BigDecimal::add);
-        //绉垎 - 鐜伴噾 姣斾緥
-        BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.SHOP_CONFIG,Constants.INTEGRAL_EXCHANGE_CASH_RATA).getCode());
+        BigDecimal maxDeductionCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(Objects.isNull(i.getCouponDeductCash())?BigDecimal.ZERO:i.getCouponDeductCash())
+                .multiply(i.getDeductRata()).divide(new BigDecimal("100"),2,RoundingMode.DOWN)).reduce(BigDecimal.ZERO,BigDecimal::add);
+        //绉垎-鐜伴噾鍏戞崲姣斾緥锛圶XX绉垎鎶垫墸1鍏冿級
+        BigDecimal cashToIntegralRata = new BigDecimal(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET,Constants.INTERALSET_DEDUCTINTEGRALLIMIT).getCode());
         //褰撳墠閫夋嫨鍟嗗搧鎶垫墸闇�瑕佷娇鐢ㄧ殑绉垎
-        BigDecimal maxDeductionIntegral =  maxDeductionCash.multiply(cashToIntegralRata).multiply(new BigDecimal("100"));
+        BigDecimal maxDeductionIntegral =  maxDeductionCash.multiply(cashToIntegralRata);
         //鑾峰彇褰撳墠闇�瑕佹敮浠樼殑鐜伴噾鎬婚
-        BigDecimal payCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(i.getCouponDeductCash())).reduce(BigDecimal.ZERO,BigDecimal::add);
+        BigDecimal payCash =  goodsCalculateList.stream().map(i->i.getSkuAmount().subtract(Objects.isNull(i.getCouponDeductCash())?BigDecimal.ZERO:i.getCouponDeductCash())).reduce(BigDecimal.ZERO,BigDecimal::add);
 
         //濡傛灉瀹為檯绉垎灏戜簬鏈�澶ч渶瑕佺Н鍒� 闇�瑕佽绠楁瘮渚嬪崰姣� 鍘诲搴旀坊鍔犺嚦瀵瑰簲鐨勫晢鍝侀噷
         //寰幆涓嬪崟鍟嗗搧鍒楄〃 璁$畻搴旇浣跨敤鐨勭Н鍒嗗��
         BigDecimal realDeductionCash = BigDecimal.ZERO;
         for (int j = 0; j < goodsCalculateList.size(); j++) {
-            BigDecimal deductionCash = goodsCalculateList.get(j).getSkuAmount().subtract(goodsCalculateList.get(j).getCouponDeductCash());
+            //鑾峰彇鏈�澶у彲鎶垫墸閲戦
+            BigDecimal deductionCash = 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(deductionCash);
             //濡傛灉鍓╀綑绉垎澶т簬鍙互浣跨敤绉垎 鍒欑洿鎺ユ弧棰濊绠� 鍙嶄箣 鍓╀綑绉垎涓嶈兘婊¤冻鍏ㄩ儴鎶垫墸 鍗曠嫭璁$畻姣忎釜鍟嗗搧鍗犳瘮
             if(totalIntegral.compareTo(maxDeductionIntegral)<Constants.ZERO){
@@ -1536,7 +1611,7 @@
         //鍓╀綑绉垎鍊�
         orderPayConfirmResponse.setSurplusIntegral(totalIntegral);
         //瀹為檯鎶垫墸浣跨敤绉垎
-        orderPayConfirmResponse.setDeductIntegral(totalIntegral.compareTo(maxDeductionCash)<=Constants.ZERO?totalIntegral:maxDeductionIntegral);
+        orderPayConfirmResponse.setDeductIntegral(totalIntegral.compareTo(maxDeductionIntegral)<=Constants.ZERO?totalIntegral:maxDeductionIntegral);
         return realDeductionCash;
 
     }
@@ -1627,10 +1702,11 @@
         this.orderAddShopIntegral(goodsorder);
         //涓嬪崟瀹屾垚 鏍规嵁淇℃伅纭鏄惁闇�瑕佽禒閫侀個璇疯�呬紭鎯犲埜
         this.orderDoneRewardInviteCoupon(goodsorder);
-        //娑堣垂鑰呯‘璁ゆ敹璐�
+        //璧犻�佹秷璐硅�呬笅鍗曠Н鍒�
         this.orderAddMemberIntegral(goodsorder);
         //缁忛攢鍟� 缁撶畻閲戦
         this.orderAddShopCash(goodsorder);
+
     }
 
 
@@ -1669,6 +1745,9 @@
             List<MemberCoupon> memberCouponList = new ArrayList<>();
             List<CouponNoticeRequest> requestList = new ArrayList<>();
             for (JSONObject jsonObject:shareCouponRewardList) {
+                if(!jsonObject.containsKey("couponId")||!jsonObject.containsKey("num")){
+                    continue;
+                }
                 Integer couponId = jsonObject.getInteger("couponId");
                 Integer num = jsonObject.getInteger("num");
                 Coupon coupon =  couponMapper.selectById(couponId);
@@ -1677,24 +1756,32 @@
                 }
                 MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,inviteMember,new Date(),Constants.ONE,null);
                 for (int i = 0; i < num; i++) {
+                    //婊″噺鍗蜂笉浼氱敓鎴恗axPrice 闇�瑕佹牴鎹紭鎯犲埜鍑忓皯閲戦璁剧疆
+                    if(Constants.equalsInteger(coupon.getCouponType(),Constants.ZERO)){
+                        memberCoupon.setMaxPrice(coupon.getPrice());
+                    }
                     memberCouponList.add(memberCoupon);
                 }
                 couponIds = couponIds + (StringUtils.isBlank(couponIds)? ",":"" )+ couponId ;
                 couponNames = couponNames + (StringUtils.isBlank(couponNames)? ",":"" )+ coupon.getName() ;
 
-
                 CouponNoticeRequest couponNoticeRequest = new CouponNoticeRequest();
                 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)
@@ -1739,6 +1826,8 @@
         goodsorder.setStatus(Constants.OrderStatus.DONE.getKey());
         goodsorder.setDoneDate(new Date());
         goodsorderMapper.updateById(goodsorder);
+        //閲婃斁鏍搁攢鐮�
+        this.releaseExchangeCode(goodsorder.getExchangeCode());
         //瀛樺湪鐜伴噾鏀粯 璧犻�� 绉垎
         if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
             //璧犻�佹秷璐硅�呯Н鍒�
@@ -1750,6 +1839,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);
+
     }
 
 
@@ -1775,7 +1873,7 @@
             if(Objects.nonNull(member)){
                 dealIntegralRequest.setParam1(member.getNickname());
             }
-            integralService.dealShopIntegral(dealIntegralRequest);
+            integralService.dealShopIntegral(dealIntegralRequest,null);
         }
     }
 
@@ -1820,7 +1918,7 @@
             dealIntegralRequest.setObjId(goodsorder.getId());
             dealIntegralRequest.setOrderCode(goodsorder.getCode().toString());
             dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.ORDER_DONATE);
-            integralService.dealIntegral(dealIntegralRequest);
+            integralService.dealIntegral(dealIntegralRequest,null);
         }
     }
 
@@ -1873,8 +1971,6 @@
         if(!goodsorder.getStatus().equals(Constants.OrderStatus.DONE.getKey())){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鎿嶄綔澶辫触锛氳鍗曟湭瀹屾垚锛屾棤娉曢��娆撅紒");
         }
-
-
     }
 
 
@@ -2184,4 +2280,61 @@
 
 
 
+    @Override
+    public String createExchangeCode(){
+        List<Goodsorder> goodsorderList = goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda()
+                .eq(Goodsorder::getIsdeleted,Constants.ZERO)
+                .eq(Goodsorder::getReceiveType,Constants.ONE)
+                .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())
+                .ge(Goodsorder::getCreateDate, "DATE_SUB(NOW(), INTERVAL 15 MINUTE)")
+        );
+        if(CollectionUtils.isNotEmpty(goodsorderList)){
+            for (Goodsorder goodsorder:goodsorderList) {
+                this.cancel(goodsorder,null,"璁㈠崟鏈敮浠樿秴鏃惰嚜鍔ㄥ彇娑�");
+            }
+        }
+
+
+
+    }
+
 }

--
Gitblit v1.9.3