From 82203a196fa700adfc379b2b453b2266266c940c Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 15 一月 2026 18:14:25 +0800
Subject: [PATCH] 经销商管理

---
 server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java |  284 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 274 insertions(+), 10 deletions(-)

diff --git a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
index 7b10f17..f2b1bdb 100644
--- a/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
+++ b/server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -11,9 +11,12 @@
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.*;
 import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.dto.MemberCouponAddDTO;
+import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.web.dto.CouponDTO;
 import com.doumee.dao.web.dto.MemberCouponDTO;
 import com.doumee.dao.web.request.PayDetailRequest;
+import com.doumee.dao.web.response.MemberCouponResponse;
 import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse;
 import com.doumee.service.business.MemberCouponService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -24,8 +27,10 @@
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -54,10 +59,152 @@
     private MemberCouponJoinMapper memberCouponJoinMapper;
 
     @Autowired
+    private LabelsMapper labelsMapper;
+
+
+    @Autowired
     private CouponMapper couponMapper;
 
     @Autowired
     private MemberMapper memberMapper;
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public    String addBatch(MemberCouponAddDTO memberCoupon){
+        checkAddBatchParamValid(memberCoupon);
+
+        List<Coupon> couponList = getCouponListByParam(memberCoupon);
+        List<Member> memberList = getMemberListByParam(memberCoupon);
+        List<MemberCoupon>  addList = new ArrayList<>();
+        int index =1;
+        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
+        Date now = new Date();
+        for(Coupon param  : memberCoupon.getAddCouponList()){
+            Coupon  coupon = getCouponFromListById(param.getId(),couponList);
+            if(coupon == null){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗��"+index+"銆戜釜浼樻儬鍒告煡璇㈡棤鏁堬紝璇峰埛鏂伴〉闈㈤噸鏂帮紒");
+            }
+            for(Member member : memberList){
+                for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
+                    //鎸ㄤ釜閫�
+                    addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now));
+                }
+            }
+            index++;
+        }
+        if(addList.size()>0){
+            //鎵归噺鎻掑叆鏁版嵁
+            memberCouponMapper.insert(addList);
+        }
+        return "鎿嶄綔鎴愬姛,鎴愬姛浜哄憳鏁伴噺锛�"+memberList.size()+",鍏卞彂鏀句紭鎯犲埜鏁伴噺锛�"+addList.size();
+
+    }
+
+    private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) {
+        MemberCoupon insert = new MemberCoupon();
+        insert.setCreator(loginUserInfo.getId());
+        insert.setCreateDate(now);
+        insert.setEditor(loginUserInfo.getId());
+        insert.setEditDate(now);
+        insert.setIsdeleted(Constants.ZERO);
+        insert.setRemark("瀹氬悜鍙戞斁");
+        insert.setMemberId(member.getId());
+        insert.setShopId(coupon.getShopId());
+        insert.setType(coupon.getType());
+        insert.setCouponType(coupon.getType());
+        insert.setLimitPrice(coupon.getLimitPrice());
+        insert.setPrice(coupon.getPrice());
+        if(Constants.equalsObject(coupon.getUseType(),Constants.ZERO)){
+            //濡傛灉鏄浐瀹氭椂娈�
+            insert.setStartDate(coupon.getStartDate());
+            insert.setEndDate(coupon.getEndDate());
+        }else{
+            //鍥哄畾鏃堕暱 //鎺ㄨ繜澶╂暟
+            insert.setEndDate(DateUtil.addDaysToDate(now,Constants.formatIntegerNum(coupon.getValidDays())));
+            insert.setStartDate(now);
+        }
+        insert.setGetMethod(Constants.TWO);//瀹氬悜鍙戞斁
+        insert.setIntegral(coupon.getIntegral());
+        insert.setStatus(Constants.ZERO);//鏈娇鐢�
+        insert.setInfo(coupon.getInfo());
+//        insert.setBackIntegral(coupon.getB);
+        insert.setName(coupon.getName());
+        insert.setApplyIds(coupon.getApplyIds());
+        insert.setApplyType(coupon.getApplyType());
+        insert.setCouponId(coupon.getId());
+        return  insert;
+    }
+
+    private Coupon getCouponFromListById(Integer id, List<Coupon> couponList) {
+        for(Coupon c : couponList){
+            if(Constants.equalsObject(id,c.getId())){
+                return c;
+            }
+        }
+        return null;
+    }
+
+
+    private List<Member> getMemberListByParam(MemberCouponAddDTO memberCoupon) {
+        List<Member>  list = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+                .eq(Member::getIsdeleted,Constants.ZERO)
+                .eq(memberCoupon.getAddType() == Constants.ZERO,Member::getId,memberCoupon.getAddMemberIds())
+                .in(memberCoupon.getAddType() == Constants.ONE,Member::getPhone,memberCoupon.getPhones()));
+        if(list == null || list.size()==0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鏈夋晥鐨勭敤鎴蜂俊鎭紒");
+        }
+
+        return list;
+    }
+
+    private List<Coupon> getCouponListByParam(MemberCouponAddDTO memberCoupon) {
+        List<Integer> ids = new ArrayList<>();
+        for(Coupon coupon : memberCoupon.getAddCouponList()){
+            if(coupon.getId() ==null || Constants.formatLongNum(coupon.getNum())==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            ids.add(coupon.getId());
+        }
+        List<Coupon> list =  couponMapper.selectList(new QueryWrapper<Coupon>().lambda()
+                .eq(Coupon::getStatus,Constants.ZERO)
+                .eq(Coupon::getIsdeleted,Constants.ZERO)
+                .in(Coupon::getId,ids));
+
+        if(list == null || list.size()==0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鏈夋晥浼樻儬鍒告暟鎹�,璇峰埛鏂伴〉闈㈤噸璇曪紒");
+        }
+        return  list;
+    }
+
+    private  void checkAddBatchParamValid(MemberCouponAddDTO memberCoupon) {
+        if(memberCoupon.getAddType() == null
+                || memberCoupon.getAddCouponList()==null
+                || memberCoupon.getAddCouponList().size()==0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ZERO)){
+            //鎸囧畾浜哄憳
+            if( memberCoupon.getAddMemberIds() ==null){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+        }else   if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ONE)){
+            //鎸囧畾鎵嬫満鍙�
+            if( StringUtils.isBlank(memberCoupon.getAddMemberPhones())){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            String[] ss =memberCoupon.getAddMemberPhones().replace(" ","").split("\n");
+            if(ss == null ||ss.length==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST);
+            }
+            memberCoupon.setPhones(Arrays.asList(ss));
+
+        }else  if(Constants.equalsObject(memberCoupon.getAddType(),Constants.TWO)){
+            //鍏ㄩ儴浼氬憳
+        }else{
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+    }
+
     @Override
     public Integer create(MemberCoupon memberCoupon) {
         LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
@@ -82,7 +229,6 @@
         if(memberCouponMapper.selectCount(queryWrapper) > Constants.ZERO){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "宸插厬鎹㈣浼樻儬鍒�,鏃犳硶鍏戞崲锛�");
         };
-
         MemberCoupon insert = new MemberCoupon();
         Date now = new Date();
         insert.setCreator(loginUserInfo.getId());
@@ -167,20 +313,41 @@
         IPage<MemberCoupon> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
         MPJLambdaWrapper<MemberCoupon> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
-
         queryWrapper.selectAll(MemberCoupon.class);
+        queryWrapper.selectAs(Member::getPhone,MemberCoupon::getMemberPhone);
         queryWrapper.selectAs(Member::getNickname,MemberCoupon::getNikeName);
-
+        queryWrapper.selectAs(Goodsorder::getCode,MemberCoupon::getOrderCode);
+        queryWrapper.selectAs(Goodsorder::getCouponPrice,MemberCoupon::getCouponPrice);//浼樻儬閲戦
+        queryWrapper.selectAs(SystemUser::getUsername,MemberCoupon::getCreatorName);
         queryWrapper.leftJoin(Member.class,Member::getId,MemberCoupon::getMemberId);
-
+        queryWrapper.leftJoin(Goodsorder.class,Goodsorder::getId,MemberCoupon::getOrderId);
+        queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,MemberCoupon::getCreator);
         queryWrapper.eq(MemberCoupon::getIsdeleted, Constants.ZERO);
-        queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus());
+        if(pageWrap.getModel().getStatus()!=null && pageWrap.getModel().getStatus()!=2){
+            queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus());
+        } else if (pageWrap.getModel().getStatus()!=null && pageWrap.getModel().getStatus()==2) {
+            //鏌ヨ宸茶繃鏈�(鏈娇鐢紝鍒囧凡杩囦簡浣跨敤鏈熼檺锛�
+            queryWrapper.eq( MemberCoupon::getStatus, Constants.ZERO);
+            queryWrapper.lt( MemberCoupon::getEndDate, new Date());
+        }
+        queryWrapper.eq(pageWrap.getModel().getOrderCode()!=null,Goodsorder::getCode, pageWrap.getModel().getOrderCode());
         queryWrapper.eq(pageWrap.getModel().getGetMethod()!=null,MemberCoupon::getGetMethod, pageWrap.getModel().getGetMethod());
         queryWrapper.and(StringUtils.isNotBlank(pageWrap.getModel().getNikeName()),ms -> ms.like( Member::getNickname,  pageWrap.getModel().getNikeName()).
                 or().eq( Member::getName, pageWrap.getModel().getNikeName()).
                 or().eq( Member::getPhone, pageWrap.getModel().getNikeName()));
         queryWrapper.orderByDesc(MemberCoupon::getCreateDate);
         IPage<MemberCoupon> result = memberCouponJoinMapper.selectJoinPage(page, MemberCoupon.class, queryWrapper);
+        if(result!=null && result.getRecords()!=null){
+            for(MemberCoupon model :result.getRecords()){
+                model.setNikeName(StringUtils.defaultString(model.getNikeName(),"")+" "+StringUtils.defaultString(model.getMemberPhone(),""));
+                if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)
+                        && model.getEndDate()!=null
+                        && model.getEndDate().before(new Date())){
+                    //宸茶繃鏈�
+                    model.setStatus(Constants.TWO);
+                }
+            }
+        }
         return PageData.from(result);
     }
 
@@ -202,11 +369,13 @@
      * @return
      */
     @Override
-    public IPage<CouponDTO> memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType) {
-        IPage<CouponDTO> page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper<CouponDTO>()
+    public IPage<MemberCouponResponse> memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType,Integer status) {
+        IPage<MemberCouponResponse> page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper<MemberCouponResponse>()
                 .eq("m.MEMBER_ID",memberId)
                 .eq("m.TYPE",Constants.ONE)
-                .eq("m.STATUS",Constants.ZERO)
+                .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.ZERO),"m.STATUS = 0 and m.END_DATE >= now()" )
+                .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.ONE),"m.STATUS = 1" )
+                .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.TWO),"m.STATUS = 0 and  m.END_DATE < now() " )
                 .eq("TYPE",couponType)
                 .apply(!Objects.isNull(price)," m.LIMIT_PRICE >= "+price+" ")
                 .apply("   now() between m.START_DATE and m.END_DATE ")
@@ -216,6 +385,36 @@
     }
 
 
+    @Override
+    public MemberCouponResponse getMemberCouponDetail(Integer id){
+        MemberCoupon memberCoupon = memberCouponJoinMapper.selectById(id);
+        if(Objects.isNull(memberCoupon)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        MemberCouponResponse memberCouponResponse = new MemberCouponResponse();
+        BeanUtils.copyProperties(memberCoupon,memberCouponResponse);
+        if(StringUtils.isNotBlank(memberCouponResponse.getApplyIds())){
+            if(Constants.equalsInteger(memberCouponResponse.getApplyType(),Constants.ONE)){
+                List<Labels> labelsList = labelsMapper.selectList(new QueryWrapper<Labels>().lambda()
+                        .eq(Labels::getIsdeleted,Constants.ZERO)
+                        .eq(Labels::getType,Constants.LabelsType.GOODSTYPE.getKey())
+                        .apply(" find_in_set( id , '"+memberCouponResponse.getApplyIds()+"'  ) ")
+                );
+                if(CollectionUtils.isNotEmpty(labelsList)){
+                    memberCouponResponse.setRelationInfoList(labelsList.stream().map(i->i.getName()).collect(Collectors.toList()));
+                }
+            }else if(Constants.equalsInteger(memberCouponResponse.getApplyType(),Constants.TWO)){
+                List<Goods> labelsList = goodsMapper.selectList(new QueryWrapper<Goods>().lambda()
+                        .eq(Goods::getIsdeleted,Constants.ZERO)
+                        .apply(" find_in_set( id , '"+memberCouponResponse.getApplyIds()+"'  ) ")
+                );
+                if(CollectionUtils.isNotEmpty(labelsList)){
+                    memberCouponResponse.setRelationInfoList(labelsList.stream().map(i->i.getName()).collect(Collectors.toList()));
+                }
+            }
+        }
+        return memberCouponResponse;
+    }
 
 
 
@@ -340,7 +539,6 @@
         if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅閿欒,璇峰埛鏂伴噸璇�");
         }
-
         //鏌ヨ鍟嗗搧鍒楄〃
         List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
                 new MPJLambdaWrapper<Goods>()
@@ -352,7 +550,6 @@
         if(Objects.isNull(goodsList)){
             return memberCouponList;
         }
-
         //鑾峰彇閫夋嫨鐨勫晢鍝佹�婚噾棰� 涓� 鍗曚釜鍟嗗搧閲戦
         BigDecimal totalAmount = BigDecimal.ZERO;
         for (Goods goods:goodsList) {
@@ -398,6 +595,73 @@
     }
 
 
+    public void  couponIsValid(List<PayDetailRequest> requestList,MemberCoupon memberCoupon){
+        if(Objects.isNull(memberCoupon)
+            || Constants.equalsInteger(memberCoupon.getStatus(),Constants.ONE)
+        ){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浼樻儬鍒镐俊鎭棤鏁堟垨宸茶浣跨敤");
+        }
+        if(memberCoupon.getStartDate().getTime() > System.currentTimeMillis()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浼樻儬鍒告湭鐢熸晥");
+        }
+        if(memberCoupon.getEndDate().getTime() < System.currentTimeMillis()){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浼樻儬鍒稿凡杩囨湡");
+        }
+        List<GoodsSku> goodsSkuList = goodsSkuMapper.selectList(new QueryWrapper<GoodsSku>()
+                .lambda()
+                .eq(GoodsSku::getIsdeleted,Constants.ZERO)
+                .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList()))
+        );
+        if(CollectionUtils.isEmpty(goodsSkuList)||!Constants.equalsInteger(goodsSkuList.size(),requestList.size())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+        }
+        //鏌ヨ鍟嗗搧鍒楄〃
+        List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
+                new MPJLambdaWrapper<Goods>()
+                        .selectAs(GoodsSku::getPrice,Goods::getSkuPrice)
+                        .selectAs(GoodsSku::getId,Goods::getSkuId)
+                        .leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId)
+                        .in(GoodsSku::getId,requestList.stream().map(i->i.getGoodsSkuId()).collect(Collectors.toList())));
+        if(Objects.isNull(goodsList)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU鍟嗗搧淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+        }
+        //鑾峰彇閫夋嫨鐨勫晢鍝佹�婚噾棰� 涓� 鍗曚釜鍟嗗搧閲戦
+        BigDecimal totalAmount = BigDecimal.ZERO;
+        for (Goods goods:goodsList) {
+            List<PayDetailRequest> request = requestList.stream().filter(i->Constants.equalsInteger(i.getGoodsSkuId(), goods.getSkuId())).collect(Collectors.toList());
+            if(CollectionUtils.isNotEmpty(request)){
+                goods.setSkuAmount(goods.getSkuPrice().multiply(new BigDecimal(request.get(Constants.ZERO).getGoodsNum()+"")));
+                totalAmount = totalAmount.add(goods.getSkuAmount());
+            }
+        }
+        List<OrderGoodsCalculateResponse> goodsCalculateList = ListUtil.copyProperties(goodsList,OrderGoodsCalculateResponse::new);
+        if(totalAmount.compareTo(memberCoupon.getLimitPrice())<Constants.ZERO){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠鍟嗗搧閲戦鏈弧瓒冲彲浣跨敤闂ㄦ");
+        }
+        //閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
+        if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){
+            memberCoupon.setValidAmount(memberCoupon.getPrice());
+        }else{
+            List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(","));
+            //鑾峰彇鏈夋晥鍙互浣跨敤浼樻儬鍒哥殑鏁版嵁
+            isVaildUse(applyIdList,goodsCalculateList,
+                    Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+            BigDecimal skuAmount = goodsCalculateList.stream().filter(i->i.getUseCoupon()).map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
+            if(skuAmount.compareTo(memberCoupon.getLimitPrice())>=Constants.ZERO){
+                //鏍规嵁閲戦璁$畻瀹為檯鎶樻墸閲戦
+                BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("100"),2, RoundingMode.HALF_UP);
+                //鎶樻墸閲戦澶т簬鏈�澶у彲鎶樻墸閲戦  鍒欎娇鐢ㄦ渶澶у彲鎶樻墸閲戦
+                memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice);
+            }
+        }
+    }
+
+
+
+
+
+
+
     /**
      * 璁$畻褰撳墠宸查�夋嫨浼樻儬鍒告瘡涓晢鍝佸崰姣旈噾棰�
      * @param coupon 浼樻儬鍒镐俊鎭�

--
Gitblit v1.9.3