From a1a6e227628810259fcba0fff146792e97a80b8a Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 15 十二月 2025 08:56:09 +0800
Subject: [PATCH] 订单业务开发
---
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 166 insertions(+), 9 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 b5af21e..7b10f17 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
@@ -7,31 +7,31 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
+import com.doumee.core.utils.ListUtil;
import com.doumee.core.utils.Utils;
-import com.doumee.dao.business.CouponMapper;
-import com.doumee.dao.business.MemberCouponJoinMapper;
-import com.doumee.dao.business.MemberCouponMapper;
-import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.*;
import com.doumee.dao.business.model.*;
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.goods.OrderGoodsCalculateResponse;
import com.doumee.service.business.MemberCouponService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
+import java.math.RoundingMode;
import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
+import java.util.stream.Collectors;
/**
* 鐢ㄦ埛浼樻儬鍒稿叧鑱旇〃Service瀹炵幇
@@ -43,6 +43,12 @@
@Autowired
private MemberCouponMapper memberCouponMapper;
+
+ @Autowired
+ private GoodsMapper goodsMapper;
+
+ @Autowired
+ private GoodsSkuMapper goodsSkuMapper;
@Autowired
private MemberCouponJoinMapper memberCouponJoinMapper;
@@ -209,6 +215,10 @@
return page;
}
+
+
+
+
/**
* 浼樻儬鍒告暟閲�
* @param price
@@ -220,7 +230,6 @@
public long memberCouponNum( BigDecimal price, Integer memberId,Integer couponType) {
long count = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>()
.eq("MEMBER_ID",memberId)
- .eq("TYPE",Constants.ONE)
.eq("STATUS",Constants.ZERO)
.eq("TYPE",couponType)
.apply("LIMIT_PRICE >= "+price+" ")
@@ -317,4 +326,152 @@
}
+ /**
+ * 鏍规嵁鍟嗗搧淇℃伅鑾峰彇閫傜敤鐨勪紭鎯犲埜
+ */
+ @Override
+ public List<MemberCoupon> getApplyCoupon(List<PayDetailRequest> requestList,Integer memberId){
+ List<MemberCoupon> memberCouponList = new ArrayList<>();
+ 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)){
+ return memberCouponList;
+ }
+
+ //鑾峰彇閫夋嫨鐨勫晢鍝佹�婚噾棰� 涓� 鍗曚釜鍟嗗搧閲戦
+ 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);
+ //鑾峰彇鎵�鏈夋弧瓒抽噾棰濅笖鍙敤鐨勪紭鎯犲埜
+ List<MemberCoupon> allCoupon = memberCouponMapper.selectList(new QueryWrapper<MemberCoupon>().lambda()
+ .eq(MemberCoupon::getIsdeleted,Constants.ZERO)
+ .eq(MemberCoupon::getStatus,Constants.ZERO)
+ .apply(" LIMIT_PRICE <= " + totalAmount)
+ .apply(" now() between START_DATE and END_DATE "));
+
+ if(CollectionUtils.isNotEmpty(allCoupon)){
+ for (MemberCoupon memberCoupon:allCoupon) {
+ //閫傜敤绫诲瀷锛�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);
+ memberCouponList.add(memberCoupon);
+ }
+ }
+ }
+ }
+ // 浣跨敤 Stream 鎺掑簭 reversed() 琛ㄧず鍊掑簭
+ memberCouponList = memberCouponList.stream().sorted(Comparator.comparing(MemberCoupon::getValidAmount,Comparator.nullsFirst(BigDecimal::compareTo)).reversed())
+ .collect(Collectors.toList());
+ return memberCouponList;
+ }
+
+
+ /**
+ * 璁$畻褰撳墠宸查�夋嫨浼樻儬鍒告瘡涓晢鍝佸崰姣旈噾棰�
+ * @param coupon 浼樻儬鍒镐俊鎭�
+ * @param goodsCalculateList 鍟嗗搧闆嗗悎
+ * @param totalAmount 璁㈠崟鎬婚噾棰�
+ */
+ public void calculateCouponRata(MemberCoupon coupon,List<OrderGoodsCalculateResponse> goodsCalculateList,BigDecimal totalAmount){
+ //鎬讳綑棰�
+ BigDecimal validAmount = coupon.getValidAmount();
+ //鍓╀綑鍙垎閰嶉噾棰�
+ BigDecimal surplusValidAmount = validAmount;
+ //宸茬敤鍗犳瘮姣斾緥鍊�
+ BigDecimal rata = BigDecimal.ZERO;
+ //鏍规嵁浼樻儬鍒哥被鍨� 璁$畻鍙互浣跨敤浼樻儬鍒哥殑鍟嗗搧淇℃伅 閫傜敤绫诲瀷锛�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);
+ }
+ //浣跨敤浜嗕紭鎯犲埜鐨勫晢鍝佹暟閲�
+ Integer countCouponNum = goodsCalculateList.stream().filter(i->i.getUseCoupon()).collect(Collectors.toList()).size();
+ Integer useCouponNum = Constants.ZERO;
+ for (int i = 0; i < goodsCalculateList.size(); i++) {
+ if(!goodsCalculateList.get(i).getUseCoupon()){
+ goodsCalculateList.get(i).setCouponDeductCash(BigDecimal.ZERO);
+ continue;
+ }
+ if(Constants.equalsInteger(useCouponNum+1,countCouponNum)){
+ goodsCalculateList.get(i).setOrderCouponRata(new BigDecimal("1").subtract(rata));
+ goodsCalculateList.get(i).setCouponDeductCash(surplusValidAmount);
+ break;
+ }
+ goodsCalculateList.get(i).setOrderCouponRata(goodsCalculateList.get(i).getSkuAmount().divide(totalAmount,2,BigDecimal.ROUND_DOWN));
+ goodsCalculateList.get(i).setCouponDeductCash(validAmount.multiply(goodsCalculateList.get(i).getOrderCouponRata()));
+ surplusValidAmount = surplusValidAmount.subtract(goodsCalculateList.get(i).getCouponDeductCash());
+ rata = rata.add(goodsCalculateList.get(i).getOrderCouponRata());
+ useCouponNum = useCouponNum + 1;
+ }
+ }
+
+
+
+
+
+ /**
+ * 鍒ゆ柇鏄惁鍙互鏈夋晥浣跨敤
+ * @param idList
+ * @param goodsList
+ * @param vaildType 0=鍟嗗搧锛�1=鍝佺被
+ * @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);
+ }
+ }
+// public Set<Integer> isVaildUse(List<String> idList,List<OrderGoodsCalculateResponse> goodsList,Integer vaildType){
+// List<OrderGoodsCalculateResponse> resultList = new ArrayList<>();
+// for (String id:idList) {
+// if(Constants.equalsInteger(vaildType,Constants.ZERO)){
+// resultList.addAll(goodsList.stream().filter(i->i.getId().toString().equals(id)).collect(Collectors.toList()));
+// }else{
+// resultList.addAll(goodsList.stream().filter(i->i.getCategoryId().toString().equals(id)).collect(Collectors.toList()));
+// }
+// }
+// if(CollectionUtils.isNotEmpty(resultList)){
+// return new HashSet<>(resultList.stream().map(i->i.getId()).collect(Collectors.toList()));
+// }
+// return new HashSet<>();
+// }
+
+
+
+
+
+
}
--
Gitblit v1.9.3