From bdf04af3958fb7a61f3180aa1efb795ba8ac00d2 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 08 九月 2025 15:28:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java      |   82 ++++++++++++++++++--
 framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java |   15 +++
 lmk-job/src/main/java/cn/lili/job/MemberJob.java                                     |   98 ++++++++++++++++++++++++
 framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java         |    2 
 4 files changed, 189 insertions(+), 8 deletions(-)

diff --git a/buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java
index a6d4674..e9b092e 100644
--- a/buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/promotion/CouponBuyerController.java
@@ -6,6 +6,7 @@
 import cn.lili.common.security.context.UserContext;
 import cn.lili.common.vo.PageVO;
 import cn.lili.common.vo.ResultMessage;
+import cn.lili.modules.promotion.entity.dos.Coupon;
 import cn.lili.modules.promotion.entity.dos.MemberCoupon;
 import cn.lili.modules.promotion.entity.dto.CouponActivityTrigger;
 import cn.lili.modules.promotion.entity.dto.search.CouponSearchParams;
@@ -18,10 +19,13 @@
 import cn.lili.modules.promotion.service.CouponService;
 import cn.lili.modules.promotion.service.MemberCouponService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -86,22 +90,62 @@
     @GetMapping
     @ApiOperation(value = "鑾峰彇鍙鍙栦紭鎯犲埜鍒楄〃")
     public ResultMessage<IPage<CouponVO>> getCouponList(CouponSearchParams queryParam, PageVO page) {
-        System.out.println("------------------------------------");
         System.out.println(queryParam);
         queryParam.setPromotionStatus(PromotionsStatusEnum.START.name());
         queryParam.setGetType(CouponGetEnum.FREE.name());
-        IPage<CouponVO> canUseCoupons = couponService.pageVOFindAll(queryParam, page);
+        // 鏌ヨ鍘熷鍒嗛〉鏁版嵁
+        IPage<CouponVO> originalPage = couponService.pageVOFindAll(queryParam, page);
+        List<CouponVO> originalRecords = originalPage.getRecords();
 
-        List<CouponVO> list = canUseCoupons.getRecords();
-        couponService.getUserCouponsStatus(list);
-        //鏇村叿鐢ㄦ埛id
-        return ResultUtil.data(canUseCoupons);
+//        // 鑾峰彇鐢ㄦ埛浼樻儬鍒哥姸鎬�
+//        couponService.getUserCouponsStatus(originalRecords);
+
+        //
+        originalRecords.forEach(couponVO -> {
+            couponVO.setOwned(Boolean.FALSE);
+            // 鍙戣鏁伴噺涓�0琛ㄧず涓嶉檺鍒讹紝鍙鏌ョ敤鎴烽鍙栭檺鍒�
+            if (couponVO.getPublishNum() == 0) {
+                 if(shouldRemoveCoupon(couponVO)){
+                     couponVO.setOwned(Boolean.TRUE);
+                 }
+
+            } else {
+                // 璁$畻鍓╀綑鏁伴噺
+                int residueNum = couponVO.getPublishNum() - couponVO.getReceivedNum();
+                // 鍓╀綑鏁伴噺涓�0鎴栫敤鎴疯揪鍒伴鍙栭檺鍒讹紝閮介渶瑕佸垹闄�
+                 if(residueNum == 0 || shouldRemoveCoupon(couponVO)){
+                     couponVO.setOwned(Boolean.TRUE);
+                 }
+            }
+        });
+
+
+
+        return ResultUtil.data(originalPage);
+    }
+
+    /**
+     * 鍒ゆ柇鏄惁闇�瑕佹爣璁颁紭鎯犲埜涓嶅彲棰嗗彇
+     * 鐢ㄦ埛棰嗗彇鏁伴噺杈惧埌闄愬埗鏃惰繑鍥瀟rue
+     */
+    private boolean shouldRemoveCoupon(CouponVO couponVO) {
+        if (couponVO == null || couponVO.getCouponLimitNum() == null) {
+            return false;
+        }
+
+        Long userCouponCount = couponService.getCouponsCountByIdAndMemberId(couponVO.getId());
+
+        if (userCouponCount == null) {
+            return false;
+        }
+
+        // 鐢ㄦ埛棰嗗彇鏁伴噺 >= 闄愬埗鏁伴噺鏃讹紝闇�瑕佺Щ闄�
+        return userCouponCount >= couponVO.getCouponLimitNum();
     }
 
     @ApiOperation(value = "鑾峰彇褰撳墠浼氬憳鐨勪紭鎯犲埜鍒楄〃")
     @GetMapping("/getCoupons")
     public ResultMessage<IPage<MemberCoupon>> getCoupons(MemberCouponSearchParams param, PageVO pageVo) {
-        System.out.println("------------------------------------");
         System.out.println(param);
         AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
         param.setMemberId(currentUser.getId());
@@ -129,8 +173,30 @@
     @GetMapping("/receive/{couponId}")
     public ResultMessage<Object> receiveCoupon(@NotNull(message = "浼樻儬鍒窱D涓嶈兘涓虹┖") @PathVariable("couponId") String couponId) {
         AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
+        //鍦ㄨ繖閲屽垽鏂鍙�
         memberCouponService.receiveBuyerCoupon(couponId, currentUser.getId(), currentUser.getNickName());
-        return ResultUtil.success();
+
+        Coupon coupon = couponService.getById(couponId);
+        CouponVO couponVO = new CouponVO();
+        BeanUtils.copyProperties(coupon,couponVO);
+        System.out.println(couponVO);
+        couponVO.setOwned(Boolean.FALSE);
+        // 鍙戣鏁伴噺涓�0琛ㄧず涓嶉檺鍒讹紝鍙鏌ョ敤鎴烽鍙栭檺鍒�
+        if (couponVO.getPublishNum() == 0) {
+            if(shouldRemoveCoupon(couponVO)){
+                couponVO.setOwned(Boolean.TRUE);
+            }
+
+        } else {
+            // 璁$畻鍓╀綑鏁伴噺
+            int residueNum = couponVO.getPublishNum() - couponVO.getReceivedNum();
+            // 鍓╀綑鏁伴噺涓�0鎴栫敤鎴疯揪鍒伴鍙栭檺鍒讹紝閮介渶瑕佸垹闄�
+            if(residueNum == 0 || shouldRemoveCoupon(couponVO)){
+                couponVO.setOwned(Boolean.TRUE);
+            }
+        }
+
+        return ResultUtil.data(couponVO);
     }
 
     @ApiOperation(value = "閫氳繃id鑾峰彇")
diff --git a/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java b/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java
index f0324a0..d7af362 100644
--- a/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java
+++ b/framework/src/main/java/cn/lili/modules/promotion/service/CouponService.java
@@ -16,6 +16,8 @@
  */
 public interface CouponService extends AbstractPromotionsService<Coupon> {
 
+    Long getCouponsCountByIdAndMemberId(String couponId);
+
     void getUserCouponsStatus(List<CouponVO> list);
     /**
      * 棰嗗彇浼樻儬鍒�
diff --git a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java
index a283a48..6a6b8e8 100644
--- a/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/promotion/serviceimpl/CouponServiceImpl.java
@@ -91,6 +91,21 @@
 
     @Autowired
     private MemberCouponMapper memberCouponMapper;
+
+    @Override
+    public Long getCouponsCountByIdAndMemberId(String couponId){
+        AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
+        Long count = 0L;
+        if (StringUtils.isNotBlank(currentUser.getId())) {
+            count = new LambdaQueryChainWrapper<>(memberCouponMapper)
+                    .eq(MemberCoupon::getCouponId,couponId)
+                    .eq(MemberCoupon::getMemberId,currentUser.getId())
+                    .count();
+        }
+
+        return count;
+    }
+
     @Override
     public void getUserCouponsStatus(List<CouponVO> list) {
         AuthUser currentUser = Objects.requireNonNull(UserContext.getCurrentUser());
diff --git a/lmk-job/src/main/java/cn/lili/job/MemberJob.java b/lmk-job/src/main/java/cn/lili/job/MemberJob.java
new file mode 100644
index 0000000..58c371e
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/job/MemberJob.java
@@ -0,0 +1,98 @@
+package cn.lili.job;
+
+
+import cn.lili.modules.member.entity.dos.Member;
+import cn.lili.modules.member.entity.dos.MemberAddress;
+import cn.lili.modules.member.mapper.MemberAddressMapper;
+import cn.lili.modules.member.mapper.MemberMapper;
+import cn.lili.modules.member.service.MemberService;
+import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections.CollectionUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * lmk-shop-java
+ * 浼氬憳鐩稿叧浠诲姟
+ * @author : zxl
+ * @date : 2025-09-04 16:49
+ **/
+
+@Component
+@RequiredArgsConstructor
+public class MemberJob {
+
+    private final MemberMapper memberMapper;
+    private final MemberService memberService;
+
+    private final MemberAddressMapper memberAddressMapper;
+    /**
+     * 姣忔棩浠诲姟鍚屾鐢ㄦ埛鍦板潃
+     *
+     * @throws Exception
+     */
+    @XxlJob("everyDayExecuteJobHandlerAsyncMemberAddress")
+    public void everyDayExecuteJobHandlerAsyncMemberAddress() throws Exception {
+        XxlJobHelper.log("寮�濮嬫墽琛屾瘡鏃ヤ换鍔★細浼氬憳鍦板潃鍚屾");
+        List<Member> updateList = new ArrayList<>();
+        List<Member> list = new LambdaQueryChainWrapper<>(memberMapper)
+                // 鏌ヨregion涓虹┖鐨勮褰�
+                .and(wrapper -> wrapper
+                        .isNull(Member::getRegion)  // region 涓� NULL
+                        .or()                       // 鎴栬��
+                        .eq(Member::getRegion, "")  // region 涓虹┖瀛楃涓�
+                )
+                .and(wrapper -> wrapper
+                        .isNull(Member::getRegionId)  // region_id 涓� NULL
+                        .or()                         // 鎴栬��
+                        .eq(Member::getRegionId, "")  // region_id 涓虹┖瀛楃涓�
+                )
+                .eq(Member::getDeleteFlag,Boolean.FALSE)
+                .list();
+        if (CollectionUtils.isNotEmpty(list)) {
+            List<String> memberIds = list.stream().map(Member::getId).collect(Collectors.toList());
+            if (CollectionUtils.isNotEmpty(memberIds)) {
+                List<MemberAddress> addresses = new LambdaQueryChainWrapper<>(memberAddressMapper)
+                        .in(MemberAddress::getMemberId, memberIds) // 鏌ヨ鎸囧畾 memberIds 鐨勫湴鍧�
+                        .eq(MemberAddress::getDeleteFlag, Boolean.FALSE) // 閫昏緫鍒犻櫎瀛楁锛屽亣璁� 0 琛ㄧず鏈垹闄�
+                        .orderByDesc(MemberAddress::getIsDefault) // 浼樺厛杩斿洖榛樿鍦板潃锛坕s_default=1 鐨勬帓鍦ㄥ墠闈級
+                        .orderByDesc(MemberAddress::getCreateTime) // 鐒跺悗鎸夋椂闂撮檷搴忔帓鍒�
+                        .list();
+                Map<String, MemberAddress> firstAddressByMember = addresses.stream()
+                        .collect(Collectors.toMap(
+                                MemberAddress::getMemberId,
+                                address -> address,
+                                (existing, replacement) -> existing // 濡傛灉宸叉湁璇� member 鐨勫湴鍧�锛屼繚鐣欑涓�涓紙鐢变簬鎺掑簭锛岀涓�涓氨鏄紭鍏堢骇鏈�楂樼殑锛�
+                        ));
+                for (Member member : list) {
+                    MemberAddress address = firstAddressByMember.get(member.getId());
+                    if (address != null) {
+                        member.setRegion(address.getConsigneeAddressPath());
+                        member.setRegionId(address.getConsigneeAddressIdPath());
+                        updateList.add(member);
+                    } else {
+                        // 鍙�夛細澶勭悊鏃犲湴鍧�鐨勬儏鍐碉紙濡傛棩蹇楄褰曘�佽烦杩囨洿鏂扮瓑锛�
+                        XxlJobHelper.log("浼氬憳{}娌℃湁瀵瑰簲鐨勫湴鍧�璁板綍锛屼笉鏇存柊region淇℃伅", member.getId());
+                    }
+                }
+                System.out.println("鎵撳嵃闇�瑕佷慨鏀圭殑闆嗗悎--------------------");
+                System.out.println(updateList);
+                memberService.updateBatchById(list);
+
+            }
+
+
+        }
+
+        // 淇敼
+        XxlJobHelper.log("鎵ц瀹屾垚锛氫細鍛樺湴鍧�鍚屾瀹屾垚");
+    }
+
+}

--
Gitblit v1.8.0