ソースを参照

库存逻辑优化

yjwang 4 日 前
コミット
b9704bb90e

+ 10 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -1415,4 +1415,14 @@ public interface FsStoreOrderScrmMapper extends BaseMapper<FsStoreOrderScrm>
      * @return lsit
      * **/
     List<FsStoreOrderCodeOpenIdVo> selectOrderCodeOpenIdInOrderCode(@Param("list") List<String> list);
+
+    /**
+     * 查询超时未支付的订单
+     * @param params 包含以下参数:
+     *               - now: LocalDateTime 当前时间
+     *               - prescribeTimeoutMinutes: 处方订单超时分钟数
+     *               - unPayTime: 非处方订单超时分钟数
+     * @return 超时订单列表
+     */
+    List<FsStoreOrderScrm> selectTimeoutUnpaidOrders(Map<String, Object> params);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -707,4 +707,9 @@ public interface FsStoreProductScrmMapper
      * 普通商品我猜你喜欢列表
      * **/
     List<FsStoreProductListQueryVO> selectFsStoreProductGoodListList();
+
+    /**
+     * 批量更新商品信息
+     * **/
+    int updateBatchById(@Param("updateProducts") List<FsStoreProductScrm> updateProducts);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreVerifyCodeScrmMapper.java

@@ -84,4 +84,9 @@ public interface FsStoreVerifyCodeScrmMapper extends BaseMapper<FsStoreVerifyCod
     List<FsStoreVerifyCodeScrm> selectUnOutboundVerifyCodesWithLock(
             @Param("productId") Long productId,
             @Param("count") Integer count);
+
+    /**
+     * 批量更新状态
+     * **/
+    void updateOutboundStatus(@Param("list") List<FsStoreVerifyCodeScrm> list);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java

@@ -351,4 +351,6 @@ public interface IFsStoreOrderScrmService
     R dfOrderResult(String body);
 
     R receiveWaybillPush(String body);
+
+    void cancelOrderReuse(FsStoreOrderScrm order);
 }

+ 80 - 20
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -1047,18 +1047,18 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
             if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
-                }else {
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+                    config.setUnPayTime(4320);
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
                 }
+//                else {
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+//                }
             } else {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
                     if(config == null){
                         config = new StoreConfig();
                     }
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
-                }else {
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+                    config.setUnPayTime(4320);
                 }
             }
             //添加支付到期时间
@@ -1780,19 +1780,22 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
             if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
-                }else {
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+                    config.setUnPayTime(4320);
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
                 }
+//                else {
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+//                }
             } else {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
                     if(config == null){
                         config = new StoreConfig();
                     }
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
-                }else {
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+                    config.setUnPayTime(4320);
                 }
+//                else {
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+//                }
             }
             Calendar calendar = Calendar.getInstance();
             calendar.setTime(storeOrder.getCreateTime());
@@ -2949,9 +2952,27 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     private void refundStock(FsStoreOrderScrm order) {
         //获取订单下的商品
         List<FsStoreOrderItemVO> orderItemVOS = fsStoreOrderItemMapper.selectFsStoreOrderItemListByOrderId(order.getId());
+        List<Long> itemIds = new ArrayList<>();
         for (FsStoreOrderItemVO vo : orderItemVOS) {
-            productService.incProductStock(vo.getNum(), vo.getProductId()
-                    , vo.getProductAttrValueId());
+            if (checkProductCater(vo.getProductId())) {
+                itemIds.add(vo.getItemId());
+            }else {
+                productService.incProductStock(vo.getNum(), vo.getProductId()
+                        , vo.getProductAttrValueId());
+            }
+        }
+
+        if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(itemIds)) {
+            List<FsStoreVerifyCodeScrm> codes = verifyCodeScrmMapper.selectList(
+                    new LambdaQueryWrapper<FsStoreVerifyCodeScrm>()
+                            .eq(FsStoreVerifyCodeScrm::getOrderId, order.getId())
+                            .in(FsStoreVerifyCodeScrm::getOrderItemId, itemIds)
+                            .eq(FsStoreVerifyCodeScrm::getIsDel, "0")
+            );
+            if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(codes)) {
+                verifyCodeScrmMapper.updateOutboundStatus(codes);
+                log.info("订单{}共更新{}个核销码关联状态", order.getId(), codes.size());
+            }
         }
 
     }
@@ -5188,19 +5209,23 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             com.fs.store.config.StoreConfig config = JSONUtil.toBean(json, com.fs.store.config.StoreConfig.class);
             if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药72小时
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
-                }else {
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+                    config.setUnPayTime(4320);
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);//
                 }
+//                else {
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+//                }
             } else {
                 if(storeOrder.getIsPrescribe() != null && storeOrder.getIsPrescribe() == 1){//处方药
                     if(config == null){
                         config = new com.fs.store.config.StoreConfig();
                     }
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
-                }else {
-                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+                    config.setUnPayTime(4320);
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(),4320, TimeUnit.MINUTES);
                 }
+//                else {
+//                    redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+//                }
             }
             //添加支付到期时间
             Calendar calendar = Calendar.getInstance();
@@ -5867,6 +5892,41 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         }
     }
 
+    @Override
+    public void cancelOrderReuse(FsStoreOrderScrm order) {
+        if (order.getStatus() == OrderInfoEnum.STATUS_0.getValue()) {
+            if (!StringUtils.isEmpty(order.getExtendOrderId())) {
+                redisCache.deleteObject(DELIVERY + ":" + order.getExtendOrderId());
+            }
+            //退回积分
+            this.refundIntegral(order);
+            //退回优惠券
+            this.refundCoupon(order);
+            //退回库存
+            this.refundStock(order);
+            fsStoreOrderMapper.cancelOrder(order.getId());
+            //添加记录
+            orderStatusService.create(order.getId(), OrderLogEnum.CANCEL_ORDER.getValue(),
+                    OrderLogEnum.CANCEL_ORDER.getDesc());
+//            if(order.getPaid()==1){
+//                //更新OMS
+//                ErpRefundUpdateRequest request=new ErpRefundUpdateRequest();
+//                request.setTid(order.getOrderCode());
+//                request.setOid(order.getOrderCode());
+//                request.setRefund_state(1);
+//                erpOrderService.refundUpdate(request);
+//            }
+            TemplateBean templateBean = TemplateBean.builder()
+                    .orderId(order.getId().toString())
+                    .orderCode(order.getOrderCode().toString())
+                    .remark("您的订单已取消")
+                    .userId(order.getUserId())
+                    .templateType(TemplateListenEnum.TYPE_1.getValue())
+                    .build();
+            publisher.publishEvent(new TemplateEvent(this, templateBean));
+        }
+    }
+
     //校验商品类型
     public boolean checkProductCater(Long productId){
         FsStoreProductScrm product = fsStoreProductMapper.selectFsStoreProductById(productId);

+ 20 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -2136,4 +2136,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
 
     </select>
+
+    <!-- 根据条件查询超时未支付订单 -->
+    <select id="selectTimeoutUnpaidOrders"
+            parameterType="java.util.Map"
+            resultType="com.fs.hisStore.domain.FsStoreOrderScrm">
+        SELECT
+        *
+        FROM
+        fs_store_order_scrm
+        WHERE
+        status = 0
+        AND create_time IS NOT NULL
+        AND is_prescribe IS NOT NULL
+        AND create_time &lt; DATE_SUB(#{now}, INTERVAL
+        CASE
+        WHEN is_prescribe = 1 THEN #{prescribeTimeoutMinutes}
+        ELSE #{unPayTime}
+        END
+        MINUTE)
+    </select>
 </mapper>

+ 22 - 1
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -1018,5 +1018,26 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             ORDER BY
             p.product_id DESC
     </select>
-
+    <update id="updateBatchById">
+        UPDATE fs_store_product_scrm
+        <set>
+            sales = CASE
+            <foreach collection="updateProducts" item="item" separator="">
+                WHEN product_id = #{item.productId} THEN #{item.sales}
+            </foreach>
+            ELSE sales
+            END,
+            stock = CASE
+            <foreach collection="updateProducts" item="item" separator="">
+                WHEN product_id = #{item.productId} THEN #{item.stock}
+            </foreach>
+            ELSE stock
+            END,
+            update_time = NOW()
+        </set>
+        WHERE product_id IN
+        <foreach collection="updateProducts" item="item" open="(" separator="," close=")">
+            #{item.productId}
+        </foreach>
+    </update>
 </mapper>

+ 12 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreVerifyCodeScrmMapper.xml

@@ -136,4 +136,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             )
         </foreach>
     </insert>
+
+    <update id="updateOutboundStatus">
+        <foreach collection="list" item="item" separator=";">
+            UPDATE fs_store_verify_code_scrm
+            SET verify_status = 0,
+            outbound_status = 0,
+            order_id = null,
+            order_item_id = null,
+            update_time = NOW()
+            WHERE id = #{item.id}
+        </foreach>
+    </update>
 </mapper>

+ 63 - 48
fs-user-app/src/main/java/com/fs/app/redis/OrderExpireHandler.java

@@ -1,23 +1,32 @@
 package com.fs.app.redis;
 
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
 import com.fs.hisStore.mapper.FsStoreOrderItemScrmMapper;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.hisStore.mapper.FsStoreVerifyCodeScrmMapper;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
 import com.fs.hisStore.service.IFsStoreVerifyCodeScrmService;
 import com.fs.hisStore.domain.FsStoreVerifyCodeScrm;
 import com.fs.hisStore.vo.FsStoreOrderItemVO;
+import com.fs.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.time.LocalDateTime;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -36,74 +45,80 @@ public class OrderExpireHandler {
     @Autowired
     private FsStoreOrderScrmMapper orderScrmMapper;
 
+    // 处方药固定超时时间:4320分钟三天过期
+    private static final int PRESCRIBE_TIMEOUT_MINUTES = 4320;
     @Autowired
-    private FsStoreOrderItemScrmMapper orderItemScrmMapper;
+    private ISysConfigService configService;
 
-    @Autowired
-    private FsStoreVerifyCodeScrmMapper verifyCodeScrmMapper;
+    private static final String LOCK_KEY_PREFIX = "order-expire-product-lock:";
+
+    private static final int LOCK_WAIT_TIME = 3; // 锁等待时间
+    private static final int LOCK_LEASE_TIME = 30; // 锁持有时间
 
     @Autowired
-    private IFsStoreVerifyCodeScrmService verifyCodeScrmService;
+    private IFsStoreOrderScrmService fsStoreOrderService;
 
 
     @Scheduled(fixedDelay = 60_000) // 每分钟跑一次
     public void handleUnpaidOrders() {
-        RLock lock = redissonClient.getLock("order-expire-handler-lock");
+        // 全局锁:防止多实例同时执行任务(粒度粗,仅控制任务入口)
+        RLock globalLock = redissonClient.getLock("order-expire-handler-global-lock");
         try {
-            if (lock.tryLock(3, 30, TimeUnit.SECONDS)) {
-                // 查询所有 status=0 且创建时间超过指定阈值的订单
-                List<FsStoreOrderScrm> orders = orderScrmMapper.selectList(
-                        new LambdaQueryWrapper<FsStoreOrderScrm>()
-                                .eq(FsStoreOrderScrm::getStatus, 0)
-                                .lt(FsStoreOrderScrm::getCreateTime, LocalDateTime.now().minusMinutes(30))
-                );
+            if (globalLock.tryLock(LOCK_WAIT_TIME, LOCK_LEASE_TIME, TimeUnit.SECONDS)) {
+                LocalDateTime now = LocalDateTime.now();
+                log.info("开始处理超时未支付订单,当前时间:{}", now);
+
+                // 获取配置时间
+                String json = configService.selectConfigByKey("store.config");
+                com.fs.store.config.StoreConfig config = JSONUtil.toBean(json, com.fs.store.config.StoreConfig.class);
+                if (config == null || config.getUnPayTime() == null) {
+                    log.error("未获取到门店配置,unPayTime为空");
+                    return;
+                }
+
+                // 查询所有待处理订单
+                Map<String, Object> params = new HashMap<>(3);
+                params.put("now", now);
+                params.put("prescribeTimeoutMinutes", PRESCRIBE_TIMEOUT_MINUTES);
+                params.put("unPayTime", config.getUnPayTime());
+                List<FsStoreOrderScrm> orders = orderScrmMapper.selectTimeoutUnpaidOrders(params);
+
+                if (CollectionUtils.isEmpty(orders)) {
+                    log.info("暂无超时未支付订单需要处理");
+                    return;
+                }
+                log.info("共查询到{}个超时未支付订单,开始逐个处理", orders.size());
 
                 for (FsStoreOrderScrm order : orders) {
-                    processExpiredOrder(order);
+                    try {
+                        processExpiredOrder(order);
+                        log.info("订单{}处理完成,状态已更新为-3", order.getId());
+                    } catch (Exception e) {
+                        log.error("处理订单{}失败", order.getId(), e);
+                        // 记录失败订单,可后续补偿
+                        // failOrderService.recordFailOrder(order.getId(), "库存恢复失败:" + e.getMessage());
+                    }
                 }
+            } else {
+                log.warn("获取全局分布式锁失败,跳过本次订单处理");
             }
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
+            log.error("获取全局锁时线程中断", e);
         } finally {
-            if (lock.isHeldByCurrentThread()) {
-                lock.unlock();
+            if (globalLock.isHeldByCurrentThread()) {
+                globalLock.unlock();
             }
         }
     }
-
-    private void processExpiredOrder(FsStoreOrderScrm order) {
+    @Transactional(rollbackFor = Exception.class)
+    void processExpiredOrder(FsStoreOrderScrm order) {
         Long orderId = order.getId();
-
-        List<FsStoreOrderItemVO> items = orderItemScrmMapper.selectMyFsStoreOrderItemListByOrderId(orderId);
-        if (!items.isEmpty()) {
-            List<Long> itemIds = items.stream()
-                    .map(FsStoreOrderItemVO::getItemId)
-                    .collect(Collectors.toList());
-
-            List<FsStoreVerifyCodeScrm> codes = verifyCodeScrmMapper.selectList(
-                    new LambdaQueryWrapper<FsStoreVerifyCodeScrm>()
-                            .eq(FsStoreVerifyCodeScrm::getOrderId, orderId)
-                            .in(FsStoreVerifyCodeScrm::getOrderItemId, itemIds)
-                            .eq(FsStoreVerifyCodeScrm::getIsDel, "0")
-            );
-
-            codes.forEach(code -> {
-                code.setVerifyStatus(0L);
-                code.setOutboundStatus(0L);
-                code.setOrderId(0L);
-                code.setOrderItemId(0L);
-            });
-
-            verifyCodeScrmService.updateBatchById(codes);
+        if (orderId == null) {
+            log.warn("订单ID为空,跳过处理");
+            return;
         }
-
-        FsStoreOrderScrm updateOrder = new FsStoreOrderScrm();
-        updateOrder.setId(orderId);
-        updateOrder.setStatus(-3);
-        orderScrmMapper.updateFsStoreOrder(updateOrder);
+        fsStoreOrderService.cancelOrderReuse(order);
     }
 
-
-
-
 }

+ 49 - 49
fs-user-app/src/main/java/com/fs/app/redis/RedisKeyExpirationListener.java

@@ -109,55 +109,55 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
 //            }
 //
 //        }else
-        if (key.contains(FsConstants.REDIS_ORDER_UNPAY)) {//未支付支付订单过期
-            log.info("监听商城过期appKey-redis过期:pattern={},channel={},key={}", new String(pattern), channel, key);
-            String lockKey = "lockStoreAppKey:" + key;  // 分布式锁的 key
-            Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
-            if (Boolean.TRUE.equals(lockAcquired)) {  // 只有一个实例会成功获取锁
-                try {
-                    String[] parts = key.split(":");
-                    if (parts.length == 3) {
-                        Long orderId = Long.parseLong(parts[parts.length - 1].trim());
-                        if (orderId != null) {
-                            //获取订单信息
-                            FsStoreOrderScrm orderScrm = orderScrmMapper.selectFsStoreOrderById(orderId);
-                            if (orderScrm != null && orderScrm.getStatus() == 0) {
-                                //获取订单下的详情信息
-                                List<FsStoreOrderItemVO> scrmList = orderItemScrmMapper.selectMyFsStoreOrderItemListByOrderId(orderId);
-                                if (!scrmList.isEmpty()) {
-                                    List<Long> orderItemIds = scrmList.stream().map(FsStoreOrderItemVO::getItemId).collect(Collectors.toList());
-                                    //获取溯源码,进行回退
-                                    List<FsStoreVerifyCodeScrm> verifyCodes = verifyCodeScrmMapper.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getOrderId, orderId).in(FsStoreVerifyCodeScrm::getOrderItemId, orderItemIds).eq(FsStoreVerifyCodeScrm::getIsDel, "0"));
-                                    if(!verifyCodes.isEmpty()){
-                                        verifyCodes.forEach(v->{
-                                            v.setVerifyStatus(0L);
-                                            v.setOutboundStatus(0L);
-                                            v.setOrderId(0L);
-                                            v.setOrderItemId(0L);
-                                        });
-                                        //批量更新数据
-                                        verifyCodeScrmService.updateBatchById(verifyCodes);
-                                    }
-                                }
-                                //更新订单状态
-                                FsStoreOrderScrm updateOrder = new FsStoreOrderScrm();
-                                updateOrder.setId(orderId);
-                                updateOrder.setStatus(-3);
-                                orderScrmMapper.updateFsStoreOrder(updateOrder);
-                            }
-                        }
-                    } else {
-                        log.error("监听appKey失效!");
-                    }
-                } finally {
-                    // 释放锁,避免影响后续任务
-                    redisTemplate.delete(lockKey);
-                }
-            } else {
-                log.info("另一个实例已经处理了 key={},当前实例跳过", key);
-            }
-
-        }
+//        if (key.contains(FsConstants.REDIS_ORDER_UNPAY)) {//未支付支付订单过期
+//            log.info("监听商城过期appKey-redis过期:pattern={},channel={},key={}", new String(pattern), channel, key);
+//            String lockKey = "lockStoreAppKey:" + key;  // 分布式锁的 key
+//            Boolean lockAcquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 30, TimeUnit.SECONDS);
+//            if (Boolean.TRUE.equals(lockAcquired)) {  // 只有一个实例会成功获取锁
+//                try {
+//                    String[] parts = key.split(":");
+//                    if (parts.length == 3) {
+//                        Long orderId = Long.parseLong(parts[parts.length - 1].trim());
+//                        if (orderId != null) {
+//                            //获取订单信息
+//                            FsStoreOrderScrm orderScrm = orderScrmMapper.selectFsStoreOrderById(orderId);
+//                            if (orderScrm != null && orderScrm.getStatus() == 0) {
+//                                //获取订单下的详情信息
+//                                List<FsStoreOrderItemVO> scrmList = orderItemScrmMapper.selectMyFsStoreOrderItemListByOrderId(orderId);
+//                                if (!scrmList.isEmpty()) {
+//                                    List<Long> orderItemIds = scrmList.stream().map(FsStoreOrderItemVO::getItemId).collect(Collectors.toList());
+//                                    //获取溯源码,进行回退
+//                                    List<FsStoreVerifyCodeScrm> verifyCodes = verifyCodeScrmMapper.selectList(new LambdaQueryWrapper<FsStoreVerifyCodeScrm>().eq(FsStoreVerifyCodeScrm::getOrderId, orderId).in(FsStoreVerifyCodeScrm::getOrderItemId, orderItemIds).eq(FsStoreVerifyCodeScrm::getIsDel, "0"));
+//                                    if(!verifyCodes.isEmpty()){
+//                                        verifyCodes.forEach(v->{
+//                                            v.setVerifyStatus(0L);
+//                                            v.setOutboundStatus(0L);
+//                                            v.setOrderId(0L);
+//                                            v.setOrderItemId(0L);
+//                                        });
+//                                        //批量更新数据
+//                                        verifyCodeScrmService.updateBatchById(verifyCodes);
+//                                    }
+//                                }
+//                                //更新订单状态
+//                                FsStoreOrderScrm updateOrder = new FsStoreOrderScrm();
+//                                updateOrder.setId(orderId);
+//                                updateOrder.setStatus(-3);
+//                                orderScrmMapper.updateFsStoreOrder(updateOrder);
+//                            }
+//                        }
+//                    } else {
+//                        log.error("监听appKey失效!");
+//                    }
+//                } finally {
+//                    // 释放锁,避免影响后续任务
+//                    redisTemplate.delete(lockKey);
+//                }
+//            } else {
+//                log.info("另一个实例已经处理了 key={},当前实例跳过", key);
+//            }
+//
+//        }
     }
 
 //    /**