From 77fc61a25c14071584e45731476207959137d6b6 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期三, 04 三月 2026 17:17:39 +0800
Subject: [PATCH] 小程序 接口开发
---
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java | 182 +++++++++++++++++++++++++++++++++++----------
1 files changed, 142 insertions(+), 40 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 f146ea2..18d141b 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
@@ -15,6 +15,7 @@
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.CouponNoticeRequest;
import com.doumee.dao.web.request.PayDetailRequest;
import com.doumee.dao.web.response.MemberCouponResponse;
import com.doumee.dao.web.response.goods.OrderGoodsCalculateResponse;
@@ -27,6 +28,7 @@
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
+import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -68,27 +70,41 @@
@Autowired
private MemberMapper memberMapper;
+ @Autowired
+ private NoticeMapper noticeMapper;
+
+
@Override
@Transactional(rollbackFor = {BusinessException.class,Exception.class})
- public String addBatch(MemberCouponAddDTO memberCoupon){
- checkAddBatchParamValid(memberCoupon);
+ public String addBatch(MemberCouponAddDTO memberCouponAddDTO){
+ checkAddBatchParamValid(memberCouponAddDTO);
- List<Coupon> couponList = getCouponListByParam(memberCoupon);
- List<Member> memberList = getMemberListByParam(memberCoupon);
+ List<Coupon> couponList = getCouponListByParam(memberCouponAddDTO);
+ List<Member> memberList = getMemberListByParam(memberCouponAddDTO);
List<MemberCoupon> addList = new ArrayList<>();
int index =1;
LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
Date now = new Date();
- for(Coupon param : memberCoupon.getAddCouponList()){
+ for(Coupon param : memberCouponAddDTO.getAddCouponList()){
Coupon coupon = getCouponFromListById(param.getId(),couponList);
if(coupon == null){
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗��"+index+"銆戜釜浼樻儬鍒告煡璇㈡棤鏁堬紝璇峰埛鏂伴〉闈㈤噸鏂帮紒");
}
for(Member member : memberList){
+ MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo);
for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
+ //婊″噺鍗蜂笉浼氱敓鎴恗axPrice 闇�瑕佹牴鎹紭鎯犲埜鍑忓皯閲戦璁剧疆
+ if(Constants.equalsInteger(coupon.getCouponType(),Constants.ZERO)){
+ memberCoupon.setMaxPrice(coupon.getPrice());
+ }
//鎸ㄤ釜閫�
- addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now));
+ addList.add(memberCoupon);
}
+ //浼樻儬鍒稿彂鏀鹃�氱煡
+ Notice notice = Notice.getNotice(Constants.NoticeType.COUPON,
+ member.getId(),null);
+ notice.setContent(notice.getContent().replace("{param}",Constants.getCouponInfo(memberCoupon, (int) Constants.formatLongNum(param.getNum()))));
+ noticeMapper.insert(notice);
}
index++;
}
@@ -97,8 +113,8 @@
memberCouponMapper.insert(addList);
}
return "鎿嶄綔鎴愬姛,鎴愬姛浜哄憳鏁伴噺锛�"+memberList.size()+",鍏卞彂鏀句紭鎯犲埜鏁伴噺锛�"+addList.size();
-
}
+/*
private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) {
MemberCoupon insert = new MemberCoupon();
@@ -134,6 +150,7 @@
insert.setCouponId(coupon.getId());
return insert;
}
+*/
private Coupon getCouponFromListById(Integer id, List<Coupon> couponList) {
for(Coupon c : couponList){
@@ -323,13 +340,16 @@
queryWrapper.leftJoin(Goodsorder.class,Goodsorder::getId,MemberCoupon::getOrderId);
queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,MemberCoupon::getCreator);
queryWrapper.eq(MemberCoupon::getIsdeleted, Constants.ZERO);
- 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());
+ if(Constants.equalsInteger(pageWrap.getModel().getStatus(),0)&&pageWrap.getModel().getIsexpire()!=null && pageWrap.getModel().getIsexpire()== 0){
+ queryWrapper.gt( MemberCoupon::getEndDate, new Date());
+ } else if (Constants.equalsInteger(pageWrap.getModel().getStatus(),0)&&pageWrap.getModel().getIsexpire()!=null && pageWrap.getModel().getIsexpire()== 1) {
+ queryWrapper.le( MemberCoupon::getEndDate, new Date());
}
+ queryWrapper.in(pageWrap.getModel().getMethodList()!=null,MemberCoupon::getGetMethod, pageWrap.getModel().getMethodList());
+ queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus());
+ queryWrapper.eq(pageWrap.getModel().getCouponType()!=null,MemberCoupon::getCouponType, pageWrap.getModel().getCouponType());
+ queryWrapper.eq(pageWrap.getModel().getCouponId()!=null,MemberCoupon::getCouponId, pageWrap.getModel().getCouponId());
+ queryWrapper.like(pageWrap.getModel().getName()!=null,MemberCoupon::getName, pageWrap.getModel().getName());
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()).
@@ -344,7 +364,9 @@
&& model.getEndDate()!=null
&& model.getEndDate().before(new Date())){
//宸茶繃鏈�
- model.setStatus(Constants.TWO);
+ model.setIsexpire(Constants.ONE);
+ }else if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)){
+ model.setIsexpire(Constants.ZERO);
}
}
}
@@ -378,7 +400,7 @@
.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 ")
+// .apply(" now() between m.START_DATE and m.END_DATE ")
.orderByDesc(" m.PRICE ")
);
return page;
@@ -518,10 +540,7 @@
memberCoupon.setBackIntegral(BigDecimal.ZERO);
memberCoupon.setName(coupon.getName());
memberCouponMapper.insert(memberCoupon);
- //TODO 娣诲姞绉垎鍙樺姩璁板綍
- //鏇存柊鐢ㄦ埛绉垎
- memberMapper.subtractIntegral(memberId,memberCoupon.getIntegral());
}
@@ -537,11 +556,12 @@
.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淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅宸插け鏁�,璇峰埛鏂伴噸璇�");
}
//鏌ヨ鍟嗗搧鍒楄〃
List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
new MPJLambdaWrapper<Goods>()
+ .selectAll(Goods.class)
.selectAs(GoodsSku::getPrice,Goods::getSkuPrice)
.selectAs(GoodsSku::getId,Goods::getSkuId)
.leftJoin(GoodsSku.class,GoodsSku::getGoodsId,Goods::getId)
@@ -564,28 +584,37 @@
List<MemberCoupon> allCoupon = memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
.eq(MemberCoupon::getIsdeleted,Constants.ZERO)
.eq(MemberCoupon::getStatus,Constants.ZERO)
+ .eq(MemberCoupon::getMemberId,memberId)
.apply(" LIMIT_PRICE <= " + totalAmount)
- .apply(" now() between START_DATE and END_DATE "));
+ .apply(" now() between START_DATE and END_DATE ")
+ .orderByDesc(MemberCoupon::getMaxPrice)
+ .orderByAsc(MemberCoupon::getEndDate)
+ )
+ ;
if(CollectionUtils.isNotEmpty(allCoupon)){
for (MemberCoupon memberCoupon:allCoupon) {
- //閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
+ if(this.calculateCouponRata(memberCoupon,goodsCalculateList,totalAmount).compareTo(memberCoupon.getPrice())<=Constants.ZERO){
+ continue;
+ }
+ memberCouponList.add(memberCoupon);
+ /*//閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
if(Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ZERO)){
- memberCoupon.setValidAmount(memberCoupon.getPrice());
+ memberCoupon.setValidAmount(memberCoupon.getMaxPrice());
+ memberCouponList.add(memberCoupon);
}else{
List<String> applyIdList = Arrays.asList(memberCoupon.getApplyIds().split(","));
//鑾峰彇鏈夋晥鍙互浣跨敤浼樻儬鍒哥殑鏁版嵁
- isVaildUse(applyIdList,goodsCalculateList,
- Constants.equalsInteger(memberCoupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+ isVaildUse(applyIdList,goodsCalculateList,memberCoupon.getApplyType());
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);
+ //鏍规嵁閲戦璁$畻瀹為檯鎶樻墸閲戦 PRICE 瀛樺偍鎶樻墸鍊� 渚嬪 5鎶� 瀛樺偍鍊� 5
+ BigDecimal couponPrice = skuAmount.multiply(memberCoupon.getPrice()).divide(new BigDecimal("10"),2, RoundingMode.HALF_UP);
//鎶樻墸閲戦澶т簬鏈�澶у彲鎶樻墸閲戦 鍒欎娇鐢ㄦ渶澶у彲鎶樻墸閲戦
memberCoupon.setValidAmount(couponPrice.compareTo(memberCoupon.getMaxPrice())>Constants.ZERO?memberCoupon.getMaxPrice():couponPrice);
memberCouponList.add(memberCoupon);
}
- }
+ }*/
}
}
// 浣跨敤 Stream 鎺掑簭 reversed() 琛ㄧず鍊掑簭
@@ -613,7 +642,7 @@
.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淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU淇℃伅宸插け鏁�,璇峰埛鏂伴噸璇�");
}
//鏌ヨ鍟嗗搧鍒楄〃
List<Goods> goodsList = goodsMapper.selectJoinList(Goods.class,
@@ -658,14 +687,15 @@
/**
- * 璁$畻褰撳墠宸查�夋嫨浼樻儬鍒告瘡涓晢鍝佸崰姣旈噾棰�
+ * 璁$畻浼樻儬鍒告瘡涓晢鍝佸崰姣旈噾棰�
* @param coupon 浼樻儬鍒镐俊鎭�
* @param goodsCalculateList 鍟嗗搧闆嗗悎
* @param totalAmount 璁㈠崟鎬婚噾棰�
+ * @return 鍙互浣跨敤浼樻儬鍒哥殑鍟嗗搧鎬婚噾棰�
*/
- public void calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
+ public BigDecimal calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
//鎬讳綑棰�
- BigDecimal validAmount = coupon.getValidAmount();
+ BigDecimal validAmount = coupon.getMaxPrice();
//鍓╀綑鍙垎閰嶉噾棰�
BigDecimal surplusValidAmount = validAmount;
//宸茬敤鍗犳瘮姣斾緥鍊�
@@ -673,11 +703,23 @@
//鏍规嵁浼樻儬鍒哥被鍨� 璁$畻鍙互浣跨敤浼樻儬鍒哥殑鍟嗗搧淇℃伅 閫傜敤绫诲瀷锛�0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
if(!Constants.equalsInteger(coupon.getApplyType(),Constants.ZERO)){
List<String> applyIdList = Arrays.asList(coupon.getApplyIds().split(","));
- isVaildUse(applyIdList,goodsCalculateList,
- Constants.equalsInteger(coupon.getApplyType(),Constants.ONE)?Constants.ONE:Constants.ZERO);
+ isVaildUse(applyIdList,goodsCalculateList,coupon.getApplyType());
+ }else{
+ isVaildUse(null,goodsCalculateList,coupon.getApplyType());
}
//浣跨敤浜嗕紭鎯犲埜鐨勫晢鍝佹暟閲�
Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size();
+ //浣跨敤浼樻儬鍒哥殑鎬婚噾棰�
+ BigDecimal useCouponPrice = goodsCalculateList.stream().filter(i->i.getUseCoupon())
+ .map(i->i.getSkuAmount()).reduce(BigDecimal.ZERO,BigDecimal::add);
+ if(Constants.equalsInteger(coupon.getCouponType(),Constants.ONE)){
+ //鏈�澶у彲浼樻儬閲戦
+ BigDecimal couponAmount = useCouponPrice.multiply(coupon.getPrice()).divide(new BigDecimal("10"),2,BigDecimal.ROUND_DOWN);
+ if(couponAmount.compareTo(validAmount)<=Constants.ZERO){
+ validAmount = couponAmount;
+ surplusValidAmount = validAmount;
+ }
+ }
Integer useCouponNum = Constants.ZERO;
for (int i = 0; i < goodsCalculateList.size(); i++) {
if(!goodsCalculateList.get(i).getUseCoupon()){
@@ -687,6 +729,7 @@
if(Constants.equalsInteger(useCouponNum+1,countCouponNum)){
goodsCalculateList.get(i).setOrderCouponRata(new BigDecimal("1").subtract(rata));
goodsCalculateList.get(i).setCouponDeductCash(surplusValidAmount);
+ surplusValidAmount = BigDecimal.ZERO;
break;
}
goodsCalculateList.get(i).setOrderCouponRata(goodsCalculateList.get(i).getSkuAmount().divide(totalAmount,2,BigDecimal.ROUND_DOWN));
@@ -695,6 +738,8 @@
rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata());
useCouponNum = useCouponNum + 1;
}
+ coupon.setValidAmount(validAmount.subtract(surplusValidAmount));
+ return useCouponPrice;
}
@@ -705,13 +750,20 @@
* 鍒ゆ柇鏄惁鍙互鏈夋晥浣跨敤
* @param idList
* @param goodsList
- * @param vaildType 0=鍟嗗搧锛�1=鍝佺被
+ * @param vaildType 0=鍏ㄥ満;1=鍝佺被锛�2=鎸囧畾鍟嗗搧
* @return
*/
public void isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
- for (OrderGoodsCalculateResponse response:goodsList) {
- response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.ZERO)?response.getId().toString():response.getCategoryId().toString())?true:false);
+ if(Constants.equalsInteger(vaildType,Constants.ZERO)){
+ for (OrderGoodsCalculateResponse response:goodsList) {
+ response.setUseCoupon(true);
+ }
+ }else{
+ for (OrderGoodsCalculateResponse response:goodsList) {
+ response.setUseCoupon(idList.contains(Constants.equalsInteger(vaildType,Constants.TWO)?response.getId().toString():response.getCategoryId().toString())?true:false);
+ }
}
+
}
@@ -730,10 +782,60 @@
// }
// return new HashSet<>();
// }
+
+ @Override
+ @Transactional(rollbackFor = {Exception.class})
+ public void notifyExpiredCoupon(Integer days) {
+ if (days == null || days <= 0) {
+ days = 3; // 榛樿鎻愬墠 3 澶╅�氱煡
+ }
+ String afterDate = DateUtil.afterDateToStr(days);
+ // 鏌ヨ鍗冲皢杩囨湡鐨勪紭鎯犲埜锛堟湭浣跨敤涓斿湪鐩爣鏃ユ湡鑼冨洿鍐呰繃鏈燂級
+ List<MemberCoupon> expiredCoupons = memberCouponMapper.selectList(
+ new QueryWrapper<MemberCoupon>().lambda()
+ .eq(MemberCoupon::getIsdeleted, Constants.ZERO)
+ .eq(MemberCoupon::getStatus, Constants.ZERO) // 鏈娇鐢�
+ .eq(MemberCoupon::getNoticeStatus,Constants.ZERO)// 鏈�氱煡鏁版嵁
+ .ge(MemberCoupon::getEndDate, DateUtil.getCurrDateTime()) // 澶т簬绛変簬寮�濮嬫椂闂�
+ .lt(MemberCoupon::getEndDate, (afterDate+" 23:59:59") ) // 灏忎簬缁撴潫鏃堕棿
+ );
+ if (CollectionUtils.isEmpty(expiredCoupons)) {
+ return;
+ }
+ // 鎸夌敤鎴峰垎缁勭粺璁�
+ Map<Integer, List<MemberCoupon>> memberCouponMap = expiredCoupons.stream()
+ .collect(Collectors.groupingBy(MemberCoupon::getMemberId));
+
+ // 閬嶅巻姣忎釜鐢ㄦ埛鐨勪紭鎯犲埜鍙戦�侀�氱煡
+ for (Map.Entry<Integer, List<MemberCoupon>> entry : memberCouponMap.entrySet()) {
+ Integer memberId = entry.getKey();
+ List<MemberCoupon> coupons = entry.getValue();
+ if (CollectionUtils.isEmpty(coupons)) {
+ continue;
+ }
+ // 鏌ヨ鐢ㄦ埛淇℃伅
+ Member member = memberMapper.selectById(memberId);
+ if (member == null || member.getIsdeleted() == Constants.ONE) {
+ continue;
+ }
+ // 缁熻浼樻儬鍒告暟閲忓拰绫诲瀷
+ long count = coupons.size();
-
-
-
-
+ List<Integer> couponIds = coupons.stream().map(MemberCoupon::getId).collect(Collectors.toList());
+ //鍙戦�佺珯鍐呬俊 浼樻儬鍒稿嵆灏嗚繃鏈�
+ Notice notice = Notice.getNotice(
+ Constants.NoticeType.EXPIRE_COUPON,
+ member.getId(),
+ null
+ );
+ notice.setContent(notice.getContent().replace("{param}",Long.toString(count)).replace("{param1}",afterDate));
+ noticeMapper.insert(notice);
+ memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda()
+ .set(MemberCoupon::getNoticeStatus,Constants.ONE)
+ .set(MemberCoupon::getNoticeTime,DateUtil.getCurrDateTime())
+ .in(MemberCoupon::getId,couponIds)
+ );
+ }
+ }
}
--
Gitblit v1.9.3