Parcourir la source

中车API对接

Lijingyang il y a 2 mois
Parent
commit
7a9c84429a
36 fichiers modifiés avec 1170 ajouts et 35 suppressions
  1. 1 0
      ruoyi-api/pom.xml
  2. 25 0
      ruoyi-api/ruoyi-api-bill/pom.xml
  3. 8 0
      ruoyi-api/ruoyi-api-bill/src/main/java/org/dromara/bill/api/RemoteBillService.java
  4. 6 0
      ruoyi-api/ruoyi-api-bom/pom.xml
  5. 2 0
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/MessageBo.java
  6. 0 32
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/TrackVo.java
  7. 13 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java
  8. 13 0
      ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductShoppingCartService.java
  9. 6 0
      ruoyi-modules/ruoyi-bill/pom.xml
  10. 18 0
      ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/dubbo/RemoteBillServiceImpl.java
  11. 1 0
      ruoyi-modules/ruoyi-external/pom.xml
  12. 0 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java
  13. 3 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java
  14. 11 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AccountActiveMessageHandler.java
  15. 52 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditPassMessageHandler.java
  16. 54 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditRejectMessageHandler.java
  17. 71 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsImportBlockMessageHandler.java
  18. 52 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOffShelfMessageHandler.java
  19. 52 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOnShelfFailMessageHandler.java
  20. 54 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsWaitAuditMessageHandler.java
  21. 2 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/InvoiceApplyMessageHandler.java
  22. 49 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/SettlementCreateMessageHandler.java
  23. 55 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/StockLockMessageHandler.java
  24. 46 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/StockUnlockMessageHandler.java
  25. 4 0
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/enums/MallMessageTypeEnum.java
  26. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductServiceImpl.java
  27. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductInventoryLockController.java
  28. 57 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductInventoryLock.java
  29. 44 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductInventoryLockBo.java
  30. 56 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductInventoryLockVo.java
  31. 42 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java
  32. 39 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductShoppingCartServiceImpl.java
  33. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductInventoryLockMapper.java
  34. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductInventoryLockService.java
  35. 135 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductInventoryLockServiceImpl.java
  36. 7 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductInventoryLockMapper.xml

+ 1 - 0
ruoyi-api/pom.xml

@@ -17,6 +17,7 @@
         <module>ruoyi-api-external</module>
         <module>ruoyi-api-order</module>
         <module>ruoyi-api-customer</module>
+        <module>ruoyi-api-bill</module>
     </modules>
 
     <artifactId>ruoyi-api</artifactId>

+ 25 - 0
ruoyi-api/ruoyi-api-bill/pom.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.dromara</groupId>
+        <artifactId>ruoyi-api</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>ruoyi-api-bill</artifactId>
+
+    <dependencies>
+
+        <!-- RuoYi Common Core-->
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+
+    </dependencies>
+
+</project>

+ 8 - 0
ruoyi-api/ruoyi-api-bill/src/main/java/org/dromara/bill/api/RemoteBillService.java

@@ -0,0 +1,8 @@
+package org.dromara.bill.api;
+
+/**
+ * author
+ * 时间:2026/2/4,16:52
+ */
+public interface RemoteBillService {
+}

+ 6 - 0
ruoyi-api/ruoyi-api-bom/pom.xml

@@ -21,6 +21,12 @@
     <dependencyManagement>
         <dependencies>
 
+            <dependency>
+                <groupId>org.dromara</groupId>
+                <artifactId>ruoyi-api-bill</artifactId>
+                <version>${revision}</version>
+            </dependency>
+
             <dependency>
                 <groupId>org.dromara</groupId>
                 <artifactId>ruoyi-api-customer</artifactId>

+ 2 - 0
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/bo/MessageBo.java

@@ -30,4 +30,6 @@ public class MessageBo {
      * 推送时间,格式YYYYMMDDHHMMSS
      */
     private String time;
+
+    private String accountName;
 }

+ 0 - 32
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/zhongche/domain/vo/TrackVo.java

@@ -1,32 +0,0 @@
-package org.dromara.external.api.zhongche.domain.vo;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-import org.dromara.common.core.domain.zhongche.domain.DeliveryTrack;
-
-import java.util.List;
-
-
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-public class TrackVo {
-    /**
-     * 物流单号
-     * 非必填
-     */
-    private String expressCode;
-
-    /**
-     * 物流公司
-     * 非必填
-     */
-    private String expressCompanyName;
-
-    /**
-     * 物流信息列表
-     * 非必填
-     */
-    private List<DeliveryTrack> deliveryTrack;
-}

+ 13 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductService.java

@@ -87,4 +87,17 @@ public interface RemoteProductService {
     List<ProductAggregateDto> getProductInfo(List<Long> productIds);
 
 
+    /**
+     * 库存锁定
+     */
+    //锁定库存
+    boolean lockShoppingCart(Long productId, Long count,String accountName);
+
+    //解定库存
+    boolean unlockShoppingCart(Long productId, String accountName);
+    /**
+     * 库存解定
+     */
+
+
 }

+ 13 - 0
ruoyi-api/ruoyi-api-product/src/main/java/org/dromara/product/api/RemoteProductShoppingCartService.java

@@ -0,0 +1,13 @@
+package org.dromara.product.api;
+
+/**
+ * author
+ * 时间:2026/2/4,17:33
+ */
+public interface RemoteProductShoppingCartService {
+    //锁定购物车 就是 加入购物车
+    boolean lockShoppingCart(Long productId, Long count);
+
+    //解顶购物车 就是 删除购物车
+    boolean unlockShoppingCart(Long productId, Long count);
+}

+ 6 - 0
ruoyi-modules/ruoyi-bill/pom.xml

@@ -21,6 +21,11 @@
             <artifactId>ruoyi-api-customer</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.dromara</groupId>
+            <artifactId>ruoyi-api-bill</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-common-nacos</artifactId>
@@ -124,6 +129,7 @@
             <artifactId>ruoyi-api-product</artifactId>
         </dependency>
 
+
     </dependencies>
 
     <build>

+ 18 - 0
ruoyi-modules/ruoyi-bill/src/main/java/org/dromara/bill/dubbo/RemoteBillServiceImpl.java

@@ -0,0 +1,18 @@
+package org.dromara.bill.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.bill.api.RemoteBillService;
+import org.springframework.stereotype.Service;
+
+/**
+ * author
+ * 时间:2026/2/4,16:52
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteBillServiceImpl implements RemoteBillService {
+}

+ 1 - 0
ruoyi-modules/ruoyi-external/pom.xml

@@ -100,6 +100,7 @@
             <artifactId>ruoyi-api-system</artifactId>
         </dependency>
 
+
         <dependency>
             <groupId>org.dromara</groupId>
             <artifactId>ruoyi-api-resource</artifactId>

+ 0 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePullController.java

@@ -55,7 +55,6 @@ public class ZhongChePullController {
     private static final String ZC_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEmUrB5ByAeb8jHayC7vbddqBFDIEsf1cpNO1qJttZ17xlDagVB/tBFasPr/x0+OWf2kimTKah2NGCYarymD1R5Q==\n"; // 中车公钥
     private static final String VERSION = "1.0.0";
 
-    private final SM2SignUtil sm2SignUtil;
 
     //5	中车电子商城提供服务
     //5.1	基础数据服务

+ 3 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java

@@ -594,11 +594,14 @@ public class ZhongChePushController {
         if (!"0".equals(tokenCheck.getRespCode())) {
             return tokenCheck;
         }
+        //TODO 假设解析出电商用户名
+        String accountName = "123456";
         // 3. 业务参数解析
         MessageBo messageBo;
         try {
             String decodedData = Base64.decodeStr(zcTokenBo.getData(), StandardCharsets.UTF_8);
             messageBo = JSONUtil.toBean(decodedData, MessageBo.class);
+            messageBo.setAccountName(accountName);
         } catch (Exception e) {
             log.error("消息监听 - 业务参数解析失败", e);
             return ZCR.fail("5007", "业务参数解析失败");

+ 11 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/AccountActiveMessageHandler.java

@@ -12,6 +12,7 @@ import org.dromara.external.api.zhongche.domain.vo.GoodsImportVo;
 import org.dromara.external.api.zhongche.domain.vo.MessageVo;
 import org.dromara.external.controller.zhongche.ZhongChePullController;
 import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
 import org.dromara.external.domain.vo.ExternalProductVo;
 import org.dromara.external.enums.MallMessageTypeEnum;
 import org.dromara.external.service.IExternalProductService;
@@ -137,7 +138,17 @@ public class AccountActiveMessageHandler implements MallMessageHandler {
                 );
                 return new MessageVo("0", "商品导入失败:" + resp.getMessage());
             }
+            // ===== 本批次推送成功,更新推送状态 =====
+            List<Long> pushedProductIds = batchGoods.stream()
+                .map(item -> Long.valueOf(item.getGoodsId()))
+                .toList();
+
+            externalProductService.lambdaUpdate()
+                .in(ExternalProduct::getProductId, pushedProductIds)
+                .set(ExternalProduct::getPushStatus, 1L)
+                .update();
         }
+
         return new MessageVo("1","商品导入成功");
     }
 }

+ 52 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditPassMessageHandler.java

@@ -0,0 +1,52 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,19:48
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsAuditPassMessageHandler implements MallMessageHandler {
+
+    private final IExternalProductService externalProductService;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.GOODS_AUDIT_PASS;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+
+        String goodsIdsStr = (String) content.get("goodsIds");
+
+        if (StrUtil.isBlank(goodsIdsStr)) {
+            return new MessageVo("0", "goodsIds为空");
+        }
+
+
+        // 更新
+        boolean update = externalProductService.lambdaUpdate()
+            .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
+            .set(ExternalProduct::getPushStatus, 1L)
+            .update();
+
+        return update
+            ? new MessageVo("1", "处理成功")
+            : new MessageVo("0", "处理失败");
+    }
+}

+ 54 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsAuditRejectMessageHandler.java

@@ -0,0 +1,54 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,19:50
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsAuditRejectMessageHandler implements MallMessageHandler {
+
+    private final IExternalProductService externalProductService;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.GOODS_AUDIT_REJECT;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+
+        String goodsIdsStr = (String) content.get("goodsIds");
+        String auditMsg = (String) content.get("auditMsg");
+
+        if (StrUtil.isBlank(goodsIdsStr)) {
+            return new MessageVo("0", "goodsIds为空");
+        }
+
+
+        // 更新
+        boolean update = externalProductService.lambdaUpdate()
+            .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
+            .set(ExternalProduct::getPushStatus, 2L)
+            .set(ExternalProduct::getRemark, auditMsg)
+            .update();
+
+        return update
+            ? new MessageVo("1", "处理成功")
+            : new MessageVo("0", "处理失败");
+    }
+}

+ 71 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsImportBlockMessageHandler.java

@@ -0,0 +1,71 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+/**
+ * author
+ * 时间:2026/2/4,19:34
+ */
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsImportBlockMessageHandler implements MallMessageHandler {
+
+    private final IExternalProductService externalProductService;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.GOODS_IMPORT_BLOCK;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+
+        String goodsIdsStr = (String) content.get("goodsIds");
+        String msg = (String) content.get("msg");
+
+        if (StrUtil.isBlank(goodsIdsStr)) {
+            return new MessageVo("0", "goodsIds为空");
+        }
+
+        // sku1,sku2,sku3
+        List<String> goodsIds = StrUtil.split(goodsIdsStr, ",");
+
+        if (CollUtil.isEmpty(goodsIds)) {
+            return new MessageVo("0", "goodsIds解析失败");
+        }
+
+        // 转成 Long productId(你的系统里 sku = productId)
+        List<Long> productIds = goodsIds.stream()
+            .map(Long::valueOf)
+            .toList();
+
+        // 更新为“拦截状态”
+        boolean update = externalProductService.lambdaUpdate()
+            .in(ExternalProduct::getProductId, productIds)
+            .set(ExternalProduct::getPushStatus, 2L)
+            .set(ExternalProduct::getRemark, msg)
+            .update();
+
+        log.info("商品导入拦截处理完成,productIds={}, msg={}", productIds, msg);
+
+        return update
+            ? new MessageVo("1", "拦截处理成功")
+            : new MessageVo("0", "拦截处理失败");
+    }
+}

+ 52 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOffShelfMessageHandler.java

@@ -0,0 +1,52 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,19:56
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsOffShelfMessageHandler implements MallMessageHandler {
+
+    private final IExternalProductService externalProductService;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.GOODS_AUDIT_PASS;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+        String goodsIdsStr = (String) content.get("goodsIds");
+        String reason = (String) content.get("reason");
+        if (StrUtil.isBlank(goodsIdsStr)) {
+            return new MessageVo("0", "goodsIds为空");
+        }
+
+
+        // 更新下架
+        boolean update = externalProductService.lambdaUpdate()
+            .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
+            .set(ExternalProduct::getProductStatus, 0L)
+            .set(ExternalProduct::getRemark, reason)
+            .update();
+
+        return update
+            ? new MessageVo("1", "处理成功")
+            : new MessageVo("0", "处理失败");
+    }
+}

+ 52 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsOnShelfFailMessageHandler.java

@@ -0,0 +1,52 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,19:53
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsOnShelfFailMessageHandler implements MallMessageHandler {
+
+    private final IExternalProductService externalProductService;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.GOODS_AUDIT_PASS;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+        String goodsIdsStr = (String) content.get("goodsIds");
+        String message = (String) content.get("message");
+        if (StrUtil.isBlank(goodsIdsStr)) {
+            return new MessageVo("0", "goodsIds为空");
+        }
+
+
+        // 更新下架
+        boolean update = externalProductService.lambdaUpdate()
+            .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
+            .set(ExternalProduct::getProductStatus, 0L)
+            .set(ExternalProduct::getRemark, message)
+            .update();
+
+        return update
+            ? new MessageVo("1", "处理成功")
+            : new MessageVo("0", "处理失败");
+    }
+}

+ 54 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/GoodsWaitAuditMessageHandler.java

@@ -0,0 +1,54 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.external.service.IExternalProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,19:45
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class GoodsWaitAuditMessageHandler implements MallMessageHandler {
+
+    private final IExternalProductService externalProductService;
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.GOODS_WAIT_AUDIT;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+
+        String goodsIdsStr = (String) content.get("goodsIds");
+
+        if (StrUtil.isBlank(goodsIdsStr)) {
+            return new MessageVo("0", "goodsIds为空");
+        }
+
+
+        // 更新
+        boolean update = externalProductService.lambdaUpdate()
+            .eq(ExternalProduct::getProductId, Long.parseLong(goodsIdsStr))
+            .set(ExternalProduct::getPushStatus, 0L)
+            .update();
+
+        return update
+            ? new MessageVo("1", "处理成功")
+            : new MessageVo("0", "处理失败");
+    }
+}

+ 2 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/InvoiceApplyMessageHandler.java

@@ -33,7 +33,8 @@ public class InvoiceApplyMessageHandler implements MallMessageHandler {
 
     private final ZhongChePullController zhongChePullController;
 
-    private final RemoteExternalOrderService remoteExternalOrderService;
+
+
     @Override
     public MallMessageTypeEnum supportType() {
         return MallMessageTypeEnum.INVOICE_APPLY;

+ 49 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/SettlementCreateMessageHandler.java

@@ -0,0 +1,49 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.settlement.bo.SettlementDetailBo;
+import org.dromara.external.api.zhongche.domain.settlement.vo.SettlementDetailVo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.springframework.stereotype.Component;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * author
+ * 时间:2026/2/5,9:24
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class SettlementCreateMessageHandler implements MallMessageHandler {
+
+    private final RemoteExternalOrderService remoteExternalOrderService;
+
+    private final ZhongChePullController zhongChePullController;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.SETTLEMENT_CREATE;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        String applyNo = (String) messageBo.getContent().get("applyNo");
+        SettlementDetailBo bo = new SettlementDetailBo();
+        bo.setApplyNo(applyNo);
+        SettlementDetailVo settlementDetailVo = zhongChePullController.mallSettlementDetail(bo);
+
+
+        //boolean b = remoteExternalOrderService.cancelOrder(orderNo, outgoingCode);
+
+       /* if (b){
+            return new MessageVo("1");
+        }*/
+        return new MessageVo("0","确认收获失败");
+    }
+}

+ 55 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/StockLockMessageHandler.java

@@ -0,0 +1,55 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.invoice.bo.InvoiceApplyDetailBo;
+import org.dromara.external.api.zhongche.domain.invoice.domain.InvoiceOrder;
+import org.dromara.external.api.zhongche.domain.invoice.vo.InvoiceApplyDetailVo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.ZhongChePullController;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteExternalOrderService;
+import org.dromara.product.api.RemoteProductService;
+import org.dromara.product.api.RemoteProductShoppingCartService;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,17:28
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class StockLockMessageHandler implements MallMessageHandler {
+
+    private final RemoteProductService remoteProductService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.STOCK_LOCK;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+        String accountName = messageBo.getAccountName();
+        String goodsId = String.valueOf(content.get("goodsId"));
+        String goodsNum = String.valueOf(content.get("goodsNum"));
+        if (StrUtil.isBlank(goodsId) || StrUtil.isBlank(goodsNum)) {
+            return new MessageVo("0", "缺少商品编号或商品数量");
+        }
+        boolean b = remoteProductService.lockShoppingCart(Long.valueOf(goodsId), Long.parseLong(goodsNum), accountName);
+        if (b){
+            return new MessageVo("1");
+        } else {
+            return new MessageVo("0", "锁定失败");
+        }
+    }
+}

+ 46 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/handle/impl/StockUnlockMessageHandler.java

@@ -0,0 +1,46 @@
+package org.dromara.external.controller.zhongche.handle.impl;
+
+import cn.hutool.core.util.StrUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.zhongche.domain.bo.MessageBo;
+import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.zhongche.handle.MallMessageHandler;
+import org.dromara.external.enums.MallMessageTypeEnum;
+import org.dromara.product.api.RemoteProductService;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * author
+ * 时间:2026/2/4,19:02
+ */
+@Component
+@Slf4j
+@RequiredArgsConstructor
+public class StockUnlockMessageHandler implements MallMessageHandler {
+
+    private final RemoteProductService remoteProductService;
+
+    @Override
+    public MallMessageTypeEnum supportType() {
+        return MallMessageTypeEnum.STOCK_LOCK;
+    }
+
+    @Override
+    public MessageVo handle(MessageBo messageBo) {
+        Map<String, Object> content = (Map<String, Object>) messageBo.getContent();
+        String accountName = messageBo.getAccountName();
+        String goodsId = String.valueOf(content.get("goodsId"));
+        if (StrUtil.isBlank(goodsId)) {
+            return new MessageVo("0", "缺少商品编号");
+        }
+        boolean b = remoteProductService.unlockShoppingCart(Long.valueOf(goodsId), accountName);
+        if (b){
+            return new MessageVo("1");
+        } else {
+            return new MessageVo("0", "解定失败");
+        }
+    }
+}

+ 4 - 0
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/enums/MallMessageTypeEnum.java

@@ -61,6 +61,7 @@ public enum MallMessageTypeEnum {
     ABNORMAL_REJECT("2308", "对账", "异议单审核不通过消息"),
 
     /* ======================= 开票 ======================= */
+    //TODO 交接不好
     INVOICE_APPLY("2401", "开票", "开票申请消息"),
     INVOICE_CONFIRM("2402", "开票", "采购确认收票消息"),
     INVOICE_REFUND_APPLY("2403", "开票", "退票申请消息"),
@@ -79,8 +80,11 @@ public enum MallMessageTypeEnum {
     GOODS_OFF_SHELF("2606", "商品", "采购主动下架商品消息"),
 
     /* ======================= 结算 ======================= */
+    //TODO
     SETTLEMENT_CREATE("2701", "结算", "采购生成结算单消息"),
+    //TODO
     SETTLEMENT_PAYED("2702", "结算", "采购结算单已付款消息"),
+    //新的文档已经没有了
     SETTLEMENT_INVOICE_RETURN("2703", "结算", "采购结算单开票退回消息");
 
     private final String code;

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductServiceImpl.java

@@ -201,7 +201,7 @@ public class ExternalProductServiceImpl  extends ServiceImpl<ExternalProductMapp
 
     @Override
     public List<ExternalProductVo> getAllProductList() {
-        List<ExternalProductVo> externalProductVos = baseMapper.selectVoList();
+        List<ExternalProductVo> externalProductVos = baseMapper.selectVoList(new LambdaQueryWrapper<ExternalProduct>().eq(ExternalProduct::getPushStatus, 0));
         if (CollUtil.isEmpty(externalProductVos)) {
             return externalProductVos;
         }

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductInventoryLockController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.product.domain.vo.ProductInventoryLockVo;
+import org.dromara.product.domain.bo.ProductInventoryLockBo;
+import org.dromara.product.service.IProductInventoryLockService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 库存锁定记录
+ * 前端访问路由地址为:/product/inventoryLock
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/inventoryLock")
+public class ProductInventoryLockController extends BaseController {
+
+    private final IProductInventoryLockService productInventoryLockService;
+
+    /**
+     * 查询库存锁定记录列表
+     */
+    //@SaCheckPermission("product:inventoryLock:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductInventoryLockVo> list(ProductInventoryLockBo bo, PageQuery pageQuery) {
+        return productInventoryLockService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出库存锁定记录列表
+     */
+    //@SaCheckPermission("product:inventoryLock:export")
+    @Log(title = "库存锁定记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductInventoryLockBo bo, HttpServletResponse response) {
+        List<ProductInventoryLockVo> list = productInventoryLockService.queryList(bo);
+        ExcelUtil.exportExcel(list, "库存锁定记录", ProductInventoryLockVo.class, response);
+    }
+
+    /**
+     * 获取库存锁定记录详细信息
+     *
+     * @param id 主键
+     */
+    //@SaCheckPermission("product:inventoryLock:query")
+    @GetMapping("/{id}")
+    public R<ProductInventoryLockVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productInventoryLockService.queryById(id));
+    }
+
+    /**
+     * 新增库存锁定记录
+     */
+    //@SaCheckPermission("product:inventoryLock:add")
+    @Log(title = "库存锁定记录", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductInventoryLockBo bo) {
+        return toAjax(productInventoryLockService.insertByBo(bo));
+    }
+
+    /**
+     * 修改库存锁定记录
+     */
+    //@SaCheckPermission("product:inventoryLock:edit")
+    @Log(title = "库存锁定记录", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductInventoryLockBo bo) {
+        return toAjax(productInventoryLockService.updateByBo(bo));
+    }
+
+    /**
+     * 删除库存锁定记录
+     *
+     * @param ids 主键串
+     */
+    //@SaCheckPermission("product:inventoryLock:remove")
+    @Log(title = "库存锁定记录", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productInventoryLockService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 57 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductInventoryLock.java

@@ -0,0 +1,57 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 库存锁定记录对象 product_inventory_lock
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_inventory_lock")
+public class ProductInventoryLock extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 关联 product_base.id
+     */
+    private Long productId;
+
+    /**
+     * 本次锁定库存量
+     */
+    private Long inventory;
+
+    /**
+     * 电商名称
+     */
+    private String accountName;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 44 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductInventoryLockBo.java

@@ -0,0 +1,44 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductInventoryLock;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 库存锁定记录业务对象 product_inventory_lock
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductInventoryLock.class, reverseConvertGenerate = false)
+public class ProductInventoryLockBo extends BaseEntity {
+
+    /**
+     * id
+     */
+    private Long id;
+
+    /**
+     * 关联 product_base.id
+     */
+    private Long productId;
+
+    /**
+     * 本次锁定库存量
+     */
+    private Long inventory;
+
+    /**
+     * 电商名称
+     */
+    private String accountName;
+
+
+}

+ 56 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductInventoryLockVo.java

@@ -0,0 +1,56 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductInventoryLock;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 库存锁定记录视图对象 product_inventory_lock
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductInventoryLock.class)
+public class ProductInventoryLockVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @ExcelProperty(value = "id")
+    private Long id;
+
+    /**
+     * 关联 product_base.id
+     */
+    @ExcelProperty(value = "关联 product_base.id")
+    private Long productId;
+
+    /**
+     * 本次锁定库存量
+     */
+    @ExcelProperty(value = "本次锁定库存量")
+    private Long inventory;
+
+    /**
+     * 电商名称
+     */
+    @ExcelProperty(value = "电商名称")
+    private String accountName;
+
+
+}

+ 42 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductServiceImpl.java

@@ -35,6 +35,7 @@ import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.ProductChangeLogBo;
 import org.dromara.product.service.*;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -71,6 +72,8 @@ public class RemoteProductServiceImpl implements RemoteProductService {
 
     private final IProductClassificationService productClassificationService;
 
+    private final IProductInventoryLockService productInventoryLockService;
+
     /**
      * 获取商品详情
      *
@@ -458,5 +461,44 @@ public class RemoteProductServiceImpl implements RemoteProductService {
         }).toList();
     }
 
+    @Override
+    @Transactional
+    public boolean lockShoppingCart(Long productId, Long count,String accountName) {
+        // 1. 减库存
+        boolean success = productPriceInventoryService.lambdaUpdate()
+            .eq(ProductPriceInventory::getProductId, productId)
+            .ge(ProductPriceInventory::getTotalInventory, count) // 库存必须足够
+            .setSql("total_inventory = total_inventory - " + count)
+            .update();
+
+        ProductInventoryLock lock = new ProductInventoryLock();
+        lock.setProductId(productId);
+        lock.setInventory(count);
+        lock.setAccountName(accountName);
+        success = success && productInventoryLockService.save(lock);
+        return success;
+    }
+
+    @Override
+    @Transactional
+    public boolean unlockShoppingCart(Long productId, String accountName) {
+        ProductInventoryLock lock =
+            productInventoryLockService.lambdaQuery()
+                .eq(ProductInventoryLock::getProductId, productId)
+                .eq(ProductInventoryLock::getAccountName, accountName)
+                .one();
+        if (lock == null) {
+            // 没有锁定记录,直接返回成功
+            return true;
+        }
+
+        boolean update = productPriceInventoryService.lambdaUpdate()
+            .eq(ProductPriceInventory::getProductId, productId)
+            .setSql("total_inventory = total_inventory + " + lock.getInventory())
+            .update();
+
+        return update;
+    }
+
 
 }

+ 39 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/dubbo/RemoteProductShoppingCartServiceImpl.java

@@ -0,0 +1,39 @@
+package org.dromara.product.dubbo;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.dubbo.config.annotation.DubboService;
+import org.dromara.product.api.RemoteProductShoppingCartService;
+import org.dromara.product.domain.bo.ProductShoppingCartBo;
+import org.dromara.product.service.IProductShoppingCartService;
+import org.springframework.stereotype.Service;
+
+/**
+ * author
+ * 时间:2026/2/4,17:35
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+@DubboService
+public class RemoteProductShoppingCartServiceImpl implements RemoteProductShoppingCartService {
+
+    private final IProductShoppingCartService productShoppingCartService;
+    @Override
+    public boolean lockShoppingCart(Long productId, Long count) {
+        ProductShoppingCartBo productShoppingCartBo = new ProductShoppingCartBo();
+        productShoppingCartBo.setProductId(productId);
+        productShoppingCartBo.setProductNum(count);
+        //加入购物车
+        Boolean b = productShoppingCartService.insertByBo(new ProductShoppingCartBo());
+        if (b) {
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    public boolean unlockShoppingCart(Long productId, Long count) {
+        return false;
+    }
+}

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductInventoryLockMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.product.mapper;
+
+import org.dromara.product.domain.ProductInventoryLock;
+import org.dromara.product.domain.vo.ProductInventoryLockVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 库存锁定记录Mapper接口
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+public interface ProductInventoryLockMapper extends BaseMapperPlus<ProductInventoryLock, ProductInventoryLockVo> {
+
+}

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductInventoryLockService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProductInventoryLock;
+import org.dromara.product.domain.vo.ProductInventoryLockVo;
+import org.dromara.product.domain.bo.ProductInventoryLockBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 库存锁定记录Service接口
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+public interface IProductInventoryLockService extends IService<ProductInventoryLock>{
+
+    /**
+     * 查询库存锁定记录
+     *
+     * @param id 主键
+     * @return 库存锁定记录
+     */
+    ProductInventoryLockVo queryById(Long id);
+
+    /**
+     * 分页查询库存锁定记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 库存锁定记录分页列表
+     */
+    TableDataInfo<ProductInventoryLockVo> queryPageList(ProductInventoryLockBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的库存锁定记录列表
+     *
+     * @param bo 查询条件
+     * @return 库存锁定记录列表
+     */
+    List<ProductInventoryLockVo> queryList(ProductInventoryLockBo bo);
+
+    /**
+     * 新增库存锁定记录
+     *
+     * @param bo 库存锁定记录
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProductInventoryLockBo bo);
+
+    /**
+     * 修改库存锁定记录
+     *
+     * @param bo 库存锁定记录
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProductInventoryLockBo bo);
+
+    /**
+     * 校验并批量删除库存锁定记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 135 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductInventoryLockServiceImpl.java

@@ -0,0 +1,135 @@
+package org.dromara.product.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.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 lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProductInventoryLockBo;
+import org.dromara.product.domain.vo.ProductInventoryLockVo;
+import org.dromara.product.domain.ProductInventoryLock;
+import org.dromara.product.mapper.ProductInventoryLockMapper;
+import org.dromara.product.service.IProductInventoryLockService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 库存锁定记录Service业务层处理
+ *
+ * @author LionLi
+ * @date 2026-02-04
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductInventoryLockServiceImpl  extends ServiceImpl<ProductInventoryLockMapper, ProductInventoryLock> implements IProductInventoryLockService {
+
+    private final ProductInventoryLockMapper baseMapper;
+
+    /**
+     * 查询库存锁定记录
+     *
+     * @param id 主键
+     * @return 库存锁定记录
+     */
+    @Override
+    public ProductInventoryLockVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询库存锁定记录列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 库存锁定记录分页列表
+     */
+    @Override
+    public TableDataInfo<ProductInventoryLockVo> queryPageList(ProductInventoryLockBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<ProductInventoryLock> lqw = buildQueryWrapper(bo);
+        Page<ProductInventoryLockVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的库存锁定记录列表
+     *
+     * @param bo 查询条件
+     * @return 库存锁定记录列表
+     */
+    @Override
+    public List<ProductInventoryLockVo> queryList(ProductInventoryLockBo bo) {
+        LambdaQueryWrapper<ProductInventoryLock> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<ProductInventoryLock> buildQueryWrapper(ProductInventoryLockBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProductInventoryLock> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProductInventoryLock::getId);
+        lqw.eq(bo.getProductId() != null, ProductInventoryLock::getProductId, bo.getProductId());
+        lqw.eq(bo.getInventory() != null, ProductInventoryLock::getInventory, bo.getInventory());
+        lqw.like(StringUtils.isNotBlank(bo.getAccountName()), ProductInventoryLock::getAccountName, bo.getAccountName());
+        return lqw;
+    }
+
+    /**
+     * 新增库存锁定记录
+     *
+     * @param bo 库存锁定记录
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProductInventoryLockBo bo) {
+        ProductInventoryLock add = MapstructUtils.convert(bo, ProductInventoryLock.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改库存锁定记录
+     *
+     * @param bo 库存锁定记录
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProductInventoryLockBo bo) {
+        ProductInventoryLock update = MapstructUtils.convert(bo, ProductInventoryLock.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProductInventoryLock entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除库存锁定记录信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductInventoryLockMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.product.mapper.ProductInventoryLockMapper">
+
+</mapper>