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/IntegralServiceImpl.java |  444 ++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 324 insertions(+), 120 deletions(-)

diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
index 5cf3eb0..abb185f 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/IntegralServiceImpl.java
@@ -7,15 +7,11 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.IntegralMapper;
-import com.doumee.dao.business.MemberMapper;
-import com.doumee.dao.business.ShopMapper;
+import com.doumee.dao.business.*;
 import com.doumee.dao.business.join.IntegralJoinMapper;
-import com.doumee.dao.business.model.Fund;
-import com.doumee.dao.business.model.Integral;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.business.model.Shop;
+import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.model.SystemDictData;
 import com.doumee.dao.web.dto.IntegralDTO;
 import com.doumee.dao.web.dto.IntegralRecordDTO;
@@ -38,10 +34,7 @@
 
 import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -69,7 +62,16 @@
     private ShopMapper shopMapper;
 
     @Autowired
+    private WithdrawRecordMapper withdrawRecordMapper;
+
+    @Autowired
+    private GoodsorderMapper goodsorderMapper;
+
+    @Autowired
     private NoticeService noticeService;
+
+    @Autowired
+    private NoticeMapper noticeMapper;
 
     @Transactional(rollbackFor = {Exception.class, BusinessException.class})
     @Override
@@ -144,8 +146,10 @@
 
     @Override
     @Transactional(rollbackFor = {Exception.class, BusinessException.class})
-    public Integer dealIntegral(DealIntegralRequest dealIntegralRequest) {
-        Member member = memberMapper.selectById(dealIntegralRequest.getMemberId());
+    public Integer dealIntegral(DealIntegralRequest dealIntegralRequest,Member member) {
+        if(member == null){
+              member = memberMapper.selectById(dealIntegralRequest.getMemberId());
+        }
         if(Objects.isNull(member)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐢ㄦ埛淇℃伅");
         }
@@ -156,40 +160,42 @@
         integral.setIsdeleted(Constants.ZERO);
         integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
         String info = dealIntegralRequest.getIntegralObjType().getNoteinfo();
-        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().toString());
+        info = info.replace("${param}",dealIntegralRequest.getIntegralNum().intValue()+"");
         if(StringUtils.isNotBlank(dealIntegralRequest.getParam1())){
             info = info .replace("${param1}",dealIntegralRequest.getParam1());
         }
         integral.setContent(info);
+        integral.setRemark(dealIntegralRequest.getRemark());
         integral.setObjId(dealIntegralRequest.getObjId());
         integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
         integral.setType(dealIntegralRequest.getDealType());
         integral.setNum(dealIntegralRequest.getIntegralNum());
-        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? member.getIntegral().add(integral.getNum()):member.getIntegral().subtract(integral.getNum()));
+        integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? Objects.nonNull(member.getIntegral())?member.getIntegral():BigDecimal.ZERO.add(integral.getNum()):Objects.nonNull(member.getIntegral())?member.getIntegral():BigDecimal.ZERO.subtract(integral.getNum()));
         integral.setOrderCode(dealIntegralRequest.getOrderCode());
         integral.setUserType(Constants.ZERO);
         integralMapper.insert(integral);
-        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
-            memberMapper.addIntegral(member.getId(),dealIntegralRequest.getIntegralNum(),
-                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
-        }else{
-            memberMapper.subtractIntegral(member.getId(),dealIntegralRequest.getIntegralNum());
-        }
+        LoginUserInfo user = dealIntegralRequest.getUser();
+        memberMapper.update(null,new UpdateWrapper<Member>().lambda()
+                .eq(Member::getId,member.getId())
+                .set(Member::getEditDate,new Date())
+                .set(Member::getEditor,user!=null ? user.getId():null)
+                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//绱澧炲姞
+                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
+                .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
 
         //绔欏唴淇�
         noticeService.saveMemberIntegralNotice(
-                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,member.getId(),dealIntegralRequest.getIntegralNum(),
+                dealIntegralRequest.getIntegralObjType(),Constants.ONE,member.getId(),dealIntegralRequest.getIntegralNum(),
                 integral.getId(), info
         );
-
-
         return integral.getId();
     }
 
     @Override
-    @Transactional(rollbackFor = {Exception.class, BusinessException.class})
-    public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest) {
-        Shop shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
+    public Integer dealShopIntegral(DealIntegralRequest dealIntegralRequest,Shop shop) {
+        if(shop ==null){
+            shop = shopMapper.selectById(dealIntegralRequest.getMemberId());
+        }
         if(Objects.isNull(shop)){
             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鍟嗘埛淇℃伅");
         }
@@ -197,7 +203,7 @@
         integral.setMemberId(shop.getId());
         integral.setCreateDate(new Date());
         integral.setIsdeleted(Constants.ZERO);
-        integral.setTitle(dealIntegralRequest.getIntegralObjType().getName());
+        integral.setTitle( dealIntegralRequest.getIntegralObjType()!=null?dealIntegralRequest.getIntegralObjType().getName():"");
         String info = dealIntegralRequest.getIntegralObjType().getNoteinfo();
         info = info.replace("${param}",dealIntegralRequest.getIntegralNum().toString());
         if(StringUtils.isNotBlank(dealIntegralRequest.getParam1())){
@@ -207,25 +213,27 @@
         integral.setObjId(dealIntegralRequest.getObjId());
         integral.setObjType(dealIntegralRequest.getIntegralObjType().getKey());
         integral.setType(dealIntegralRequest.getDealType());
+        integral.setRemark(dealIntegralRequest.getRemark());
         integral.setNum(dealIntegralRequest.getIntegralNum());
+        shop.setIntegral(Constants.formatBigdecimal(shop.getIntegral()));
         integral.setTotalNum(dealIntegralRequest.getDealType().equals(Constants.ZERO)? shop.getIntegral().add(integral.getNum()):shop.getIntegral().subtract(integral.getNum()));
         integral.setOrderCode(dealIntegralRequest.getOrderCode());
         integral.setUserType(Constants.ONE);
         integralMapper.insert(integral);
-        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
 
-            shopMapper.addIntegral(shop.getId(),dealIntegralRequest.getIntegralNum(),
-                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
-        }else{
+        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
+                    .eq(Shop::getId,shop.getId())
+                    .set(Shop::getEditDate,new Date())
+                    .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//绱澧炲姞
+                    .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
+                    .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
 
-            shopMapper.subtractIntegral(shop.getId(),dealIntegralRequest.getIntegralNum());
-        }
 
-        //绔欏唴淇�
-        noticeService.saveMemberIntegralNotice(
-                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
-                integral.getId(), info
-        );
+//        //绔欏唴淇�
+//        noticeService.saveMemberIntegralNotice(
+//                dealIntegralRequest.getIntegralObjType(),Constants.ZERO,shop.getId(),dealIntegralRequest.getIntegralNum(),
+//                integral.getId(), info
+//        );
         return integral.getId();
     }
 
@@ -256,12 +264,13 @@
         integral.setOrderCode(dealIntegralRequest.getOrderCode());
         integral.setUserType(Constants.TWO);
         integralMapper.insert(integral);
-        if(dealIntegralRequest.getDealType().equals(Constants.ZERO)){
-            shopMapper.addAmount(shop.getId(),dealIntegralRequest.getIntegralNum(),
-                    dealIntegralRequest.getIntegralObjType().getAddTitle()==Constants.ZERO?dealIntegralRequest.getIntegralNum():BigDecimal.ZERO);
-        }else{
-            shopMapper.subtractAmount(shop.getId(),dealIntegralRequest.getIntegralNum());
-        }
+
+        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
+                .eq(Shop::getId,shop.getId())
+                .set(Shop::getEditDate,new Date())
+                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"total_integral = ifnull(total_integral,0)+" + dealIntegralRequest.getIntegralNum())//绱澧炲姞
+                .setSql(dealIntegralRequest.getDealType().equals(Constants.ZERO),"integral = ifnull(integral,0)+" +  dealIntegralRequest.getIntegralNum())
+                .setSql(dealIntegralRequest.getDealType().equals(Constants.ONE),"integral = ifnull(integral,0)-" + dealIntegralRequest.getIntegralNum()));
         return integral.getId();
     }
 
@@ -445,6 +454,10 @@
                 .lambda()
                 .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
                 .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
+                .eq(Objects.nonNull(model.getObjType()),Integral::getObjType,model.getObjType())
+                .ge(Objects.nonNull(model.getStartDate()),Integral::getCreateDate,  model.getStartDate()+" 00:00:00")
+                .le(Objects.nonNull(model.getEndDate()),Integral::getCreateDate,  model.getEndDate()+" 23:59:59")
+                .eq(Objects.nonNull(model.getObjType()),Integral::getObjType,model.getObjType())
                 .eq(Integral::getMemberId,model.getMemberId())
                 .orderByDesc(Integral::getCreateDate)
         );
@@ -452,9 +465,46 @@
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(result.getRecords())){
             for (Integral integral:result.getRecords()) {
                 integral.setStrObjType(Constants.IntegralObjType.getName(integral.getObjType()));
+                //浣欓鎻愮幇 鍏宠仈 鎻愮幇璁板綍
+                if(Constants.equalsInteger(integral.getObjType(),Constants.IntegralObjType.WITHDRAW_APPLY.getKey())){
+                    WithdrawRecord withdrawRecord = withdrawRecordMapper.selectById(integral.getObjId());
+                    if(Objects.nonNull(withdrawRecord)){
+                        integral.setWithdrawStatus(withdrawRecord.getStatus());
+                    }
+                }
             }
         }
-        return PageData.from(result);
+        PageData<Integral> rr =  PageData.from(result);
+        if(pageWrap.getPage() == 1  && Constants.equalsInteger(model.getUserType(),Constants.TWO)){
+            //濡傛灉鏌ヨ绗竴椤碉紝鍋氭暟鎹粺璁�
+            rr.setCountData(dealCountIntegralNum(pageWrap));
+        }
+
+        return rr;
+    }
+
+    private Integral dealCountIntegralNum(PageWrap<IntegralRecordDTO> pageWrap) {
+        IntegralRecordDTO model = pageWrap.getModel();
+        List<Integral> result = integralMapper.selectList(new QueryWrapper<Integral>()
+                .lambda()
+                .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
+                .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
+                .eq(Objects.nonNull(model.getObjType()),Integral::getObjType,model.getObjType())
+                .ge(Objects.nonNull(model.getStartDate()),Integral::getCreateDate,  model.getStartDate()+" 00:00:00")
+                .le(Objects.nonNull(model.getEndDate()),Integral::getCreateDate,  model.getEndDate()+" 23:59:59")
+                .eq(Objects.nonNull(model.getObjType()),Integral::getObjType,model.getObjType())
+                .eq(Integral::getMemberId,model.getMemberId())
+                .orderByDesc(Integral::getCreateDate)
+        );
+        Integral integral = new Integral();
+        integral.setInAmount(BigDecimal.ZERO);
+        integral.setOutAmount(BigDecimal.ZERO);
+        if(CollectionUtils.isEmpty( result)){
+            return integral;
+        }
+        integral.setInAmount(result.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ZERO)).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        integral.setOutAmount(result.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        return integral;
     }
 
     @Override
@@ -468,9 +518,13 @@
         }
         LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
 
-        Date date = new Date();
-        Integral integral = new Integral();
+//        Date date = new Date();
+//        Integral integral = new Integral();
         Constants.IntegralObjType integralObjType =null;
+        DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
+        dealIntegralRequest.setIntegralNum(param.getNum());
+        dealIntegralRequest.setRemark(param.getRemark());
+        dealIntegralRequest.setDealType(param.getType());
         if(Constants.equalsInteger(param.getUserType(), Constants.ZERO)){//鐢ㄦ埛璐﹀彿
             MPJLambdaWrapper<Member> queryWrapper =new MPJLambdaWrapper<>();
             queryWrapper.selectAll(Member.class);
@@ -489,28 +543,12 @@
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢ㄦ埛璐︽埛浣欓涓嶈冻锛�");
             }
             integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
-            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
-            dealIntegralRequest.setIntegralNum(num);
-            dealIntegralRequest.setDealType(param.getType());
             dealIntegralRequest.setMemberId(model.getId());
-            dealIntegralRequest.setObjId(null);
-            dealIntegralRequest.setOrderCode(null);
+            dealIntegralRequest.setRemark(param.getRemark());
             dealIntegralRequest.setIntegralObjType(integralObjType);
-            this.dealIntegral(dealIntegralRequest);
+            dealIntegralRequest.setUser(user);
+            this.dealIntegral(dealIntegralRequest,model);
 
-
-            //璐︽埛浣欓
-//            memberMapper.update(null,new UpdateWrapper<Member>().lambda()
-//                    .eq(Member::getId,model.getId())
-//                    .set(Member::getEditDate,date)
-//                    .set(Member::getEditor,user.getId())
-//                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//绱澧炲姞
-//                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
-//                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
-//
-//            integralObjType = param.getType()==0?Constants.IntegralObjType.SYSTEM_RECHARGE:Constants.IntegralObjType.SYSTEM_DEDUCT;
-//            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
-//            integral.setUserType(Constants.ZERO);
         }else{//缁忛攢鍟嗚处鎴�
             Shop model = shopMapper.selectById(param.getMemberId());
             if(model == null ||Constants.equalsObject(model.getIsdeleted(),Constants.ONE)){
@@ -522,42 +560,15 @@
 //                num = num.multiply(new BigDecimal(-1));//鍑忓皯
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"缁忛攢鍟嗚处鎴风Н鍒嗕綑棰濅笉瓒筹紒");
             }
-            //璐︽埛浣欓
-//            shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
-//                    .eq(Shop::getId,model.getId())
-//                    .set(Shop::getEditDate,date)
-//                    .set(Shop::getEditor,user.getId())
-//                    .setSql(param.getType() == 0,"total_integral = ifnull(total_integral,0)+" + num)//绱澧炲姞
-//                    .setSql(param.getType() == 0,"integral = ifnull(integral,0)+" + param.getNum())
-//                    .setSql(param.getType() == 1,"integral = ifnull(integral,0)-" + param.getNum()));
-//            integralObjType = param.getType()==0?Constants.IntegralObjType.SHOP_SYSTEM_RECHARGE:Constants.IntegralObjType.SHOP_SYSTEM_DEDUCT;
-//            integral.setTotalNum(param.getType() == 0? Constants.formatBigdecimal(model.getIntegral()).add(param.getNum()):Constants.formatBigdecimal(model.getIntegral()).subtract(param.getNum()));
-//            integral.setUserType(Constants.ONE);
 
-            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
-            dealIntegralRequest.setIntegralNum(num);
-            dealIntegralRequest.setDealType(param.getType());
+            integralObjType = param.getType()==0?Constants.IntegralObjType.SHOP_SYSTEM_RECHARGE:Constants.IntegralObjType.SHOP_SYSTEM_DEDUCT;
             dealIntegralRequest.setMemberId(model.getId());
-            dealIntegralRequest.setObjId(null);
-            dealIntegralRequest.setOrderCode(null);
             dealIntegralRequest.setIntegralObjType(integralObjType);
-            this.dealShopIntegral(dealIntegralRequest);
+            this.dealShopIntegral(dealIntegralRequest,model);
 
 
         }
-//        integral.setCreateDate(new Date());
-//        integral.setCreator(user.getId());
-//        integral.setIsdeleted(Constants.ZERO);
-//        integral.setNum(param.getNum());
-//        integral.setTitle(integralObjType.getName());
-//        integral.setContent(integralObjType.getNoteinfo().replace("${param}",integral.getNum().toString()));
-//        integral.setMemberId(param.getMemberId());
-//        integral.setObjId(param.getMemberId());
-//        integral.setObjType(integralObjType.getKey());
-//        integral.setType(param.getType());
-//        integral.setRemark(param.getRemark());
-//        integral.setOrderCode(null);
-//        integralMapper.insert(integral);
+
     }
     @Override
     public IntegralDataResponse getIntegralData(IntegralRecordDTO model){
@@ -569,38 +580,88 @@
         IntegralDataResponse integralDataResponse = new IntegralDataResponse();
         integralDataResponse.setSurplusIntegral(BigDecimal.ZERO);
         integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
+        //鐢ㄦ埛绉垎
+        if(Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
+            Member member = memberMapper.selectById(model.getMemberId());
+            integralDataResponse.setSurplusIntegral(member.getIntegral());
+        }else{
+            //鍟嗘埛绉垎/浣欓
+            Shop shop = shopMapper.selectById(model.getMemberId());
+            if (Objects.nonNull(shop)) {
+                integralDataResponse.setSurplusIntegral(
+                        Constants.equalsInteger(model.getUserType(),Constants.TWO)?shop.getAmount():shop.getIntegral());
+            }
+        }
         List<Integral> list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
                 .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
-//                .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
                 .eq(Integral::getMemberId,model.getMemberId())
                 .orderByDesc(Integral::getCreateDate));
 
         if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(list)){
-            integralDataResponse.setSurplusIntegral(
-                    list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
-                    ).reduce(BigDecimal.ZERO, BigDecimal::add)
-            );
+            //鎻愮幇涓氬姟鏁版嵁
+            if(Constants.equalsInteger(model.getUserType(),Constants.TWO)){
+                integralDataResponse.setWithdrawAmount(
+                        withdrawRecordMapper.selectList(new QueryWrapper<WithdrawRecord>().lambda()
+                                .eq(WithdrawRecord::getMemberId,model.getMemberId())
+                                .eq(WithdrawRecord::getStatus,Constants.ONE)
+                        ).stream().map(WithdrawRecord::getAmount)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                );
+                integralDataResponse.setWithdrawIngAmount(
+                        withdrawRecordMapper.selectList(new QueryWrapper<WithdrawRecord>().lambda()
+                                        .eq(WithdrawRecord::getMemberId,model.getMemberId())
+                                        .eq(WithdrawRecord::getStatus,Constants.ZERO)
+                                ).stream().map(WithdrawRecord::getAmount)
+                                .reduce(BigDecimal.ZERO, BigDecimal::add)
+                );
+                integralDataResponse.setWaitPayAmount(
+                        goodsorderMapper.selectList(new QueryWrapper<Goodsorder>().lambda()
+                                .eq(Goodsorder::getDistributionShopId,model.getMemberId())
+                                .in(Goodsorder::getStatus,Constants.OrderStatus.WAIT_PAY.getKey(),
+                                        Constants.OrderStatus.PAY_DONE.getKey(),
+                                        Constants.OrderStatus.WAIT_RECEIVE.getKey())
+                        ).stream().map(Goodsorder::getShopSettlement)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add)
+                );
+            }
+            if(Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
+                //绉垎澶辨晥鏂瑰紡 0闀挎湡鏈夋晥 1鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
+                Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
+                //娑堣垂鑰呯Н鍒� 闇�瑕佹煡璇㈠嵆灏嗚繃鏈熺Н鍒�
+                if(Constants.equalsInteger(type,Constants.ONE)&& Constants.equalsInteger(model.getUserType(),Constants.ZERO)){
+                    Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
+                    if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
+                        List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                                .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                                .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                                .eq(Integral::getMemberId,model.getMemberId())
+                                // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                                .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                                .orderByAsc(Integral::getCreateDate));
 
-            //绉垎澶辨晥鏂瑰紡 0闀挎湡鏈夋晥 1鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
-            Integer type  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
-            //娑堣垂鑰呯Н鍒� 闇�瑕佹煡璇㈠嵆灏嗚繃鏈熺Н鍒�
-            if(Constants.equalsInteger(type,Constants.ONE)){
-                Integer validYear  = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
-                if(validYear.compareTo(Constants.ZERO)>Constants.ZERO){
-                     list = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
-                            .eq(Objects.nonNull(model.getUserType()),Integral::getUserType,model.getUserType())
-                            .eq(Objects.nonNull(model.getType()),Integral::getType,model.getType())
-                            .eq(Integral::getMemberId,model.getMemberId())
-                             .apply(" CREATE_DATE >= DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL "+(validYear*12)+1+" MONTH) ")
-                            .orderByDesc(Integral::getCreateDate));
-                    BigDecimal newIntegral = list.stream().map(i->i.getNum().multiply(new BigDecimal(i.getType().toString()))
-                    ).reduce(BigDecimal.ZERO, BigDecimal::add);
-                    integralDataResponse.setExpiredIntegral(
-                            integralDataResponse.getSurplusIntegral().compareTo(newIntegral)>Constants.ZERO?integralDataResponse.getSurplusIntegral().subtract(newIntegral):BigDecimal.ZERO
-                    );
+
+                        //鏌ヨ杩囨湡鏃ユ湡鍚庣殑娑堣�楃Н鍒�
+                        List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                                .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                                .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                                .eq(Integral::getType, Constants.ONE) // 浣跨敤鐨勭Н鍒�
+                                .eq(Integral::getMemberId,model.getMemberId())
+                                // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                                .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                                .orderByAsc(Integral::getCreateDate));
+                        BigDecimal totalExpiredNum = expiredIntegrals.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+
+                        BigDecimal afterUseIntegral = useIntegrals.stream().map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+
+                        if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
+                            integralDataResponse.setExpiredIntegral(BigDecimal.ZERO);
+                        }else{
+                            integralDataResponse.setExpiredIntegral(totalExpiredNum.subtract(afterUseIntegral));
+                        }
+
+                    }
                 }
             }
-
         }
         String info  = systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALRULEINFO).getCode();
         integralDataResponse.setInfo(info);
@@ -609,7 +670,150 @@
     }
 
 
+    /**
+     * 绉垎杩囨湡澶勭悊(瀹氭椂浠诲姟)
+     */
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public void expiredIntegral() {
+        // 绉垎澶辨晥鏂瑰紡 0 闀挎湡鏈夋晥 1 鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
+        Integer type = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
+        // 鍙湁閰嶇疆涓烘寜鏃堕棿澶辨晥鏃舵墠鎵ц
+        if (Constants.equalsInteger(type, Constants.ONE)) {
+            Integer validYear = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
 
+            if (validYear != null && validYear.compareTo(Constants.ZERO) > 0) {
+                // 鏌ヨ鎵�鏈夐渶瑕佸鐞嗙殑鐢ㄦ埛绉垎璁板綍
+                // 鏌ヨ鎵�鏈夊凡杩囨湡浣嗚繕鏈鐞嗙殑绉垎璁板綍
+                List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+
+                //鏌ヨ杩囨湡鏃ユ湡鍚庣殑娑堣�楃Н鍒�
+                List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        .eq(Integral::getType, Constants.ONE) // 浣跨敤鐨勭Н鍒�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+                if (CollectionUtils.isEmpty(expiredIntegrals)) {
+                    return;
+                }
+                // 鎸変細鍛樺垎缁勭粺璁¤繃鏈熺Н鍒�
+                Map<Integer, List<Integral>> memberIntegralMap = expiredIntegrals.stream()
+                        .collect(Collectors.groupingBy(Integral::getMemberId));
+                // 閬嶅巻姣忎釜鐢ㄦ埛鐨勮繃鏈熺Н鍒嗚繘琛屽鐞�
+                for (Map.Entry<Integer, List<Integral>> entry : memberIntegralMap.entrySet()) {
+                    Integer memberId = entry.getKey();
+                    List<Integral> integrals = entry.getValue();
+                    // 缁熻璇ョ敤鎴风殑鎬昏繃鏈熺Н鍒�
+                    BigDecimal totalExpiredNum = integrals.stream()
+                            .map(Integral::getNum)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+                    if (totalExpiredNum.compareTo(BigDecimal.ZERO) <= 0) {
+                        continue;
+                    }
+                    // 鏌ヨ鐢ㄦ埛褰撳墠绉垎
+                    Member member = memberMapper.selectById(memberId);
+                    if (member == null || member.getIsdeleted() == Constants.ONE) {
+                        continue;
+                    }
+
+                    BigDecimal afterUseIntegral = useIntegrals.stream().filter(i->Constants.equalsInteger(memberId,i.getMemberId())).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+                    if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
+                        continue;
+                    }
+                    DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
+                    dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.MEMBER_YEAR_SETTLEMENT);
+                    dealIntegralRequest.setIntegralNum(totalExpiredNum.subtract(afterUseIntegral));
+                    dealIntegralRequest.setMemberId(memberId);
+                    dealIntegralRequest.setDealType(Constants.ONE);
+                    this.dealIntegral(dealIntegralRequest,member);
+                }
+            }
+        }
+    }
+
+
+
+    /**
+     * 绉垎鍗冲皢杩囨湡閫氱煡
+     */
+    @Override
+    public void expiredIntegralNotice() {
+        // 绉垎澶辨晥鏂瑰紡 0 闀挎湡鏈夋晥 1 鎸夌Н鍒嗕骇鐢熸椂闂村け鏁�
+        Integer type = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDTYPE).getCode());
+        // 鍙湁閰嶇疆涓烘寜鏃堕棿澶辨晥鏃舵墠鎵ц
+        if (Constants.equalsInteger(type, Constants.ONE)) {
+            Integer validYear = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.INTEGRAL_SET, Constants.INTERALSET_INTEGRALINVALIDCIRCLE).getCode());
+
+            if (validYear != null && validYear.compareTo(Constants.ZERO) > 0) {
+                // 鏌ヨ鎵�鏈夐渶瑕佸鐞嗙殑鐢ㄦ埛绉垎璁板綍
+                // 鏌ヨ鎵�鏈夊凡杩囨湡浣嗚繕鏈鐞嗙殑绉垎璁板綍
+                List<Integral> expiredIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date < ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+                //鏌ヨ杩囨湡鏃ユ湡鍚庣殑娑堣�楃Н鍒�
+                List<Integral> useIntegrals = integralMapper.selectList(new QueryWrapper<Integral>().lambda()
+                        .eq(Integral::getUserType, Constants.ZERO)  // 娑堣垂鑰呯Н鍒�
+                        .eq(Integral::getIsdeleted, Constants.ZERO) // 鏈垹闄�
+                        .eq(Integral::getType, Constants.ONE) // 浣跨敤鐨勭Н鍒�
+                        // 鏌ユ壘瓒呰繃鏈夋晥鏈熺殑绉垎锛堝垱寤烘棩鏈熸棭浜庡綋鍓嶆棩鏈熷噺鍘绘湁鏁堝勾闄愶級
+                        .apply(  " create_date >= ( DATE_SUB(DATE_FORMAT(CURDATE(), '%Y-%m-01'),INTERVAL " + ((validYear * 12) + 1) + " MONTH) ) ")    // 宸茶繃鏈�
+                        .orderByAsc(Integral::getCreateDate));
+
+                if (CollectionUtils.isEmpty(expiredIntegrals)) {
+                    return;
+                }
+                // 鎸変細鍛樺垎缁勭粺璁¤繃鏈熺Н鍒�
+                Map<Integer, List<Integral>> memberIntegralMap = expiredIntegrals.stream()
+                        .collect(Collectors.groupingBy(Integral::getMemberId));
+                // 閬嶅巻姣忎釜鐢ㄦ埛鐨勮繃鏈熺Н鍒嗚繘琛屽鐞�
+                for (Map.Entry<Integer, List<Integral>> entry : memberIntegralMap.entrySet()) {
+                    Integer memberId = entry.getKey();
+                    List<Integral> integrals = entry.getValue();
+                    // 缁熻璇ョ敤鎴风殑鎬昏繃鏈熺Н鍒�
+                    BigDecimal totalExpiredNum = integrals.stream()
+                            .map(Integral::getNum)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+                    BigDecimal afterUseIntegral = useIntegrals.stream().filter(i->Constants.equalsInteger(memberId,i.getMemberId())).map(i->i.getNum()).reduce(BigDecimal.ZERO,BigDecimal::add);
+
+                    if (totalExpiredNum.compareTo(BigDecimal.ZERO) <= 0) {
+                        continue;
+                    }
+                    // 鏌ヨ鐢ㄦ埛褰撳墠绉垎
+                    Member member = memberMapper.selectById(memberId);
+                    if (member == null || member.getIsdeleted() == Constants.ONE) {
+                        continue;
+                    }
+                    if(afterUseIntegral.compareTo(totalExpiredNum)>=Constants.ZERO){
+                        continue;
+                    }
+                    //鍙戦�佸彂璐х珯鍐呬俊
+                    Notice notice = Notice.getNotice(
+                            Constants.NoticeType.EXPIRE_INTEGRAL,
+                            memberId,
+                            null
+                    );
+                    notice.setContent(notice.getContent().replace("{param}", totalExpiredNum.subtract(afterUseIntegral).intValue()+""));
+                    noticeMapper.insert(notice);
+
+                }
+
+            }
+        }
+    }
 
 
 }

--
Gitblit v1.9.3