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