lubo 1 месяц назад
Родитель
Сommit
bf7a7897fe

+ 2 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/business/service/impl/UserBusinessRoleServiceImpl.java

@@ -313,6 +313,8 @@ public class UserBusinessRoleServiceImpl implements IUserBusinessRoleService {
             role.setIsBound(false);
         }
         this.baseMapper.updateById(role);
+
+
         Date now = new Date();
         //新增积分记录
         UserBusinessIntegralRecordBo recordBo = new UserBusinessIntegralRecordBo();

+ 1 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/enums/StockFlowWater.java

@@ -19,6 +19,7 @@ public enum StockFlowWater implements IIntegerEnum<Integer> {
     ORDER_RETURN_REFUND_RETURN_STOCK(5, "订单退货退款回退库存"),
     DROP_ACTIVITY_PRODUCT_STOCK(6, "投放活动商品库存减少"),
     EDIT_ACTIVITY_PRODUCT_STOCK(7, "编辑活动商品库存"),
+    //TODO
     ACTIVITY_PRODUCT_CANCEL_LEFT_RETURN_STOCK(8, "活动商品取消剩余回退商品"),
     EDIT_ACTIVITY_PRODUCT_CONTINUE_DROP_STOCK(9, "编辑活动商品继续投放"),
     EDIT_ACTIVITY_PRODUCT_RETURN_ORIGINAL_PRODUCT(10, "编辑活动商品回退原商品"),

+ 8 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/domain/GroupBuyActivityGoods.java

@@ -150,4 +150,12 @@ public class GroupBuyActivityGoods extends BaseEntity {
         this.realSaleNum += saleNum;
         this.computeResultSaleAndResidueStock();
     }
+
+    public void decSaleNum(Integer saleNum) {
+        this.realSaleNum -= saleNum;
+        if (this.realSaleNum <= 0) {
+            this.realSaleNum = 0;
+        }
+        this.computeResultSaleAndResidueStock();
+    }
 }

+ 11 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/domain/GroupBuyTeam.java

@@ -155,6 +155,17 @@ public class GroupBuyTeam extends BaseTimeEntity {
         }
         return joinSuccessMembers;
     }
+    /**
+     * 获取团下面所有有效支付的成员数量
+     */
+    @TableField(exist = false)
+    private Long joinSuccessCount;
+
+    public Long getJoinSuccessCount() {
+        IGroupBuyTeamMemberService service  = SpringUtil.getBean("groupBuyTeamMemberServiceImpl",IGroupBuyTeamMemberService.class);
+        this.joinSuccessCount = service.loadJoinSuccessCount(this.id);
+        return this.joinSuccessCount;
+    }
 
     @TableField(exist = false)
     @FilePathValue

+ 3 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/IGroupBuyTeamMemberService.java

@@ -120,7 +120,7 @@ public interface IGroupBuyTeamMemberService {
     List<GroupBuyTeamMember> loadValidMember(Long teamId);
 
     /**
-     * 获取团下面所有参与成功的成员(参与成功,并不一定支付了,只是占了坑了,有过期支付参与失败的逻辑)
+     * 获取团下面所有参与成功的成员
      * @param teamId
      *
      */
@@ -136,4 +136,6 @@ public interface IGroupBuyTeamMemberService {
     GroupBuyTeamMember getMemberBy(Long teamId, Long userId);
 
     Long loadJoinSuccessCount(Long teamId);
+
+    void memberPayExpireHandler(ShopOrder shopOrder);
 }

+ 7 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/IGroupBuyTeamService.java

@@ -106,4 +106,11 @@ public interface IGroupBuyTeamService {
      * @param order 订单
      */
      GroupBuyTeamMember joinTeam(ShopOrder order);
+
+     /**
+     * 拼团成功
+     *
+     * @param buyTeamId 拼团ID
+     */
+     void teamSuccess(Long buyTeamId);
 }

+ 5 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/impl/GroupBuyActivityServiceImpl.java

@@ -17,6 +17,7 @@ import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyActivityGoodsMapper;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyActivityGoodsService;
 import com.ruoyi.shop.product.domain.vo.ProductVo;
 import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import com.ruoyi.shop.marketing.groupbuy.domain.bo.GroupBuyActivityBo;
 import com.ruoyi.shop.marketing.groupbuy.domain.vo.GroupBuyActivityVo;
@@ -25,6 +26,7 @@ import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyActivityMapper;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyActivityService;
 import com.ruoyi.shop.marketing.groupbuy.exception.GroupBuyActivityExceptionEnum;
 
+import javax.annotation.Resource;
 import java.util.List;
 import java.util.Map;
 import java.util.Collection;
@@ -43,7 +45,9 @@ public class GroupBuyActivityServiceImpl implements IGroupBuyActivityService {
 
     private final GroupBuyActivityGoodsMapper groupBuyActivityGoodsMapper;
 
-    private final IGroupBuyActivityGoodsService groupBuyActivityGoodsService;
+    @Lazy
+    @Resource
+    private  IGroupBuyActivityGoodsService groupBuyActivityGoodsService;
 
     /**
      * 查询拼团活动分页

+ 89 - 2
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/impl/GroupBuyTeamMemberServiceImpl.java

@@ -11,13 +11,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.ruoyi.shop.marketing.enums.MemberRightsType;
+import com.ruoyi.shop.marketing.enums.TeamStatus;
+import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyActivityGoods;
 import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyTeam;
 import com.ruoyi.shop.marketing.groupbuy.domain.vo.TeamMemberUserInfoVO;
+import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyActivityGoodsMapper;
+import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyTeamMapper;
+import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyActivityGoodsService;
+import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamService;
 import com.ruoyi.shop.order.domain.ShopOrder;
 import com.ruoyi.shop.order.domain.ShopOrderDetail;
 import com.ruoyi.shop.order.enums.PaymentStatus;
 import com.ruoyi.shop.order.enums.RightsStatus;
 import lombok.RequiredArgsConstructor;
+import org.redisson.api.RLock;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import com.ruoyi.shop.marketing.groupbuy.domain.bo.GroupBuyTeamMemberBo;
 import com.ruoyi.shop.marketing.groupbuy.domain.vo.GroupBuyTeamMemberVo;
@@ -26,7 +34,9 @@ import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyTeamMemberMapper;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamMemberService;
 import com.ruoyi.shop.marketing.groupbuy.exception.GroupBuyTeamMemberExceptionEnum;
 
+import javax.annotation.Resource;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 拼团活动的成员Service业务层处理
@@ -40,6 +50,18 @@ public class GroupBuyTeamMemberServiceImpl implements IGroupBuyTeamMemberService
 
     private final GroupBuyTeamMemberMapper baseMapper;
 
+    private final GroupBuyTeamMapper groupBuyTeamMapper;
+
+    private final GroupBuyActivityGoodsMapper groupBuyActivityGoodsMapper;
+
+    @Lazy
+    @Resource
+    private  IGroupBuyTeamService groupBuyTeamService;
+
+    @Lazy
+    @Resource
+    private  IGroupBuyActivityGoodsService groupBuyActivityGoodsService;
+
     /**
      * 查询拼团活动的成员分页
      *
@@ -199,11 +221,11 @@ public class GroupBuyTeamMemberServiceImpl implements IGroupBuyTeamMemberService
         groupBuyTeamMember.setLeader(isLeader);
         groupBuyTeamMember.setOrderId(order.getOrderId());
         groupBuyTeamMember.setOrderCode(order.getOrderNo());
-        groupBuyTeamMember.setJoinTime(new Date());
+        groupBuyTeamMember.setJoinTime(null);
         groupBuyTeamMember.setPayTime(null);
         groupBuyTeamMember.setPayExpireTime(team.getGroupBuyActivity().getPayExpireTime(new Date()));
         groupBuyTeamMember.setPayStatus(PaymentStatus.WAIT_PAY);
-        groupBuyTeamMember.setJoinStatus(true);
+        groupBuyTeamMember.setJoinStatus(false);
         groupBuyTeamMember.setRightsStatus(RightsStatus.NO_RIGHTS);
         groupBuyTeamMember.setMemberRightsType(MemberRightsType.NO);
 
@@ -221,7 +243,14 @@ public class GroupBuyTeamMemberServiceImpl implements IGroupBuyTeamMemberService
         groupBuyTeamMember.setTotalReduced(order.getTotalReduced());
         groupBuyTeamMember.setOrderDetailId(orderDetail.getOrderDetailId());
         groupBuyTeamMember.setNumber(orderDetail.getProductNum());
+        if(PaymentStatus.PAID.equals(order.getPaymentStatus()))
+        {
+            groupBuyTeamMember.setPayTime(new Date());
+            groupBuyTeamMember.setPayStatus(PaymentStatus.PAID);
+            groupBuyTeamMember.setJoinStatus(true);
+            groupBuyTeamMember.setJoinTime(new Date());
 
+        }
         this.baseMapper.insert(groupBuyTeamMember);
         return groupBuyTeamMember;
     }
@@ -277,9 +306,67 @@ public class GroupBuyTeamMemberServiceImpl implements IGroupBuyTeamMemberService
     public Long loadJoinSuccessCount(Long teamId) {
         return this.baseMapper.selectCount(new LambdaQueryWrapper<GroupBuyTeamMember>()
             .eq(GroupBuyTeamMember::getBuyTeamId, teamId)
+            .eq(GroupBuyTeamMember::getPayStatus, PaymentStatus.PAID)
             .eq(GroupBuyTeamMember::getJoinStatus, true)
         );
 
     }
 
+    @Override
+    public void memberPayExpireHandler(ShopOrder shopOrder) {
+        GroupBuyTeam groupBuyTeam = groupBuyTeamService.loadById(shopOrder.getSponsorActivityId(), false);
+        if(groupBuyTeam!=null)
+        {
+            GroupBuyTeamMember member = this.getMemberBy(groupBuyTeam.getId(), shopOrder.getUserId());
+            if(member.getLeader())
+            {
+                leaderPayExpireHandler(member);
+            }
+            else
+            {
+                memberPayExpireHandler(member);
+            }
+
+            //回退拼团商品库存
+            GroupBuyActivityGoods groupBuyActivityGoods = groupBuyActivityGoodsService.loadByIdAndLock(member.getGroupBuyProductId());
+            if(ObjectUtil.isNotNull(groupBuyActivityGoods)) {
+                groupBuyTeam.getGroupBuyActivityGoods();
+                groupBuyActivityGoods.decSaleNum(member.getNumber());
+                groupBuyActivityGoodsMapper.updateById(groupBuyActivityGoods);
+            }
+        }
+    }
+
+    /**
+     * 团长支付过期处理
+     */
+    private void leaderPayExpireHandler(GroupBuyTeamMember member) {
+        if(PaymentStatus.WAIT_PAY.equals(member.getPayStatus()))
+        {
+            //修改成员状态
+            member.setJoinStatus(false);
+            member.setPayStatus(PaymentStatus.EXPIRE);
+            this.baseMapper.updateById(member);
+
+            GroupBuyTeam groupBuyTeam = groupBuyTeamService.loadById(member.getBuyTeamId(), true);
+            groupBuyTeam.setStatus(TeamStatus.CREAT_FAIL);
+            groupBuyTeamMapper.updateById(groupBuyTeam);
+
+        }
+    }
+
+
+    /**
+     * 成员支付过期处理
+     */
+    private void memberPayExpireHandler(GroupBuyTeamMember member) {
+        if(PaymentStatus.WAIT_PAY.equals(member.getPayStatus()))
+        {
+            //修改成员状态
+            member.setJoinStatus(false);
+            member.setPayStatus(PaymentStatus.EXPIRE);
+            this.baseMapper.updateById(member);
+        }
+    }
+
 }

+ 38 - 4
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/impl/GroupBuyTeamServiceImpl.java

@@ -24,6 +24,7 @@ import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamMemberService;
 import com.ruoyi.shop.order.domain.ShopOrder;
 import com.ruoyi.shop.order.domain.ShopOrderDetail;
 import com.ruoyi.shop.order.enums.PaymentStatus;
+import com.ruoyi.shop.order.service.IShopOrderService;
 import lombok.RequiredArgsConstructor;
 import org.redisson.api.RLock;
 import org.springframework.context.annotation.Lazy;
@@ -69,6 +70,10 @@ public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
     @Lazy
     private IGroupBuyTeamMemberService groupBuyTeamMemberService;
 
+    @Lazy
+    @Resource
+    private final IShopOrderService shopOrderService;
+
     /**
      * 查询拼团活动的团分页
      *
@@ -261,6 +266,23 @@ public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
         return groupBuyTeamMemberService.createMember(groupBuyTeam, order, shopOrderDetail,false);
     }
 
+    @Override
+    public void teamSuccess(Long buyTeamId) {
+        GroupBuyTeam groupBuyTeam = this.loadById(buyTeamId, true);
+        Long joinSuccessCount = groupBuyTeam.getJoinSuccessCount();
+        if(groupBuyTeam.getGroupPersonNumber().equals(joinSuccessCount.intValue()))
+        {
+            groupBuyTeam.setCompleteTime(new Date());
+            groupBuyTeam.setStatus(TeamStatus.TEAM_SUCCESS);
+            this.baseMapper.updateById(groupBuyTeam);
+            List<GroupBuyTeamMember> groupBuyTeamMembers = groupBuyTeam.loadValidMembers();
+            for (GroupBuyTeamMember groupBuyTeamMember : groupBuyTeamMembers) {
+                groupBuyTeamMember.setJoinStatus(true);
+                shopOrderService.effectiveAfterAbleShip(groupBuyTeamMember.getOrderId());
+            }
+        }
+    }
+
     @Override
     public GroupBuyTeamMember createTeam(ShopOrder order) {
         GroupBuyActivity groupBuyActivity = groupBuyActivityService.loadById(order.getActivityId(), true);
@@ -269,6 +291,7 @@ public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
         //变更活动库存
         ShopOrderDetail shopOrderDetail = order.loadOrderDetails(true).get(0);
         GroupBuyActivityGoods activityGoods = incSaleNum(shopOrderDetail.getActivityProductId(),shopOrderDetail.getProductNum());
+
         //开团
         GroupBuyTeam groupBuyTeam = new GroupBuyTeam();
         groupBuyTeam.setBusinessId(order.getBusinessId());
@@ -278,10 +301,21 @@ public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
         groupBuyTeam.setLeaderUserMobile(order.getUserMobile());
         groupBuyTeam.setGroupPersonNumber(activityGoods.getGroupPeopleNum());
         groupBuyTeam.setLimitTime(groupBuyActivity.getLimitHour());
-        groupBuyTeam.setStartTime(null);
-        groupBuyTeam.setEndTime(null);
-        groupBuyTeam.setCompleteTime(null);
-        groupBuyTeam.setStatus(TeamStatus.CREATING);
+        if(PaymentStatus.PAID.equals(order.getPaymentStatus()))
+        {
+            groupBuyTeam.setStartTime(new Date());
+            groupBuyTeam.setEndTime(DateUtil.offsetHour(groupBuyTeam.getStartTime(), groupBuyTeam.getLimitTime()));
+            groupBuyTeam.setCompleteTime(null);
+            groupBuyTeam.setStatus(TeamStatus.CREAT_SUCCESS);
+        }
+        else
+        {
+            groupBuyTeam.setStartTime(null);
+            groupBuyTeam.setEndTime(null);
+            groupBuyTeam.setCompleteTime(null);
+            groupBuyTeam.setStatus(TeamStatus.CREATING);
+        }
+
         this.baseMapper.insert(groupBuyTeam);
 
         //添加团成员

+ 3 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/order/enums/PaymentStatus.java

@@ -17,7 +17,9 @@ public enum PaymentStatus implements IIntegerEnum<Integer> {
 
     WAIT_PAY(0, "待支付"),
     PAID(10, "已支付"),
-    PAY_FAIL(100, "支付失败");
+    PAY_FAIL(100, "支付失败"),
+    EXPIRE(200, "支付过期")
+    ;
 
     private Integer code;
 

+ 2 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/IShopOrderService.java

@@ -236,4 +236,6 @@ public interface IShopOrderService {
     ShopOrder loadByBusinessIdAndOrderNo(Long businessId, String orderNo, boolean tw);
 
     void modify(ShopOrder order);
+
+    void effectiveAfterAbleShip(Long orderId);
 }

+ 6 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/createorder/impl/CreateGroupBuyOrderService.java

@@ -5,6 +5,7 @@ import cn.hutool.core.util.ObjectUtil;
 import com.ruoyi.common.enums.order.MarketingType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.shop.coupon.domain.vo.CouponReceiveRecordVo;
+import com.ruoyi.shop.marketing.enums.TeamStatus;
 import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyActivity;
 import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyActivityGoods;
 import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyTeam;
@@ -38,6 +39,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -99,6 +101,10 @@ public class CreateGroupBuyOrderService extends AbstractCreateOrderService imple
         } else {
             //如果提供团数据,说明是参团
             teamMember = groupBuyTeamService.joinTeam(orderEntity);
+            if(teamMember.getJoinStatus())
+            {
+                groupBuyTeamService.teamSuccess(teamMember.getBuyTeamId());
+            }
         }
         if (PaymentStatus.WAIT_PAY.equals(orderEntity.getPaymentStatus())) {
             orderEntity.setExpiredTime(teamMember.getPayExpireTime());

+ 30 - 12
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/impl/ShopOrderServiceImpl.java

@@ -17,6 +17,7 @@ import com.ruoyi.businessDayBill.enums.BusinessDayBillChangeType;
 import com.ruoyi.businessDayBill.service.IBusinessDayBillService;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.order.MarketingType;
 import com.ruoyi.common.enums.order.OrderType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.BeanCopyUtils;
@@ -28,6 +29,7 @@ import com.ruoyi.shop.business.service.IUserBusinessRoleService;
 import com.ruoyi.shop.config.domain.ShopSaleConfig;
 import com.ruoyi.shop.config.service.IShopSaleConfigService;
 import com.ruoyi.shop.coupon.service.ICouponReceiveRecordService;
+import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamMemberService;
 import com.ruoyi.shop.order.domain.ShopOrder;
 import com.ruoyi.shop.order.domain.ShopOrderDetail;
 import com.ruoyi.shop.order.domain.bo.*;
@@ -88,6 +90,8 @@ public class ShopOrderServiceImpl implements IShopOrderService {
     private final IBusinessDayBillService businessDayBillService;
     private final IBusinessService businessService;
 
+    private final IGroupBuyTeamMemberService groupBuyTeamMemberService;
+
     /**
      * 查询订单分页
      *
@@ -360,6 +364,11 @@ public class ShopOrderServiceImpl implements IShopOrderService {
                 shopOrderDetailService.cancel(shopOrder, shopOrderDetail);
             }
 
+            if(MarketingType.GROUP.equals(shopOrder.getMarketingType()))
+            {
+                groupBuyTeamMemberService.memberPayExpireHandler(shopOrder);
+            }
+
             //按商品ID分组后合计商品销量
             shopOrderDetails.stream().collect(Collectors.groupingBy(ShopOrderDetail::getProductId)).forEach((productId, shopOrderDetails1) -> {
                 Integer num = shopOrderDetails1.stream().mapToInt(ShopOrderDetail::getProductNum).sum();
@@ -370,18 +379,20 @@ public class ShopOrderServiceImpl implements IShopOrderService {
             //优惠券回退
             couponReceiveRecordService.backCoupon(cancelOrderBo.getOrderId());
 
-            //积分回退
-            userBusinessRoleService.changeUserIntegral(UserBusinessChangeIntegralBo.builder()
-                .userId(shopOrder.getUserId())
-                .businessId(shopOrder.getBusinessId())
-                .integral(shopOrder.getPaymentPoints())
-                .isAdd(true)
-                .canExpire(false)
-                .sourceType(IntegralSourceType.CANCEL_ORDER_RETURN)
-                .sourceId(shopOrder.getOrderId())
-                .sourceCode(shopOrder.getOrderNo())
-                .remark("商城购物取消积分退回")
-                .build());
+            if(shopOrder.getPaymentPoints().compareTo(BigDecimal.ZERO) > 0) {
+                //积分回退
+                userBusinessRoleService.changeUserIntegral(UserBusinessChangeIntegralBo.builder()
+                    .userId(shopOrder.getUserId())
+                    .businessId(shopOrder.getBusinessId())
+                    .integral(shopOrder.getPaymentPoints())
+                    .isAdd(true)
+                    .canExpire(false)
+                    .sourceType(IntegralSourceType.CANCEL_ORDER_RETURN)
+                    .sourceId(shopOrder.getOrderId())
+                    .sourceCode(shopOrder.getOrderNo())
+                    .remark("商城购物取消积分退回")
+                    .build());
+            }
         }
     }
 
@@ -588,6 +599,13 @@ public class ShopOrderServiceImpl implements IShopOrderService {
         this.baseMapper.updateById(order);
     }
 
+    @Override
+    public void effectiveAfterAbleShip(Long orderId) {
+        ShopOrder order = loadById(orderId, true);
+        order.setEffective(true);
+        this.baseMapper.updateById(order);
+    }
+
     @Override
     public void endRefundOrderSync(Long orderDetailId, Long orderId) {
         ShopOrder shopOrder = this.loadByLockId(orderId, true);