Преглед изворни кода

Merge remote-tracking branch 'origin/dev_20260131' into dev_20260131

donglang пре 2 месеци
родитељ
комит
de295ab758
47 измењених фајлова са 1109 додато и 88 уклоњено
  1. 3 2
      pom.xml
  2. 50 9
      sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java
  3. 5 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/constant/HttpStatus.java
  4. 16 14
      sckw-gateway/src/main/java/com/sckw/gateway/filter/AuthenticationFilter.java
  5. 1 1
      sckw-gateway/src/main/resources/bootstrap-dev.yml
  6. 3 7
      sckw-modules-api/pom.xml
  7. 9 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  8. 5 0
      sckw-modules-api/sckw-modules-bom/pom.xml
  9. 17 1
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/feign/TradeOrderApi.java
  10. 1 1
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderPara.java
  11. 39 0
      sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/feign/OfflineWalletFeignService.java
  12. 32 0
      sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/model/dto/WalletFreezeDto.java
  13. 42 0
      sckw-modules-api/sckw-report-api/pom.xml
  14. 19 0
      sckw-modules-api/sckw-report-api/src/main/java/com/sckw/report/api/feign/ReportApi.java
  15. 1 1
      sckw-modules-api/sckw-report-api/src/main/java/com/sckw/report/api/model/TodoCountVo.java
  16. 1 1
      sckw-modules-api/sckw-report-api/src/main/java/com/sckw/report/api/model/ViewUrl.java
  17. 35 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/feign/TransportApi.java
  18. 1 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/LogisticsBaseOrderVo.java
  19. 68 11
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/McpLogisticsOrderVo.java
  20. 25 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/OrderUrl.java
  21. 1 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/OrderPara.java
  22. 15 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  23. 15 2
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java
  24. 59 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderStatisticsTestController.java
  25. 47 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/McpController.java
  26. 1 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/TradeOrderStatusEnum.java
  27. 31 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/CancelTradeOrderParam.java
  28. 18 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderCountReq.java
  29. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderParam.java
  30. 23 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderReceiveAddressReq.java
  31. 45 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderCountResp.java
  32. 29 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderReceiveAddressResp.java
  33. 11 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderUnitRepository.java
  34. 219 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  35. 6 2
      sckw-modules/sckw-report/pom.xml
  36. 4 3
      sckw-modules/sckw-report/src/main/java/com/sckw/report/controller/HomeController.java
  37. 2 2
      sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwHomeService.java
  38. 10 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsEnterpriseController.java
  39. 24 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/PlatformEnterpriseResVo.java
  40. 66 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  41. 20 2
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  42. 9 8
      sckw-modules/sckw-system/src/main/resources/bootstrap-dev.yml
  43. 1 10
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtLogisticsOrderController.java
  44. 61 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/McpController.java
  45. 3 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java
  46. 8 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java
  47. 3 3
      sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

+ 3 - 2
pom.xml

@@ -384,8 +384,8 @@
             <id>dev</id>
             <properties>
                 <profiles.active>dev</profiles.active>
-                <nacos.server>10.10.10.224:8848</nacos.server>
-                <nacos.namespace>sckw-ng-service-platform-dev</nacos.namespace>
+                <nacos.server>nacos-server:8848</nacos.server>
+                <nacos.namespace>sckw-ng-service-platform</nacos.namespace>
             </properties>
         </profile>
         <!--测试环境-->
@@ -546,3 +546,4 @@
     </build>
 
 </project>
+

+ 50 - 9
sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java

@@ -50,7 +50,7 @@ public class AuthServiceImpl implements IAuthService {
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteUserService remoteUserService;
 
-    @DubboReference(version = "1.0.0", group = "design", check = false)
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private RemoteSystemService systemService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
@@ -167,7 +167,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setClientType(loginBase.getClientType());
         loginRes.setSystemType(loginBase.getSystemType());
         loginRes.setToken(token);
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1);
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -259,7 +259,7 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setRoleId(user.getRoleId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
-        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName());
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),0);
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
             loginRes.setTabBar(tabBar);
         }
@@ -696,7 +696,7 @@ public class AuthServiceImpl implements IAuthService {
         new AsyncProcess(loginBase, null, driver, enterprise, remoteUserService).run();
 
         // 构建返回结果
-        LoginResVo1 loginRes = buildDriverLoginRes(driver, enterprise, tokenClientType, tokenSystemType, newToken, newRefreshToken);
+        LoginResVo1 loginRes = buildDriverLoginRes(loginBase,driver, enterprise, tokenClientType, tokenSystemType, newToken, newRefreshToken);
         return HttpResult.ok(loginRes);
     }
     
@@ -735,14 +735,14 @@ public class AuthServiceImpl implements IAuthService {
         new AsyncProcess(loginBase, user, null, enterprise, remoteUserService).run();
 
         // 构建返回结果
-        LoginResVo1 loginRes = buildCommonLoginRes(user, enterprise, tokenClientType, tokenSystemType, newToken, newRefreshToken);
+        LoginResVo1 loginRes = buildCommonLoginRes(loginBase,user, enterprise, tokenClientType, tokenSystemType, newToken, newRefreshToken);
         return HttpResult.ok(loginRes);
     }
     
     /**
      * 构建司机端登录返回结果
      */
-    private LoginResVo1 buildDriverLoginRes(RDriverDetailVo driver, EntCacheResDto enterprise, 
+    private LoginResVo1 buildDriverLoginRes(LoginBase loginBase,RDriverDetailVo driver, EntCacheResDto enterprise,
                                             String tokenClientType, Integer tokenSystemType, 
                                             String newToken, String newRefreshToken) {
         LoginResVo1 loginRes = new LoginResVo1();
@@ -759,13 +759,17 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setSystemType(tokenSystemType);
         loginRes.setToken(newToken);
         loginRes.setRefreshToken(newRefreshToken);
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, null,1);
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
+            loginRes.setTabBar(tabBar);
+        }
         return loginRes;
     }
     
     /**
      * 构建运营端/企业端登录返回结果
      */
-    private LoginResVo1 buildCommonLoginRes(KwsUserResDto user, EntCacheResDto enterprise, 
+    private LoginResVo1 buildCommonLoginRes(LoginBase loginBase,KwsUserResDto user, EntCacheResDto enterprise,
                                            String tokenClientType, Integer tokenSystemType, 
                                            String newToken, String newRefreshToken) {
         LoginResVo1 loginRes = new LoginResVo1();
@@ -791,6 +795,10 @@ public class AuthServiceImpl implements IAuthService {
         loginRes.setRoleId(user.getRoleId());
         loginRes.setRoleName(user.getRoleName());
         loginRes.setRoleList(user.getRoleInfoDto());
+        List<LoginResVo1.TabBarItem> tabBar = buildAppTabBar(loginBase, user.getRoleName(),1);
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tabBar)) {
+            loginRes.setTabBar(tabBar);
+        }
         if (user.getSystemType().equals(SystemTypeEnum.MANAGE.getCode())) {
             loginRes.setValid(true);
         } else {
@@ -807,19 +815,52 @@ public class AuthServiceImpl implements IAuthService {
                 || Objects.equals(clientType, ClientTypeEnum.mobile.getValue());
     }
 
-    private List<LoginResVo1.TabBarItem> buildAppTabBar(LoginBase loginBase, String roleName) {
+    private List<LoginResVo1.TabBarItem> buildAppTabBar(LoginBase loginBase, String roleName,int flag) {
         if (!isAppLogin(loginBase)) {
             return List.of();
         }
         boolean isDoorKeeper = StringUtils.isNotBlank(roleName) && roleName.contains("门卫");
         boolean isForkliftDriver = StringUtils.isNotBlank(roleName) && roleName.contains("铲车司机");
+        boolean isBuyer = StringUtils.isNotBlank(roleName) && roleName.contains("买家");
         if (isDoorKeeper) {
             return buildDoorKeeperTabBar();
         }
         if (isForkliftDriver) {
             return buildForkliftDriverTabBar();
         }
-        return buildDefaultDriverTabBar();
+        if (isBuyer) {
+            return buildBuyerTabBar();
+        }
+        if (flag == 1) {
+            return buildDefaultDriverTabBar();
+        }
+        if (flag == 0 && !isDoorKeeper && !isForkliftDriver && !isBuyer){
+            return buildBuyerTabBar();
+        }
+        return List.of();
+    }
+
+    private List<LoginResVo1.TabBarItem> buildBuyerTabBar() {
+        List<LoginResVo1.TabBarItem> items = new ArrayList<>();
+        items.add(buildTabBarItem(
+                "商城",
+                "/static/tabbar/mall_select.png",
+                "/static/tabbar/mall.png",
+                "/pages/mall/index"
+        ));
+        items.add(buildTabBarItem(
+                "贸易订单",
+                "/static/tabbar/trade_select.png",
+                "/static/tabbar/trade.png",
+                "/pages/tradeOrder/index"
+        ));
+        items.add(buildTabBarItem(
+                "个人中心",
+                "/static/tabbar/my_select.png",
+                "/static/tabbar/my.png",
+                "/pages/forklift/my"
+        ));
+        return items;
     }
 
     private List<LoginResVo1.TabBarItem> buildDoorKeeperTabBar() {

+ 5 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/constant/HttpStatus.java

@@ -47,6 +47,11 @@ public class HttpStatus {
      */
     public static final int GOODS_PUT_ON_SHELVES_FAIL_CODE = 60667;
 
+    /**
+     * 库存不足需确认状态码
+     */
+    public static final int STOCK_INSUFFICIENT_CONFIRM_CODE = 60668;
+
     /**
      * 全局异常提示信息
      */

+ 16 - 14
sckw-gateway/src/main/java/com/sckw/gateway/filter/AuthenticationFilter.java

@@ -93,20 +93,22 @@ public class AuthenticationFilter implements GlobalFilter, Ordered {
 //        String accessSpecial = request.getHeader(RequestConstant.ACCESS_SPECIAL);
         String requestUri = request.getPath().value();
         /*1、非token校验接口放行*/
-        if (EXCLUDEPATH.contains(requestUri)&& StrUtil.isNotBlank(token)) {
-            Map<String, Object> tokenMap = EncryUtil.descryV2(Global.PRI_KEY, token);
-            if (tokenMap != null) {
-                Long userId = StringUtils.isNotBlank(tokenMap.get("userId")) ? NumberUtils.parseLong(tokenMap.get("userId")) : null;
-                String key = Global.getFullUserLoginKey(systemType, userId);
-
-                String userInfoStr = RedissonUtils.getString(key);
-                LoginUserInfo loginUserInfo = StringUtils.isNotBlank(userInfoStr) ? com.alibaba.fastjson.JSON.parseObject(userInfoStr, LoginUserInfo.class) : null;
-                if (Objects.nonNull(loginUserInfo)) {
-                    loginUserInfo.setClientType(clientType);
-                    String loginEntStr = RedissonUtils.getString(Global.getFullUserEntKey(loginUserInfo.getEntId()));
-                    LoginEntInfo loginEntInfo = StringUtils.isNotBlank(loginEntStr) ? com.alibaba.fastjson.JSON.parseObject(loginEntStr, LoginEntInfo.class) : null;
-                    ServerWebExchange build = buildNewExchange(exchange,loginUserInfo,loginEntInfo);
-                    return chain.filter(build);
+        if (EXCLUDEPATH.contains(requestUri)) {
+            if (StrUtil.isNotBlank(token)) {
+                Map<String, Object> tokenMap = EncryUtil.descryV2(Global.PRI_KEY, token);
+                if (tokenMap != null) {
+                    Long userId = StringUtils.isNotBlank(tokenMap.get("userId")) ? NumberUtils.parseLong(tokenMap.get("userId")) : null;
+                    String key = Global.getFullUserLoginKey(systemType, userId);
+
+                    String userInfoStr = RedissonUtils.getString(key);
+                    LoginUserInfo loginUserInfo = StringUtils.isNotBlank(userInfoStr) ? com.alibaba.fastjson.JSON.parseObject(userInfoStr, LoginUserInfo.class) : null;
+                    if (Objects.nonNull(loginUserInfo)) {
+                        loginUserInfo.setClientType(clientType);
+                        String loginEntStr = RedissonUtils.getString(Global.getFullUserEntKey(loginUserInfo.getEntId()));
+                        LoginEntInfo loginEntInfo = StringUtils.isNotBlank(loginEntStr) ? com.alibaba.fastjson.JSON.parseObject(loginEntStr, LoginEntInfo.class) : null;
+                        ServerWebExchange build = buildNewExchange(exchange,loginUserInfo,loginEntInfo);
+                        return chain.filter(build);
+                    }
                 }
             }
             return chain.filter(exchange);

+ 1 - 1
sckw-gateway/src/main/resources/bootstrap-dev.yml

@@ -25,4 +25,4 @@ spring:
         extension-configs:
           - data-id: sckw-common.yml
             group: sckw-ng-service-platform
-            refresh: true
+            refresh: true

+ 3 - 7
sckw-modules-api/pom.xml

@@ -7,12 +7,7 @@
         <groupId>com.sckw</groupId>
         <version>1.0.0</version>
     </parent>
-    <dependencies>
-        <dependency>
-            <groupId>com.sckw</groupId>
-            <artifactId>sckw-common-core</artifactId>
-        </dependency>
-    </dependencies>
+
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>sckw-modules-api</artifactId>
@@ -29,6 +24,7 @@
         <module>sckw-contract-api</module>
         <module>sckw-payment-api</module>
         <module>sckw-manage-api</module>
+        <module>sckw-report-api</module>
     </modules>
 
     <properties>
@@ -36,4 +32,4 @@
         <maven.compiler.target>17</maven.compiler.target>
     </properties>
 
-</project>
+</project>

+ 9 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -157,4 +157,13 @@ public interface RemoteContractService {
     ContractDetailRespVo signTradeContract(ContractAuditPara contractAuditPara);
 
     LogisticDetailRespVo signLogisticsContract(ContractAuditPara contractAuditPara);
+
+    /**
+     * 更新贸易合同商品已采购数量(累加履行量)
+     *
+     * @param contractId 贸易合同id
+     * @param goodsId    商品id
+     * @param orderAmount 本次下单数量
+     */
+    void updateTradeContractGoodsPerformed(Long contractId, Long goodsId, BigDecimal orderAmount);
 }

+ 5 - 0
sckw-modules-api/sckw-modules-bom/pom.xml

@@ -67,6 +67,11 @@
                 <artifactId>sckw-product-api</artifactId>
                 <version>${project.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.sckw</groupId>
+                <artifactId>sckw-report-api</artifactId>
+                <version>${project.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 </project>

+ 17 - 1
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/feign/TradeOrderApi.java

@@ -1,9 +1,25 @@
 package com.sckw.order.api.feign;
 
+import com.sckw.order.api.model.OrderPara;
+import com.sckw.order.api.model.TradeOrderVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.cloud.openfeign.SpringQueryMap;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import java.util.List;
+
 /**
  * @author xucaiqin
  * @date 2025-12-01 15:26:28
  */
+@FeignClient(name = "sckw-ng-order", contextId = "TradeOrderApi")
 public interface TradeOrderApi {
-
+    /**
+     * 分页查询物流订单
+     *
+     * @param para
+     * @return
+     */
+    @GetMapping("/tradeOrder/trade")
+    List<TradeOrderVo> trade(@SpringQueryMap OrderPara para);
 }

+ 1 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/OrderPara.java → sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/OrderPara.java

@@ -1,4 +1,4 @@
-package com.sckw.order.enums;
+package com.sckw.order.api.model;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;

+ 39 - 0
sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/feign/OfflineWalletFeignService.java

@@ -0,0 +1,39 @@
+package com.sckw.payment.api.feign;
+
+import com.sckw.core.web.response.BaseResult;
+import com.sckw.payment.api.model.dto.WalletFreezeDto;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.math.BigDecimal;
+
+/**
+ * 线下钱包Feign接口
+ * @author cxf
+ */
+@FeignClient(name = "sckw-payment-new", url = "${wallet.api.base-url}/walletPrepaid", contextId = "OfflineWalletFeignService")
+@ConditionalOnProperty(name = "wallet.api.base-url")
+public interface OfflineWalletFeignService {
+
+    /**
+     * 验证线下钱包预付余额是否足够
+     */
+    @GetMapping("/queryPrepaidBalance")
+    BaseResult<BigDecimal> queryPrepaidBalance(Long entityId);
+
+    /**
+     * 线下钱包扣减预付余额、增加冻结金额
+     */
+    @PostMapping("/freezeBalance")
+    BaseResult<Boolean> freezeBalance(@RequestBody WalletFreezeDto req);
+
+    /**
+     * 线下钱包加回预付余额、减冻结金额
+     */
+    @PostMapping("/unfreezeBalance")
+    BaseResult<Boolean> unfreezeBalance(@RequestBody WalletFreezeDto req);
+
+}

+ 32 - 0
sckw-modules-api/sckw-payment-api/src/main/java/com/sckw/payment/api/model/dto/WalletFreezeDto.java

@@ -0,0 +1,32 @@
+package com.sckw.payment.api.model.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 余额冻结参数
+ *
+ * @author cxf
+ * @since 2026-03-06  08:46
+ */
+@Data
+public class WalletFreezeDto implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6079448481420817882L;
+    //采购商企业id
+    @Schema(description = "采购商企业id")
+    private Long proEntId;
+    //供应商id
+    @Schema(description = "供应商id")
+    private Long supEntId;
+    //冻结金额
+    @Schema(description = "冻结金额")
+    private BigDecimal freezeAmount;
+    //订单号
+    @Schema(description = "订单号")
+    private String orderNo;
+}

+ 42 - 0
sckw-modules-api/sckw-report-api/pom.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.sckw</groupId>
+        <artifactId>sckw-modules-api</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>sckw-report-api</artifactId>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-openfeign-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-common-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.swagger.core.v3</groupId>
+            <artifactId>swagger-annotations-jakarta</artifactId>
+            <version>2.2.22</version>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>

+ 19 - 0
sckw-modules-api/sckw-report-api/src/main/java/com/sckw/report/api/feign/ReportApi.java

@@ -0,0 +1,19 @@
+package com.sckw.report.api.feign;
+
+import com.sckw.report.api.model.TodoCountVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@FeignClient(name = "sckw-ng-report", contextId = "ReportApi")
+public interface ReportApi {
+
+
+    /**
+     * ai助手待办统计
+     *
+     * @return
+     */
+    @GetMapping("/kwHome/count")
+    TodoCountVo count();
+
+}

+ 1 - 1
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/TodoCountVo.java → sckw-modules-api/sckw-report-api/src/main/java/com/sckw/report/api/model/TodoCountVo.java

@@ -1,4 +1,4 @@
-package com.sckw.report.service.vo;
+package com.sckw.report.api.model;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;

+ 1 - 1
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/vo/ViewUrl.java → sckw-modules-api/sckw-report-api/src/main/java/com/sckw/report/api/model/ViewUrl.java

@@ -1,4 +1,4 @@
-package com.sckw.report.service.vo;
+package com.sckw.report.api.model;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;

+ 35 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/feign/TransportApi.java

@@ -0,0 +1,35 @@
+package com.sckw.transport.api.feign;
+
+import com.sckw.transport.api.model.LogisticsBaseOrderVo;
+import com.sckw.transport.api.model.dto.McpLogisticsOrderVo;
+import com.sckw.transport.api.model.param.OrderPara;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.cloud.openfeign.SpringQueryMap;
+import org.springframework.web.bind.annotation.GetMapping;
+
+import java.util.List;
+
+/**
+ * 车辆轨迹服务 Feign 客户端
+ * 调用数据中台的车辆轨迹接口
+ *
+ * @author system
+ * @date 2024
+ */
+
+@FeignClient(name = "sckw-ng-transport", contextId = "TransportApi")
+public interface TransportApi {
+
+
+    /**
+     * 分页查询物流订单
+     *
+     * @param para
+     * @return
+     */
+    @GetMapping("/logisticsOrder/list")
+    List<McpLogisticsOrderVo> list(@SpringQueryMap OrderPara para);
+
+    @GetMapping("/logisticsOrder/base")
+    List<LogisticsBaseOrderVo> base(@SpringQueryMap OrderPara para);
+}

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/LogisticsBaseOrderVo.java → sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/LogisticsBaseOrderVo.java

@@ -1,4 +1,4 @@
-package com.sckw.transport.model.vo;
+package com.sckw.transport.api.model;
 
 import lombok.Data;
 

+ 68 - 11
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/LogisticsOrderVo.java → sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/McpLogisticsOrderVo.java

@@ -1,8 +1,7 @@
-package com.sckw.transport.model.vo;
+package com.sckw.transport.api.model.dto;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.sckw.order.api.model.OrderUrl;
 import lombok.Data;
 
 import java.io.Serial;
@@ -12,48 +11,106 @@ import java.time.LocalDateTime;
 
 
 @Data
-public class LogisticsOrderVo implements Serializable {
+public class McpLogisticsOrderVo implements Serializable {
     @Serial
     private static final long serialVersionUID = 4964311980474791569L;
     private Long id;
     private String moreUrl;
-
+    /**
+     * 贸易订单id
+     */
     @JsonProperty("tOrderId")
     private Long tOrderId;
-
+    /**
+     * 物流订单id
+     */
     @JsonProperty("lOrderId")
     private Long lOrderId;
-
+    /**
+     * 物流订单号
+     */
     @JsonProperty("lOrderNo")
     private String lOrderNo;
-
+    /**
+     * 物流订单跳转地址信息,用户可以直接点击订单号进行跳转
+     */
     @JsonProperty("lOrderNoUrl")
     private OrderUrl lOrderNoUrl;
-
+    /**
+     * 贸易订单号
+     */
     @JsonProperty("tOrderNo")
     private String tOrderNo;
-
+    /**
+     * 贸易订单跳转地址信息,用户可以直接点击订单号进行跳转
+     */
     @JsonProperty("tOrderNoUrl")
     private OrderUrl tOrderNoUrl;
-
+    /**
+     * 委托量
+     */
     private BigDecimal amount;
+    /**
+     * 订单状态
+     */
     private Integer status;
+    /**
+     * 订单状态文本
+     */
     private String statusLabel;
+    /**
+     * 托运企业名称
+     */
     private String tyFirmName;
+    /**
+     * 承运企业名称
+     */
     private String cyFirmName;
+    /**
+     * 创建时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;
-
+    /**
+     * 商品名称
+     */
     private String goodsName;
+    /**
+     * 商品id
+     */
     private Long goodsId;
+    /**
+     * 运输单价
+     */
     private BigDecimal price;//运输单价
+    /**
+     * 计费方式
+     */
     private String billingMode;//计费方式
+    /**
+     * 预计运费
+     */
     private BigDecimal money;//预计运费
+    /**
+     * 实际运费
+     */
     private BigDecimal pay;//实际运费
+    /**
+     * 累计装货量
+     */
     private BigDecimal loadAmount;//累计装货量
+    /**
+     * 累计卸货量
+     */
     private BigDecimal unloadAmount;//累计卸货量
+    /**
+     * 开始时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime startTime;
+    /**
+     * 结束时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime endTime;
 

+ 25 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/dto/OrderUrl.java

@@ -0,0 +1,25 @@
+package com.sckw.transport.api.model.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.io.Serializable;
+
+/**
+ * @author xucaiqin
+ * @date 2026-01-15 13:45:43
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class OrderUrl implements Serializable {
+    @Schema(description = "订单号")
+    private String orderNo;
+    @Schema(description = "跳转链接")
+    private String url;
+
+}

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/OrderPara.java → sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/OrderPara.java

@@ -1,4 +1,4 @@
-package com.sckw.transport.model;
+package com.sckw.transport.api.model.param;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;

+ 15 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -703,5 +703,20 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         throw new BusinessException("未找到合同");
     }
 
+    @Override
+    public void updateTradeContractGoodsPerformed(Long contractId, Long goodsId, BigDecimal orderAmount) {
+        KwcContractTradeGoods tradeGoods = kwcContractTradeGoodsMapper.selectOne(new LambdaQueryWrapper<KwcContractTradeGoods>()
+                .eq(KwcContractTradeGoods::getContractId, contractId)
+                .eq(KwcContractTradeGoods::getGoodsId, goodsId)
+                .eq(KwcContractTradeGoods::getDelFlag, 0)
+        );
+        if (Objects.isNull(tradeGoods)) {
+            throw new BusinessException("贸易合同商品信息不存在");
+        }
+        BigDecimal performed = tradeGoods.getPerformedAmount() != null ? tradeGoods.getPerformedAmount() : BigDecimal.ZERO;
+        tradeGoods.setPerformedAmount(performed.add(orderAmount));
+        tradeGoods.setUpdateTime(new Date());
+        kwcContractTradeGoodsMapper.updateById(tradeGoods);
+    }
 
 }

+ 15 - 2
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java

@@ -8,7 +8,7 @@ import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.order.api.model.TradeOrderPara;
-import com.sckw.order.enums.OrderPara;
+import com.sckw.order.api.model.OrderPara;
 import com.sckw.order.model.vo.req.*;
 import com.sckw.order.serivce.KwoTradeOrderService;
 import io.seata.spring.annotation.GlobalTransactional;
@@ -309,6 +309,12 @@ public class KwoTradeOrderController {
      * @Param params:
      * @return: com.sckw.core.web.response.HttpResult
      */
+    @GetMapping(value = "/countStatistic", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Operation(summary = "统计贸易订单数量")
+    public HttpResult countStatistic() {
+        return HttpResult.ok("统计贸易订单数量成功", kwoTradeOrderService.countStatistic());
+    }
+
     @PostMapping(value = "/tradeOrderExport", produces = MediaType.APPLICATION_JSON_VALUE)
     public void export(@RequestBody @Validated TradeOrderListExportParam params, HttpServletResponse response) {
         List<TradeOrderListExport> list = kwoTradeOrderService.export(params);
@@ -355,6 +361,13 @@ public class KwoTradeOrderController {
         return HttpResult.ok("增补运力查询成功");
     }
 
-
+    @GlobalTransactional(name = "default_tx_group")
+    @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
+    @PostMapping(value = "/cancelOrder", produces = MediaType.APPLICATION_JSON_VALUE)
+    @Operation(summary = "买家撤销贸易订单", description = "买家撤销贸易订单")
+    public HttpResult cancelOrder(@RequestBody @Validated CancelTradeOrderParam param) {
+        kwoTradeOrderService.cancelTradeOrder(param);
+        return HttpResult.ok("订单撤销成功");
+    }
 
 }

+ 59 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderStatisticsTestController.java

@@ -0,0 +1,59 @@
+package com.sckw.order.controller;
+
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.order.model.vo.req.WbTOrderDataStsParam;
+import com.sckw.order.model.vo.req.WbTOrderExcelStsParam;
+import com.sckw.order.serivce.KwoTradeOrderStatisticsService;
+import lombok.AllArgsConstructor;
+import org.springframework.http.MediaType;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @desc: 订单统计相关接口
+ * @author: yzc
+ * @date: 2023-09-13 8:34
+ */
+@AllArgsConstructor
+@RestController
+@RequestMapping("/kwoTradeOrderStatistics1")
+public class KwoTradeOrderStatisticsTestController {
+
+    private final KwoTradeOrderStatisticsService kwoTradeOrderStatisticsService;
+
+
+    /**
+     * @desc: 工作台贸易订单表格统计
+     * @author: yzc
+     * @date: 2023-09-12 16:38
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/workbenchExcel1", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult workbenchExcel(@RequestBody @Validated WbTOrderExcelStsParam params) {
+        return HttpResult.ok(kwoTradeOrderStatisticsService.workbenchExcel(params));
+    }
+
+    /**
+     * @desc: 工作台贸易订单数据统计
+     * @author: yzc
+     * @date: 2023-09-11 14:43
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/workbenchData1", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult workbenchData(@RequestBody @Validated WbTOrderDataStsParam params) {
+        return HttpResult.ok(kwoTradeOrderStatisticsService.workbenchData(params));
+    }
+
+    /**
+     * @desc: 工作台采购订单列表
+     * @author: yzc
+     * @date: 2023-09-13 19:13
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @GetMapping(value = "/workbenchPurchaseList1", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult workbenchPurchaseList() {
+        return HttpResult.ok(kwoTradeOrderStatisticsService.workbenchPurchaseList());
+    }
+}

+ 47 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/McpController.java

@@ -0,0 +1,47 @@
+package com.sckw.order.controller;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.sckw.order.api.model.TradeOrderPara;
+import com.sckw.order.api.model.TradeOrderVo;
+import com.sckw.order.api.model.OrderPara;
+import com.sckw.order.serivce.KwoTradeOrderService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springdoc.core.annotations.ParameterObject;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author lfdc
+ * @desc 物流订单Controller-v4.2
+ * @date 2024-03-11 11:06:06
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/tradeOrder")
+@Tag(name = "物流订单相关接口")
+public class McpController {
+
+    private final KwoTradeOrderService kwoTradeOrderService;
+
+
+    @GetMapping(value = "/trade")
+    @Operation(summary = "查询贸易订单", description = "查询贸易订单")
+    public List<TradeOrderVo> list(@ParameterObject OrderPara orderPara) {
+        TradeOrderPara tradeOrderPara = new TradeOrderPara();
+        tradeOrderPara.setStartTime(LocalDateTimeUtil.parse(orderPara.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
+        tradeOrderPara.setEndTime(LocalDateTimeUtil.parse(orderPara.getEndTime(), "yyyy-MM-dd HH:mm:ss"));
+        tradeOrderPara.setUserId(orderPara.getUserId());
+        tradeOrderPara.setOrderNo(orderPara.getOrderNo());
+        return  kwoTradeOrderService.queryOrder(tradeOrderPara);
+    }
+
+}

+ 1 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/TradeOrderStatusEnum.java

@@ -25,6 +25,7 @@ public enum TradeOrderStatusEnum {
     DEAL(3, "结算中"),
     SUCCESS(4, "已完成"),
     BACK(5, "审核驳回"),
+    CANCEL(6, "已取消"),
     ;
     private final Integer code;
     private final String msg;

+ 31 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/CancelTradeOrderParam.java

@@ -0,0 +1,31 @@
+package com.sckw.order.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Length;
+
+import java.math.BigDecimal;
+
+@Getter
+@Setter
+@ToString
+@Schema(description = "买家撤销贸易订单参数")
+public class CancelTradeOrderParam {
+
+    @Length(max = 200, message = "撤销原因最多200字")
+    @Schema(description = "撤销原因")
+    private String remark;
+
+    @Schema(description = "贸易合同")
+    private Long tradeContractId;
+
+    @Schema(description = "商品id")
+    private Long goodsId;
+
+    //冻结金额
+    @Schema(description = "冻结金额")
+    private BigDecimal freezeAmount;
+}

+ 18 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderCountReq.java

@@ -0,0 +1,18 @@
+package com.sckw.order.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: trade order count request
+ * @author: Codex
+ * @date: 2026-03-11
+ */
+@Getter
+@Setter
+@ToString
+@Schema(description = "trade order count request")
+public class TradeOrderCountReq {
+}

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderParam.java

@@ -81,5 +81,10 @@ public class TradeOrderParam {
     @Schema(description = "结束时间")
     private LocalDate endTime;
 
+    /**
+     * 库存不足时是否确认继续下单
+     */
+    @Schema(description = "库存不足确认继续下单")
+    private Boolean confirmInsufficientStock;
 
 }

+ 23 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderReceiveAddressReq.java

@@ -0,0 +1,23 @@
+package com.sckw.order.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: trade order receive address request
+ * @author: cxf
+ * @date: 2026-03-11
+ */
+@Getter
+@Setter
+@ToString
+@Schema(description = "trade order receive address request")
+public class TradeOrderReceiveAddressReq {
+
+    @NotNull(message = "tradeOrderId不能为空")
+    @Schema(description = "订单贸易id")
+    private Long tradeOrderId;
+}

+ 45 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderCountResp.java

@@ -0,0 +1,45 @@
+package com.sckw.order.model.vo.res;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @desc: trade order count response
+ * @author: cxf
+ * @date: 2026-03-11
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@Schema(description = "查询订单状态数量响应")
+public class TradeOrderCountResp {
+
+    @Schema(description = "状态列表")
+    private List<TradeOrderCountItem> items;
+    @Schema(description = "总数")
+    private Long totalCount;
+    @Getter
+    @Setter
+    @ToString
+    @Accessors(chain = true)
+    @Schema(description = "状态详情")
+    public static class TradeOrderCountItem {
+
+        @Schema(description = "状态")
+        private Integer status;
+
+        @Schema(description = "状态描述")
+        private String statusDesc;
+
+        @Schema(description = "状态数量")
+        private Long statusCount;
+
+
+    }
+}

+ 29 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderReceiveAddressResp.java

@@ -0,0 +1,29 @@
+package com.sckw.order.model.vo.res;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+/**
+ * @desc: trade order receive address response
+ * @author: Codex
+ * @date: 2026-03-11
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@Schema(description = "查询收货地址响应")
+public class TradeOrderReceiveAddressResp {
+
+    @Schema(description = "详细地址")
+    private String detailAddress;
+
+    @Schema(description = "经度")
+    private String lng;
+
+    @Schema(description = "纬度")
+    private String lat;
+}

+ 11 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderUnitRepository.java

@@ -7,6 +7,7 @@ import com.sckw.order.dao.KwoTradeOrderUnitMapper;
 import com.sckw.order.model.KwoTradeOrderUnit;
 import org.springframework.stereotype.Repository;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -35,4 +36,14 @@ public class KwoTradeOrderUnitRepository extends ServiceImpl<KwoTradeOrderUnitMa
                 .eq(BaseModel::getDelFlag,0)
                 .in(KwoTradeOrderUnit::getEntId, entIds));
     }
+
+    public List<KwoTradeOrderUnit> queryByEntIdAndUnitType(Long entId, String unitType) {
+        if (entId == null) {
+            return Collections.emptyList();
+        }
+        return list(Wrappers.<KwoTradeOrderUnit>lambdaQuery()
+                .eq(BaseModel::getDelFlag, 0)
+                .eq(KwoTradeOrderUnit::getEntId, entId)
+                .eq(KwoTradeOrderUnit::getUnitType, unitType));
+    }
 }

+ 219 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -8,6 +8,7 @@ import cn.hutool.core.util.NumberUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.github.pagehelper.PageHelper;
@@ -52,11 +53,14 @@ import com.sckw.order.model.vo.res.*;
 import com.sckw.order.model.vo.res.GoodsInfoDetailRes;
 import com.sckw.order.model.vo.res.OrderDetailRes;
 import com.sckw.order.model.vo.res.UnitInfoDetailRes;
+import com.sckw.order.repository.KwoTradeOrderUnitRepository;
 import com.sckw.payment.api.dubbo.PayCenterDubboService;
 import com.sckw.payment.api.dubbo.PaymentDubboService;
+import com.sckw.payment.api.feign.OfflineWalletFeignService;
 import com.sckw.payment.api.model.WalletFreeze;
 import com.sckw.payment.api.model.constant.ChannelEnum;
 import com.sckw.payment.api.model.dto.WalletDto;
+import com.sckw.payment.api.model.dto.WalletFreezeDto;
 import com.sckw.payment.api.model.dto.common.R;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.AddressInfoDetail;
@@ -132,6 +136,8 @@ public class KwoTradeOrderService {
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     protected RemoteFleetService remoteFleetService;
 
+    private final OfflineWalletFeignService offlineWalletFeignService;
+
     private final KwoTradeOrderMapper kwoTradeOrderMapper;
     private final StreamBridge streamBridge;
     private final KwoTradeOrderAddressService kwoTradeOrderAddressService;
@@ -142,6 +148,7 @@ public class KwoTradeOrderService {
     private final KwoTradeOrderGoodsUnitService kwoTradeOrderGoodsUnitService;
     private final KwoTradeOrderAmountService tradeOrderAmountService;
     private final KwoTradeOrderTransportService kwoTradeOrderTransportService;
+    private final KwoTradeOrderUnitRepository kwoTradeOrderUnitRepository;
     @Value("${url.order.list.valet.pc}")
     private String pcValetListUrl;
 
@@ -1811,6 +1818,66 @@ public class KwoTradeOrderService {
      * @Param params:
      * @return: java.util.List<com.sckw.report.service.param.TradeOrderListExport>
      */
+
+
+    public TradeOrderCountResp countStatistic() {
+        Long entId = LoginUserHolder.getEntId();
+        Set<Long> tradeOrderIds = kwoTradeOrderUnitRepository
+                .queryByEntIdAndUnitType(entId, OrderUnitTypeEnum.PURCHASE.getType())
+                .stream()
+                .map(KwoTradeOrderUnit::getTOrderId)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        Long totalCount = 0L;
+        Map<Integer, Long> statusCountMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
+        if (CollUtil.isNotEmpty(tradeOrderIds)) {
+            QueryWrapper<KwoTradeOrder> queryWrapper = new QueryWrapper<>();
+            queryWrapper.select("status", "COUNT(1) AS statusCount")
+                    .eq("del_flag", Global.NO)
+                    .in("id", tradeOrderIds)
+                    .groupBy("status")
+                    .orderByAsc("status");
+
+            List<Map<String, Object>> statisticMaps = kwoTradeOrderMapper.selectMaps(queryWrapper);
+            if (CollUtil.isNotEmpty(statisticMaps)) {
+                statusCountMap = statisticMaps.stream()
+                        .filter(item -> Objects.nonNull(item.get("status")))
+                        .collect(Collectors.toMap(item -> Integer.parseInt(String.valueOf(item.get("status"))),
+                                item -> Long.parseLong(String.valueOf(item.get("statusCount"))),
+                                Long::sum));
+            }
+
+            totalCount = Optional.ofNullable(kwoTradeOrderMapper.selectCount(
+                    new LambdaQueryWrapper<KwoTradeOrder>()
+                            .eq(KwoTradeOrder::getDelFlag, Global.NO)
+                            .in(KwoTradeOrder::getId, tradeOrderIds))).orElse(0L);
+        }
+
+        Set<Integer> statuses = new TreeSet<>();
+        TradeOrderStatusEnum.getSortList().stream().map(TradeOrderStatusEnum::getCode).forEach(statuses::add);
+        statuses.addAll(statusCountMap.keySet());
+
+        List<TradeOrderCountResp.TradeOrderCountItem> items = new ArrayList<>(statuses.size());
+        for (Integer status : statuses) {
+            TradeOrderCountResp.TradeOrderCountItem item = new TradeOrderCountResp.TradeOrderCountItem();
+            item.setStatus(status)
+                    .setStatusDesc(getTradeOrderStatusDesc(status))
+                    .setStatusCount(statusCountMap.getOrDefault(status, 0L));
+            items.add(item);
+        }
+        return new TradeOrderCountResp().setTotalCount(totalCount).setItems(items);
+    }
+
+    private String getTradeOrderStatusDesc(Integer status) {
+        String statusDesc = TradeOrderStatusEnum.getMsg(status);
+        if (StrUtil.isNotBlank(statusDesc)) {
+            return statusDesc;
+        }
+        statusDesc = OrderStatusEnum.getMsg(status);
+        return StrUtil.isNotBlank(statusDesc) ? statusDesc : "unknown";
+    }
+
     public List<TradeOrderListExport> export(TradeOrderListExportParam params) {
         TradeOrderListSelectDTO dto = new TradeOrderListSelectDTO();
         List<Long> ids = new ArrayList<>();
@@ -1948,6 +2015,34 @@ public class KwoTradeOrderService {
         KwpGoods goodsById = goodsInfoService.getGoodsById(tradeOrderParam.getGoodsId());
 
         TradeContractResDto tradeContractResDto = checkPara(tradeOrderParam, order, goodsById);
+
+        // ====== 下单前校验 start ======
+        // 1. 验证线下钱包预付余额是否足够,不足则提示"线下钱包预付余额不足"
+        checkWallet(order);
+
+        // 2. 验证商品是否开启库存(amount不为null代表已开启库存,null代表无限库存无需验证)
+        if (goodsById.getAmount() != null && goodsById.getAmount().compareTo(tradeOrderParam.getAmount()) < 0) {
+            if (!Boolean.TRUE.equals(tradeOrderParam.getConfirmInsufficientStock())) {
+                throw new CustomPromptException(HttpStatus.STOCK_INSUFFICIENT_CONFIRM_CODE, "当前库存可能不足,是否依旧下单?");
+            }
+        }
+
+        // 4. 记录钱包金额账数据,类型为冻结,备注为"贸易订单号:xxx 下单冻结"
+        // TODO: 后续对接外部系统,记录钱包流水
+        // recordWalletTransaction(buyEntId, order.getPrice(), "冻结", "贸易订单号:" + order.getTOrderNo() + " 下单冻结");
+
+        // 5. 验证贸易合同限量采购,若为限量采购则校验剩余可采购数量并扣减本次下单量
+        GoodsInfoDto contractGoodsInfo = tradeContractResDto.getGoodsInfoDto();
+        if (contractGoodsInfo.getAmount() != null && contractGoodsInfo.getAmount().compareTo(BigDecimal.ZERO) > 0) {
+            BigDecimal performed = contractGoodsInfo.getPerformedAmount() != null ? contractGoodsInfo.getPerformedAmount() : BigDecimal.ZERO;
+            BigDecimal remaining = contractGoodsInfo.getAmount().subtract(performed);
+            if (tradeOrderParam.getAmount().compareTo(remaining) > 0) {
+                throw new BusinessException("当前贸易合同该商品为限量采购,剩余可采购数量为" + remaining.stripTrailingZeros().toPlainString() + ",本次下单数量超出限额");
+            }
+            remoteContractService.updateTradeContractGoodsPerformed(tradeOrderParam.getTradeContractId(), tradeOrderParam.getGoodsId(), tradeOrderParam.getAmount());
+        }
+        // ====== 下单前校验 end ======
+
         WalletFreeze walletFreeze = new WalletFreeze();
         walletFreeze.setOrderNo(order.getTOrderNo());
         walletFreeze.setMoney(order.getPrice());
@@ -2062,7 +2157,7 @@ public class KwoTradeOrderService {
             }
         }
         List<TradeContractUnitDto> unitList = tradeContractResDto.getUnitList();
-
+        WalletFreezeDto freezeDto = new WalletFreezeDto();
         List<KwoTradeOrderUnit> list = new ArrayList<>();
         unitList.forEach(e -> {
             KwoTradeOrderUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderUnit.class);
@@ -2071,9 +2166,11 @@ public class KwoTradeOrderService {
             unit.setUnitType(StrUtil.equals(e.getUnitType(), "1") ? "2" : "1");//贸易合同和订单的单位类型相反
             if (StrUtil.equals(unit.getUnitType(), "1")) {
                 walletFreeze.setBuyEntId(unit.getEntId());
+                freezeDto.setProEntId(unit.getEntId());
             }
             if (StrUtil.equals(unit.getUnitType(), "2")) {
                 walletFreeze.setSaleEntId(unit.getEntId());
+                freezeDto.setSupEntId(unit.getEntId());
             }
             list.add(unit);
         });
@@ -2083,7 +2180,128 @@ public class KwoTradeOrderService {
         if (booleanBaseResult.getCode() != 60200) {
             throw new BusinessException(booleanBaseResult.getMessage());
         }
+        // 3. 线下钱包扣减预付余额、增加冻结金额
+        walletFreeze(tradeOrderParam, order,freezeDto);
+    }
+
+    private void walletFreeze(TradeOrderParam tradeOrderParam, KwoTradeOrder order,WalletFreezeDto freezeDto) {
+
+        freezeDto.setFreezeAmount(tradeOrderParam.getAmount());
+        freezeDto.setOrderNo(order.getTOrderNo());
+
+        BaseResult<Boolean> balanceResult;
+        try {
+            balanceResult = offlineWalletFeignService.freezeBalance(freezeDto);
+        } catch (Exception e) {
+            log.error("线下钱包扣减预付余额、增加冻结金额异常", e);
+            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额异常");
+        }
+        if (balanceResult == null || balanceResult.getCode() != HttpStatus.SUCCESS_CODE) {
+            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额失败");
+        }
+        Boolean aBoolean = balanceResult.getData();
+        if (!Boolean.TRUE.equals(aBoolean)) {
+            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额失败");
+        }
+    }
+
+    private void checkWallet(KwoTradeOrder order) {
+        BaseResult<BigDecimal> balanceResult;
+        try {
+            balanceResult = offlineWalletFeignService.queryPrepaidBalance(LoginUserHolder.getEntId());
+        } catch (Exception e) {
+            log.error("查询线下钱包服务异常", e);
+            throw new BusinessException("查询线下钱包服务异常,请稍后再试");
+        }
+        if (balanceResult == null || balanceResult.getCode() != HttpStatus.SUCCESS_CODE) {
+            throw new BusinessException("查询线下钱包预付余额失败,请稍后再试");
+        }
+        BigDecimal prepaidBalance = balanceResult.getData();
+        if (prepaidBalance == null || prepaidBalance.compareTo(order.getPrice()) < 0) {
+            throw new BusinessException("线下钱包预付余额不足");
+        }
+    }
 
+    /**
+     * 买家撤销贸易订单
+     */
+    public void cancelTradeOrder(CancelTradeOrderParam param) {
+        KwoTradeOrder order = kwoTradeOrderMapper.selectOne(
+                new LambdaQueryWrapper<KwoTradeOrder>()
+                        .eq(KwoTradeOrder::getId, param.getTradeContractId())
+                        .eq(KwoTradeOrder::getDelFlag, 0)
+        );
+        if (Objects.isNull(order)) {
+            throw new BusinessException("贸易订单不存在");
+        }
+        if (!Objects.equals(order.getStatus(), TradeOrderStatusEnum.AUDIT.getCode())) {
+            throw new BusinessException("当前订单状态不允许撤销");
+        }
+        TradeContractResDto tradeContractResDto = remoteContractService.queryTradeContract(param.getTradeContractId(), param.getGoodsId());
+        // 1. 线下钱包加回预付余额、减冻结金额
+        List<TradeContractUnitDto> unitList = tradeContractResDto.getUnitList();
+        WalletFreezeDto freezeDto = new WalletFreezeDto();
+        unitList.forEach(e -> {
+            KwoTradeOrderUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderUnit.class);
+            unit.setId(new IdWorker(1).nextId());
+            unit.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo()).setTopEntId(e.getEntId());
+            unit.setUnitType(StrUtil.equals(e.getUnitType(), "1") ? "2" : "1");//贸易合同和订单的单位类型相反
+            if (StrUtil.equals(unit.getUnitType(), "1")) {
+                freezeDto.setProEntId(unit.getEntId());
+            }
+            if (StrUtil.equals(unit.getUnitType(), "2")) {
+                freezeDto.setSupEntId(unit.getEntId());
+            }
+        });
+         freezeDto.setFreezeAmount(param.getFreezeAmount());
+         freezeDto.setOrderNo(order.getTOrderNo());
+
+        BaseResult<Boolean> balanceResult;
+        try {
+            balanceResult = offlineWalletFeignService.unfreezeBalance(freezeDto);
+        } catch (Exception e) {
+            log.error("线下钱包扣减预付余额、增加冻结金额异常", e);
+            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额异常");
+        }
+        if (balanceResult == null || balanceResult.getCode() != HttpStatus.SUCCESS_CODE) {
+            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额失败");
+        }
+        Boolean aBoolean = balanceResult.getData();
+        if (!Boolean.TRUE.equals(aBoolean)) {
+            throw new BusinessException("线下钱包扣减预付余额、增加冻结金额失败");
+        }
+
+        // 2. 记录钱包金额账数据,类型为解冻,备注为"贸易订单号:xxx 撤销订单"
+        // TODO: 后续对接外部系统,记录钱包流水
+        // recordWalletTransaction(buyEntId, order.getPrice(), "解冻", "贸易订单号:" + order.getTOrderNo() + " 撤销订单");
+
+        // 线上钱包解冻
+        WalletFreeze walletFreeze = new WalletFreeze();
+        walletFreeze.setTTradeOrderId(order.getId());
+        walletFreeze.setOrderNo(order.getTOrderNo());
+        BaseResult<Boolean> unfreezeResult = paymentDubboService.unfreezeMoney(walletFreeze);
+        if (unfreezeResult.getCode() != 60200) {
+            throw new BusinessException(unfreezeResult.getMessage());
+        }
+
+        // 3. 贸易合同该商品有采购数量,则更新采购数量(加回本单总量)
+        KwoTradeOrderGoods orderGoods = kwoTradeOrderGoodsService.getByOrderId(order.getId());
+        KwoTradeOrderContract orderContract = kwoTradeOrderContractService.getByOrderId(order.getId());
+        if (Objects.nonNull(orderGoods) && Objects.nonNull(orderContract)) {
+            TradeContractResDto contractRes = remoteContractService.queryTradeContract(orderContract.getContractId(), orderGoods.getGoodsId());
+            if (Objects.nonNull(contractRes) && Objects.nonNull(contractRes.getGoodsInfoDto())) {
+                GoodsInfoDto goodsInfo = contractRes.getGoodsInfoDto();
+                if (goodsInfo.getAmount() != null && goodsInfo.getAmount().compareTo(BigDecimal.ZERO) > 0) {
+                    remoteContractService.updateTradeContractGoodsPerformed(
+                            orderContract.getContractId(), orderGoods.getGoodsId(), order.getAmount().negate()
+                    );
+                }
+            }
+        }
+
+        // 4. 更新贸易订单状态为"取消"
+        order.setStatus(TradeOrderStatusEnum.CANCEL.getCode());
+        kwoTradeOrderMapper.updateById(order);
     }
 
     private TradeContractResDto checkPara(TradeOrderParam tradeOrderParam, KwoTradeOrder order, KwpGoods goodsById) {

+ 6 - 2
sckw-modules/sckw-report/pom.xml

@@ -85,7 +85,11 @@
 <!--            <version>1.0.0</version>-->
             <version>${basic.version}</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.sckw</groupId>
+            <artifactId>sckw-report-api</artifactId>
+            <version>${basic.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.sckw</groupId>
             <artifactId>sckw-transport-api</artifactId>
@@ -177,4 +181,4 @@
         </plugins>
     </build>
 
-</project>
+</project>

+ 4 - 3
sckw-modules/sckw-report/src/main/java/com/sckw/report/controller/HomeController.java

@@ -10,7 +10,7 @@ import com.sckw.core.web.response.BaseResult;
 import com.sckw.order.api.model.*;
 import com.sckw.report.service.KwHomeService;
 import com.sckw.report.service.vo.OperationCountVo;
-import com.sckw.report.service.vo.TodoCountVo;
+import com.sckw.report.api.model.TodoCountVo;
 import com.sckw.transport.api.model.param.LogisticsOrderAuditPara;
 import com.sckw.transport.api.model.vo.LogisticsDto;
 import com.sckw.transport.api.model.vo.LogisticsVo;
@@ -38,10 +38,11 @@ public class HomeController {
     public BaseResult<OperationCountVo> operationCount() {
         return BaseResult.success(kwHomeService.operationCount());
     }
+
     @GetMapping("/count")
     @Operation(summary = "ai助手待办统计", description = "ai助手待办统计")
-    public BaseResult<TodoCountVo> todoCount() {
-        return BaseResult.success(kwHomeService.todoCount());
+    public TodoCountVo todoCount() {
+        return kwHomeService.todoCount();
     }
 
     @GetMapping("/operationTradeContract")

+ 2 - 2
sckw-modules/sckw-report/src/main/java/com/sckw/report/service/KwHomeService.java

@@ -1,6 +1,6 @@
 package com.sckw.report.service;
 
-import com.sckw.report.service.vo.ViewUrl;
+import com.sckw.report.api.model.ViewUrl;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
 import com.sckw.contract.api.RemoteContractService;
@@ -13,7 +13,7 @@ import com.sckw.core.utils.BeanUtils;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.*;
 import com.sckw.report.service.vo.OperationCountVo;
-import com.sckw.report.service.vo.TodoCountVo;
+import com.sckw.report.api.model.TodoCountVo;
 import com.sckw.system.api.RemoteSystemService;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.vo.LogisticsDto;

+ 10 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsEnterpriseController.java

@@ -10,6 +10,7 @@ import com.sckw.system.model.vo.res.EntInfo;
 import com.sckw.system.model.vo.res.EntFindInfoResp;
 import com.sckw.system.model.vo.res.EntInfoResp;
 import com.sckw.system.model.vo.res.KwsUserSystemTypeVo;
+import com.sckw.system.model.vo.res.PlatformEnterpriseResVo;
 import com.sckw.system.service.KwsEnterpriseService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -334,6 +335,15 @@ public class KwsEnterpriseController {
         return kwsEntService.findAllEnterprise();
     }
 
+    /**
+     * @return 平台所有企业
+     */
+    @GetMapping("/findPlatformEnterprise")
+    @Operation(summary = "查询平台所有企业")
+    public BaseResult<List<PlatformEnterpriseResVo>> findPlatformEnterprise() {
+        return BaseResult.success(kwsEntService.findPlatformEnterprise());
+    }
+
     /**
      * @desc: 入驻认证/客户列表导出
      * @author: czh

+ 24 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/PlatformEnterpriseResVo.java

@@ -0,0 +1,24 @@
+package com.sckw.system.model.vo.res;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author cxf
+ */
+@Data
+public class PlatformEnterpriseResVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 4558841182144772550L;
+
+    @Schema(description = "企业id")
+    private Long id;
+
+    @Schema(description = "企业名称")
+    private String firmName;
+
+}

+ 66 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -230,6 +230,38 @@ public class KwsEnterpriseService {
         return kwsEntCertificate;
     }
 
+    private void validateRegisterParentEnterprise(Long targetParentId, Long currentEntId) {
+        if (Objects.isNull(targetParentId) || targetParentId <= 0) {
+            return;
+        }
+        if (Objects.equals(targetParentId, currentEntId)) {
+            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, "上级企业不能为当前企业");
+        }
+
+        long childCount = kwsEnterpriseDao.selectCount(Wrappers.<KwsEnterprise>lambdaQuery()
+                .eq(BaseModel::getDelFlag, Global.NO)
+                .eq(KwsEnterprise::getPid, currentEntId));
+        if (childCount > 0) {
+            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, "当前企业存在下级企业,不能设置为其他企业的子级");
+        }
+
+        KwsEnterprise targetParent = kwsEnterpriseDao.selectByKey(targetParentId);
+        if (Objects.isNull(targetParent) || Objects.equals(targetParent.getDelFlag(), Global.YES)) {
+            throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.ENT_NOT_EXISTS);
+        }
+
+        int parentLevel = getEnterpriseLevel(targetParent);
+        if (parentLevel + 1 > 2) {
+            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, "企业层级不能超过两级");
+        }
+    }
+
+    private int getEnterpriseLevel(KwsEnterprise enterprise) {
+        if (Objects.isNull(enterprise) || Objects.isNull(enterprise.getPid()) || enterprise.getPid() <= 0) {
+            return 1;
+        }
+        return 2;
+    }
 
     /**
      * @param key 企业id
@@ -370,6 +402,7 @@ public class KwsEnterpriseService {
         Long entId = kwsEnterprise.getId();
         Date date = new Date();
         Long userId = LoginUserHolder.getUserId();
+        validateRegisterParentEnterprise(reqVo.getEntPid(), entId);
         kwsEnterprise.setCreditCode(reqVo.getOrgCode());//统一社会信用代码
         kwsEnterprise.setCode(reqVo.getCode());
         kwsEnterprise.setLegalName(reqVo.getLegalName());
@@ -377,7 +410,9 @@ public class KwsEnterpriseService {
         kwsEnterprise.setHead(reqVo.getHead());
         kwsEnterprise.setRegSource(LoginUserHolder.getClientType());
         kwsEnterprise.setCityCode(reqVo.getCityCode());
-        kwsEnterprise.setPid(reqVo.getEntPid());
+        if (Objects.nonNull(reqVo.getEntPid())) {
+            kwsEnterprise.setPid(reqVo.getEntPid());
+        }
         SysArea sysArea = sysAreaDao.selectById(reqVo.getCityCode());
         if (Objects.nonNull(sysArea)) {
             kwsEnterprise.setCityName(sysArea.getMergerName());
@@ -1470,6 +1505,36 @@ public class KwsEnterpriseService {
         return HttpResult.ok(enterprises);
     }
 
+    public List<PlatformEnterpriseResVo> findPlatformEnterprise() {
+        List<KwsEnterprise> enterprises = kwsEnterpriseRepository.list(Wrappers.<KwsEnterprise>lambdaQuery()
+                .eq(BaseModel::getDelFlag, Global.UN_DELETED)
+                .eq(BaseModel::getStatus, Global.NO)
+                .orderByDesc(BaseModel::getCreateTime));
+        if (CollectionUtils.isEmpty(enterprises)) {
+            return List.of();
+        }
+
+//        Set<Long> parentIds = enterprises.stream()
+//                .map(KwsEnterprise::getPid)
+//                .filter(Objects::nonNull)
+//                .filter(pid -> pid > 0)
+//                .collect(Collectors.toSet());
+//        Map<Long, String> parentNameMap = CollectionUtils.isEmpty(parentIds) ? Collections.emptyMap()
+//                : kwsEnterpriseRepository.list(Wrappers.<KwsEnterprise>lambdaQuery()
+//                        .in(KwsEnterprise::getId, parentIds)
+//                        .eq(BaseModel::getDelFlag, Global.UN_DELETED)
+//                        .eq(BaseModel::getStatus, Global.NO))
+//                .stream()
+//                .collect(Collectors.toMap(KwsEnterprise::getId, KwsEnterprise::getFirmName, (v1, v2) -> v1));
+
+        return enterprises.stream().map(item -> {
+            PlatformEnterpriseResVo vo = new PlatformEnterpriseResVo();
+            vo.setId(item.getId());
+            vo.setFirmName(item.getFirmName());
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
     public EntInfoResp queryEntInfo(EntInfoReq req) {
         //如果是发起方是采购方,采购方只能是自己和下级,供应方可以选所有入住的供应企业
         // 如果发起方是供应方,则供应方是能自己和下级,采购方可以是所有入住企业

+ 20 - 2
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java

@@ -117,6 +117,10 @@ public class KwsUserService {
      */
     @Transactional(rollbackFor = {})
     public void add(UserAddReqVo reqVo) {
+        // 平台端用户只能新增平台员工,不能新增企业员工
+        if (LoginUserHolder.isManager() && !Objects.equals(reqVo.getSystemType(), SystemTypeEnum.MANAGE.getCode())) {
+            throw new BusinessException("平台端只能新增平台员工数据");
+        }
         commonService.checkPhone(reqVo.getAccount());
         KwsUser kwsUser = new KwsUser();
         BeanUtils.copyProperties(reqVo, kwsUser);
@@ -321,6 +325,10 @@ public class KwsUserService {
             }
             KwsUser kwsUser = kwsUserDao.selectByKey(Long.parseLong(id));
             if (null != kwsUser) {
+                // 平台端用户只能删除平台员工,不能删除企业员工
+                if (LoginUserHolder.isManager() && !Objects.equals(kwsUser.getSystemType(), SystemTypeEnum.MANAGE.getCode())) {
+                    throw new BusinessException("平台端只能删除平台员工数据");
+                }
                 if (!LoginUserHolder.isManager()) {
                     if (Objects.equals(kwsUser.getIsMain(), 1)) {//企业管理员用户,默认用户不允许删除
                         throw new BusinessException(String.format("默认企业管理员账号[%s]不允许删除", kwsUser.getName()));
@@ -346,6 +354,10 @@ public class KwsUserService {
         if (Objects.isNull(kwsUser)) {
             throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.ACCOUNT_NOT_EXISTS);
         }
+        // 平台端用户只能修改平台员工,不能修改企业员工
+        if (LoginUserHolder.isManager() && !Objects.equals(kwsUser.getSystemType(), SystemTypeEnum.MANAGE.getCode())) {
+            throw new BusinessException("平台端只能修改平台员工数据");
+        }
         if (!LoginUserHolder.isManager()) {
             if (Objects.equals(kwsUser.getIsMain(), 1)) {//企业管理员用户,只修改名称和备注,归属企业和角色都不允许修改。
                 kwsUser.setRemark(params.getRemark());
@@ -632,8 +644,14 @@ public class KwsUserService {
      * @date: 2023/7/3
      */
     public void closeAccount(Long id) {
-        KwsUser kwsUser = new KwsUser();
-        kwsUser.setId(id);
+        KwsUser kwsUser = kwsUserDao.selectByKey(id);
+        if (Objects.isNull(kwsUser)) {
+            throw new SystemException(HttpStatus.QUERY_FAIL_CODE, HttpStatus.ACCOUNT_NOT_EXISTS);
+        }
+        // 平台端用户只能注销平台员工,不能注销企业员工
+        if (LoginUserHolder.isManager() && !Objects.equals(kwsUser.getSystemType(), SystemTypeEnum.MANAGE.getCode())) {
+            throw new BusinessException("平台端只能注销平台员工数据");
+        }
         kwsUser.setDelFlag(Global.YES);
         if (kwsUserDao.updateById(kwsUser) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.DELETE_FAIL);

+ 9 - 8
sckw-modules/sckw-system/src/main/resources/bootstrap-dev.yml

@@ -3,26 +3,27 @@ spring:
     nacos:
       discovery:
         # 服务注册地址
-        server-addr: 10.10.10.224:8848
+        server-addr: @nacos.server@
         # 命名空间
-        namespace: sckw-ng-service-platform-dev
+        namespace: @nacos.namespace@
         # 共享配置
         group: sckw-ng-service-platform
       config:
         # 配置中心地址
-        server-addr: 10.10.10.224:8848
-        # 配置文件格式
-        file-extension: yaml
+        server-addr: @nacos.server@
         # 命名空间
-        namespace: sckw-ng-service-platform-dev
+        namespace: @nacos.namespace@
         # 共享配置
         group: sckw-ng-service-platform
+        # 配置文件格式
+        file-extension: yaml
         shared-configs:
           - data-id: sckw-common.yml
             group: sckw-ng-common
             refresh: true
-        #可以读多个配置文件  需要在同一个命名空间下面可以是不同的组
+
+        #可以读多个配置文件 需要在同一个命名空间下面可以是不同的组
         extension-configs:
           - dataId: sckw-common.yml
             group: sckw-ng-service-platform
-            refresh: true
+            refresh: true

+ 1 - 10
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtLogisticsOrderController.java

@@ -8,7 +8,7 @@ import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.transport.model.LogisticsOrderPara;
-import com.sckw.transport.model.OrderPara;
+import com.sckw.transport.api.model.param.OrderPara;
 import com.sckw.transport.model.dto.*;
 import com.sckw.transport.model.param.AddLogisticsOrderParam;
 import com.sckw.transport.model.param.LogisticsOrderResp;
@@ -209,15 +209,6 @@ public class KwtLogisticsOrderController {
         return BaseResult.success(transportCommonService.queryOrderUnits());
     }
 
-    @GetMapping(value = "/list")
-    @Operation(summary = "分页查询物流订单", description = "分页查询物流订单")
-    public HttpResult list(@ParameterObject OrderPara orderPara) {
-        LogisticsOrderPara tradeOrderPara = new LogisticsOrderPara();
-        tradeOrderPara.setStartTime(LocalDateTimeUtil.parse(orderPara.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
-        tradeOrderPara.setEndTime(LocalDateTimeUtil.parse(orderPara.getEndTime(), "yyyy-MM-dd HH:mm:ss"));
-        tradeOrderPara.setUserId(orderPara.getUserId());
-        return HttpResult.ok(logisticsConsignmentService.queryList(tradeOrderPara));
-    }
 
     @GetMapping(value = "/base")
     @Operation(summary = "分页查询物流订单概要信息", description = "分页查询物流订单概要信息")

+ 61 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/McpController.java

@@ -0,0 +1,61 @@
+package com.sckw.transport.controller;
+
+import cn.hutool.core.date.LocalDateTimeUtil;
+import com.sckw.transport.api.model.LogisticsBaseOrderVo;
+import com.sckw.transport.api.model.dto.McpLogisticsOrderVo;
+import com.sckw.transport.api.model.param.OrderPara;
+import com.sckw.transport.model.LogisticsOrderPara;
+import com.sckw.transport.service.KwtLogisticsConsignmentService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author lfdc
+ * @desc 物流订单Controller-v4.2
+ * @date 2024-03-11 11:06:06
+ */
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/logisticsOrder")
+@Tag(name = "物流订单相关接口")
+public class McpController {
+
+    @Autowired
+    KwtLogisticsConsignmentService logisticsConsignmentService;
+
+
+    @PostMapping(value = "/list")
+    @Operation(summary = "分页查询物流订单", description = "分页查询物流订单")
+    public List<McpLogisticsOrderVo> list(@RequestBody OrderPara orderPara) {
+        LogisticsOrderPara tradeOrderPara = new LogisticsOrderPara();
+        tradeOrderPara.setStartTime(LocalDateTimeUtil.parse(orderPara.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
+        tradeOrderPara.setEndTime(LocalDateTimeUtil.parse(orderPara.getEndTime(), "yyyy-MM-dd HH:mm:ss"));
+        tradeOrderPara.setUserId(orderPara.getUserId());
+        tradeOrderPara.setOrderNo(orderPara.getOrderNo());
+        tradeOrderPara.setLogisticsOrderNo(orderPara.getLogisticsOrderNo());
+        return logisticsConsignmentService.queryMcpList(tradeOrderPara);
+    }
+
+    @PostMapping(value = "/base")
+    @Operation(summary = "分页查询物流订单概要信息", description = "分页查询物流订单概要信息")
+    public List<LogisticsBaseOrderVo> base(@RequestBody OrderPara orderPara) {
+        LogisticsOrderPara tradeOrderPara = new LogisticsOrderPara();
+        tradeOrderPara.setStartTime(LocalDateTimeUtil.parse(orderPara.getStartTime(), "yyyy-MM-dd HH:mm:ss"));
+        tradeOrderPara.setEndTime(LocalDateTimeUtil.parse(orderPara.getEndTime(), "yyyy-MM-dd HH:mm:ss"));
+        tradeOrderPara.setUserId(orderPara.getUserId());
+        return logisticsConsignmentService.queryBaseList(tradeOrderPara);
+    }
+
+}

+ 3 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java

@@ -2,7 +2,9 @@ package com.sckw.transport.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.mongo.model.TableTops;
+import com.sckw.transport.api.model.LogisticsBaseOrderVo;
 import com.sckw.transport.api.model.dto.AcceptCarriageLogisticsOrderDto;
+import com.sckw.transport.api.model.dto.McpLogisticsOrderVo;
 import com.sckw.transport.api.model.vo.LogisticsOrderVO;
 import com.sckw.transport.model.KwtLogisticsOrder;
 import com.sckw.transport.model.LogisticsOrderPara;
@@ -475,7 +477,7 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      **/
     LogisticsCountVo findLogisticsOrderCount(Map<String, Object> params);
 
-    List<LogisticsOrderVo> selectData(@Param("para") LogisticsOrderPara orderPara);
+    List<McpLogisticsOrderVo> selectData(@Param("para") LogisticsOrderPara orderPara);
 
     Long queryCount(@Param("ids") List<Long> ids);
 

+ 8 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -49,6 +49,9 @@ import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.RemoteUserService;
 import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.UserResDto;
+import com.sckw.transport.api.model.LogisticsBaseOrderVo;
+import com.sckw.transport.api.model.dto.McpLogisticsOrderVo;
+import com.sckw.transport.api.model.dto.OrderUrl;
 import com.sckw.transport.common.config.MessageUrlConfig;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
@@ -2322,7 +2325,8 @@ public class KwtLogisticsConsignmentService {
      */
     private boolean shouldReturnEmptyResult(Set<Long> logOrderIds, Set<Long> entList, QueryLogisticsOrderReq req) {
         return CollectionUtils.isEmpty(logOrderIds) &&
-                (!org.apache.commons.lang3.StringUtils.isAllBlank(req.getContractId(), req.getGoodsName(), req.getConsignCompanyId(), req.getCarriageCompanyId()));
+                (!org.apache.commons.lang3.StringUtils.isAllBlank(req.getContractId(), req.getGoodsName(), req.getConsignCompanyId(), req.getCarriageCompanyId())
+                        || org.apache.commons.collections4.CollectionUtils.isNotEmpty(entList));
     }
 
     /**
@@ -3670,7 +3674,8 @@ public class KwtLogisticsConsignmentService {
     }
 
 
-    public List<LogisticsOrderVo> queryList(LogisticsOrderPara orderPara) {
+
+    public List<McpLogisticsOrderVo> queryMcpList(LogisticsOrderPara orderPara) {
         UserResDto userResDto = remoteSystemService.queryUserById(orderPara.getUserId());
         if (Objects.nonNull(userResDto)) {
             orderPara.setType(userResDto.getType());
@@ -3680,7 +3685,7 @@ public class KwtLogisticsConsignmentService {
             }
         }
 
-        List<LogisticsOrderVo> list = kwtLogisticsOrderMapper.selectData(orderPara);
+        List<McpLogisticsOrderVo> list = kwtLogisticsOrderMapper.selectData(orderPara);
         if (CollUtil.isNotEmpty(list)) {
             list.forEach(d -> {
                 GoodsDetails detailById = goodsInfoService.getDetail(d.getGoodsId());

+ 3 - 3
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

@@ -2951,7 +2951,7 @@
         </if>
     </select>
 
-    <select id="selectData" resultType="com.sckw.transport.model.vo.LogisticsOrderVo">
+    <select id="selectData" resultType="com.sckw.transport.api.model.dto.McpLogisticsOrderVo">
         select a.id                                  as lOrderId,
                a.t_order_id                          AS tOrderId,
                a.l_order_no                          AS lOrderNo,
@@ -3009,7 +3009,7 @@
             limit 10
         </where>
     </select>
-    <select id="selectBase" resultType="com.sckw.transport.model.vo.LogisticsBaseOrderVo">
+    <select id="selectBase" resultType="com.sckw.transport.api.model.LogisticsBaseOrderVo">
         select count(1)                                   as count,
                d.firm_name                                as tyFirmName,
                e.firm_name                                as cyFirmName,
@@ -3043,7 +3043,7 @@
                     </if>
                 </if>
             </if>
-            group by d.ent_id, e.ent_id
+            group by d.ent_id, e.ent_id,d.firm_name, e.firm_name
         </where>
     </select>