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