lubo hace 1 mes
padre
commit
f614146bc3

+ 42 - 13
ruoyi-message/src/main/java/com/ruoyi/listener/AutoShopOrderNotifyReceiver.java

@@ -14,6 +14,8 @@ import com.ruoyi.rabbitmq.constant.GeneralConstant;
 import com.ruoyi.rabbitmq.core.BaseRabbiMqHandler;
 import com.ruoyi.rabbitmq.listener.MqListener;
 import com.ruoyi.rabbitmq.utils.BaseMap;
+import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyTeam;
+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.domain.ShopOrderPackage;
@@ -90,6 +92,10 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
     @Resource
     private ISendPrivateMessageMsgService sendPrivateMessageMsgService;
 
+    @Lazy
+    @Resource
+    private IGroupBuyTeamService groupBuyTeamService;
+
 
     /**
      * 订单自动取消 完成
@@ -165,7 +171,7 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
                 // 业务处理
                 String result = new String(message.getBody());
                 Long orderDetailId = Long.valueOf(result);
-                log.info("MQ 自动封单和自动评价,订单明细orderDetailId : " + orderDetailId);
+                log.info("MQ 自动封单和自动评价,订单明细orderDetailId : {}", orderDetailId);
                 ShopOrderDetail shopOrderDetail = shopOrderDetailService.loadById(orderDetailId, true);
                 try {
                     shopOrderService.autoEnd(shopOrderDetail);
@@ -238,14 +244,14 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
                 Long rightsId = Long.valueOf(result);
                 SaleRightsOrder saleRightsOrder = saleRightsOrderService.loadById(rightsId, false);
                 try {
-                    log.info(String.format("维权订单:%s,维权申请商家过期没处理,开始执行货自动同意", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},维权申请商家过期没处理,开始执行货自动同意", saleRightsOrder.getRightsCode());
                     SaleRightsOrder agreeOrder = saleRightsOrderService.autoAgree(saleRightsOrder);
                     if (RightsMethod.RETURN_GOODS.equals(saleRightsOrder.getRightsType())) {
                         rightsMqService.rightsAgreeSendMsg(agreeOrder);
                     }
-                    log.info(String.format("维权订单:%s,维权申请商家过期没处理,完成执行货自动同意", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},维权申请商家过期没处理,完成执行货自动同意", saleRightsOrder.getRightsCode());
                 } catch (Exception ex) {
-                    log.error(String.format("维权订单:%s,维权申请商家过期没处理,完成执行货自动同意,出错%s", saleRightsOrder.getRightsCode(), ex.getMessage()));
+                    log.error("维权订单:{},维权申请商家过期没处理,完成执行货自动同意,出错{}", saleRightsOrder.getRightsCode(), ex.getMessage());
                 }
             }
         });
@@ -264,11 +270,11 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
                 Long rightsId = Long.valueOf(result);
                 SaleRightsOrder saleRightsOrder = saleRightsOrderService.loadById(rightsId, false);
                 try {
-                    log.info(String.format("维权订单:%s,买家过期没有填写物流单,开始执行货自动取消", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},买家过期没有填写物流单,开始执行货自动取消", saleRightsOrder.getRightsCode());
                     saleRightsOrderService.autoCancel(saleRightsOrder);
-                    log.info(String.format("维权订单:%s,买家过期没有填写物流单,完成执行货自动取消", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},买家过期没有填写物流单,完成执行货自动取消", saleRightsOrder.getRightsCode());
                 } catch (Exception ex) {
-                    log.error(String.format("维权订单:%s,买家过期没有填写物流单,完成执行货自动取消,出错%s", saleRightsOrder.getRightsCode(), ex.getMessage()));
+                    log.error("维权订单:{},买家过期没有填写物流单,完成执行货自动取消,出错{}", saleRightsOrder.getRightsCode(), ex.getMessage());
                 }
             }
         });
@@ -287,7 +293,7 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
                 Long rightsId = Long.valueOf(result);
                 SaleRightsOrder saleRightsOrder = saleRightsOrderService.loadById(rightsId, false);
                 try {
-                    log.info(String.format("维权订单:%s,商家处理维权发送消息", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},商家处理维权发送消息", saleRightsOrder.getRightsCode());
                     String statusTxt = "";
                     switch (saleRightsOrder.getRightsOperateStatus()) {
                         case AGREE:
@@ -315,9 +321,9 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
                         userNoticeBo.setEntityId(saleRightsOrder.getId());
                         userNoticeService.insertByBo(userNoticeBo);
                     }
-                    log.info(String.format("维权订单:%s,商家处理维权发送消息完成", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},商家处理维权发送消息完成", saleRightsOrder.getRightsCode());
                 } catch (Exception ex) {
-                    log.error(String.format("维权订单:%s,商家处理维权发送消息出错%s", saleRightsOrder.getRightsCode(), ex.getMessage()));
+                    log.error("维权订单:{},商家处理维权发送消息出错{}", saleRightsOrder.getRightsCode(), ex.getMessage());
                 }
             }
         });
@@ -336,11 +342,34 @@ public class AutoShopOrderNotifyReceiver extends BaseRabbiMqHandler<BaseMap> {
                 Long rightsId = Long.valueOf(result);
                 SaleRightsOrder saleRightsOrder = saleRightsOrderService.loadById(rightsId, false);
                 try {
-                    log.info(String.format("维权订单:%s,商家收货过期,开始执行货自动收货", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},商家收货过期,开始执行货自动收货", saleRightsOrder.getRightsCode());
                     saleRightsOrderService.autoReceipt(saleRightsOrder);
-                    log.info(String.format("维权订单:%s,商家收货过期,完成执行货自动收货", saleRightsOrder.getRightsCode()));
+                    log.info("维权订单:{},商家收货过期,完成执行货自动收货", saleRightsOrder.getRightsCode());
+                } catch (Exception ex) {
+                    log.error("维权订单:{},商家收货过期,完成执行货自动收货,出错{}", saleRightsOrder.getRightsCode(), ex.getMessage());
+                }
+            }
+        });
+    }
+
+    /**
+     * 过期没有成团的团需要取消
+     */
+    @RabbitListener(queues = DelayedConstant.AutoExpireTeamConstant.AUTO_EXPIRE_TEAM_DELAYED_QUEUE)
+    public void autoExpireTeam(Message message, Channel channel) {
+        super.onMessage(message, channel, new MqListener<BaseMap>() {
+            @Override
+            public void handler(Message message) {
+                // 业务处理
+                String result = new String(message.getBody());
+                Long teamId = Long.valueOf(result);
+                GroupBuyTeam v = groupBuyTeamService.loadById(teamId, false);
+                try {
+                    log.info("编号:{} 过期没有组团成功,开始执行取消", v.getId().toString());
+                    groupBuyTeamService.expireTeamHandle(v);
+                    log.info("编号:{} 过期没有组团成功,执行取消完成", v.getId().toString());
                 } catch (Exception ex) {
-                    log.error(String.format("维权订单:%s,商家收货过期,完成执行货自动收货,出错%s", saleRightsOrder.getRightsCode(), ex.getMessage()));
+                    log.error("编号:{} 过期没有组团成功,执行取消,出错{}", v.getId().toString(), ex.getMessage());
                 }
             }
         });

+ 25 - 0
ruoyi-rabbitmq/src/main/java/com/ruoyi/rabbitmq/config/RabbitMqDelayedConfig.java

@@ -11,6 +11,7 @@ import org.springframework.context.annotation.Configuration;
 import java.util.HashMap;
 import java.util.Map;
 
+import static com.ruoyi.rabbitmq.constant.DelayedConstant.AutoExpireTeamConstant.*;
 import static com.ruoyi.rabbitmq.constant.DelayedConstant.CustomTestDelayedConstant.*;
 import static com.ruoyi.rabbitmq.constant.DelayedConstant.OrderAutoCLoseDelayedConstant.*;
 import static com.ruoyi.rabbitmq.constant.DelayedConstant.OrderAutoReceivingDelayedConstant.*;
@@ -226,4 +227,28 @@ public class RabbitMqDelayedConfig {
         return BindingBuilder.bind(queue).to(customExchange).with(RIGHTS_AUTO_RECEIPT_DELAYED_ROUTING).noargs();
     }
     //endregion
+
+
+    //region 过期没有成团的团需要取消 延时队列MQ
+    @Bean
+    public Queue autoExpireTeamDelayedQueue() {
+        return new Queue(AUTO_EXPIRE_TEAM_DELAYED_QUEUE);
+    }
+
+    @Bean
+    public CustomExchange autoExpireTeamDelayedExchange() {
+        Map<String, Object> args = new HashMap<String, Object>();
+        args.put("x-delayed-type", "direct");
+        // 表⽰是否最多只允许⼀个消费者消费,如果有多个消费者同时绑定,则只会激活第⼀个,
+        // 除⾮第⼀个消费者被取消或者死亡,才会⾃动转到下⼀个消费者。
+        args.put("x-single-active-consumer", true);
+        return new CustomExchange(AUTO_EXPIRE_TEAM_DELAYED_EXCHANGE, "x-delayed-message", true, false, args);
+    }
+
+    @Bean
+    public Binding autoExpireTeamReceiptDelayedRouting(@Qualifier("autoExpireTeamDelayedQueue") Queue queue,
+                                                   @Qualifier("autoExpireTeamDelayedExchange") CustomExchange customExchange) {
+        return BindingBuilder.bind(queue).to(customExchange).with(AUTO_EXPIRE_TEAM_DELAYED_ROUTING).noargs();
+    }
+    //endregion
 }

+ 8 - 0
ruoyi-rabbitmq/src/main/java/com/ruoyi/rabbitmq/constant/DelayedConstant.java

@@ -73,4 +73,12 @@ public class DelayedConstant {
         String RIGHTS_AUTO_RECEIPT_DELAYED_ROUTING = PREFIX+"rights_auto_receipt_delayed_routingkey";
     }
 
+
+    /** 过期没有成团的团需要取消 **/
+    public interface AutoExpireTeamConstant {
+        String AUTO_EXPIRE_TEAM_DELAYED_EXCHANGE = PREFIX+"auto_expire_team_delayed_exchange";
+        String AUTO_EXPIRE_TEAM_DELAYED_QUEUE= PREFIX+"auto_expire_team_delayed_queue";
+        String AUTO_EXPIRE_TEAM_DELAYED_ROUTING = PREFIX+"auto_expire_team_delayed_routingkey";
+    }
+
 }

+ 13 - 1
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/IGroupBuyTeamService.java

@@ -114,5 +114,17 @@ public interface IGroupBuyTeamService {
      */
      void teamSuccess(Long buyTeamId);
 
-    void paySuccess(ShopOrder order);
+     /**
+     * 支付成功
+     *
+     * @param order 订单
+     */
+     GroupBuyTeam paySuccess(ShopOrder order);
+
+     /**
+     * 拼团过期
+     *
+     * @param buyTeamId 拼团ID
+     */
+     GroupBuyTeam expireTeamHandle(GroupBuyTeam team);
 }

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

@@ -204,7 +204,10 @@ public class GroupBuyActivityServiceImpl implements IGroupBuyActivityService {
         {
             throw new ServiceException(GroupBuyActivityExceptionEnum.GROUP_BUY_ACTIVITY_HAS_GOODS);
         }
-        return baseMapper.deleteById(id) > 0;
+        boolean flag = baseMapper.deleteById(id) > 0;
+
+        //TODO 把所有的拼团活动商品的库存回退
+        return flag;
     }
 
     @Override

+ 92 - 3
ruoyi-shop/src/main/java/com/ruoyi/shop/marketing/groupbuy/service/impl/GroupBuyTeamServiceImpl.java

@@ -11,13 +11,16 @@ import com.ruoyi.common.core.domain.PageQuery;
 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.enums.RightsOperatePerson;
 import com.ruoyi.shop.marketing.enums.ActiveState;
+import com.ruoyi.shop.marketing.enums.MemberRightsType;
 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.GroupBuyTeamMember;
 import com.ruoyi.shop.marketing.groupbuy.domain.vo.GroupBuyActivityVo;
 import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyActivityGoodsMapper;
+import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyTeamMemberMapper;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyActivityGoodsService;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyActivityService;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamMemberService;
@@ -25,7 +28,9 @@ 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 com.ruoyi.shop.rights.service.ISaleRightsOrderService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RLock;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
@@ -35,8 +40,10 @@ import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyTeam;
 import com.ruoyi.shop.marketing.groupbuy.mapper.GroupBuyTeamMapper;
 import com.ruoyi.shop.marketing.groupbuy.service.IGroupBuyTeamService;
 import com.ruoyi.shop.marketing.groupbuy.exception.GroupBuyTeamExceptionEnum;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -49,11 +56,13 @@ import java.util.concurrent.TimeUnit;
  * @author lubo
  * @date 2026-02-26
  */
+@Slf4j
 @RequiredArgsConstructor
 @Service
 public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
 
     private final GroupBuyTeamMapper baseMapper;
+    private final GroupBuyTeamMemberMapper groupBuyTeamMemberMapper;
 
     private final GroupBuyActivityGoodsMapper groupBuyActivityGoodsMapper;
 
@@ -74,6 +83,10 @@ public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
     @Resource
     private final IShopOrderService shopOrderService;
 
+    @Lazy
+    @Resource
+    private final ISaleRightsOrderService saleRightsOrderService;
+
     /**
      * 查询拼团活动的团分页
      *
@@ -270,22 +283,98 @@ public class GroupBuyTeamServiceImpl implements IGroupBuyTeamService {
     public void teamSuccess(Long buyTeamId) {
         GroupBuyTeam groupBuyTeam = this.loadById(buyTeamId, true);
         Long joinSuccessCount = groupBuyTeam.getJoinSuccessCount();
-        if(groupBuyTeam.getGroupPersonNumber().equals(joinSuccessCount.intValue()))
+        if(groupBuyTeam.getGroupPersonNumber()<=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());
             }
         }
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public GroupBuyTeam paySuccess(ShopOrder order) {
+        GroupBuyTeam groupBuyTeam = this.loadById(order.getSponsorActivityId(), true);
+        GroupBuyTeamMember member = groupBuyTeamMemberService.getMemberBy(groupBuyTeam.getId(), order.getUserId());
+        //更新团成员的支付状态和支付时间
+        member.setPayStatus(PaymentStatus.PAID);
+        member.setJoinStatus(true);
+        member.setPayTime(new Date());
+        groupBuyTeamMemberMapper.updateById(member);
+        //如果是团长
+        if (member.getLeader()) {
+            //建团成功
+            groupBuyTeam.setStatus(TeamStatus.CREAT_SUCCESS);
+            groupBuyTeam.setStartTime(new Date());
+            groupBuyTeam.setEndTime(groupBuyTeam.computeEndTime());
+            this.baseMapper.updateById(groupBuyTeam);
+        } else {
+            //查询已成功支付的人员的数量
+            Long count = groupBuyTeamMemberService.loadJoinSuccessCount(groupBuyTeam.getId());
+            //如果成员数满员
+            if (count >= groupBuyTeam.getGroupPersonNumber()) {
+                //更新团的状诚为组团成功
+                groupBuyTeam.setStatus(TeamStatus.TEAM_SUCCESS);
+                groupBuyTeam.setCompleteTime(new Date());
+                this.baseMapper.updateById(groupBuyTeam);
+                List<GroupBuyTeamMember> members = groupBuyTeamMemberService.loadValidMember(groupBuyTeam.getId());
+                for(GroupBuyTeamMember subMember : members)
+                {
+                    //同时把所有成员订单改成有效,这样就可以发货了
+                    shopOrderService.effectiveAfterAbleShip(subMember.getOrderId());
+                }
+            }
+        }
+        return groupBuyTeam;
+    }
+
+    @Transactional
     @Override
-    public void paySuccess(ShopOrder order) {
+    public GroupBuyTeam expireTeamHandle(GroupBuyTeam team) {
+        //不是组团中的不能过期
+        if(!TeamStatus.CREAT_SUCCESS.equals(team.getStatus()))
+        {
+            throw new ServiceException("不是组团中的不能过期");
+        }
+
+        if(team.getJoinSuccessCount()>0) {
+            team.setStatus(TeamStatus.TEAM_SUCCESS);
+            team.setCompleteTime(new Date());
+            this.baseMapper.updateById(team);
+        }
+        else {
+            team.setStatus(TeamStatus.TEAM_FAIL);
+            this.baseMapper.updateById(team);
+        }
 
+//        team.setStatus(TeamStatus.TEAM_FAIL);
+//        this.baseMapper.updateById(team);
+
+//        GroupBuyActivityGoods activityGoods = groupBuyActivityGoodsService.loadById(team.getGroupBuyProductId(), false);
+//        if(ObjectUtil.isNotNull(activityGoods)) {
+//            List<GroupBuyTeamMember> groupBuyTeamMembers = groupBuyTeamMemberService.loadValidMember(team.getId());
+//            for (GroupBuyTeamMember member : groupBuyTeamMembers) {
+//
+//                activityGoods.decSaleNum(member.getNumber());
+//                groupBuyActivityGoodsMapper.updateById(activityGoods);
+//                member.setMemberRightsType(MemberRightsType.COMPOSE_EXPIRE);
+//                ShopOrder order = shopOrderService.loadById(member.getOrderId(), false);
+//                if(ObjectUtil.isNotNull( order))
+//                {
+//                    try {
+//                        //自动发起退款维权=====================================================
+//                        saleRightsOrderService.systemAutoRefund(order, RightsOperatePerson.SYSTEM);
+//                    } catch (Exception ex) {
+//                        log.error("编号:{} 过期没有组团成功,执行自动退款,出错{}", order.getOrderNo(), ex.getMessage());
+//                    }
+//                }
+//            }
+//        }
+        return team;
     }
 
     @Override

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

@@ -36,6 +36,7 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.util.Collections;
@@ -82,6 +83,7 @@ public class CreateGroupBuyOrderService extends AbstractCreateOrderService imple
     private IShopOrderDetailService shopOrderDetailService;
 
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     public ShopOrder createOrder(CreateOrderBo createOrderBo) {
         this.validateTeam(createOrderBo);

+ 35 - 6
ruoyi-shop/src/main/java/com/ruoyi/shop/order/service/mqproduct/ShopOrderMqProductServiceImpl.java

@@ -3,10 +3,14 @@ package com.ruoyi.shop.order.service.mqproduct;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.ruoyi.common.enums.order.MarketingType;
 import com.ruoyi.rabbitmq.client.RabbitMqClient;
 import com.ruoyi.rabbitmq.constant.DelayedConstant;
 import com.ruoyi.shop.config.domain.ShopSaleConfig;
 import com.ruoyi.shop.config.service.IShopSaleConfigService;
+import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyTeam;
+import com.ruoyi.shop.marketing.groupbuy.domain.GroupBuyTeamMember;
+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.domain.ShopOrderPackage;
@@ -37,6 +41,10 @@ public class ShopOrderMqProductServiceImpl implements IShopOrderMqProductService
     @Resource
     private IShopOrderPackageService shopOrderPackageService;
 
+    @Lazy
+    @Resource
+    private IGroupBuyTeamService groupBuyTeamService;
+
 
     /**
      * 发送订单自动结束MQ的
@@ -87,12 +95,33 @@ public class ShopOrderMqProductServiceImpl implements IShopOrderMqProductService
     @Override
     public void autoStockUpMqProductSend(Long orderId) {
         ShopOrder order = shopOrderService.loadById(orderId, false);
-        if (ShippingMethod.SELF_PICKUP.equals(order.getShippingMethod()) && ObjectUtil.isNotNull(order.getAutoStockUpLastTime())) {
-            int lazyTime = Long.valueOf(DateUtil.between(new Date(), order.getAutoStockUpLastTime(), DateUnit.MS)).intValue();
-            rabbitMqClient.send(DelayedConstant.OrderAutoStockUpDelayedConstant.ORDER_AUTO_STOCK_UP_DELAYED_EXCHANGE,
-                DelayedConstant.OrderAutoStockUpDelayedConstant.ORDER_AUTO_STOCK_UP_DELAYED_ROUTING,
-                String.valueOf(order.getOrderId()),
-                lazyTime);
+        if(!MarketingType.GROUP.equals(order.getMarketingType())) {
+            if (ShippingMethod.SELF_PICKUP.equals(order.getShippingMethod()) && ObjectUtil.isNotNull(order.getAutoStockUpLastTime())) {
+                int lazyTime = Long.valueOf(DateUtil.between(new Date(), order.getAutoStockUpLastTime(), DateUnit.MS)).intValue();
+                rabbitMqClient.send(DelayedConstant.OrderAutoStockUpDelayedConstant.ORDER_AUTO_STOCK_UP_DELAYED_EXCHANGE,
+                    DelayedConstant.OrderAutoStockUpDelayedConstant.ORDER_AUTO_STOCK_UP_DELAYED_ROUTING,
+                    String.valueOf(order.getOrderId()),
+                    lazyTime);
+            }
+        }else{
+            if(order.getEffective())
+            {
+                GroupBuyTeam groupBuyTeam = groupBuyTeamService.loadById(order.getSponsorActivityId(), false);
+                if(ObjectUtil.isNotNull(groupBuyTeam))
+                {
+                    List<GroupBuyTeamMember> groupBuyTeamMembers = groupBuyTeam.loadValidMembers();
+                    for (GroupBuyTeamMember groupBuyTeamMember : groupBuyTeamMembers) {
+                        ShopOrder memberOrder = shopOrderService.loadById(groupBuyTeamMember.getOrderId(), false);
+                        if (memberOrder.getEffective() && ShippingMethod.SELF_PICKUP.equals(memberOrder.getShippingMethod()) && ObjectUtil.isNotNull(memberOrder.getAutoStockUpLastTime())) {
+                            int lazyTime = Long.valueOf(DateUtil.between(new Date(), memberOrder.getAutoStockUpLastTime(), DateUnit.MS)).intValue();
+                            rabbitMqClient.send(DelayedConstant.OrderAutoStockUpDelayedConstant.ORDER_AUTO_STOCK_UP_DELAYED_EXCHANGE,
+                                DelayedConstant.OrderAutoStockUpDelayedConstant.ORDER_AUTO_STOCK_UP_DELAYED_ROUTING,
+                                String.valueOf(memberOrder.getOrderId()),
+                                lazyTime);
+                        }
+                    }
+                }
+            }
         }
     }
 

+ 4 - 0
ruoyi-shop/src/main/java/com/ruoyi/shop/rights/service/ISaleRightsOrderService.java

@@ -1,10 +1,12 @@
 package com.ruoyi.shop.rights.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.domain.Shop;
 import com.ruoyi.common.core.domain.PageQuery;
 import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.newwxpay.refund.RefundNotifyResult;
 import com.ruoyi.shop.enums.RightsOperatePerson;
+import com.ruoyi.shop.order.domain.ShopOrder;
 import com.ruoyi.shop.rights.domain.SaleRightsOrder;
 import com.ruoyi.shop.rights.domain.bo.SaleRightsOrderBo;
 import com.ruoyi.shop.rights.domain.bo.SaleRightsOrderOperateRecordBo;
@@ -124,4 +126,6 @@ public interface ISaleRightsOrderService {
     Integer loadRightsOrderNum(Long businessId, int i);
 
     SaleRightsOrder loadByRightsCode(String rightsCode, boolean tw);
+
+    SaleRightsOrderVo systemAutoRefund(ShopOrder order, RightsOperatePerson rightsOperatePerson);
 }

+ 70 - 59
ruoyi-shop/src/main/java/com/ruoyi/shop/rights/service/impl/SaleRightsOrderServiceImpl.java

@@ -760,68 +760,13 @@ public class SaleRightsOrderServiceImpl implements ISaleRightsOrderService {
     @Transactional(rollbackFor = Exception.class)
     @Override
     public SaleRightsOrderVo shopLaunchRefund(Long orderId, Long businessId, RightsOperatePerson operatePerson) {
+
         ShopOrder shopOrder = shopOrderService.loadByBusinessIdAndId(businessId, orderId, true);
-        //订单已关闭
-        if (shopOrder.getEnd()) {
-            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_ORDER_IS_CLOSED);
-        }
-        //没有支付成功不能申请退款
-        if (!PaymentStatus.PAID.equals(shopOrder.getPaymentStatus())) {
-            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_NOT_ALLOW_APPLY_REFUND);
-        }
-        //已存在主维权单
-        if (getCountRightsOrder(shopOrder.getOrderId(), true) > 0) {
-            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_RIGHTS_ORDER_EXISTS);
-        }
-        //如果存在子维权订单
-        if (this.getCountRightsOrder(shopOrder.getOrderId(), false) > 0) {
-            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_RIGHTS_ORDER_EXISTS);
-        }
-        /**
-         * 第一步创建维权订单
-         */
-        //生成维权订单==============================================================
-        SaleRightsOrder rightsOrder = systemCreateRightsOrder(shopOrder, operatePerson);
 
-        //更新主订单的维权状态
-        ShopOrderBo orderUpdateBo = new ShopOrderBo();
-        orderUpdateBo.setOrderId(shopOrder.getOrderId());
-        orderUpdateBo.setRightsStatus(RightsStatus.RIGHTS_PROCESSING);
-        orderUpdateBo.setRightsMethod(rightsOrder.getRightsType());
-        shopOrderService.updateByBo(orderUpdateBo);
-        /**
-         * 第二步创建维权订单明细
-         */
-        List<ShopOrderDetail> shopOrderDetails = shopOrder.loadOrderDetails(true);
-        for (ShopOrderDetail childOrder : shopOrderDetails) {
-            saleRightsOrderDetailService.insertByBo(build(rightsOrder, childOrder, childOrder.getProductNum(), childOrder.getPaymentAmount(), childOrder.getTotalPoint()));
-            /**
-             * 更新子订单的维权状态
-             */
-            ShopOrderDetailBo detailUpdateBo = new ShopOrderDetailBo();
-            detailUpdateBo.setOrderDetailId(childOrder.getOrderDetailId());
-            detailUpdateBo.setRightsStatus(RightsStatus.RIGHTS_PROCESSING);
-            detailUpdateBo.setRightsMethod(rightsOrder.getRightsType());
-            detailUpdateBo.setRightsNum(childOrder.getProductNum());
-            shopOrderDetailService.updateByBo(detailUpdateBo);
+        if (!OrderType.NORMAL.equals(shopOrder.getOrderType())) {
+            throw new ServiceException("只支持普通订单的全额退款");
         }
-        /**
-         * 第三步创建维权订单操作日志
-         */
-        createRecord(rightsOrder.getId(), rightsOrder.getRightsOperateStatus(), rightsOrder.getReason(), rightsOrder.getVoucherImages(), operatePerson, businessId);
-        /**
-         * 第四步修改维权单的状态成为已同意
-         */
-        rightsOrder.setRightsOperateStatus(RightsOperateStatus.AGREE);
-        baseMapper.updateById(rightsOrder);
-        /**
-         * 第五步创建维权订单操作日志
-         */
-        createRecord(rightsOrder.getId(), rightsOrder.getRightsOperateStatus(), "", new ArrayList<>(), operatePerson, businessId);
-        /**
-         * 第六步发起退款
-         */
-        return BeanCopyUtils.copy(refund(rightsOrder, shopOrder), SaleRightsOrderVo.class);
+        return systemAutoRefund(shopOrder, operatePerson);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -1041,6 +986,72 @@ public class SaleRightsOrderServiceImpl implements ISaleRightsOrderService {
         return saleRightsOrder;
     }
 
+    @Override
+    public SaleRightsOrderVo systemAutoRefund(ShopOrder shopOrder, RightsOperatePerson operatePerson) {
+        //订单已关闭
+        if (shopOrder.getEnd()) {
+            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_ORDER_IS_CLOSED);
+        }
+        //没有支付成功不能申请退款
+        if (!PaymentStatus.PAID.equals(shopOrder.getPaymentStatus())) {
+            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_NOT_ALLOW_APPLY_REFUND);
+        }
+        //已存在主维权单
+        if (getCountRightsOrder(shopOrder.getOrderId(), true) > 0) {
+            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_RIGHTS_ORDER_EXISTS);
+        }
+        //如果存在子维权订单
+        if (this.getCountRightsOrder(shopOrder.getOrderId(), false) > 0) {
+            throw new ServiceException(SaleRightsOrderExceptionEnum.SaleRightsOrder_RIGHTS_ORDER_EXISTS);
+        }
+        /**
+         * 第一步创建维权订单
+         */
+        //生成维权订单==============================================================
+        SaleRightsOrder rightsOrder = systemCreateRightsOrder(shopOrder, operatePerson);
+
+        //更新主订单的维权状态
+        ShopOrderBo orderUpdateBo = new ShopOrderBo();
+        orderUpdateBo.setOrderId(shopOrder.getOrderId());
+        orderUpdateBo.setRightsStatus(RightsStatus.RIGHTS_PROCESSING);
+        orderUpdateBo.setRightsMethod(rightsOrder.getRightsType());
+        shopOrderService.updateByBo(orderUpdateBo);
+        /**
+         * 第二步创建维权订单明细
+         */
+        List<ShopOrderDetail> shopOrderDetails = shopOrder.loadOrderDetails(true);
+        for (ShopOrderDetail childOrder : shopOrderDetails) {
+            saleRightsOrderDetailService.insertByBo(build(rightsOrder, childOrder, childOrder.getProductNum(), childOrder.getPaymentAmount(), childOrder.getTotalPoint()));
+            /**
+             * 更新子订单的维权状态
+             */
+            ShopOrderDetailBo detailUpdateBo = new ShopOrderDetailBo();
+            detailUpdateBo.setOrderDetailId(childOrder.getOrderDetailId());
+            detailUpdateBo.setRightsStatus(RightsStatus.RIGHTS_PROCESSING);
+            detailUpdateBo.setRightsMethod(rightsOrder.getRightsType());
+            detailUpdateBo.setRightsNum(childOrder.getProductNum());
+            shopOrderDetailService.updateByBo(detailUpdateBo);
+        }
+        /**
+         * 第三步创建维权订单操作日志
+         */
+        createRecord(rightsOrder.getId(), rightsOrder.getRightsOperateStatus(), rightsOrder.getReason(), rightsOrder.getVoucherImages(), operatePerson, shopOrder.getBusinessId());
+        /**
+         * 第四步修改维权单的状态成为已同意
+         */
+        rightsOrder.setRightsOperateStatus(RightsOperateStatus.AGREE);
+        baseMapper.updateById(rightsOrder);
+        /**
+         * 第五步创建维权订单操作日志
+         */
+        createRecord(rightsOrder.getId(), rightsOrder.getRightsOperateStatus(), "", new ArrayList<>(), operatePerson, shopOrder.getBusinessId());
+        /**
+         * 第六步发起退款
+         */
+        return BeanCopyUtils.copy(refund(rightsOrder, shopOrder), SaleRightsOrderVo.class);
+    }
+
+
     private SaleRightsOrder refund(SaleRightsOrder rightsOrder, ShopOrder shopOrder) {
         rightsOrder.setRightsOperateStatus(RightsOperateStatus.SEND_REFUND);
         baseMapper.updateById(rightsOrder);