From 80fd41ea0dc602ac3ca33778f17fce5bc2e817b1 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期五, 16 一月 2026 18:58:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java | 453 ++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 436 insertions(+), 17 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..f146ea2 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,36 @@
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.system.dto.MemberCouponAddDTO;
+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.PayDetailRequest;
+import com.doumee.dao.web.response.MemberCouponResponse;
+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.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
-import org.springframework.util.CollectionUtils;
+import org.springframework.transaction.annotation.Transactional;
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瀹炵幇
@@ -45,13 +50,161 @@
private MemberCouponMapper memberCouponMapper;
@Autowired
+ private GoodsMapper goodsMapper;
+
+ @Autowired
+ private GoodsSkuMapper goodsSkuMapper;
+
+ @Autowired
private MemberCouponJoinMapper memberCouponJoinMapper;
+
+ @Autowired
+ private LabelsMapper labelsMapper;
+
@Autowired
private CouponMapper couponMapper;
@Autowired
private MemberMapper memberMapper;
+
+ @Override
+ @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+ public String addBatch(MemberCouponAddDTO memberCoupon){
+ checkAddBatchParamValid(memberCoupon);
+
+ List<Coupon> couponList = getCouponListByParam(memberCoupon);
+ List<Member> memberList = getMemberListByParam(memberCoupon);
+ List<MemberCoupon> addList = new ArrayList<>();
+ int index =1;
+ LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
+ Date now = new Date();
+ for(Coupon param : memberCoupon.getAddCouponList()){
+ Coupon coupon = getCouponFromListById(param.getId(),couponList);
+ if(coupon == null){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗��"+index+"銆戜釜浼樻儬鍒告煡璇㈡棤鏁堬紝璇峰埛鏂伴〉闈㈤噸鏂帮紒");
+ }
+ for(Member member : memberList){
+ for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
+ //鎸ㄤ釜閫�
+ addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now));
+ }
+ }
+ index++;
+ }
+ if(addList.size()>0){
+ //鎵归噺鎻掑叆鏁版嵁
+ memberCouponMapper.insert(addList);
+ }
+ return "鎿嶄綔鎴愬姛,鎴愬姛浜哄憳鏁伴噺锛�"+memberList.size()+",鍏卞彂鏀句紭鎯犲埜鏁伴噺锛�"+addList.size();
+
+ }
+
+ private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) {
+ MemberCoupon insert = new MemberCoupon();
+ insert.setCreator(loginUserInfo.getId());
+ insert.setCreateDate(now);
+ insert.setEditor(loginUserInfo.getId());
+ insert.setEditDate(now);
+ insert.setIsdeleted(Constants.ZERO);
+ insert.setRemark("瀹氬悜鍙戞斁");
+ insert.setMemberId(member.getId());
+ insert.setShopId(coupon.getShopId());
+ insert.setType(coupon.getType());
+ insert.setCouponType(coupon.getType());
+ insert.setLimitPrice(coupon.getLimitPrice());
+ insert.setPrice(coupon.getPrice());
+ if(Constants.equalsObject(coupon.getUseType(),Constants.ZERO)){
+ //濡傛灉鏄浐瀹氭椂娈�
+ insert.setStartDate(coupon.getStartDate());
+ insert.setEndDate(coupon.getEndDate());
+ }else{
+ //鍥哄畾鏃堕暱 //鎺ㄨ繜澶╂暟
+ insert.setEndDate(DateUtil.addDaysToDate(now,Constants.formatIntegerNum(coupon.getValidDays())));
+ insert.setStartDate(now);
+ }
+ insert.setGetMethod(Constants.TWO);//瀹氬悜鍙戞斁
+ insert.setIntegral(coupon.getIntegral());
+ insert.setStatus(Constants.ZERO);//鏈娇鐢�
+ insert.setInfo(coupon.getInfo());
+// insert.setBackIntegral(coupon.getB);
+ insert.setName(coupon.getName());
+ insert.setApplyIds(coupon.getApplyIds());
+ insert.setApplyType(coupon.getApplyType());
+ insert.setCouponId(coupon.getId());
+ return insert;
+ }
+
+ private Coupon getCouponFromListById(Integer id, List<Coupon> couponList) {
+ for(Coupon c : couponList){
+ if(Constants.equalsObject(id,c.getId())){
+ return c;
+ }
+ }
+ return null;
+ }
+
+
+ private List<Member> getMemberListByParam(MemberCouponAddDTO memberCoupon) {
+ List<Member> list = memberMapper.selectList(new QueryWrapper<Member>().lambda()
+ .eq(Member::getIsdeleted,Constants.ZERO)
+ .eq(memberCoupon.getAddType() == Constants.ZERO,Member::getId,memberCoupon.getAddMemberIds())
+ .in(memberCoupon.getAddType() == Constants.ONE,Member::getPhone,memberCoupon.getPhones()));
+ if(list == null || list.size()==0){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鏈夋晥鐨勭敤鎴蜂俊鎭紒");
+ }
+
+ return list;
+ }
+
+ private List<Coupon> getCouponListByParam(MemberCouponAddDTO memberCoupon) {
+ List<Integer> ids = new ArrayList<>();
+ for(Coupon coupon : memberCoupon.getAddCouponList()){
+ if(coupon.getId() ==null || Constants.formatLongNum(coupon.getNum())==0){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ ids.add(coupon.getId());
+ }
+ List<Coupon> list = couponMapper.selectList(new QueryWrapper<Coupon>().lambda()
+ .eq(Coupon::getStatus,Constants.ZERO)
+ .eq(Coupon::getIsdeleted,Constants.ZERO)
+ .in(Coupon::getId,ids));
+
+ if(list == null || list.size()==0){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鏈夋晥浼樻儬鍒告暟鎹�,璇峰埛鏂伴〉闈㈤噸璇曪紒");
+ }
+ return list;
+ }
+
+ private void checkAddBatchParamValid(MemberCouponAddDTO memberCoupon) {
+ if(memberCoupon.getAddType() == null
+ || memberCoupon.getAddCouponList()==null
+ || memberCoupon.getAddCouponList().size()==0){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ZERO)){
+ //鎸囧畾浜哄憳
+ if( memberCoupon.getAddMemberIds() ==null){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ }else if(Constants.equalsObject(memberCoupon.getAddType(),Constants.ONE)){
+ //鎸囧畾鎵嬫満鍙�
+ if( StringUtils.isBlank(memberCoupon.getAddMemberPhones())){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ String[] ss =memberCoupon.getAddMemberPhones().replace(" ","").split("\n");
+ if(ss == null ||ss.length==0){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ memberCoupon.setPhones(Arrays.asList(ss));
+
+ }else if(Constants.equalsObject(memberCoupon.getAddType(),Constants.TWO)){
+ //鍏ㄩ儴浼氬憳
+ }else{
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ }
+
@Override
public Integer create(MemberCoupon memberCoupon) {
LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
@@ -76,7 +229,6 @@
if(memberCouponMapper.selectCount(queryWrapper) > Constants.ZERO){
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "宸插厬鎹㈣浼樻儬鍒�,鏃犳硶鍏戞崲锛�");
};
-
MemberCoupon insert = new MemberCoupon();
Date now = new Date();
insert.setCreator(loginUserInfo.getId());
@@ -161,20 +313,41 @@
IPage<MemberCoupon> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
MPJLambdaWrapper<MemberCoupon> queryWrapper = new MPJLambdaWrapper<>();
Utils.MP.blankToNull(pageWrap.getModel());
-
queryWrapper.selectAll(MemberCoupon.class);
+ queryWrapper.selectAs(Member::getPhone,MemberCoupon::getMemberPhone);
queryWrapper.selectAs(Member::getNickname,MemberCoupon::getNikeName);
-
+ queryWrapper.selectAs(Goodsorder::getCode,MemberCoupon::getOrderCode);
+ queryWrapper.selectAs(Goodsorder::getCouponPrice,MemberCoupon::getCouponPrice);//浼樻儬閲戦
+ queryWrapper.selectAs(SystemUser::getUsername,MemberCoupon::getCreatorName);
queryWrapper.leftJoin(Member.class,Member::getId,MemberCoupon::getMemberId);
-
+ queryWrapper.leftJoin(Goodsorder.class,Goodsorder::getId,MemberCoupon::getOrderId);
+ queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,MemberCoupon::getCreator);
queryWrapper.eq(MemberCoupon::getIsdeleted, Constants.ZERO);
- queryWrapper.eq(pageWrap.getModel().getStatus()!=null,MemberCoupon::getStatus, pageWrap.getModel().getStatus());
+ 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());
+ }
+ 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()).
or().eq( Member::getName, pageWrap.getModel().getNikeName()).
or().eq( Member::getPhone, pageWrap.getModel().getNikeName()));
queryWrapper.orderByDesc(MemberCoupon::getCreateDate);
IPage<MemberCoupon> result = memberCouponJoinMapper.selectJoinPage(page, MemberCoupon.class, queryWrapper);
+ if(result!=null && result.getRecords()!=null){
+ for(MemberCoupon model :result.getRecords()){
+ model.setNikeName(StringUtils.defaultString(model.getNikeName(),"")+" "+StringUtils.defaultString(model.getMemberPhone(),""));
+ if(Constants.equalsInteger(model.getStatus(),Constants.ZERO)
+ && model.getEndDate()!=null
+ && model.getEndDate().before(new Date())){
+ //宸茶繃鏈�
+ model.setStatus(Constants.TWO);
+ }
+ }
+ }
return PageData.from(result);
}
@@ -196,11 +369,13 @@
* @return
*/
@Override
- public IPage<CouponDTO> memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType) {
- IPage<CouponDTO> page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper<CouponDTO>()
+ public IPage<MemberCouponResponse> memberCouponPage(IPage pages, BigDecimal price, Integer memberId,Integer couponType,Integer status) {
+ IPage<MemberCouponResponse> page = memberCouponMapper.memberCouponPage(pages,new QueryWrapper<MemberCouponResponse>()
.eq("m.MEMBER_ID",memberId)
.eq("m.TYPE",Constants.ONE)
- .eq("m.STATUS",Constants.ZERO)
+ .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.ZERO),"m.STATUS = 0 and m.END_DATE >= now()" )
+ .apply(Objects.nonNull(status)&&Constants.equalsInteger(status,Constants.ONE),"m.STATUS = 1" )
+ .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 ")
@@ -208,6 +383,40 @@
);
return page;
}
+
+
+ @Override
+ public MemberCouponResponse getMemberCouponDetail(Integer id){
+ MemberCoupon memberCoupon = memberCouponJoinMapper.selectById(id);
+ if(Objects.isNull(memberCoupon)){
+ throw new BusinessException(ResponseStatus.DATA_EMPTY);
+ }
+ MemberCouponResponse memberCouponResponse = new MemberCouponResponse();
+ BeanUtils.copyProperties(memberCoupon,memberCouponResponse);
+ if(StringUtils.isNotBlank(memberCouponResponse.getApplyIds())){
+ if(Constants.equalsInteger(memberCouponResponse.getApplyType(),Constants.ONE)){
+ List<Labels> labelsList = labelsMapper.selectList(new QueryWrapper<Labels>().lambda()
+ .eq(Labels::getIsdeleted,Constants.ZERO)
+ .eq(Labels::getType,Constants.LabelsType.GOODSTYPE.getKey())
+ .apply(" find_in_set( id , '"+memberCouponResponse.getApplyIds()+"' ) ")
+ );
+ if(CollectionUtils.isNotEmpty(labelsList)){
+ memberCouponResponse.setRelationInfoList(labelsList.stream().map(i->i.getName()).collect(Collectors.toList()));
+ }
+ }else if(Constants.equalsInteger(memberCouponResponse.getApplyType(),Constants.TWO)){
+ List<Goods> labelsList = goodsMapper.selectList(new QueryWrapper<Goods>().lambda()
+ .eq(Goods::getIsdeleted,Constants.ZERO)
+ .apply(" find_in_set( id , '"+memberCouponResponse.getApplyIds()+"' ) ")
+ );
+ if(CollectionUtils.isNotEmpty(labelsList)){
+ memberCouponResponse.setRelationInfoList(labelsList.stream().map(i->i.getName()).collect(Collectors.toList()));
+ }
+ }
+ }
+ return memberCouponResponse;
+ }
+
+
/**
* 浼樻儬鍒告暟閲�
@@ -220,7 +429,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 +525,215 @@
}
+ /**
+ * 鏍规嵁鍟嗗搧淇℃伅鑾峰彇閫傜敤鐨勪紭鎯犲埜
+ */
+ @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;
+ }
+
+
+ public void couponIsValid(List<PayDetailRequest> requestList,MemberCoupon memberCoupon){
+ if(Objects.isNull(memberCoupon)
+ || Constants.equalsInteger(memberCoupon.getStatus(),Constants.ONE)
+ ){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浼樻儬鍒镐俊鎭棤鏁堟垨宸茶浣跨敤");
+ }
+ if(memberCoupon.getStartDate().getTime() > System.currentTimeMillis()){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浼樻儬鍒告湭鐢熸晥");
+ }
+ if(memberCoupon.getEndDate().getTime() < System.currentTimeMillis()){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"浼樻儬鍒稿凡杩囨湡");
+ }
+ 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)){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鍟嗗搧SKU鍟嗗搧淇℃伅閿欒,璇峰埛鏂伴噸璇�");
+ }
+ //鑾峰彇閫夋嫨鐨勫晢鍝佹�婚噾棰� 涓� 鍗曚釜鍟嗗搧閲戦
+ 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);
+ if(totalAmount.compareTo(memberCoupon.getLimitPrice())<Constants.ZERO){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠鍟嗗搧閲戦鏈弧瓒冲彲浣跨敤闂ㄦ");
+ }
+ //閫傜敤绫诲瀷锛�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);
+ }
+ }
+ }
+
+
+ /**
+ * 璁$畻褰撳墠宸查�夋嫨浼樻儬鍒告瘡涓晢鍝佸崰姣旈噾棰�
+ * @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