Browse Source

feat(product): 完善合同产品关联功能并增加导入导出支持

- 在ContractProduct相关实体类中添加supplierId字段
- 移除ContractProduct中的@TableLogic注解以取消逻辑删除
- 在ContractProductController中添加导入导出功能接口
- 实现合同产品数据批量导入功能及导入监听器
- 添加协议供货商品列表查询功能
- 实现按供应商删除合同产品的功能
- 在CustomerContactServiceImpl中增加创建时间范围查询
- 完善外部商品推送逻辑并增加统计商城订单处理
- 修复Auth2Controller的请求路径映射
- 更新全局异常处理器的日志信息显示
- 添加商品导入模板下载功能
肖路 14 hours ago
parent
commit
57f5904c12
40 changed files with 769 additions and 244 deletions
  1. 10 3
      ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/tongji/RemoteTongJiPullService.java
  2. 1 1
      ruoyi-auth/src/main/java/org/dromara/auth/controller/Auth2Controller.java
  3. 1 1
      ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java
  4. 5 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SupplierQualification.java
  5. 5 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierQualificationBo.java
  6. 5 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierQualificationVo.java
  7. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java
  8. 3 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java
  9. 2 0
      ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContractServiceImpl.java
  10. 1 1
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/tongji/TongJiPullController.java
  11. 10 7
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/tongji/TongJiPushController.java
  12. 1 3
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/zhongche/ZhongChePushController.java
  13. 32 3
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/dubbo/RemoteTongJiPullServiceImpl.java
  14. 6 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/ProductPushStrategy.java
  15. 20 14
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/TongjiPushStrategy.java
  16. 6 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/YangGuangPushStrategy.java
  17. 18 12
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/ZhongChePushStrategy.java
  18. 6 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/ZhongZhiPushStrategy.java
  19. 109 113
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/impl/OrderCreateMessageHandler.java
  20. 11 4
      ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/service/impl/ExternalProductServiceImpl.java
  21. 18 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainCrrcExtController.java
  22. 0 1
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java
  23. 13 38
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverServiceImpl.java
  24. 30 8
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java
  25. 26 8
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/ZhongCheOrderMainServiceImpl.java
  26. 2 2
      ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/utils/kd100/Kd100Util.java
  27. 63 6
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ContractProductController.java
  28. 1 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java
  29. 5 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ContractProduct.java
  30. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ContractProductBo.java
  31. 15 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAuditBo.java
  32. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java
  33. 34 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ContractProductImportVo.java
  34. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ContractProductVo.java
  35. 2 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java
  36. 148 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/listener/ContractProductImportListener.java
  37. 7 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IContractProductService.java
  38. 71 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ContractProductServiceImpl.java
  39. 16 5
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseAuditServiceImpl.java
  40. 49 0
      script/config/nacos/ruoyi-gateway.yml

+ 10 - 3
ruoyi-api/ruoyi-api-external/src/main/java/org/dromara/external/api/tongji/RemoteTongJiPullService.java

@@ -4,11 +4,12 @@ import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleConfirmBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRefundBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRefundBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRejectBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRejectBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleReturnReceivedBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleReturnReceivedBo;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
 import org.dromara.common.core.exception.api.ZhongcheException;
 import org.dromara.common.core.exception.api.ZhongcheException;
-import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
-import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
-import org.dromara.external.api.zhongche.domain.bo.ZhongCheOrderDeliverBo;
+import org.dromara.external.api.zhongche.domain.bo.*;
+import org.dromara.external.api.zhongche.domain.vo.AreaVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+import org.dromara.external.api.zhongche.domain.vo.PendingOrderListVo;
 import org.dromara.external.api.zhongche.domain.vo.ZhongCheOrderDeliverVo;
 import org.dromara.external.api.zhongche.domain.vo.ZhongCheOrderDeliverVo;
 
 
 /**
 /**
@@ -16,6 +17,8 @@ import org.dromara.external.api.zhongche.domain.vo.ZhongCheOrderDeliverVo;
  * 时间:2026/2/25,17:49
  * 时间:2026/2/25,17:49
  */
  */
 public interface RemoteTongJiPullService {
 public interface RemoteTongJiPullService {
+    //获取地区
+    AreaVo areaQuery(AreaQueryBo bo);
     //接单
     //接单
     GoodsUpdateVo mallOrderConfirm(OrderConfirmBo bo) throws ZhongcheException;
     GoodsUpdateVo mallOrderConfirm(OrderConfirmBo bo) throws ZhongcheException;
     //拒单
     //拒单
@@ -30,4 +33,8 @@ public interface RemoteTongJiPullService {
     GoodsUpdateVo mallAftersaleRefund(AfterSaleRefundBo bo) throws ZhongcheException;
     GoodsUpdateVo mallAftersaleRefund(AfterSaleRefundBo bo) throws ZhongcheException;
     //发货
     //发货
     ZhongCheOrderDeliverVo mallOrderDeliverGoods(ZhongCheOrderDeliverBo bo) throws ZhongcheException;
     ZhongCheOrderDeliverVo mallOrderDeliverGoods(ZhongCheOrderDeliverBo bo) throws ZhongcheException;
+    //查询待处理的订单
+    PendingOrderListVo mallOrderPendingList(PendingOrderListBo bo);
+    //查询订单详情
+    OrderDetailVo mallOrderDetail(OrderDetailBo bo);
 }
 }

+ 1 - 1
ruoyi-auth/src/main/java/org/dromara/auth/controller/Auth2Controller.java

@@ -36,7 +36,7 @@ import java.util.Objects;
 @SaIgnore
 @SaIgnore
 @RequiredArgsConstructor
 @RequiredArgsConstructor
 @RestController
 @RestController
-@RequestMapping("/auth2")
+@RequestMapping("/")
 public class Auth2Controller {
 public class Auth2Controller {
 
 
     private final ObjectMapper objectMapper;
     private final ObjectMapper objectMapper;

+ 1 - 1
ruoyi-common/ruoyi-common-web/src/main/java/org/dromara/common/web/handler/GlobalExceptionHandler.java

@@ -51,7 +51,7 @@ public class GlobalExceptionHandler {
 
 
     @ExceptionHandler(ZhongcheException.class)
     @ExceptionHandler(ZhongcheException.class)
     public R<Void> handleZhongcheException(ZhongcheException e) {
     public R<Void> handleZhongcheException(ZhongcheException e) {
-        log.error("中车系统异常 : {}", e.getMessage());
+        log.error("系统异常 : {}", e.getMessage());
         return R.fail(e.getMessage());
         return R.fail(e.getMessage());
     }
     }
 
 

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/SupplierQualification.java

@@ -97,5 +97,10 @@ public class SupplierQualification extends TenantEntity {
      */
      */
     private String remark;
     private String remark;
 
 
+    /**
+     * 0=待提交,1=生效,2=禁用
+     * */
+    private String qualificationStatus;
+
 
 
 }
 }

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/bo/SupplierQualificationBo.java

@@ -81,5 +81,10 @@ public class SupplierQualificationBo extends BaseEntity {
 
 
     private String remark;
     private String remark;
 
 
+    /**
+     * 0=待提交,1=生效,2=禁用
+     * */
+    private String qualificationStatus;
+
 
 
 }
 }

+ 5 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/domain/vo/SupplierQualificationVo.java

@@ -107,5 +107,10 @@ public class SupplierQualificationVo implements Serializable {
 
 
     private String remark;
     private String remark;
 
 
+    /**
+     * 0=待提交,1=生效,2=禁用
+     * */
+    private String qualificationStatus;
+
 
 
 }
 }

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/CustomerContactServiceImpl.java

@@ -167,6 +167,8 @@ public class CustomerContactServiceImpl extends ServiceImpl<CustomerContactMappe
         lqw.like(StringUtils.isNotBlank(bo.getDeptName()), CustomerContact::getDeptName, bo.getDeptName());
         lqw.like(StringUtils.isNotBlank(bo.getDeptName()), CustomerContact::getDeptName, bo.getDeptName());
         lqw.like(StringUtils.isNotBlank(bo.getRoleName()), CustomerContact::getRoleName, bo.getRoleName());
         lqw.like(StringUtils.isNotBlank(bo.getRoleName()), CustomerContact::getRoleName, bo.getRoleName());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerContact::getPlatformCode, bo.getPlatformCode());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), CustomerContact::getPlatformCode, bo.getPlatformCode());
+        lqw.between(ObjectUtil.isNotEmpty(params.get("beginTime")) && ObjectUtil.isNotEmpty(params.get("endTime")),
+            CustomerContact::getCreateTime, params.get("beginTime"), params.get("endTime"));
         // 增加联系人类型查询
         // 增加联系人类型查询
         if (StringUtils.isNotBlank(bo.getType())) {
         if (StringUtils.isNotBlank(bo.getType())) {
             List<CustomerContactInfo> infoList = contactInfoMapper.selectList(new LambdaQueryWrapper<CustomerContactInfo>()
             List<CustomerContactInfo> infoList = contactInfoMapper.selectList(new LambdaQueryWrapper<CustomerContactInfo>()

+ 3 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContactServiceImpl.java

@@ -18,6 +18,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.redis.utils.SequenceUtils;
 import org.dromara.common.redis.utils.SequenceUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.customer.domain.CustomerContact;
 import org.dromara.customer.domain.SupplierContact;
 import org.dromara.customer.domain.SupplierContact;
 import org.dromara.customer.domain.SupplierInfo;
 import org.dromara.customer.domain.SupplierInfo;
 import org.dromara.customer.domain.bo.SupplierContactBo;
 import org.dromara.customer.domain.bo.SupplierContactBo;
@@ -157,6 +158,8 @@ public class SupplierContactServiceImpl extends ServiceImpl<SupplierContactMappe
         lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SupplierContact::getPhone, bo.getPhone());
         lqw.eq(StringUtils.isNotBlank(bo.getPhone()), SupplierContact::getPhone, bo.getPhone());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SupplierContact::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SupplierContact::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getUserNo()), SupplierContact::getUserNo, bo.getUserNo());
         lqw.eq(StringUtils.isNotBlank(bo.getUserNo()), SupplierContact::getUserNo, bo.getUserNo());
+        lqw.between(ObjectUtil.isNotEmpty(params.get("beginTime")) && ObjectUtil.isNotEmpty(params.get("endTime")),
+            SupplierContact::getCreateTime, params.get("beginTime"), params.get("endTime"));
         return lqw;
         return lqw;
     }
     }
 
 

+ 2 - 0
ruoyi-modules/ruoyi-customer/src/main/java/org/dromara/customer/service/impl/SupplierContractServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.customer.service.impl;
 package org.dromara.customer.service.impl;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -13,6 +14,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.customer.domain.SupplierContact;
 import org.dromara.customer.domain.SupplierInfo;
 import org.dromara.customer.domain.SupplierInfo;
 import org.dromara.customer.domain.dto.ContractCountDTO;
 import org.dromara.customer.domain.dto.ContractCountDTO;
 import org.dromara.customer.domain.vo.SupplierContactVo;
 import org.dromara.customer.domain.vo.SupplierContactVo;

+ 1 - 1
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/tongji/TongJiPullController.java

@@ -54,7 +54,7 @@ public class TongJiPullController {
     private static final String CLIENT_ID = "KFZOW9K7ix6";
     private static final String CLIENT_ID = "KFZOW9K7ix6";
     private static final String PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgkRuHZ2UkqHOv+TpwYFkccmIJpE4Tje63UFV++O1AxTKgCgYIKoEcz1UBgi2hRANCAASL+QeNJvix0bhOunIyO/s1as0aGkQ6am3rf/4eb17UOnJzVo6xvKOFPRA/5rG0rFggU5hYwe70ElN/xWT/Cy2g"; // 电商平台私钥
     private static final String PRIVATE_KEY = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgkRuHZ2UkqHOv+TpwYFkccmIJpE4Tje63UFV++O1AxTKgCgYIKoEcz1UBgi2hRANCAASL+QeNJvix0bhOunIyO/s1as0aGkQ6am3rf/4eb17UOnJzVo6xvKOFPRA/5rG0rFggU5hYwe70ElN/xWT/Cy2g"; // 电商平台私钥
     private static final String TJ_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAECeORp+9YlmSobsiULe0D1obWOxjTG4aAeufqhtXEwy9BhpbLKQjjifXHKcb92ozx0VBtt5Yt9E7U06+hc0x/tQ=="; // 同济公钥
     private static final String TJ_PUBLIC_KEY = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAECeORp+9YlmSobsiULe0D1obWOxjTG4aAeufqhtXEwy9BhpbLKQjjifXHKcb92ozx0VBtt5Yt9E7U06+hc0x/tQ=="; // 同济公钥
-    private final String username = "yoe365-tiyy";
+    private final String username = "20240316002";
     //测试环境
     //测试环境
     // 同济地区查询接口地址(替换为真实域名)
     // 同济地区查询接口地址(替换为真实域名)
 //    private static final String AREA_QUERY_URL = "https://supply-test.crrcgo.cc/mallapi/";
 //    private static final String AREA_QUERY_URL = "https://supply-test.crrcgo.cc/mallapi/";

+ 10 - 7
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/controller/tongji/TongJiPushController.java

@@ -298,13 +298,13 @@ public class TongJiPushController {
 
 
         // 2. 提取商品ID列表,准备查询库存
         // 2. 提取商品ID列表,准备查询库存
         List<String> goodsIds = goodsMap.keySet().stream().collect(Collectors.toList());
         List<String> goodsIds = goodsMap.keySet().stream().collect(Collectors.toList());
-        ExternalItem one = externalItemService.getOne(Wrappers.lambdaQuery(ExternalItem.class).eq(ExternalItem::getItemKey, "zhongche").last("LIMIT 1"));
+        ExternalItem one = externalItemService.getOne(Wrappers.lambdaQuery(ExternalItem.class).eq(ExternalItem::getItemKey, "tongji").last("LIMIT 1"));
         List<ExternalProduct> externalProducts = externalProductService.queryProductStock(one.getId(),goodsIds);
         List<ExternalProduct> externalProducts = externalProductService.queryProductStock(one.getId(),goodsIds);
         // 5. 遍历查询结果,封装返回数据
         // 5. 遍历查询结果,封装返回数据
         externalProducts.forEach(product -> {
         externalProducts.forEach(product -> {
             // 5.1 提取商品核心信息
             // 5.1 提取商品核心信息
             String productIdStr = product.getProductNo();
             String productIdStr = product.getProductNo();
-            Integer nowInventory = product.getAvailableInventory();
+            Integer nowInventory = ObjectUtil.isEmpty(product.getAvailableInventory()) ? 0 : product.getAvailableInventory();
             Integer goodsNum = goodsMap.get(productIdStr); // 入参的所需库存数量
             Integer goodsNum = goodsMap.get(productIdStr); // 入参的所需库存数量
             //可用库存
             //可用库存
 
 
@@ -434,6 +434,12 @@ public class TongJiPushController {
      * 核心业务:查询商品价格,映射文档返回格式
      * 核心业务:查询商品价格,映射文档返回格式
      */
      */
     public PricesVo queryGoodsPrice(List<String> goodsIdList) {
     public PricesVo queryGoodsPrice(List<String> goodsIdList) {
+        //获取项目配置
+        ExternalItem externalItem = externalItemService.getOne(
+            Wrappers.lambdaQuery(ExternalItem.class)
+                .eq(ExternalItem::getItemKey, "tongji")
+                .last("LIMIT 1")
+        );
         // 1. 初始化响应结果
         // 1. 初始化响应结果
         PricesVo pricesVo = new PricesVo();
         PricesVo pricesVo = new PricesVo();
         pricesVo.setPrices(new ArrayList<>());
         pricesVo.setPrices(new ArrayList<>());
@@ -454,8 +460,6 @@ public class TongJiPushController {
                 priceResp.setDsPrice(new BigDecimal(-1));
                 priceResp.setDsPrice(new BigDecimal(-1));
                 priceResp.setPrice(new BigDecimal(-1));
                 priceResp.setPrice(new BigDecimal(-1));
                 priceResp.setTaxFreePrice(null);
                 priceResp.setTaxFreePrice(null);
-                priceResp.setTax(BigDecimal.valueOf(0.13));
-                priceResp.setTaxCode("107022301");
                 pricesVo.getPrices().add(priceResp);
                 pricesVo.getPrices().add(priceResp);
                 continue;
                 continue;
             }
             }
@@ -468,6 +472,7 @@ public class TongJiPushController {
             // 协议价格(price)
             // 协议价格(price)
             ExternalProduct one = externalProductService.getOne(new LambdaQueryWrapper<>(ExternalProduct.class)
             ExternalProduct one = externalProductService.getOne(new LambdaQueryWrapper<>(ExternalProduct.class)
                 .eq(ExternalProduct::getProductNo, goodsId)
                 .eq(ExternalProduct::getProductNo, goodsId)
+                .eq(ExternalProduct::getItemId, externalItem.getId())
                 .last("LIMIT 1")
                 .last("LIMIT 1")
             );
             );
             if (one == null) {
             if (one == null) {
@@ -478,10 +483,8 @@ public class TongJiPushController {
                 // 找到协议价格,使用数据库中的协议价格
                 // 找到协议价格,使用数据库中的协议价格
                 priceResp.setPrice(one.getExternalPrice());
                 priceResp.setPrice(one.getExternalPrice());
             }
             }
-            priceResp.setTaxFreePrice(null);
-            priceResp.setTax(BigDecimal.valueOf(0.13));
             // 税收编码(非必填)
             // 税收编码(非必填)
-            priceResp.setTaxCode("107022301");
+            priceResp.setTaxCode(one.getTaxCode());
             // 3.3 添加到响应列表
             // 3.3 添加到响应列表
             pricesVo.getPrices().add(priceResp);
             pricesVo.getPrices().add(priceResp);
         }
         }

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

@@ -307,7 +307,7 @@ public class ZhongChePushController {
         externalProducts.forEach(product -> {
         externalProducts.forEach(product -> {
             // 5.1 提取商品核心信息
             // 5.1 提取商品核心信息
             String productIdStr = product.getProductNo();
             String productIdStr = product.getProductNo();
-            Integer nowInventory = product.getAvailableInventory();
+            Integer nowInventory = ObjectUtil.isEmpty(product.getAvailableInventory()) ? 0 : product.getAvailableInventory();
             Integer goodsNum = goodsMap.get(productIdStr); // 入参的所需库存数量
             Integer goodsNum = goodsMap.get(productIdStr); // 入参的所需库存数量
             //可用库存
             //可用库存
 
 
@@ -457,8 +457,6 @@ public class ZhongChePushController {
                 priceResp.setDsPrice(new BigDecimal(-1));
                 priceResp.setDsPrice(new BigDecimal(-1));
                 priceResp.setPrice(new BigDecimal(-1));
                 priceResp.setPrice(new BigDecimal(-1));
                 priceResp.setTaxFreePrice(null);
                 priceResp.setTaxFreePrice(null);
-                priceResp.setTax(BigDecimal.valueOf(0.13));
-                priceResp.setTaxCode("107022301");
                 pricesVo.getPrices().add(priceResp);
                 pricesVo.getPrices().add(priceResp);
                 continue;
                 continue;
             }
             }

+ 32 - 3
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/dubbo/RemoteTongJiPullServiceImpl.java

@@ -7,13 +7,14 @@ import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleConfirmBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRefundBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRefundBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRejectBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleRejectBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleReturnReceivedBo;
 import org.dromara.common.core.domain.zhongche.aftersale.bo.AfterSaleReturnReceivedBo;
+import org.dromara.common.core.domain.zhongche.vo.OrderDetailVo;
 import org.dromara.common.core.exception.api.ZhongcheException;
 import org.dromara.common.core.exception.api.ZhongcheException;
 import org.dromara.external.api.tongji.RemoteTongJiPullService;
 import org.dromara.external.api.tongji.RemoteTongJiPullService;
 
 
-import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
-import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
-import org.dromara.external.api.zhongche.domain.bo.ZhongCheOrderDeliverBo;
+import org.dromara.external.api.zhongche.domain.bo.*;
+import org.dromara.external.api.zhongche.domain.vo.AreaVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
+import org.dromara.external.api.zhongche.domain.vo.PendingOrderListVo;
 import org.dromara.external.api.zhongche.domain.vo.ZhongCheOrderDeliverVo;
 import org.dromara.external.api.zhongche.domain.vo.ZhongCheOrderDeliverVo;
 import org.dromara.external.controller.tongji.TongJiPullController;
 import org.dromara.external.controller.tongji.TongJiPullController;
 import org.dromara.external.controller.zhongche.ZhongChePullController;
 import org.dromara.external.controller.zhongche.ZhongChePullController;
@@ -30,6 +31,16 @@ import org.springframework.stereotype.Service;
 public class RemoteTongJiPullServiceImpl implements RemoteTongJiPullService {
 public class RemoteTongJiPullServiceImpl implements RemoteTongJiPullService {
 
 
     private final TongJiPullController tongJiPullController;
     private final TongJiPullController tongJiPullController;
+    /**
+     * @param bo
+     * @return
+     */
+    @Override
+    public AreaVo areaQuery(AreaQueryBo bo) {
+        AreaVo areaVo = tongJiPullController.areaQuery(bo);
+        return areaVo;
+    }
+
     @Override
     @Override
     public GoodsUpdateVo mallOrderConfirm(OrderConfirmBo bo) throws ZhongcheException {
     public GoodsUpdateVo mallOrderConfirm(OrderConfirmBo bo) throws ZhongcheException {
         GoodsUpdateVo goodsUpdateVo = tongJiPullController.mallOrderConfirm(bo);
         GoodsUpdateVo goodsUpdateVo = tongJiPullController.mallOrderConfirm(bo);
@@ -72,4 +83,22 @@ public class RemoteTongJiPullServiceImpl implements RemoteTongJiPullService {
     public ZhongCheOrderDeliverVo mallOrderDeliverGoods(ZhongCheOrderDeliverBo bo) throws ZhongcheException {
     public ZhongCheOrderDeliverVo mallOrderDeliverGoods(ZhongCheOrderDeliverBo bo) throws ZhongcheException {
         return tongJiPullController.mallOrderDeliverGoods(bo);
         return tongJiPullController.mallOrderDeliverGoods(bo);
     }
     }
+
+    /**
+     * @param bo
+     * @return
+     */
+    @Override
+    public PendingOrderListVo mallOrderPendingList(PendingOrderListBo bo) {
+        return tongJiPullController.mallOrderPendingList(bo);
+    }
+
+    /**
+     * @param bo
+     * @return
+     */
+    @Override
+    public OrderDetailVo mallOrderDetail(OrderDetailBo bo) {
+        return tongJiPullController.mallOrderDetail(bo);
+    }
 }
 }

+ 6 - 4
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/ProductPushStrategy.java

@@ -3,10 +3,12 @@ package org.dromara.external.handler;
 import org.dromara.external.api.zhongche.domain.bo.*;
 import org.dromara.external.api.zhongche.domain.bo.*;
 import org.dromara.external.api.zhongche.domain.vo.*;
 import org.dromara.external.api.zhongche.domain.vo.*;
 import org.dromara.external.domain.ExternalProduct;
 import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.domain.ExternalProductCategory;
 import org.dromara.external.domain.vo.ExternalProductVo;
 import org.dromara.external.domain.vo.ExternalProductVo;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.ProductVo;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 public interface ProductPushStrategy {
 public interface ProductPushStrategy {
 
 
@@ -18,7 +20,7 @@ public interface ProductPushStrategy {
     /**
     /**
      * 商品价格变更
      * 商品价格变更
      */
      */
-    GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products);
+    GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products , Map<String, ExternalProduct> externalProductMap);
 
 
     /**
     /**
      * 商品上下架状态变更
      * 商品上下架状态变更
@@ -28,15 +30,15 @@ public interface ProductPushStrategy {
     /**
     /**
      * 商品图片变更
      * 商品图片变更
      */
      */
-    GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products);
+    GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap);
 
 
     /**
     /**
      * 商品规格信息变更
      * 商品规格信息变更
      */
      */
-    GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products);
+    GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap);
 
 
     /**
     /**
      * 商品详情信息变更
      * 商品详情信息变更
      */
      */
-    GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products);
+    GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap,Map<Long, ExternalProductCategory> productCategoryMap);
 }
 }

+ 20 - 14
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/TongjiPushStrategy.java

@@ -45,7 +45,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @Slf4j
 public class TongjiPushStrategy  implements ProductPushStrategy {
 public class TongjiPushStrategy  implements ProductPushStrategy {
 
 
-    private final String username = "yoe365-tiyy";
+    private final String username = "20240316002";
 
 
     @DubboReference
     @DubboReference
     private final RemoteProductService remoteProductService;
     private final RemoteProductService remoteProductService;
@@ -279,16 +279,18 @@ public class TongjiPushStrategy  implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products) {
+    public GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         GoodsImportBo bo =  new GoodsImportBo();
         GoodsImportBo bo =  new GoodsImportBo();
         bo.setAccount(username);
         bo.setAccount(username);
-        List<ExternalProductVo> externalProductVos = externalProductMapper.selectVoList(Wrappers.lambdaQuery(ExternalProduct.class).eq(ExternalProduct::getItemId, itemId));
-        Map<String, BigDecimal> decimalMap = externalProductVos.stream().collect(Collectors.toMap(ExternalProductVo::getProductNo, ExternalProductVo::getExternalPrice));
         bo.setGoods(products.stream().map(item ->{
         bo.setGoods(products.stream().map(item ->{
+            ExternalProduct externalProduct = externalProductMap.get(item.getProductNo());
+            if (ObjectUtil.isEmpty(externalProduct)){
+                throw new ZhongcheException("商品不存在");
+            }
             GoodsImportItem goodsImportItem = new GoodsImportItem();
             GoodsImportItem goodsImportItem = new GoodsImportItem();
             goodsImportItem.setGoodsId(item.getProductNo());
             goodsImportItem.setGoodsId(item.getProductNo());
             goodsImportItem.setDsPrice(item.getMarketPrice());
             goodsImportItem.setDsPrice(item.getMarketPrice());
-            goodsImportItem.setPrice(decimalMap.get(item.getProductNo()));
+            goodsImportItem.setPrice(externalProduct.getExternalPrice());
             return goodsImportItem;
             return goodsImportItem;
         }).toList());
         }).toList());
         return tongJiPullController.egoodsPriceUpdate(bo);
         return tongJiPullController.egoodsPriceUpdate(bo);
@@ -308,7 +310,7 @@ public class TongjiPushStrategy  implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products) {
+    public GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         try {
         try {
             GoodsImageUpdateBo bo = new GoodsImageUpdateBo();
             GoodsImageUpdateBo bo = new GoodsImageUpdateBo();
             bo.setAccount(username);
             bo.setAccount(username);
@@ -333,13 +335,13 @@ public class TongjiPushStrategy  implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products) {
+    public GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap)  {
         try {
         try {
             GoodsPropertiesUpdateBo bo = new GoodsPropertiesUpdateBo();
             GoodsPropertiesUpdateBo bo = new GoodsPropertiesUpdateBo();
             bo.setAccount(username);
             bo.setAccount(username);
             bo.setGoods(products.stream().map(item ->{
             bo.setGoods(products.stream().map(item ->{
                 GoodsPropertiesUpdateItem goodsImageUpdateItem = new GoodsPropertiesUpdateItem();
                 GoodsPropertiesUpdateItem goodsImageUpdateItem = new GoodsPropertiesUpdateItem();
-                goodsImageUpdateItem.setProperties("{\"保质期\":\"12个月\"}");
+                goodsImageUpdateItem.setProperties("{\"保质期\":\"13个月\"}");
                 goodsImageUpdateItem.setGoodsId(item.getProductNo());
                 goodsImageUpdateItem.setGoodsId(item.getProductNo());
                 return goodsImageUpdateItem;
                 return goodsImageUpdateItem;
             }).toList());
             }).toList());
@@ -358,11 +360,16 @@ public class TongjiPushStrategy  implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products) {
+    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap,Map<Long, ExternalProductCategory> productCategoryMap)  {
         try {
         try {
             GoodsDetailBo bo = new GoodsDetailBo();
             GoodsDetailBo bo = new GoodsDetailBo();
             bo.setAccount(username);
             bo.setAccount(username);
+
             bo.setGoods(products.stream().map(item ->{
             bo.setGoods(products.stream().map(item ->{
+                ExternalProduct externalProduct = externalProductMap.get(item.getProductNo());
+                if (ObjectUtil.isEmpty(externalProduct)){
+                    throw new ZhongcheException("商品不存在");
+                }
                 GoodsDetailUpdateBo goodsImageUpdateItem = new GoodsDetailUpdateBo();
                 GoodsDetailUpdateBo goodsImageUpdateItem = new GoodsDetailUpdateBo();
                 goodsImageUpdateItem.setBrandName(item.getBrandName());
                 goodsImageUpdateItem.setBrandName(item.getBrandName());
                 goodsImageUpdateItem.setDescription(item.getPcDetail());
                 goodsImageUpdateItem.setDescription(item.getPcDetail());
@@ -371,13 +378,12 @@ public class TongjiPushStrategy  implements ProductPushStrategy {
                 goodsImageUpdateItem.setIsSelfOperated(1);
                 goodsImageUpdateItem.setIsSelfOperated(1);
                 goodsImageUpdateItem.setGoodsUrl("https://item.xiaoluwebsite.xyz/item?productNo="+item.getProductNo());
                 goodsImageUpdateItem.setGoodsUrl("https://item.xiaoluwebsite.xyz/item?productNo="+item.getProductNo());
                 goodsImageUpdateItem.setThirdUrl(item.getReferenceLink());
                 goodsImageUpdateItem.setThirdUrl(item.getReferenceLink());
-                goodsImageUpdateItem.setTaxCode("107022301");
-                goodsImageUpdateItem.setTax(BigDecimal.valueOf(0.13));
+                goodsImageUpdateItem.setTaxCode(externalProduct.getTaxCode());
                 goodsImageUpdateItem.setUnit(item.getUnitName());
                 goodsImageUpdateItem.setUnit(item.getUnitName());
-                goodsImageUpdateItem.setStandardCatalogId("1374013891398471680");
-                goodsImageUpdateItem.setStandardCatalogName("福利套餐");
+                ExternalProductCategory externalProductCategory = productCategoryMap.get(externalProduct.getExternalCategoryId());
+                goodsImageUpdateItem.setStandardCatalogId(externalProductCategory.getCategoryNo());
+                goodsImageUpdateItem.setStandardCatalogName(externalProductCategory.getCategoryName());
                 goodsImageUpdateItem.setGoodsId(item.getProductNo());
                 goodsImageUpdateItem.setGoodsId(item.getProductNo());
-                goodsImageUpdateItem.setTax(BigDecimal.valueOf(0.13));
                 return goodsImageUpdateItem;
                 return goodsImageUpdateItem;
             }).toList());
             }).toList());
             return tongJiPullController.egoodsDetailUpdate(bo);
             return tongJiPullController.egoodsDetailUpdate(bo);

+ 6 - 4
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/YangGuangPushStrategy.java

@@ -7,10 +7,12 @@ import org.dromara.external.api.zhongche.domain.vo.GoodsPriceUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsStatusUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsStatusUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 import org.dromara.external.domain.ExternalProduct;
 import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.domain.ExternalProductCategory;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.ProductVo;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 @Component("yangguangPushStrategy")
 @Component("yangguangPushStrategy")
 @RequiredArgsConstructor
 @RequiredArgsConstructor
@@ -22,7 +24,7 @@ public class YangGuangPushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsPriceUpdateVo updatePrice(Long itemId, List<ProductVo> products) {
+    public GoodsPriceUpdateVo updatePrice(Long itemId, List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         return null;
         return null;
     }
     }
 
 
@@ -32,17 +34,17 @@ public class YangGuangPushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsImageUpdateVo updateImages(Long itemId, List<ProductVo> products) {
+    public GoodsImageUpdateVo updateImages(Long itemId, List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         return null;
         return null;
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateProperties(Long itemId, List<ProductVo> products) {
+    public GoodsUpdateVo updateProperties(Long itemId, List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         return null;
         return null;
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateDetail(Long itemId, List<ProductVo> products) {
+    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap,Map<Long, ExternalProductCategory> productCategoryMap) {
         return null;
         return null;
     }
     }
 }
 }

+ 18 - 12
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/ZhongChePushStrategy.java

@@ -275,16 +275,19 @@ public class ZhongChePushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products) {
+    public GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         GoodsImportBo bo =  new GoodsImportBo();
         GoodsImportBo bo =  new GoodsImportBo();
         bo.setAccount(username);
         bo.setAccount(username);
-        List<ExternalProductVo> externalProductVos = externalProductMapper.selectVoList(Wrappers.lambdaQuery(ExternalProduct.class).eq(ExternalProduct::getItemId, itemId));
-        Map<String, BigDecimal> decimalMap = externalProductVos.stream().collect(Collectors.toMap(ExternalProductVo::getProductNo, ExternalProductVo::getExternalPrice));
+
         bo.setGoods(products.stream().map(item ->{
         bo.setGoods(products.stream().map(item ->{
+            ExternalProduct externalProduct = externalProductMap.get(item.getProductNo());
+            if (ObjectUtil.isEmpty(externalProduct)){
+                throw new ZhongcheException("商品不存在");
+            }
             GoodsImportItem goodsImportItem = new GoodsImportItem();
             GoodsImportItem goodsImportItem = new GoodsImportItem();
             goodsImportItem.setGoodsId(item.getProductNo());
             goodsImportItem.setGoodsId(item.getProductNo());
             goodsImportItem.setDsPrice(item.getMarketPrice());
             goodsImportItem.setDsPrice(item.getMarketPrice());
-            goodsImportItem.setPrice(decimalMap.get(item.getProductNo()));
+            goodsImportItem.setPrice(externalProduct.getExternalPrice());
             return goodsImportItem;
             return goodsImportItem;
         }).toList());
         }).toList());
         return zhongChePullController.egoodsPriceUpdate(bo);
         return zhongChePullController.egoodsPriceUpdate(bo);
@@ -304,7 +307,7 @@ public class ZhongChePushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products) {
+    public GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         try {
         try {
             GoodsImageUpdateBo bo = new GoodsImageUpdateBo();
             GoodsImageUpdateBo bo = new GoodsImageUpdateBo();
             bo.setAccount(username);
             bo.setAccount(username);
@@ -329,7 +332,7 @@ public class ZhongChePushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products) {
+    public GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap)  {
         try {
         try {
             GoodsPropertiesUpdateBo bo = new GoodsPropertiesUpdateBo();
             GoodsPropertiesUpdateBo bo = new GoodsPropertiesUpdateBo();
             bo.setAccount(username);
             bo.setAccount(username);
@@ -354,11 +357,15 @@ public class ZhongChePushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products) {
+    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap,Map<Long, ExternalProductCategory> productCategoryMap)  {
         try {
         try {
             GoodsDetailBo bo = new GoodsDetailBo();
             GoodsDetailBo bo = new GoodsDetailBo();
             bo.setAccount(username);
             bo.setAccount(username);
             bo.setGoods(products.stream().map(item ->{
             bo.setGoods(products.stream().map(item ->{
+                ExternalProduct externalProduct = externalProductMap.get(item.getProductNo());
+                if (ObjectUtil.isEmpty(externalProduct)){
+                    throw new ZhongcheException("商品不存在");
+                }
                 GoodsDetailUpdateBo goodsImageUpdateItem = new GoodsDetailUpdateBo();
                 GoodsDetailUpdateBo goodsImageUpdateItem = new GoodsDetailUpdateBo();
                 goodsImageUpdateItem.setBrandName(item.getBrandName());
                 goodsImageUpdateItem.setBrandName(item.getBrandName());
                 goodsImageUpdateItem.setDescription(item.getPcDetail());
                 goodsImageUpdateItem.setDescription(item.getPcDetail());
@@ -367,13 +374,12 @@ public class ZhongChePushStrategy implements ProductPushStrategy {
                 goodsImageUpdateItem.setIsSelfOperated(1);
                 goodsImageUpdateItem.setIsSelfOperated(1);
                 goodsImageUpdateItem.setGoodsUrl("https://item.xiaoluwebsite.xyz/item?productNo="+item.getProductNo());
                 goodsImageUpdateItem.setGoodsUrl("https://item.xiaoluwebsite.xyz/item?productNo="+item.getProductNo());
                 goodsImageUpdateItem.setThirdUrl(item.getReferenceLink());
                 goodsImageUpdateItem.setThirdUrl(item.getReferenceLink());
-                goodsImageUpdateItem.setTaxCode("107022301");
-                goodsImageUpdateItem.setTax(BigDecimal.valueOf(0.13));
+                goodsImageUpdateItem.setTaxCode(externalProduct.getTaxCode());
                 goodsImageUpdateItem.setUnit(item.getUnitName());
                 goodsImageUpdateItem.setUnit(item.getUnitName());
-                goodsImageUpdateItem.setStandardCatalogId("1374013891398471680");
-                goodsImageUpdateItem.setStandardCatalogName("福利套餐");
+                ExternalProductCategory externalProductCategory = productCategoryMap.get(externalProduct.getExternalCategoryId());
+                goodsImageUpdateItem.setStandardCatalogId(externalProductCategory.getCategoryNo());
+                goodsImageUpdateItem.setStandardCatalogName(externalProductCategory.getCategoryName());
                 goodsImageUpdateItem.setGoodsId(item.getProductNo());
                 goodsImageUpdateItem.setGoodsId(item.getProductNo());
-                goodsImageUpdateItem.setTax(BigDecimal.valueOf(0.13));
                 return goodsImageUpdateItem;
                 return goodsImageUpdateItem;
             }).toList());
             }).toList());
             return zhongChePullController.egoodsDetailUpdate(bo);
             return zhongChePullController.egoodsDetailUpdate(bo);

+ 6 - 4
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/ZhongZhiPushStrategy.java

@@ -2,10 +2,12 @@ package org.dromara.external.handler;
 
 
 import org.dromara.external.api.zhongche.domain.vo.*;
 import org.dromara.external.api.zhongche.domain.vo.*;
 import org.dromara.external.domain.ExternalProduct;
 import org.dromara.external.domain.ExternalProduct;
+import org.dromara.external.domain.ExternalProductCategory;
 import org.dromara.product.api.domain.ProductVo;
 import org.dromara.product.api.domain.ProductVo;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 @Component("ZF00030PushStrategy")
 @Component("ZF00030PushStrategy")
 public class ZhongZhiPushStrategy implements ProductPushStrategy {
 public class ZhongZhiPushStrategy implements ProductPushStrategy {
@@ -20,7 +22,7 @@ public class ZhongZhiPushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products) {
+    public GoodsPriceUpdateVo updatePrice(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         // TODO: 实现中职平台价格更新逻辑
         // TODO: 实现中职平台价格更新逻辑
         return null;
         return null;
     }
     }
@@ -32,19 +34,19 @@ public class ZhongZhiPushStrategy implements ProductPushStrategy {
     }
     }
 
 
     @Override
     @Override
-    public GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products) {
+    public GoodsImageUpdateVo updateImages(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap) {
         // TODO: 实现中职平台图片更新逻辑
         // TODO: 实现中职平台图片更新逻辑
         return null;
         return null;
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products) {
+    public GoodsUpdateVo updateProperties(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap)  {
         // TODO: 实现中职平台规格更新逻辑
         // TODO: 实现中职平台规格更新逻辑
         return null;
         return null;
     }
     }
 
 
     @Override
     @Override
-    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products) {
+    public GoodsUpdateVo updateDetail(Long itemId,List<ProductVo> products, Map<String, ExternalProduct> externalProductMap,Map<Long, ExternalProductCategory> productCategoryMap)  {
         // TODO: 实现中职平台详情更新逻辑
         // TODO: 实现中职平台详情更新逻辑
         return null;
         return null;
     }
     }

+ 109 - 113
ruoyi-modules/ruoyi-external/src/main/java/org/dromara/external/handler/impl/OrderCreateMessageHandler.java

@@ -16,6 +16,7 @@ import org.dromara.external.api.zhongche.domain.bo.OrderDetailBo;
 import org.dromara.external.api.zhongche.domain.vo.AreaVo;
 import org.dromara.external.api.zhongche.domain.vo.AreaVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.GoodsUpdateVo;
 import org.dromara.external.api.zhongche.domain.vo.MessageVo;
 import org.dromara.external.api.zhongche.domain.vo.MessageVo;
+import org.dromara.external.controller.tongji.TongJiPullController;
 import org.dromara.external.controller.zhongche.ZhongChePullController;
 import org.dromara.external.controller.zhongche.ZhongChePullController;
 import org.dromara.external.handler.MallMessageHandler;
 import org.dromara.external.handler.MallMessageHandler;
 import org.dromara.external.domain.ExternalItem;
 import org.dromara.external.domain.ExternalItem;
@@ -43,6 +44,7 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
 
 
     private final ZhongChePullController zhongChePullController;
     private final ZhongChePullController zhongChePullController;
 
 
+    private final TongJiPullController tongJiPullController;
     private final IExternalProductService externalProductService;
     private final IExternalProductService externalProductService;
 
 
     private final IExternalItemService externalItemService;
     private final IExternalItemService externalItemService;
@@ -80,121 +82,115 @@ public class OrderCreateMessageHandler implements MallMessageHandler {
         String orderNo = (String) messageBo.getContent().get("orderNo");
         String orderNo = (String) messageBo.getContent().get("orderNo");
         OrderDetailBo orderDetailBo = new OrderDetailBo();
         OrderDetailBo orderDetailBo = new OrderDetailBo();
         orderDetailBo.setOrderNo(orderNo);
         orderDetailBo.setOrderNo(orderNo);
-        OrderDetailVo orderDetailVo = zhongChePullController.mallOrderDetail(orderDetailBo);
-        orderDetailVo.setDataSource(messageBo.getItemKey());
-//        OrderDetailVo orderDetailVo = new OrderDetailVo();
-//
-//// ===== 基本信息 =====
-//        orderDetailVo.setOrderNo("20260210110174145");
-//        orderDetailVo.setPurchaserOrderNo("2026021010452505");
-//        orderDetailVo.setPreOrder(0);
-//        orderDetailVo.setMallOrderNo(null);
-//        orderDetailVo.setOrderStatus("1");
-//        orderDetailVo.setOrderAmount(new BigDecimal("205.24"));
-//        orderDetailVo.setFreight(new BigDecimal("0.00"));
-//
-//// ===== 收货信息 =====
-//        orderDetailVo.setName("111");
-//        orderDetailVo.setProvinceId("1");
-//        orderDetailVo.setCityId("2800");
-//        orderDetailVo.setCountyId("55835");
-//        orderDetailVo.setTownId("0");
-//        orderDetailVo.setAddress("中车智程");
-//        orderDetailVo.setZip(null);
-//        orderDetailVo.setMobile("13381115928");
-//        orderDetailVo.setPhone(null);
-//        orderDetailVo.setEmail("service_yg@bosssoft.com.cn");
-//
-//// ===== 下单信息 =====
-//        orderDetailVo.setMemo("");
-//        orderDetailVo.setOrderTime("2026-02-10 17:25:18");
-//        orderDetailVo.setBuyer("常恒瑀");
-//        orderDetailVo.setBuyerMobile("18801195315");
-//        orderDetailVo.setPurchaserName("中国中车");
-//        orderDetailVo.setPurchaserDeptName("中国中车-中车科技园发展有限公司-中车智程文化科技(北京)有限公司");
-//
-//// ===== 支付信息 =====
-//        orderDetailVo.setPaymentType("01");
-//        orderDetailVo.setVoucher("0");
-//        orderDetailVo.setPayClient("0");
-//        orderDetailVo.setPaySerialNum(null);
-//        orderDetailVo.setPayAccount(null);
-//        orderDetailVo.setPayMoney(null);
-//        orderDetailVo.setPayPrestore(null);
-//
-//        OrderGoodsItem goodsItem = new OrderGoodsItem();
-//        goodsItem.setGoodsId("362032");
-//        goodsItem.setNum(new BigDecimal("7.0000"));
-//        goodsItem.setPrice(new BigDecimal("29.3200"));
-//        goodsItem.setSubAmount(new BigDecimal("205.24"));
-//        goodsItem.setWishDeliveryDate(null);
-//
-//        orderDetailVo.setOrderGoods(Collections.singletonList(goodsItem));
-//        ZhongCheOrderInvoice invoice = new ZhongCheOrderInvoice();
-//        invoice.setInvoiceType("2");
-//        invoice.setSelectedInvoiceTitle("5");
-//        invoice.setCompanyName("中车智程文化科技(北京)");
-//        invoice.setInvoiceContent("1");
-//        invoice.setInvoiceName("王琳");
-//        invoice.setInvoicePhone("15249101907");
-//        invoice.setInvoiceFullAddress("北京海淀区羊坊店街道北京市海淀区羊坊店路11号");
-//        invoice.setRegCompanyName("中车智程文化科技(北京)");
-//        invoice.setRegCode("91110108MAC4385K6J");
-//        invoice.setRegAddr("北京市海淀区羊坊店路11号四层428室测试");
-//        invoice.setRegPhone("010-51891021");
-//        invoice.setRegBank("中国工商银行股份有限公司北京玉渊潭支行测试");
-//        invoice.setRegBankAccount("111111111");
-//        orderDetailVo.setOrderInvoice(invoice);
-        //获取省市区乡的名称
-        //省
-        AreaQueryBo provinceNameAreaQueryBo = new AreaQueryBo();
-        provinceNameAreaQueryBo.setLevel(1);
-        provinceNameAreaQueryBo.setPid("0");
-        AreaVo provinceNameAreaVo = zhongChePullController.areaQuery(provinceNameAreaQueryBo);
-        Map<String, String> provinceNameMap = provinceNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
-        //市
-        AreaQueryBo cityNameAreaQueryBo = new AreaQueryBo();
-        cityNameAreaQueryBo.setLevel(2);
-        cityNameAreaQueryBo.setPid(orderDetailVo.getProvinceId());
-        AreaVo cityNameAreaVo = zhongChePullController.areaQuery(cityNameAreaQueryBo);
-        Map<String, String> cityNameMap = cityNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
-        //区
-        AreaQueryBo countyNameAreaQueryBo = new AreaQueryBo();
-        countyNameAreaQueryBo.setLevel(3);
-        countyNameAreaQueryBo.setPid(orderDetailVo.getCityId());
-        AreaVo countyNameAreaVo = zhongChePullController.areaQuery(countyNameAreaQueryBo);
-        Map<String, String> countyNameMap = countyNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
-        //乡
-        AreaQueryBo townNameAreaQueryBo = new AreaQueryBo();
-        townNameAreaQueryBo.setLevel(4);
-        townNameAreaQueryBo.setPid(orderDetailVo.getCountyId());
-        AreaVo townNameAreaVo = zhongChePullController.areaQuery(townNameAreaQueryBo);
-        Map<String, String> townNameMap = townNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
-
-        orderDetailVo.setProvinceName(provinceNameMap.get(orderDetailVo.getProvinceId()));
-        orderDetailVo.setCityName(cityNameMap.get(orderDetailVo.getCityId()));
-        orderDetailVo.setCountyName(countyNameMap.get(orderDetailVo.getCountyId()));
-        orderDetailVo.setTownName(townNameMap.get(orderDetailVo.getTownId()));
-        OrderNoDto orderNoDto = remoteExternalOrderService.createZhongCheOrder(orderDetailVo);
-        log.info("新订单执行结果,orderNoDto={}", JSONUtil.toJsonStr(orderNoDto));
-        if (orderNoDto.getSuccess()){
-            List<OrderGoodsItem> orderGoods = orderDetailVo.getOrderGoods();
-            ExternalItem externalItem = externalItemService.getOne(Wrappers.lambdaQuery(ExternalItem.class).eq(ExternalItem::getItemKey, messageBo.getItemKey()));
-            //更新商品库存
-            for (OrderGoodsItem orderGoodsItem : orderGoods) {
-                ExternalProduct one = externalProductService.getOne(Wrappers.<ExternalProduct>lambdaQuery().
-                    eq(ExternalProduct::getProductNo, orderGoodsItem.getGoodsId())
-                    .eq(ExternalProduct::getItemId, ObjectUtil.isNotEmpty(externalItem)?externalItem.getId():"2028409445955592193")
-                );
-                one.setAvailableInventory(one.getAvailableInventory()-orderGoodsItem.getNum().intValue());
-                externalProductService.updateById(one);
+        //获取项目id
+        ExternalItem externalItem = externalItemService.getOne(Wrappers.<ExternalItem>lambdaQuery()
+            .eq(ExternalItem::getItemKey, messageBo.getItemKey())
+            .last("limit 1")
+        );
+        if (ObjectUtil.equals(messageBo.getItemKey(), "zhongche")){
+            OrderDetailVo orderDetailVo = zhongChePullController.mallOrderDetail(orderDetailBo);
+            orderDetailVo.setDataSource(messageBo.getItemKey());
+            //获取省市区乡的名称
+            //省
+            AreaQueryBo provinceNameAreaQueryBo = new AreaQueryBo();
+            provinceNameAreaQueryBo.setLevel(1);
+            provinceNameAreaQueryBo.setPid("0");
+            AreaVo provinceNameAreaVo = zhongChePullController.areaQuery(provinceNameAreaQueryBo);
+            Map<String, String> provinceNameMap = provinceNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+            //市
+            AreaQueryBo cityNameAreaQueryBo = new AreaQueryBo();
+            cityNameAreaQueryBo.setLevel(2);
+            cityNameAreaQueryBo.setPid(orderDetailVo.getProvinceId());
+            AreaVo cityNameAreaVo = zhongChePullController.areaQuery(cityNameAreaQueryBo);
+            Map<String, String> cityNameMap = cityNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+            //区
+            AreaQueryBo countyNameAreaQueryBo = new AreaQueryBo();
+            countyNameAreaQueryBo.setLevel(3);
+            countyNameAreaQueryBo.setPid(orderDetailVo.getCityId());
+            AreaVo countyNameAreaVo = zhongChePullController.areaQuery(countyNameAreaQueryBo);
+            Map<String, String> countyNameMap = countyNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+            //乡
+            AreaQueryBo townNameAreaQueryBo = new AreaQueryBo();
+            townNameAreaQueryBo.setLevel(4);
+            townNameAreaQueryBo.setPid(orderDetailVo.getCountyId());
+            AreaVo townNameAreaVo = zhongChePullController.areaQuery(townNameAreaQueryBo);
+            Map<String, String> townNameMap = townNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+
+            orderDetailVo.setProvinceName(provinceNameMap.get(orderDetailVo.getProvinceId()));
+            orderDetailVo.setCityName(cityNameMap.get(orderDetailVo.getCityId()));
+            orderDetailVo.setCountyName(countyNameMap.get(orderDetailVo.getCountyId()));
+            orderDetailVo.setTownName(townNameMap.get(orderDetailVo.getTownId()));
+            OrderNoDto orderNoDto = remoteExternalOrderService.createZhongCheOrder(orderDetailVo);
+            log.info("新订单执行结果,orderNoDto={}", JSONUtil.toJsonStr(orderNoDto));
+            if (orderNoDto.getSuccess()){
+                List<OrderGoodsItem> orderGoods = orderDetailVo.getOrderGoods();
+                //更新商品库存
+                for (OrderGoodsItem orderGoodsItem : orderGoods) {
+                    ExternalProduct one = externalProductService.getOne(Wrappers.<ExternalProduct>lambdaQuery().
+                        eq(ExternalProduct::getProductNo, orderGoodsItem.getGoodsId())
+                        .eq(ExternalProduct::getItemId, ObjectUtil.isNotEmpty(externalItem)?externalItem.getId():"2028409445955592193")
+                    );
+                    one.setAvailableInventory(one.getAvailableInventory()-orderGoodsItem.getNum().intValue());
+                    externalProductService.updateById(one);
+                }
+
+
+                return new MessageVo("1");
+            }else {
+                return new MessageVo("0","获取订单详情失败");
+            }
+        }else if (ObjectUtil.equals(messageBo.getItemKey(), "tongji")){
+            OrderDetailVo orderDetailVo = tongJiPullController.mallOrderDetail(orderDetailBo);
+            orderDetailVo.setDataSource(messageBo.getItemKey());
+            //获取省市区乡的名称
+            //省
+            AreaQueryBo provinceNameAreaQueryBo = new AreaQueryBo();
+            provinceNameAreaQueryBo.setLevel(1);
+            provinceNameAreaQueryBo.setPid("0");
+            AreaVo provinceNameAreaVo = tongJiPullController.areaQuery(provinceNameAreaQueryBo);
+            Map<String, String> provinceNameMap = provinceNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+            //市
+            AreaQueryBo cityNameAreaQueryBo = new AreaQueryBo();
+            cityNameAreaQueryBo.setLevel(2);
+            cityNameAreaQueryBo.setPid(orderDetailVo.getProvinceId());
+            AreaVo cityNameAreaVo = tongJiPullController.areaQuery(cityNameAreaQueryBo);
+            Map<String, String> cityNameMap = cityNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+            //区
+            AreaQueryBo countyNameAreaQueryBo = new AreaQueryBo();
+            countyNameAreaQueryBo.setLevel(3);
+            countyNameAreaQueryBo.setPid(orderDetailVo.getCityId());
+            AreaVo countyNameAreaVo = tongJiPullController.areaQuery(countyNameAreaQueryBo);
+            Map<String, String> countyNameMap = countyNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+            //乡
+            AreaQueryBo townNameAreaQueryBo = new AreaQueryBo();
+            townNameAreaQueryBo.setLevel(4);
+            townNameAreaQueryBo.setPid(orderDetailVo.getCountyId());
+            AreaVo townNameAreaVo = tongJiPullController.areaQuery(townNameAreaQueryBo);
+            Map<String, String> townNameMap = townNameAreaVo.getAreas().stream().collect(Collectors.toMap(Area::getId, Area::getName));
+
+            orderDetailVo.setProvinceName(provinceNameMap.get(orderDetailVo.getProvinceId()));
+            orderDetailVo.setCityName(cityNameMap.get(orderDetailVo.getCityId()));
+            orderDetailVo.setCountyName(countyNameMap.get(orderDetailVo.getCountyId()));
+            orderDetailVo.setTownName(townNameMap.get(orderDetailVo.getTownId()));
+            OrderNoDto orderNoDto = remoteExternalOrderService.createZhongCheOrder(orderDetailVo);
+            log.info("新订单执行结果,orderNoDto={}", JSONUtil.toJsonStr(orderNoDto));
+            if (orderNoDto.getSuccess()){
+                List<OrderGoodsItem> orderGoods = orderDetailVo.getOrderGoods();
+                //更新商品库存
+                for (OrderGoodsItem orderGoodsItem : orderGoods) {
+                    ExternalProduct one = externalProductService.getOne(Wrappers.<ExternalProduct>lambdaQuery().
+                        eq(ExternalProduct::getProductNo, orderGoodsItem.getGoodsId())
+                        .eq(ExternalProduct::getItemId, ObjectUtil.isNotEmpty(externalItem)?externalItem.getId():"2059520469390647298")
+                    );
+                    one.setAvailableInventory(one.getAvailableInventory()-orderGoodsItem.getNum().intValue());
+                    externalProductService.updateById(one);
+                }
+                return new MessageVo("1");
+            }else {
+                return new MessageVo("0","获取订单详情失败");
             }
             }
-
-
-            return new MessageVo("1");
-        }else {
-            return new MessageVo("0","获取订单详情失败");
         }
         }
+        return new MessageVo("0","获取订单详情失败");
     }
     }
 
 
 
 

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

@@ -256,10 +256,17 @@ public class ExternalProductServiceImpl  extends ServiceImpl<ExternalProductMapp
         if (ObjectUtil.isNotEmpty(productIds)) {
         if (ObjectUtil.isNotEmpty(productIds)) {
             //获取需要推送的商品数据
             //获取需要推送的商品数据
             List<ProductVo> productDetails = remoteProductService.getProductDetails(productIds);
             List<ProductVo> productDetails = remoteProductService.getProductDetails(productIds);
-            strategy.updateDetail(itemId,productDetails);
-            strategy.updatePrice(itemId,productDetails);
-            strategy.updateProperties(itemId,productDetails);
-            strategy.updateImages(itemId,productDetails);
+            //外部商品信息
+            Map<String, ExternalProduct> productMap = externalProducts.stream().collect(Collectors.toMap(ExternalProduct::getProductNo, Function.identity()));
+            //获取第三方分类信息
+            List<ExternalProductCategory> productCategoryList = externalProductCategoryService.list(Wrappers.lambdaQuery(ExternalProductCategory.class)
+                .eq(ExternalProductCategory::getItemId, itemId)
+            );
+            Map<Long, ExternalProductCategory> productCategoryMap = productCategoryList.stream().collect(Collectors.toMap(ExternalProductCategory::getId, Function.identity()));
+//            strategy.updateDetail(itemId,productDetails,productMap,productCategoryMap);
+//            strategy.updatePrice(itemId,productDetails,productMap);
+//            strategy.updateProperties(itemId,productDetails,productMap);
+            strategy.updateImages(itemId,productDetails,productMap);
         }
         }
         return baseMapper.update(Wrappers.lambdaUpdate(ExternalProduct.class)
         return baseMapper.update(Wrappers.lambdaUpdate(ExternalProduct.class)
             .set(ExternalProduct::getPushStatus, 1)
             .set(ExternalProduct::getPushStatus, 1)

+ 18 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/controller/OrderMainCrrcExtController.java

@@ -3,6 +3,7 @@ package org.dromara.order.controller;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
+import java.util.Objects;
 
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -13,6 +14,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.external.api.tongji.RemoteTongJiPullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.domain.OrderDeliverGoods;
 import org.dromara.external.api.zhongche.domain.OrderDeliverGoods;
 import org.dromara.external.api.zhongche.domain.PendingOrderRecord;
 import org.dromara.external.api.zhongche.domain.PendingOrderRecord;
@@ -82,6 +84,8 @@ public class OrderMainCrrcExtController extends BaseController {
     @DubboReference
     @DubboReference
     private final RemoteZhongChePullService remoteZhongChePullService;
     private final RemoteZhongChePullService remoteZhongChePullService;
 
 
+    @DubboReference
+    private final RemoteTongJiPullService remoteTongJiPullService;
     /**
     /**
      * 查询中车电子商城订单扩展列表
      * 查询中车电子商城订单扩展列表
      */
      */
@@ -241,6 +245,11 @@ public class OrderMainCrrcExtController extends BaseController {
             .eq(OrderMainCrrcExt::getPurchaserOrderNo, purchaserOrderNo)
             .eq(OrderMainCrrcExt::getPurchaserOrderNo, purchaserOrderNo)
             .last("limit 1")
             .last("limit 1")
         );
         );
+        if (ObjectUtil.isEmpty(one)) {
+            return R.fail("订单不存在");
+        }
+        //获取订单主订单
+        OrderMain orderMain = orderMainService.getOne(Wrappers.lambdaQuery(OrderMain.class));
         // 获取获取订单商品
         // 获取获取订单商品
         List<OrderProduct> products = orderProductService.list(Wrappers.lambdaQuery(OrderProduct.class)
         List<OrderProduct> products = orderProductService.list(Wrappers.lambdaQuery(OrderProduct.class)
             .eq(OrderProduct::getOrderId, one.getId())
             .eq(OrderProduct::getOrderId, one.getId())
@@ -261,7 +270,15 @@ public class OrderMainCrrcExtController extends BaseController {
         zhongCheOrderDeliverBo.setExpressCode(expressCode);
         zhongCheOrderDeliverBo.setExpressCode(expressCode);
         zhongCheOrderDeliverBo.setExpressCompanyName(expressCompanyName);
         zhongCheOrderDeliverBo.setExpressCompanyName(expressCompanyName);
         zhongCheOrderDeliverBo.setOrderDeliverGoods(orderDeliverGoods);
         zhongCheOrderDeliverBo.setOrderDeliverGoods(orderDeliverGoods);
-        ZhongCheOrderDeliverVo zhongCheOrderDeliverVo = remoteZhongChePullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
+        ZhongCheOrderDeliverVo zhongCheOrderDeliverVo = null;
+        if (Objects.equals(orderMain.getDataSource(), "zhongche")) {
+            zhongCheOrderDeliverVo = remoteZhongChePullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
+        }else if (Objects.equals(orderMain.getDataSource(), "tongji")) {
+            zhongCheOrderDeliverVo = remoteTongJiPullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
+        }
+        if (ObjectUtil.isEmpty(zhongCheOrderDeliverVo)){
+            return R.fail("发货失败");
+        }
         //保存第三方订单发货信息
         //保存第三方订单发货信息
         OrderDeliverThird orderDeliverThird = new OrderDeliverThird();
         OrderDeliverThird orderDeliverThird = new OrderDeliverThird();
         orderDeliverThird.setOrderId(one.getId());
         orderDeliverThird.setOrderId(one.getId());

+ 0 - 1
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/dubbo/RemoteExternalOrderServiceImpl.java

@@ -298,7 +298,6 @@ public class RemoteExternalOrderServiceImpl implements RemoteExternalOrderServic
 
 
         boolean update = orderMainService.lambdaUpdate()
         boolean update = orderMainService.lambdaUpdate()
             .eq(OrderMain::getId, orderMainCrrcExt.getId())
             .eq(OrderMain::getId, orderMainCrrcExt.getId())
-            .in(OrderMain::getOrderStatus, "2", "3")
             .set(OrderMain::getOrderStatus, "7")
             .set(OrderMain::getOrderStatus, "7")
             .set(OrderMain::getCancelReason, cancelReason)
             .set(OrderMain::getCancelReason, cancelReason)
             .update();
             .update();

+ 13 - 38
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderDeliverServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.dromara.common.core.domain.R;
 import org.dromara.common.core.enums.OrderStatus;
 import org.dromara.common.core.enums.OrderStatus;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
@@ -19,6 +20,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.redis.utils.SequenceUtils;
 import org.dromara.common.redis.utils.SequenceUtils;
 import org.dromara.customer.api.RemoteCustomerService;
 import org.dromara.customer.api.RemoteCustomerService;
+import org.dromara.external.api.tongji.RemoteTongJiPullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.domain.OrderDeliverGoods;
 import org.dromara.external.api.zhongche.domain.OrderDeliverGoods;
 import org.dromara.external.api.zhongche.domain.bo.ZhongCheOrderDeliverBo;
 import org.dromara.external.api.zhongche.domain.bo.ZhongCheOrderDeliverBo;
@@ -70,6 +72,9 @@ public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, Ord
 
 
     @DubboReference
     @DubboReference
     private RemoteZhongChePullService remoteZhongChePullService;
     private RemoteZhongChePullService remoteZhongChePullService;
+
+    @DubboReference
+    private RemoteTongJiPullService remoteTongJiPullService;
     @DubboReference
     @DubboReference
     private RemoteComLogisticsCompanyService remoteComLogisticsCompanyService;
     private RemoteComLogisticsCompanyService remoteComLogisticsCompanyService;
 
 
@@ -314,7 +319,7 @@ public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, Ord
             }
             }
 
 
             /*中车订单发货后调用接口通知中车*/
             /*中车订单发货后调用接口通知中车*/
-            if ("zhongche".equals(orderMain.getDataSource())) {
+            if ("zhongche".equals(orderMain.getDataSource()) || "tongji".equals(orderMain.getDataSource())) {
                 if (orderMain.getCurrentLevel() == 1) {
                 if (orderMain.getCurrentLevel() == 1) {
                     orderId = orderMain.getId();
                     orderId = orderMain.getId();
                 } else {
                 } else {
@@ -343,45 +348,15 @@ public class OrderDeliverServiceImpl extends ServiceImpl<OrderDeliverMapper, Ord
                     return zhongCheOrderDeliverGoods;
                     return zhongCheOrderDeliverGoods;
                 }).toList();
                 }).toList();
                 zhongCheOrderDeliverBo.setOrderDeliverGoods(orderDeliverGoods);
                 zhongCheOrderDeliverBo.setOrderDeliverGoods(orderDeliverGoods);
-                ZhongCheOrderDeliverVo zhongCheOrderDeliverVo = remoteZhongChePullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
-                //保存第三方订单发货信息
-                OrderDeliverThird orderDeliverThird = new OrderDeliverThird();
-                orderDeliverThird.setDeliverId(deliver.getId());
-                orderDeliverThird.setOrderId(orderId);
-                orderDeliverThird.setOutgoingCode(zhongCheOrderDeliverVo.getOutgoingCode());
-                orderDeliverThirdService.save(orderDeliverThird);
-            }
-            /*同济订单发货后调用接口通知同济*/
-            if ("tongji".equals(orderMain.getDataSource())) {
-                if (orderMain.getCurrentLevel() == 1) {
-                    orderId = orderMain.getId();
-                } else {
-                    orderId = orderMain.getParentOrderId();
+                ZhongCheOrderDeliverVo zhongCheOrderDeliverVo = null;
+                if (Objects.equals(orderMain.getDataSource(), "zhongche")) {
+                    zhongCheOrderDeliverVo = remoteZhongChePullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
+                }else if (Objects.equals(orderMain.getDataSource(), "tongji")) {
+                    zhongCheOrderDeliverVo = remoteTongJiPullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
                 }
                 }
-                OrderMainCrrcExt orderMainCrrcExt = orderMainCrrcExtService.getById(bo.getOrderId());
-                ZhongCheOrderDeliverBo zhongCheOrderDeliverBo = new ZhongCheOrderDeliverBo();
-                zhongCheOrderDeliverBo.setOrderNo(orderMainCrrcExt.getCrrcOrderNo());
-                if (Objects.equals(bo.getDeliverMethod(), "0")) {
-                    zhongCheOrderDeliverBo.setDeliveryType("2");
-                } else if (Objects.equals(bo.getDeliverMethod(), "1")) {
-                    zhongCheOrderDeliverBo.setDeliveryType("1");
-                    if (ObjectUtil.isNotEmpty(bo.getLogisticsCompanyName())) {
-                        zhongCheOrderDeliverBo.setExpressCode(bo.getLogisticNo());
-                        zhongCheOrderDeliverBo.setExpressCompanyName(bo.getLogisticsCompanyName());
-                    } else {
-                        String companyName = remoteComLogisticsCompanyService.selectLogisticsCompanyNameById(bo.getLogisticsCompanyId());
-                        zhongCheOrderDeliverBo.setExpressCode(bo.getLogisticNo());
-                        zhongCheOrderDeliverBo.setExpressCompanyName(companyName);
-                    }
+                if (ObjectUtil.isEmpty(zhongCheOrderDeliverVo)){
+                    throw new ServiceException("订单发货失败");
                 }
                 }
-                List<OrderDeliverGoods> orderDeliverGoods = bo.getOrderDeliverProducts().stream().map(orderDeliverProductBo -> {
-                    OrderDeliverGoods zhongCheOrderDeliverGoods = new OrderDeliverGoods();
-                    zhongCheOrderDeliverGoods.setGoodsId(orderDeliverProductBo.getProductNo());
-                    zhongCheOrderDeliverGoods.setNum(BigDecimal.valueOf(orderDeliverProductBo.getDeliverNum()));
-                    return zhongCheOrderDeliverGoods;
-                }).toList();
-                zhongCheOrderDeliverBo.setOrderDeliverGoods(orderDeliverGoods);
-                ZhongCheOrderDeliverVo zhongCheOrderDeliverVo = remoteZhongChePullService.mallOrderDeliverGoods(zhongCheOrderDeliverBo);
                 //保存第三方订单发货信息
                 //保存第三方订单发货信息
                 OrderDeliverThird orderDeliverThird = new OrderDeliverThird();
                 OrderDeliverThird orderDeliverThird = new OrderDeliverThird();
                 orderDeliverThird.setDeliverId(deliver.getId());
                 orderDeliverThird.setDeliverId(deliver.getId());

+ 30 - 8
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/OrderMainServiceImpl.java

@@ -26,6 +26,7 @@ import org.dromara.customer.api.*;
 import org.dromara.customer.api.domain.dto.CustomerInfoDTO;
 import org.dromara.customer.api.domain.dto.CustomerInfoDTO;
 import org.dromara.customer.api.domain.vo.RemoteCustomerContactVo;
 import org.dromara.customer.api.domain.vo.RemoteCustomerContactVo;
 import org.dromara.customer.api.domain.vo.RemoteCustomerSalesVo;
 import org.dromara.customer.api.domain.vo.RemoteCustomerSalesVo;
+import org.dromara.external.api.tongji.RemoteTongJiPullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
@@ -138,6 +139,9 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
     @DubboReference
     @DubboReference
     private final RemoteZhongChePullService zhongChePullService;
     private final RemoteZhongChePullService zhongChePullService;
 
 
+    @DubboReference
+    private final RemoteTongJiPullService tongJiPullService;
+
     private final IOrderAssignmentService orderAssignmentService;
     private final IOrderAssignmentService orderAssignmentService;
 
 
     /**
     /**
@@ -1274,10 +1278,18 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
         }
         }
         String crrcOrderNo = ext.getCrrcOrderNo();
         String crrcOrderNo = ext.getCrrcOrderNo();
         OrderConfirmBo bo = new OrderConfirmBo(crrcOrderNo, orderNo);
         OrderConfirmBo bo = new OrderConfirmBo(crrcOrderNo, orderNo);
-        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderConfirm(bo);
-        if (goodsUpdateVo.getResult() != 1) {
-            throw new ZhongcheException("中车订单扩展信息不存在");
+        if ("zhongche".equals(orderMain.getDataSource())  ) {
+            GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderConfirm(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("中车订单扩展信息不存在");
+            }
+        }else if ("tongji".equals(orderMain.getDataSource())  ) {
+            GoodsUpdateVo goodsUpdateVo = tongJiPullService.mallOrderConfirm(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("同济订单扩展信息不存在");
+            }
         }
         }
+
         log.info("接单成功{}", orderNo);
         log.info("接单成功{}", orderNo);
         //更新扩展表
         //更新扩展表
         orderMainCrrcExtService.update(
         orderMainCrrcExtService.update(
@@ -1302,17 +1314,27 @@ public class OrderMainServiceImpl extends ServiceImpl<OrderMainMapper, OrderMain
             return false;
             return false;
         }
         }
         String orderNo = orderMain.getOrderNo();
         String orderNo = orderMain.getOrderNo();
+
         // 查扩展表拿中车订单号(ID一致!)
         // 查扩展表拿中车订单号(ID一致!)
         OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
         OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
         if (ext == null) {
         if (ext == null) {
-            throw new ZhongcheException("中车订单扩展信息不存在");
+            throw new ZhongcheException("订单扩展信息不存在");
         }
         }
         String crrcOrderNo = ext.getCrrcOrderNo();
         String crrcOrderNo = ext.getCrrcOrderNo();
-        OrderRejectBo bo = new OrderRejectBo(crrcOrderNo, orderNo, reason);
-        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderReject(bo);
-        if (goodsUpdateVo.getResult() != 1) {
-            throw new ZhongcheException("拒绝失败");
+        if ("zhongche".equals(orderMain.getDataSource())  ) {
+            OrderRejectBo bo = new OrderRejectBo(crrcOrderNo, orderNo, reason);
+            GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderReject(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("拒绝失败");
+            }
+        }else if ("tongji".equals(orderMain.getDataSource())  ) {
+            OrderRejectBo bo = new OrderRejectBo(crrcOrderNo, orderNo, reason);
+            GoodsUpdateVo goodsUpdateVo = tongJiPullService.mallOrderReject(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("拒绝失败");
+            }
         }
         }
+
         return true;
         return true;
     }
     }
 
 

+ 26 - 8
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/service/impl/ZhongCheOrderMainServiceImpl.java

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.external.api.tongji.RemoteTongJiPullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.RemoteZhongChePullService;
 import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderConfirmBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
 import org.dromara.external.api.zhongche.domain.bo.OrderRejectBo;
@@ -58,6 +59,9 @@ public class ZhongCheOrderMainServiceImpl  extends ServiceImpl<ZhongCheOrderMain
     @DubboReference
     @DubboReference
     private final RemoteZhongChePullService zhongChePullService;
     private final RemoteZhongChePullService zhongChePullService;
 
 
+    @DubboReference
+    private final RemoteTongJiPullService tongJiPullService;
+
     private final IOrderDeliverService orderDeliverService;
     private final IOrderDeliverService orderDeliverService;
 
 
     @DubboReference
     @DubboReference
@@ -206,13 +210,20 @@ public class ZhongCheOrderMainServiceImpl  extends ServiceImpl<ZhongCheOrderMain
         // 查扩展表拿中车订单号(ID一致!)
         // 查扩展表拿中车订单号(ID一致!)
         OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
         OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
         if (ext == null) {
         if (ext == null) {
-            throw new ZhongcheException("中车订单扩展信息不存在");
+            throw new ZhongcheException("订单扩展信息不存在");
         }
         }
         String crrcOrderNo = ext.getCrrcOrderNo();
         String crrcOrderNo = ext.getCrrcOrderNo();
         OrderConfirmBo bo = new OrderConfirmBo(crrcOrderNo,orderNo);
         OrderConfirmBo bo = new OrderConfirmBo(crrcOrderNo,orderNo);
-        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderConfirm(bo);
-        if (goodsUpdateVo.getResult() != 1) {
-            throw new ZhongcheException("中车订单扩展信息不存在");
+        if ("zhongche".equals(orderMain.getDataSource())) {
+            GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderConfirm(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("中车订单扩展信息不存在");
+            }
+        }else if ("tongji".equals(orderMain.getDataSource())){
+            GoodsUpdateVo goodsUpdateVo = tongJiPullService.mallOrderConfirm(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("同济订单扩展信息不存在");
+            }
         }
         }
         ZhongCheOrderMain update = new ZhongCheOrderMain();
         ZhongCheOrderMain update = new ZhongCheOrderMain();
         update.setId(id);
         update.setId(id);
@@ -235,13 +246,20 @@ public class ZhongCheOrderMainServiceImpl  extends ServiceImpl<ZhongCheOrderMain
         // 查扩展表拿中车订单号(ID一致!)
         // 查扩展表拿中车订单号(ID一致!)
         OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
         OrderMainCrrcExt ext = orderMainCrrcExtService.getById(id);
         if (ext == null) {
         if (ext == null) {
-            throw new ZhongcheException("中车订单扩展信息不存在");
+            throw new ZhongcheException("订单扩展信息不存在");
         }
         }
         String crrcOrderNo = ext.getCrrcOrderNo();
         String crrcOrderNo = ext.getCrrcOrderNo();
         OrderRejectBo bo = new OrderRejectBo(crrcOrderNo,orderNo,reason);
         OrderRejectBo bo = new OrderRejectBo(crrcOrderNo,orderNo,reason);
-        GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderReject(bo);
-        if (goodsUpdateVo.getResult() != 1) {
-            throw new ZhongcheException("拒绝失败");
+        if ("zhongche".equals(orderMain.getDataSource())) {
+            GoodsUpdateVo goodsUpdateVo = zhongChePullService.mallOrderReject(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("拒绝失败");
+            }
+        }else if ("tongji".equals(orderMain.getDataSource())){
+            GoodsUpdateVo goodsUpdateVo = tongJiPullService.mallOrderReject(bo);
+            if (goodsUpdateVo.getResult() != 1) {
+                throw new ZhongcheException("拒绝失败");
+            }
         }
         }
         ZhongCheOrderMain update = new ZhongCheOrderMain();
         ZhongCheOrderMain update = new ZhongCheOrderMain();
         update.setId(id);
         update.setId(id);

+ 2 - 2
ruoyi-modules/ruoyi-order/src/main/java/org/dromara/order/utils/kd100/Kd100Util.java

@@ -55,8 +55,8 @@ public class Kd100Util {
     public static void main(String[] args) {
     public static void main(String[] args) {
         QueryTrackDTO param = QueryTrackDTO.builder()
         QueryTrackDTO param = QueryTrackDTO.builder()
                 .com("shunfeng")
                 .com("shunfeng")
-                .num("SF5196958100022")
-                .phone("13708974693")
+                .num("SF0222226296406")
+                .phone("18806486533")
                 .build();
                 .build();
         TrackVO orderTracesByJson = queryTrack(param);
         TrackVO orderTracesByJson = queryTrack(param);
         System.out.println(JSONUtil.toJsonStr(orderTracesByJson));
         System.out.println(JSONUtil.toJsonStr(orderTracesByJson));

+ 63 - 6
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ContractProductController.java

@@ -2,12 +2,18 @@ package org.dromara.product.controller;
 
 
 import java.util.List;
 import java.util.List;
 
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import jakarta.validation.constraints.*;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.dromara.product.domain.ContractProduct;
+import org.dromara.product.domain.bo.ProductBaseBo;
+import org.dromara.product.domain.vo.ProductBaseVo;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.validation.annotation.Validated;
+import org.springframework.web.multipart.MultipartFile;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.web.core.BaseController;
 import org.dromara.common.web.core.BaseController;
@@ -17,8 +23,11 @@ import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.common.excel.core.ExcelResult;
 import org.dromara.product.domain.vo.ContractProductVo;
 import org.dromara.product.domain.vo.ContractProductVo;
 import org.dromara.product.domain.bo.ContractProductBo;
 import org.dromara.product.domain.bo.ContractProductBo;
+import org.dromara.product.domain.vo.ContractProductImportVo;
+import org.dromara.product.listener.ContractProductImportListener;
 import org.dromara.product.service.IContractProductService;
 import org.dromara.product.service.IContractProductService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 
@@ -40,7 +49,7 @@ public class ContractProductController extends BaseController {
     /**
     /**
      * 查询合同产品关联列表
      * 查询合同产品关联列表
      */
      */
-    @SaCheckPermission("product:contracproduct:list")
+    //@SaCheckPermission("product:contracproduct:list")
     @GetMapping("/list")
     @GetMapping("/list")
     public TableDataInfo<ContractProductVo> list(ContractProductBo bo, PageQuery pageQuery) {
     public TableDataInfo<ContractProductVo> list(ContractProductBo bo, PageQuery pageQuery) {
         return contractProductService.queryPageList(bo, pageQuery);
         return contractProductService.queryPageList(bo, pageQuery);
@@ -58,7 +67,7 @@ public class ContractProductController extends BaseController {
     /**
     /**
      * 导出合同产品关联列表
      * 导出合同产品关联列表
      */
      */
-    @SaCheckPermission("product:contracproduct:export")
+    //@SaCheckPermission("product:contracproduct:export")
     @Log(title = "合同产品关联", businessType = BusinessType.EXPORT)
     @Log(title = "合同产品关联", businessType = BusinessType.EXPORT)
     @PostMapping("/export")
     @PostMapping("/export")
     public void export(ContractProductBo bo, HttpServletResponse response) {
     public void export(ContractProductBo bo, HttpServletResponse response) {
@@ -71,7 +80,7 @@ public class ContractProductController extends BaseController {
      *
      *
      * @param id 主键
      * @param id 主键
      */
      */
-    @SaCheckPermission("product:contracproduct:query")
+    //@SaCheckPermission("product:contracproduct:query")
     @GetMapping("/{id}")
     @GetMapping("/{id}")
     public R<ContractProductVo> getInfo(@NotNull(message = "主键不能为空")
     public R<ContractProductVo> getInfo(@NotNull(message = "主键不能为空")
                                      @PathVariable("id") Long id) {
                                      @PathVariable("id") Long id) {
@@ -81,7 +90,7 @@ public class ContractProductController extends BaseController {
     /**
     /**
      * 新增合同产品关联
      * 新增合同产品关联
      */
      */
-    @SaCheckPermission("product:contracproduct:add")
+    //@SaCheckPermission("product:contracproduct:add")
     @Log(title = "合同产品关联", businessType = BusinessType.INSERT)
     @Log(title = "合同产品关联", businessType = BusinessType.INSERT)
     @RepeatSubmit()
     @RepeatSubmit()
     @PostMapping()
     @PostMapping()
@@ -92,7 +101,7 @@ public class ContractProductController extends BaseController {
     /**
     /**
      * 修改合同产品关联
      * 修改合同产品关联
      */
      */
-    @SaCheckPermission("product:contracproduct:edit")
+    //@SaCheckPermission("product:contracproduct:edit")
     @Log(title = "合同产品关联", businessType = BusinessType.UPDATE)
     @Log(title = "合同产品关联", businessType = BusinessType.UPDATE)
     @RepeatSubmit()
     @RepeatSubmit()
     @PutMapping()
     @PutMapping()
@@ -105,11 +114,59 @@ public class ContractProductController extends BaseController {
      *
      *
      * @param ids 主键串
      * @param ids 主键串
      */
      */
-    @SaCheckPermission("product:contracproduct:remove")
+    //@SaCheckPermission("product:contracproduct:remove")
     @Log(title = "合同产品关联", businessType = BusinessType.DELETE)
     @Log(title = "合同产品关联", businessType = BusinessType.DELETE)
     @DeleteMapping("/{ids}")
     @DeleteMapping("/{ids}")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
     public R<Void> remove(@NotEmpty(message = "主键不能为空")
                           @PathVariable("ids") Long[] ids) {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(contractProductService.deleteWithValidByIds(List.of(ids), true));
         return toAjax(contractProductService.deleteWithValidByIds(List.of(ids), true));
     }
     }
+
+    /**
+    * 获取协议供货商品列表
+    * */
+    @GetMapping("/getContractProductList")
+    public TableDataInfo<ProductBaseVo> getContractProductList(ProductBaseBo bo, PageQuery pageQuery) {
+        return contractProductService.getContractProductList(bo, pageQuery);
+    }
+
+
+    @Log(title = "合同产品关联", businessType = BusinessType.DELETE)
+    @DeleteMapping("/delContracproductBySupplier")
+    public R<Void> delContracproductBySupplier(ContractProductBo bo) {
+        contractProductService.remove(Wrappers.lambdaQuery(ContractProduct.class)
+            .eq(ContractProduct::getSupplierId, bo.getSupplierId())
+            .eq(ContractProduct::getProductId, bo.getProductId())
+        );
+        return R.ok();
+    }
+
+
+        /**
+         * 导入合同产品数据
+         *
+         * @param file 导入文件
+         */
+        //@SaCheckPermission("product:contracproduct:import")
+        @Log(title = "合同产品关联", businessType = BusinessType.IMPORT)
+        @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+        public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
+            ExcelResult<ContractProductImportVo> result = ExcelUtil.importExcel(
+                file.getInputStream(),
+                ContractProductImportVo.class,
+                new ContractProductImportListener(contractProductService)
+            );
+            return R.ok(result.getAnalysis());
+        }
+
+        /**
+         * 获取导入模板
+         */
+        //@SaCheckPermission("product:contracproduct:import")
+        @Log(title = "合同产品关联", businessType = BusinessType.IMPORT)
+        @PostMapping("/importTemplate")
+        public void importTemplate(HttpServletResponse response) {
+            ExcelUtil.exportExcel(new java.util.ArrayList<>(), "合同产品导入模板", ContractProductImportVo.class, response);
+        }
+
 }
 }

+ 1 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductBaseController.java

@@ -228,6 +228,7 @@ public class ProductBaseController extends BaseController {
         boolean exists = productBaseAuditService.exists(Wrappers.lambdaQuery(ProductBaseAudit.class)
         boolean exists = productBaseAuditService.exists(Wrappers.lambdaQuery(ProductBaseAudit.class)
             .eq(ProductBaseAudit::getProductId, bo.getId())
             .eq(ProductBaseAudit::getProductId, bo.getId())
             .eq(ProductBaseAudit::getType, 1L)
             .eq(ProductBaseAudit::getType, 1L)
+            .eq(ProductBaseAudit::getAuditStatus, 1L)
         );
         );
         if (exists) {
         if (exists) {
             return R.fail("商品已提交上架审核,请勿重复提交");
             return R.fail("商品已提交上架审核,请勿重复提交");

+ 5 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ContractProduct.java

@@ -27,6 +27,11 @@ public class ContractProduct extends TenantEntity {
     @TableId(value = "id")
     @TableId(value = "id")
     private Long id;
     private Long id;
 
 
+    /**
+    * 供应商id
+    * */
+    private Long supplierId;
+
     /**
     /**
      * 合同供货编号
      * 合同供货编号
      */
      */
@@ -74,7 +79,6 @@ public class ContractProduct extends TenantEntity {
     /**
     /**
      * 删除标志(0代表存在 2代表删除)
      * 删除标志(0代表存在 2代表删除)
      */
      */
-    @TableLogic
     private String delFlag;
     private String delFlag;
 
 
     /**
     /**

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ContractProductBo.java

@@ -30,6 +30,11 @@ public class ContractProductBo extends BaseEntity {
      */
      */
     private String contractSupplyNo;
     private String contractSupplyNo;
 
 
+    /**
+     * 供应商id
+     * */
+    private Long supplierId;
+
     /**
     /**
      * 合同供货Id
      * 合同供货Id
      */
      */

+ 15 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductAuditBo.java

@@ -21,4 +21,19 @@ public class ProductAuditBo {
      * 驳回原因
      * 驳回原因
      */
      */
     private String auditReason;
     private String auditReason;
+
+    /**
+    * 最高采购价
+    * */
+    private java.math.BigDecimal maxPurchasePrice;
+    /**
+     * 最低售价
+     */
+    private java.math.BigDecimal minSellingPrice;
+
+    /**
+     * 采购价
+     */
+    private java.math.BigDecimal purchasingPrice;
+
 }
 }

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java

@@ -438,6 +438,11 @@ public class ProductBaseBo extends BaseEntity {
      * */
      * */
     private String supplierNo;
     private String supplierNo;
 
 
+    /**
+     * 供应商id
+     * */
+    private Long supplierId;
+
     /**
     /**
      * 站点id
      * 站点id
      */
      */

+ 34 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ContractProductImportVo.java

@@ -0,0 +1,34 @@
+package org.dromara.product.domain.vo;
+
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 合同产品导入VO
+ *
+ * @author LionLi
+ * @date 2026-06-01
+ */
+@Data
+public class ContractProductImportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
+    /**
+     * 供应价
+     */
+    @ExcelProperty(value = "供应价")
+    private BigDecimal offerPrice;
+
+}

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ContractProductVo.java

@@ -35,6 +35,11 @@ public class ContractProductVo implements Serializable {
     @ExcelProperty(value = "主键ID")
     @ExcelProperty(value = "主键ID")
     private Long id;
     private Long id;
 
 
+    /**
+     * 供应商id
+     * */
+    private Long supplierId;
+
     /**
     /**
      * 合同供货编号
      * 合同供货编号
      */
      */

+ 2 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java

@@ -586,4 +586,6 @@ public class ProductBaseVo implements Serializable {
     private String supplierNo;
     private String supplierNo;
 
 
 
 
+
+
 }
 }

+ 148 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/listener/ContractProductImportListener.java

@@ -0,0 +1,148 @@
+package org.dromara.product.listener;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.idev.excel.context.AnalysisContext;
+import cn.idev.excel.event.AnalysisEventListener;
+import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.core.exception.ServiceException;
+import org.dromara.common.core.utils.StreamUtils;
+import org.dromara.common.excel.core.ExcelListener;
+import org.dromara.common.excel.core.ExcelResult;
+import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.product.domain.bo.ContractProductBo;
+import org.dromara.product.domain.vo.ContractProductImportVo;
+import org.dromara.product.domain.vo.ContractProductVo;
+import org.dromara.product.service.IContractProductService;
+
+import jakarta.validation.ConstraintViolation;
+import jakarta.validation.ConstraintViolationException;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 合同产品导入监听器
+ *
+ * @author LionLi
+ * @date 2026-06-01
+ */
+@Slf4j
+public class ContractProductImportListener extends AnalysisEventListener<ContractProductImportVo> implements ExcelListener<ContractProductImportVo> {
+
+    private final IContractProductService contractProductService;
+
+    private int successNum = 0;
+    private int failureNum = 0;
+    private final StringBuilder successMsg = new StringBuilder();
+    private final StringBuilder failureMsg = new StringBuilder();
+
+    public ContractProductImportListener() {
+        this.contractProductService = null;
+    }
+
+    public ContractProductImportListener(IContractProductService contractProductService) {
+        this.contractProductService = contractProductService;
+    }
+
+    @Override
+    public void invoke(ContractProductImportVo importVo, AnalysisContext context) {
+        try {
+            // 校验必填字段
+            if (ObjectUtil.isEmpty(importVo.getProductId())) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、第 ").append(context.readRowHolder().getRowIndex() + 1).append(" 行,商品ID不能为空");
+                return;
+            }
+
+            if (ObjectUtil.isEmpty(importVo.getOfferPrice())) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、第 ").append(context.readRowHolder().getRowIndex() + 1).append(" 行,供应价不能为空");
+                return;
+            }
+
+            // 校验供应价是否大于0
+            if (importVo.getOfferPrice().compareTo(BigDecimal.ZERO) <= 0) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、第 ").append(context.readRowHolder().getRowIndex() + 1).append(" 行,供应价必须大于0");
+                return;
+            }
+
+            // 获取登录用户的供应商ID
+            Long supplierId = LoginHelper.getLoginUser().getSupplierId();
+            if (ObjectUtil.isEmpty(supplierId)) {
+                failureNum++;
+                failureMsg.append("<br/>").append(failureNum).append("、第 ").append(context.readRowHolder().getRowIndex() + 1).append(" 行,当前用户未关联供应商");
+                return;
+            }
+
+            // 根据商品ID和供应商ID查询是否已存在
+            ContractProductBo queryBo = new ContractProductBo();
+            queryBo.setProductId(importVo.getProductId());
+            queryBo.setSupplierId(supplierId);
+            List<ContractProductVo> existingList = contractProductService.queryList(queryBo);
+
+            if (ObjectUtil.isNotEmpty(existingList)) {
+                // 如果已存在,则更新供应价
+                ContractProductVo existing = existingList.get(0);
+                ContractProductBo updateBo = new ContractProductBo();
+                updateBo.setId(existing.getId());
+                updateBo.setOfferPrice(importVo.getOfferPrice().toString());
+                updateBo.setUpdateBy(LoginHelper.getUserId());
+                contractProductService.updateByBo(updateBo);
+                successNum++;
+                successMsg.append("<br/>").append(successNum).append("、商品ID ").append(importVo.getProductId()).append(" 更新成功");
+            } else {
+                // 如果不存在,则新增
+                ContractProductBo insertBo = new ContractProductBo();
+                insertBo.setProductId(importVo.getProductId());
+                insertBo.setSupplierId(supplierId);
+                insertBo.setOfferPrice(importVo.getOfferPrice().toString());
+                insertBo.setStatus("0"); // 默认正常状态
+                insertBo.setCreateBy(LoginHelper.getUserId());
+                contractProductService.insertByBo(insertBo);
+                successNum++;
+                successMsg.append("<br/>").append(successNum).append("、商品ID ").append(importVo.getProductId()).append(" 导入成功");
+            }
+        } catch (Exception e) {
+            failureNum++;
+            String msg = "<br/>" + failureNum + "、商品ID " + importVo.getProductId() + " 导入失败:";
+            String message = e.getMessage();
+            if (e instanceof ConstraintViolationException cvException) {
+                message = StreamUtils.join(cvException.getConstraintViolations(), ConstraintViolation::getMessage, ", ");
+            }
+            failureMsg.append(msg).append(message);
+            log.error(msg, e);
+        }
+    }
+
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+
+    }
+
+    @Override
+    public ExcelResult<ContractProductImportVo> getExcelResult() {
+        return new ExcelResult<ContractProductImportVo>() {
+
+            @Override
+            public String getAnalysis() {
+                if (failureNum > 0) {
+                    failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
+                    throw new ServiceException(failureMsg.toString());
+                } else {
+                    successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
+                }
+                return successMsg.toString();
+            }
+
+            @Override
+            public List<ContractProductImportVo> getList() {
+                return null;
+            }
+
+            @Override
+            public List<String> getErrorList() {
+                return null;
+            }
+        };
+    }
+}

+ 7 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IContractProductService.java

@@ -2,10 +2,12 @@ package org.dromara.product.service;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.product.domain.ContractProduct;
 import org.dromara.product.domain.ContractProduct;
+import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.vo.ContractProductVo;
 import org.dromara.product.domain.vo.ContractProductVo;
 import org.dromara.product.domain.bo.ContractProductBo;
 import org.dromara.product.domain.bo.ContractProductBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.product.domain.vo.ProductBaseVo;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
@@ -69,4 +71,9 @@ public interface IContractProductService extends IService<ContractProduct>{
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
 
 
     TableDataInfo<ContractProductVo> queryscmPageList(ContractProductBo bo, PageQuery pageQuery);
     TableDataInfo<ContractProductVo> queryscmPageList(ContractProductBo bo, PageQuery pageQuery);
+
+    /**
+    * 获取协议供货商品列表
+    * */
+    TableDataInfo<ProductBaseVo> getContractProductList(ProductBaseBo bo, PageQuery pageQuery);
 }
 }

+ 71 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ContractProductServiceImpl.java

@@ -1,6 +1,7 @@
 package org.dromara.product.service.impl;
 package org.dromara.product.service.impl;
 
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -13,11 +14,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.customer.api.RemoteSupplierInfoService;
 import org.dromara.customer.api.RemoteSupplierInfoService;
 import org.dromara.customer.api.domain.dto.SupplierAreaDTO;
 import org.dromara.customer.api.domain.dto.SupplierAreaDTO;
 import org.dromara.easyes.core.biz.EsPageInfo;
 import org.dromara.easyes.core.biz.EsPageInfo;
 import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
 import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
 import org.dromara.product.domain.ProductBase;
 import org.dromara.product.domain.ProductBase;
+import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
 import org.dromara.product.domain.vo.ProductBaseVo;
 import org.dromara.product.esmapper.ProductEsMapper;
 import org.dromara.product.esmapper.ProductEsMapper;
 import org.dromara.product.mapper.ProductBaseMapper;
 import org.dromara.product.mapper.ProductBaseMapper;
@@ -29,6 +32,7 @@ import org.dromara.product.domain.ContractProduct;
 import org.dromara.product.mapper.ContractProductMapper;
 import org.dromara.product.mapper.ContractProductMapper;
 import org.dromara.product.service.IContractProductService;
 import org.dromara.product.service.IContractProductService;
 
 
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
@@ -351,4 +355,71 @@ public class ContractProductServiceImpl  extends ServiceImpl<ContractProductMapp
         return TableDataInfo.build(result);
         return TableDataInfo.build(result);
     }
     }
 
 
+    /**
+     * 获取协议供货商品列表
+     *
+     * @param bo
+     * @param pageQuery
+     */
+    @Override
+    public TableDataInfo<ProductBaseVo> getContractProductList(ProductBaseBo bo, PageQuery pageQuery) {
+        List<ContractProduct> contractProducts = baseMapper.selectList(Wrappers.lambdaQuery(ContractProduct.class)
+            .eq(ContractProduct::getSupplierId, bo.getSupplierId())
+        );
+
+        LambdaEsQueryWrapper<ProductBaseVo> productBaseVoLambdaEsQueryWrapper = buildEsQueryWrapper(bo);
+        if (CollUtil.isEmpty(contractProducts)) {
+            return TableDataInfo.build(new Page<>());
+        }
+        List<Long> productIds = contractProducts.stream().map(ContractProduct::getProductId).collect(Collectors.toList());
+        productBaseVoLambdaEsQueryWrapper.in(ProductBaseVo::getId, productIds);
+        EsPageInfo<ProductBaseVo> esPageInfo = esMapper.pageQuery(productBaseVoLambdaEsQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
+        List<ProductBaseVo> productBaseVos = esPageInfo.getList();
+        for (ProductBaseVo productBaseVo : productBaseVos) {
+            String supplyPrice = contractProducts.stream().filter(contractProduct ->
+                    contractProduct.getProductId().equals(productBaseVo.getId()))
+                .findFirst()
+                .map(item -> ObjectUtil.isNotEmpty(item.getOfferPrice()) ? item.getOfferPrice() : null).orElse(null);
+            if (ObjectUtil.isEmpty(supplyPrice)) {
+                supplyPrice = "0";
+            }
+            productBaseVo.setSupplyPrice(new BigDecimal(supplyPrice));
+        }
+        TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build();
+        tableDataInfo.setRows(esPageInfo.getList());
+        tableDataInfo.setTotal(esPageInfo.getTotal());
+        return tableDataInfo;
+    }
+
+    private LambdaEsQueryWrapper<ProductBaseVo> buildEsQueryWrapper(ProductBaseBo bo) {
+        LambdaEsQueryWrapper<ProductBaseVo> productBaseVoLambdaEsQueryWrapper = new LambdaEsQueryWrapper<ProductBaseVo>()
+            .eq(ObjectUtil.isNotEmpty(bo.getProductNo()), ProductBaseVo::getProductNo, bo.getProductNo())
+            .like(ObjectUtil.isNotEmpty(bo.getItemName()), ProductBaseVo::getItemName, bo.getItemName())
+            .like(ObjectUtil.isNotEmpty(bo.getBrandName()), ProductBaseVo::getBrandName, bo.getBrandName())
+            .eq(bo.getBrandId() != null, ProductBaseVo::getBrandId, bo.getBrandId())
+            .eq(bo.getTopCategoryId() != null, ProductBaseVo::getTopCategoryId, bo.getTopCategoryId())
+            .eq(bo.getMediumCategoryId() != null, ProductBaseVo::getMediumCategoryId, bo.getMediumCategoryId())
+            .eq(bo.getBottomCategoryId() != null, ProductBaseVo::getBottomCategoryId, bo.getBottomCategoryId())
+            .eq(ObjectUtil.isNotEmpty(bo.getUnitId()), ProductBaseVo::getUnitId, bo.getUnitId())
+            .eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), ProductBaseVo::getProductStatus, bo.getProductStatus())
+            .eq(ObjectUtil.isNotEmpty(bo.getIsSelf()), ProductBaseVo::getIsSelf, bo.getIsSelf())
+            .eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()), ProductBaseVo::getProductReviewStatus, bo.getProductReviewStatus())
+            .eq(ObjectUtil.isNotEmpty(bo.getDataSource()), ProductBaseVo::getDataSource, bo.getDataSource())
+            .eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
+            .orderByDesc(ProductBaseVo::getCreateTime)
+            ;
+        if (ObjectUtil.isNotEmpty(bo.getIds())){
+            productBaseVoLambdaEsQueryWrapper.in(ProductBaseVo::getId, bo.getIds().split(","));
+        }
+        if (ObjectUtil.isNotEmpty(bo.getProductNos())){
+            productBaseVoLambdaEsQueryWrapper.in(ProductBaseVo::getProductNo, bo.getProductNos().split(","));
+        }
+        if (ObjectUtil.isNotEmpty(bo.getBrandIds())){
+            productBaseVoLambdaEsQueryWrapper.in(ProductBaseVo::getBrandId, bo.getBrandIds().split(","));
+        }
+        if (ObjectUtil.isNotEmpty(bo.getCategoryIds())){
+            productBaseVoLambdaEsQueryWrapper.in(ProductBaseVo::getBottomCategoryId, bo.getCategoryIds().split(","));
+        }
+        return productBaseVoLambdaEsQueryWrapper;
+    }
 }
 }

+ 16 - 5
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseAuditServiceImpl.java

@@ -322,7 +322,7 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
             // 3. 根据审核状态处理
             // 3. 根据审核状态处理
             if ("2".equals(bo.getAuditStatus())) {
             if ("2".equals(bo.getAuditStatus())) {
                 // 审核通过
                 // 审核通过
-                handleAuditPass(auditRecord, productBaseVo, bo.getAuditReason());
+                handleAuditPass(auditRecord, productBaseVo, bo);
             } else if ("3".equals(bo.getAuditStatus())) {
             } else if ("3".equals(bo.getAuditStatus())) {
                 // 审核驳回
                 // 审核驳回
                 handleAuditReject(auditRecord, bo.getAuditReason());
                 handleAuditReject(auditRecord, bo.getAuditReason());
@@ -337,9 +337,9 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
      *
      *
      * @param auditRecord   审核记录
      * @param auditRecord   审核记录
      * @param productBaseVo 商品数据
      * @param productBaseVo 商品数据
-     * @param auditReason   审核意见
+     * @param bo   审核意见
      */
      */
-    private void handleAuditPass(ProductBaseAudit auditRecord, ProductBaseVo productBaseVo, String auditReason) {
+    private void handleAuditPass(ProductBaseAudit auditRecord, ProductBaseVo productBaseVo, ProductAuditBo bo) {
         Long type = auditRecord.getType();
         Long type = auditRecord.getType();
         Long productId = auditRecord.getProductId();
         Long productId = auditRecord.getProductId();
 
 
@@ -368,9 +368,20 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
         }
         }
         // 更新审核记录状态
         // 更新审核记录状态
         if (auditRecord.getAuditStatus() == 4) {
         if (auditRecord.getAuditStatus() == 4) {
-            updateAuditRecord(auditRecord, 5L, auditReason);
+            if (ObjectUtil.isEmpty(bo.getIds())) {
+                productBaseVo.setMaxPurchasePrice(bo.getMaxPurchasePrice());
+                productBaseVo.setMinSellingPrice(bo.getMinSellingPrice());
+                productBaseVo.setPurchasingPrice(bo.getPurchasingPrice());
+                auditRecord.setProductData(JSONObject.toJSONString(productBaseVo));
+            }else {
+                //如果是批量审核,最低售价=官网价,最高采购价=采购价
+                productBaseVo.setMaxPurchasePrice(productBaseVo.getPurchasingPrice());
+                productBaseVo.setMinSellingPrice(productBaseVo.getMemberPrice());
+                auditRecord.setProductData(JSONObject.toJSONString(productBaseVo));
+            }
+            updateAuditRecord(auditRecord, 5L, bo.getAuditReason());
         }else {
         }else {
-            updateAuditRecord(auditRecord, 2L, auditReason); // 2=审核通过
+            updateAuditRecord(auditRecord, 2L, bo.getAuditReason()); // 2=审核通过
         }
         }
     }
     }
 
 

+ 49 - 0
script/config/nacos/ruoyi-gateway.yml

@@ -27,6 +27,55 @@ spring:
           lowerCaseServiceId: true
           lowerCaseServiceId: true
           enabled: true
           enabled: true
       routes:
       routes:
+        # ================== 中车 (Zhongche) 域名专属路由 ==================
+
+        # 1. 中车 - 登录接口特殊处理
+        - id: zhongche-auth-login
+          uri: lb://ruoyi-auth
+          predicates:
+            - Host=zhongche.yoe365.com
+            # 前端实际请求路径
+            - Path=/api/mall/auth/login
+          filters:
+            # 将 /api/mall/auth/login 重写为 /zhongche/access_token(直接匹配 Controller 路径)
+            - RewritePath=/api/mall/auth/login, /zhongche/access_token
+
+        # 2. 中车 - 其他通用 mall 接口
+        - id: zhongche-mall-api
+          uri: lb://ruoyi-external
+          predicates:
+            - Host=zhongche.yoe365.com
+            - Path=/api/mall/**
+          filters:
+            # 将 /api/mall/xxx 重写为 /zhongche/api/mall/xxx
+            - RewritePath=/api/mall/(?<segment>.*), /zhongche/api/mall/${segment}
+
+
+        # ================== 同济 (Tongji) 域名专属路由 ==================
+
+        # 3. 同济 - 登录接口特殊处理
+        - id: tongji-auth-login
+          uri: lb://ruoyi-auth
+          predicates:
+            - Host=jingyang.xiaoluwebsite.xyz
+            # 前端实际请求路径
+            - Path=/api/mall/auth/login
+          filters:
+            # 将 /api/mall/auth/login 重写为 /tongji/access_token(直接匹配 Controller 路径)
+            - RewritePath=/api/mall/auth/login, /tongji/access_token
+
+        # 4. 同济 - 其他通用 mall 接口
+        - id: tongji-mall-api
+          uri: lb://ruoyi-external
+          predicates:
+            - Host=jingyang.xiaoluwebsite.xyz
+            - Path=/api/mall/**
+          filters:
+            # 将 /api/mall/xxx 重写为 /tongji/api/mall/xxx
+            - RewritePath=/api/mall/(?<segment>.*), /tongji/api/mall/${segment}
+
+        # ================== 默认路由(放在最后,优先级最低) ==================
+
         # 认证中心
         # 认证中心
         - id: ruoyi-auth
         - id: ruoyi-auth
           uri: lb://ruoyi-auth
           uri: lb://ruoyi-auth