Просмотр исходного кода

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

donglang 2 месяцев назад
Родитель
Сommit
19fb62fe87
43 измененных файлов с 1516 добавлено и 89 удалено
  1. 8 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java
  2. 8 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictTypeEnum.java
  3. 5 1
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/ContractStatusEnum.java
  4. 29 12
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractSaleController.java
  5. 27 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/QueryListReqDto.java
  6. 6 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/res/QueryListResDto.java
  7. 30 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTrade.java
  8. 28 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryListReqVo.java
  9. 45 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryTradeContractReq.java
  10. 224 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/SupplyContractTradeReq.java
  11. 27 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeBaseInfoReqVo.java
  12. 2 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeGoodsInfoReqVo.java
  13. 102 49
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java
  14. 97 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryTradeContractResp.java
  15. 25 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java
  16. 39 19
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeGoodsService.java
  17. 172 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  18. 20 1
      sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml
  19. 11 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java
  20. 6 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/KwpGoods.java
  21. 30 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsInfoReq.java
  22. 48 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/res/GoodsInfoResp.java
  23. 29 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/repository/KwpGoodsRepository.java
  24. 29 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java
  25. 9 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsEnterpriseController.java
  26. 10 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/controller/KwsUserController.java
  27. 2 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsEntTypeDao.java
  28. 2 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsRoleDao.java
  29. 2 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsUserDao.java
  30. 2 1
      sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsUserRoleDao.java
  31. 6 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/KwsRole.java
  32. 38 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EntInfoReq.java
  33. 27 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/SalesReq.java
  34. 39 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/EntInfoResp.java
  35. 43 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/SalesResp.java
  36. 33 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsEntTypeRepository.java
  37. 19 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsEnterpriseRepository.java
  38. 30 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsRoleRepository.java
  39. 27 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsUserRepository.java
  40. 28 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsUserRoleRepository.java
  41. 82 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  42. 60 0
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java
  43. 10 0
      sql/2025/11/30/2025_11_30_cxf_alert.sql

+ 8 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictEnum.java

@@ -114,5 +114,12 @@ public enum DictEnum {
         }
         return list.stream().sorted(Comparator.comparing(DictEnum::getValue)).collect(Collectors.toList());
     }
-
+    public static String getLabel(String value) {
+        for (DictEnum dict : DictEnum.values()) {
+            if (dict.getValue().equals(value)) {
+                return dict.getLabel();
+            }
+        }
+        return null;
+    }
 }

+ 8 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/common/enums/enums/DictTypeEnum.java

@@ -55,5 +55,12 @@ public enum DictTypeEnum {
     private final String type;
     private final String name;
 
-
+   public static String getName(String type) {
+    for (DictTypeEnum value : DictTypeEnum.values()) {
+        if (value.getType().equals(type)) {
+            return value.getName();
+        }
+    }
+    return null;
+}
 }

+ 5 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/ContractStatusEnum.java

@@ -16,7 +16,11 @@ public enum ContractStatusEnum {
     //已保存
     SAVE(3, "已保存"),
     //签约中
-    SUBMIT(1, "待签约");
+    SUBMIT(1, "待签约"),
+    //待审核
+    WAIT_APPROVE(4, "待审核"),
+    //审核中
+    CANNEL(5, "已作废");
 
     private final int code;
 

+ 29 - 12
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/controller/KwcContractSaleController.java

@@ -1,13 +1,17 @@
 package com.sckw.contract.controller;
 
 import com.sckw.contract.model.vo.req.*;
+import com.sckw.contract.model.vo.res.QueryListResVo;
 import com.sckw.contract.service.operateService.KwcContractTradeService;
 import com.sckw.core.model.enums.EntTypeEnum;
+import com.sckw.core.model.page.PageResult;
 import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
+import com.sckw.core.web.response.result.PageDataResult;
 import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.Valid;
-import org.springframework.beans.factory.annotation.Autowired;
+import lombok.RequiredArgsConstructor;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -22,10 +26,10 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("kwcSale")
+@RequiredArgsConstructor
 public class KwcContractSaleController {
 
-    @Autowired
-    private KwcContractTradeService kwcContractTradeService;
+    private final KwcContractTradeService kwcContractTradeService;
 
     /**
      * @desc: 分页查询
@@ -34,10 +38,10 @@ public class KwcContractSaleController {
      * @date 2023/7/17
      * @return HttpResult
      */
-    @RequestMapping("queryListByPage")
-    public HttpResult queryListByPage(@RequestBody QueryListReqVo reqVo) {
+    @PostMapping("/queryListByPage")
+    public BaseResult<PageResult> queryListByPage(@RequestBody QueryListReqVo reqVo) {
         reqVo.setEntType(EntTypeEnum.SUPPLIER.getCode());
-        return HttpResult.ok(kwcContractTradeService.queryListByPage(reqVo));
+        return BaseResult.success(kwcContractTradeService.queryListByPage(reqVo));
     }
 
     /**
@@ -47,10 +51,23 @@ public class KwcContractSaleController {
      * @author: sky
      * @date: 2023/7/18
      */
-    @RequestMapping("add")
-    public HttpResult addTradeContract(@RequestBody ContractTradeReqVo reqVo) {
+    @PostMapping("/addTradeContract")
+    public BaseResult<String> addTradeContract(@Valid @RequestBody ContractTradeReqVo reqVo) {
         kwcContractTradeService.addTradeContract(reqVo);
-        return HttpResult.ok(HttpStatus.MSG_003);
+        return BaseResult.success(HttpStatus.MSG_003);
+    }
+
+    /**
+     * @param req 新增入参
+     * @return HttpResult
+     * @desc: 新增补充合同
+     * @author: sky
+     * @date: 2023/7/18
+     */
+    @PostMapping("/addSupplyTradeContract")
+    public BaseResult<String> addSupplyTradeContract(@Valid @RequestBody SupplyContractTradeReq req) {
+        kwcContractTradeService.addSupplyTradeContract(req);
+        return BaseResult.success(HttpStatus.MSG_003);
     }
 
     /**
@@ -97,10 +114,10 @@ public class KwcContractSaleController {
      * @date 2023/7/16
      * @return HttpResult
      */
-    @PostMapping("update")
-    public HttpResult update(@Valid @RequestBody ContractTradeReqVo reqVo) {
+    @PostMapping("/updateTradeContract")
+    public BaseResult<String> updateTradeContract(@Valid @RequestBody ContractTradeReqVo reqVo) {
         kwcContractTradeService.update(reqVo);
-        return HttpResult.ok();
+        return BaseResult.success();
     }
 
 

+ 27 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/req/QueryListReqDto.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.dto.req;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.util.Date;
@@ -78,4 +79,30 @@ public class QueryListReqDto {
      */
     private List<Long> initiateList;
 
+
+    /**
+     * 合同编号
+     */
+    @Schema(description = "合同编号")
+    private String contractCode;
+    /**
+     * 合同名称
+     */
+    @Schema(description = "合同名称")
+    private String contractName;
+    /**
+     * 补充合同编号
+     */
+    @Schema(description = "补充合同编号")
+    private String supplementCode;
+    /**
+     * 采购单位id
+     */
+    @Schema(description = "采购单位id")
+    private String purchaseEntId;
+    /**
+     * 供应单位id
+     */
+    @Schema(description = "供应单位id")
+    private String supplyEntId;
 }

+ 6 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/dto/res/QueryListResDto.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.dto.res;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -168,4 +169,9 @@ public class QueryListResDto {
      */
     private String contractPname;
 
+    /**
+     * 卸货方式
+     */
+    private Integer unloadWay;
+
 }

+ 30 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/entity/KwcContractTrade.java

@@ -7,6 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableName;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
 /**
@@ -128,4 +131,31 @@ public class KwcContractTrade implements Serializable {
      */
     private String businessId;
 
+    /**
+     * 结算方式
+     */
+    @TableField("settlement")
+    private Integer settlement;
+
+    /**
+     * 托运方式
+     */
+    @TableField("consignment")
+    private Integer consignment;
+    /**
+     * 卸货方式
+     */
+    @TableField("unload_way")
+    private Integer unloadWay;
+    /**
+     * 销售人员id
+     */
+   @TableField("salesman_id")
+    private Long salesmanId;
+    /**
+     * 销售联系电话
+     */
+    @TableField("salesman_phone")
+    private String salesmanPhone;
+
 }

+ 28 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryListReqVo.java

@@ -2,6 +2,7 @@ package com.sckw.contract.model.vo.req;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.core.model.page.PageRequest;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -83,6 +84,33 @@ public class QueryListReqVo extends PageRequest implements Serializable {
     /**
      * 企业id
      */
+
     private Long entId;
 
+    /**
+     * 合同编号
+     */
+    @Schema(description = "合同编号")
+    private String contractCode;
+    /**
+     * 合同名称
+     */
+    @Schema(description = "合同名称")
+    private String contractName;
+    /**
+     * 补充合同编号
+     */
+    @Schema(description = "补充合同编号")
+    private String supplementCode;
+    /**
+     * 采购单位id
+     */
+    @Schema(description = "采购单位id")
+    private String purchaseEntId;
+    /**
+     * 供应单位id
+     */
+    @Schema(description = "供应单位id")
+    private String supplyEntId;
+
 }

+ 45 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/QueryTradeContractReq.java

@@ -0,0 +1,45 @@
+package com.sckw.contract.model.vo.req;
+
+import com.sckw.core.web.request.PageReq;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易合同分页查询请求参数
+ * @create :2025-11-03 16:34:00
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class QueryTradeContractReq extends PageReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4333375462286660413L;
+    /**
+     *  贸易合同编号
+     */
+    private String tradeContractNo;
+    /**
+     * 贸易合同名称
+     */
+    private String tradeContractName;
+    /**
+     * 补充合同
+     */
+    private String supplementaryNo;
+    /**
+     * 采购单位
+     */
+    private String purchaseUnit;
+    /**
+     * 供应单位
+     */
+    private String supplyUnit;
+    /**
+     * 状态
+     */
+    private String contractStatus;
+}

+ 224 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/SupplyContractTradeReq.java

@@ -0,0 +1,224 @@
+package com.sckw.contract.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import jakarta.validation.constraints.Size;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author czh
+ * @desc 贸易合同
+ * @date 2023/7/19
+ */
+@Data
+public class SupplyContractTradeReq implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = -3838851258036291498L;
+
+    /**
+     * 合同id 修改时必传
+     */
+    @Schema(description = "合同id")
+    private Long id;
+
+    /**
+     * 父合同ID 补充合同
+     */
+    @Schema(description = "父合同ID")
+    @NotNull(message = "父合同ID不能为空")
+    private Long pid;
+
+    /**
+     * 基础信息
+     */
+    @Schema(description = "基础信息")
+    @NotNull(message = "基础信息不能为空")
+    private TradeBaseInfo baseInfo;
+
+    /**
+     * 合同文件
+     */
+    @Schema(description = "合同文件")
+    @NotBlank(message = "合同文件不能为空")
+    private String contractFile;
+
+    /**
+     * 标的信息
+     */
+    @Schema(description = "标的信息")
+    @NotNull(message = "标的信息不能为空")
+    private List<TradeGoodsInfo> goodsInfo;
+
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+    @Data
+    public static class TradeBaseInfo implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = -5828478625710244673L;
+
+        /**
+         * 采购单位id
+         */
+        @Schema(description = "采购单位id")
+        @NotNull(message = "采购单位不能为空")
+        private Long purchaseEntId;
+
+        /**
+         * 采购单位联系电话
+         */
+        @Schema(description = "采购单位联系电话")
+        @NotBlank(message = "采购单位联系电话不能为空")
+        private String purchasePhone;
+
+        /**
+         * 付款方式 1预付款、2货到付款
+         */
+//    @NotNull(message = "付款方式不能为空")
+        private Integer trading;
+
+        /**
+         * 供应单位id
+         */
+        @NotNull(message = "供应单位不能为空")
+        @Schema(description = "供应单位id")
+        private Long provideEntId;
+
+        /**
+         * 供应单位联系电话
+         */
+        @Schema(description = "供应单位联系电话")
+        @NotBlank(message = "供应单位联系电话不能为空")
+        private String providePhone;
+
+        /**
+         * 合同编号
+         */
+        @Schema(description = "合同编号")
+        @NotBlank(message = "合同编号不能为空")
+        @Size(max = 20, message = "合同编号超长")
+        private String contractCode;
+
+        /**
+         * 合同名称
+         */
+        @Schema(description = "合同名称")
+        @NotBlank(message = "合同名称不能为空")
+        @Size(max = 50, message = "合同编号超长")
+        private String contractName;
+
+        /**
+         * 终止时间
+         */
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "终止时间")
+        private Date endTime;
+
+        /**
+         * 签约方式(1线上签约、2线下签约)
+         */
+        @NotNull(message = "签约方式不能为空")
+        @Schema(description = "签约方式")
+        private Integer signingWay;
+
+        /**
+         * 生效时间
+         */
+        @NotNull(message = "生效时间不能为空")
+        @DateTimeFormat(pattern = "yyyy-MM-dd")
+        @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+        @Schema(description = "生效时间")
+        private Date startTime;
+
+        /**
+         * 结算方式
+         */
+        @NotNull(message = "结算方式不能为空")
+        @Schema(description = "结算方式")
+        private Integer settlement;
+
+        /**
+         * 托运方式
+         */
+        @NotNull(message = "托运方式不能为空")
+        @Schema(description = "托运方式")
+        private Integer consignment;
+        /**
+         * 卸货方式
+         */
+        @NotNull(message = "卸货方式不能为空")
+        @Schema(description = "卸货方式")
+        private Integer unloadWay;
+        /**
+         * 销售人员id
+         */
+        @NotNull(message = "销售人员不能为空")
+        @Schema(description = "销售人员id")
+        private Long salesmanId;
+        /**
+         * 销售联系电话
+         */
+        @NotBlank(message = "销售联系电话不能为空")
+        @Schema(description = "销售联系电话")
+        private String salesmanPhone;
+    }
+    @Data
+    public static class TradeGoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -7003603561892852639L;
+
+        /**
+         * 商品id
+         */
+        @NotNull(message = "商品不能为空")
+        @Schema(description = "商品id")
+        private Long goodsId;
+
+        /**
+         * 采购数量
+         */
+        @Schema(description = "采购数量")
+        @Digits(integer = 10, fraction = 2, message = "采购数量超长")
+        private BigDecimal amount;
+
+        /**
+         * 单价
+         */
+        @Schema(description = "单价")
+        @Digits(integer = 10, fraction = 2, message = "单价超长")
+        private BigDecimal price;
+
+        /**
+         * 单位
+         */
+        @Schema(description = "单位")
+        private String unit;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效开始时间")
+        @NotBlank(message = "生效时间不能为空")
+        private Date effectiveStartTime;
+        /**
+         * 生效时间
+         */
+        @Schema(description = "生效结束时间")
+        @NotBlank(message = "生效时间不能为空")
+        private Date effectiveEntTime;
+    }
+}

+ 27 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeBaseInfoReqVo.java

@@ -87,4 +87,31 @@ public class TradeBaseInfoReqVo implements Serializable {
     @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date startTime;
 
+    /**
+     * 结算方式
+     */
+    @NotNull(message = "结算方式不能为空")
+    private Integer settlement;
+
+    /**
+     * 托运方式
+     */
+    @NotNull(message = "托运方式不能为空")
+    private Integer consignment;
+    /**
+     * 卸货方式
+     */
+    @NotNull(message = "卸货方式不能为空")
+    private Integer unloadWay;
+    /**
+     * 销售人员id
+     */
+    @NotNull(message = "销售人员不能为空")
+    private Long salesmanId;
+    /**
+     * 销售联系电话
+     */
+    @NotBlank(message = "销售联系电话不能为空")
+    private String salesmanPhone;
+
 }

+ 2 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/req/TradeGoodsInfoReqVo.java

@@ -1,5 +1,6 @@
 package com.sckw.contract.model.vo.req;
 
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.Digits;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
@@ -14,6 +15,7 @@ import java.math.BigDecimal;
  * @date 2023/7/19
  */
 @Data
+@Valid
 public class TradeGoodsInfoReqVo implements Serializable {
 
     @Serial

+ 102 - 49
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryListResVo.java

@@ -3,6 +3,7 @@ package com.sckw.contract.model.vo.res;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fasterxml.jackson.databind.annotation.JsonSerialize;
 import com.sckw.core.utils.LongToStringUtils;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
@@ -21,139 +22,191 @@ public class QueryListResVo implements Serializable {
 
     @Serial
     private static final long serialVersionUID = -8699172452542787584L;
-
     /**
-     * 合同总量
+     * 主键id
      */
-    private BigDecimal amount;
+    @JsonSerialize(using = LongToStringUtils.class)
+    @Schema(description = "主键id")
+    private Long id;
 
     /**
-     * 承运单位名
+     * 合同状态
      */
-    private String carrierEntName;
+    @Schema(description = "合同状态")
+    private Integer status;
 
     /**
-     * 托运单位
+     * 合同状态中文
      */
-    private String checkedEntName;
+    @Schema(description = "合同状态中文名")
+    private String statusName;
 
+    /**
+     * 采购单位id
+     */
+    @Schema(description = "采购单位id")
+    private String purchaseEntId;
     /**
      * 采购单位名
      */
+    @Schema(description = "采购单位名")
     private String purchaseEntName;
+    /**
+     * 供应单位id
+     */
+    @Schema(description = "供应单位id")
+    private String provideEntId;
 
     /**
      * 供应单位名
      */
+    @Schema(description = "供应单位名")
     private String provideEntName;
 
     /**
-     * 计费方式中文
+     * 托运单位
      */
-    private String chargingName;
+    @Schema(description = "托运单位名")
+    private String checkedEntName;
 
     /**
-     * 付款方式中文名
+     * 合同编号
      */
-    private String tradingName;
+    @Schema(description = "合同编号")
+    private String contractNo;
 
     /**
      * 合同名称
      */
+    @Schema(description = "合同名称")
     private String contractName;
 
     /**
-     * 合同编号
+     * 签约方式
      */
-    private String contractNo;
+    @Schema(description = "签约方式")
+    private String signingWay;
 
     /**
-     * 发起人
+     * 签约方式中文名
      */
-    private String initiateName;
-
+    @Schema(description = "签约方式中文名")
+    private String signingWayName;
     /**
-     * 发起单位
+     * 卸货方式
      */
-    private String initiateEntName;
-
+    @Schema(description = "卸货方式")
+    private String unloadWay;
     /**
-     * 创建时间
+     * 卸货方式中文名
      */
-    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date createTime;
+    @Schema(description = "卸货方式中文名")
+    private String unloadWayName;
 
     /**
-     * 终止日期
+     * 合同总量
      */
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
-    private Date endTime;
+    @Schema(description = "合同总量")
+    private BigDecimal amount;
 
     /**
-     * 主键id
+     * 已履约量
      */
-    @JsonSerialize(using = LongToStringUtils.class)
-    private Long id;
+    @Schema(description = "已履约量")
+    private BigDecimal performedAmount;
 
     /**
      * 主合同id
      */
+    @Schema(description = "主合同id")
     private Long contractPid;
+    /**
+     * 父合同名
+     */
+    @Schema(description = "父合同名")
+    private String contractPname;
 
     /**
-     * 发起时间
+     * 计费方式中文名
      */
-    private Date initiateTime;
+    @Schema(description = "计费方式中文名")
+    private String chargingName;
 
     /**
-     * 已履约量
+     * 付款方式中文名
      */
-    private BigDecimal performedAmount;
+    @Schema(description = "付款方式中文名")
+    private String tradingName;
 
     /**
-     * 备注
+     * 承运单位名
      */
-    private String remark;
+    @Schema(description = "承运单位名")
+    private String carrierEntName;
+
 
     /**
-     * 签约方式中文名
+     * 发起人
      */
-    private String signingWayName;
+    @Schema(description = "发起人")
+    private String initiateName;
 
     /**
-     * 签约方式
+     * 发起单位
      */
-    private String signingWay;
+    @Schema(description = "发起单位")
+    private String initiateEntName;
 
     /**
-     * 签约时间
+     * 创建时间
      */
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
-    private Date signTime;
-
+    @Schema(description = "创建时间")
+    private Date createTime;
     /**
      * 起始日期
      */
+    @Schema(description = "起始日期")
     @DateTimeFormat(pattern = "yyyy-MM-dd")
     @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
     private Date startTime;
 
     /**
-     * 合同状态
+     * 终止日期
      */
-    private Integer status;
+    @Schema(description = "终止日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+    private Date endTime;
+
 
     /**
-     * 合同状态中文名
+     * 发起时间
      */
-    private String statusName;
+    @Schema(description = "发起时间")
+    private Date initiateTime;
+
 
     /**
-     * 父合同名
+     * 备注
      */
-    private String contractPname;
+    @Schema(description = "备注")
+    private String remark;
+
+
+    /**
+     * 签约时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Schema(description = "签约时间")
+    private Date signTime;
+
+
+
+
+
+
 
 }

+ 97 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/model/vo/res/QueryTradeContractResp.java

@@ -0,0 +1,97 @@
+package com.sckw.contract.model.vo.res;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易合同分页查询响应数据
+ * @create :2025-11-03 16:34:00
+ */
+@Data
+public class QueryTradeContractResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -4333375462286660413L;
+    /**
+     * 主键
+     */
+    private String id;
+    /**
+     * 合同状态
+     */
+    private String contractStatus;
+    /**
+     * 合同状态名称
+     */
+    private String contractStatusName;
+
+    /**
+     * 采购单位
+     */
+    private String purchaseUnit;
+    /**
+     * 供应单位
+     */
+    private String supplyUnit;
+    /**
+     * 贸易合同编号
+     */
+    private String tradeContractNo;
+    /**
+     * 贸易合同名称
+     */
+    private String tradeContractName;
+    /**
+     * 签约方式
+     */
+    private String signWay;
+    /**
+     * 签约方式描述
+     */
+    private String signWayName;
+    /**
+     * 卸货方式
+     */
+    private String unloadWay;
+    /**
+     * 卸货方式描述
+     */
+    private String unloadWayName;
+    /**
+     * 合同总量
+     */
+    private String totalAmount;
+    /**
+     * 已履约量
+     */
+    private String performedAmount;
+    /**
+     * 主合同
+     */
+    private String mainContract;
+    /**
+     * 起始日期
+     */
+    private String startDate;
+
+    /**
+     * 终止日期
+     */
+    private String endDate;
+
+    /**
+     * 发起人
+     */
+    private String initiator;
+    /**
+     * 发起单位
+     */
+    private String initiatorUnit;
+    /**
+     * 发起时间
+     */
+    private String initiatorTime;
+}

+ 25 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java

@@ -0,0 +1,25 @@
+package com.sckw.contract.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.contract.dao.KwcContractTradeGoodsMapper;
+import com.sckw.contract.model.entity.KwcContractTradeGoods;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description :贸易合同接口
+ * @create :2025-11-04 09:52:00
+ */
+@Repository
+public class KwcContractTradeGoodsRepository extends ServiceImpl<KwcContractTradeGoodsMapper, KwcContractTradeGoods> {
+    public List<KwcContractTradeGoods> queryByConTractIdGoodsIds(Long pid,List<Long> goodsIds) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .eq(KwcContractTradeGoods::getContractId, pid)
+                .in(KwcContractTradeGoods::getGoodsId, goodsIds));
+    }
+}

+ 39 - 19
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/KwcContractTradeGoodsService.java

@@ -4,18 +4,24 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.sckw.contract.dao.KwcContractTradeGoodsMapper;
 import com.sckw.contract.model.entity.KwcContractTradeGoods;
 import com.sckw.contract.model.vo.req.TradeGoodsInfoReqVo;
+import com.sckw.contract.repository.KwcContractTradeGoodsRepository;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.CollectionUtils;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 
 /**
@@ -24,10 +30,11 @@ import java.util.List;
 * @createDate 2023-07-13 13:36:19
 */
 @Service
+@RequiredArgsConstructor
 public class KwcContractTradeGoodsService {
 
-    @Autowired
-    private KwcContractTradeGoodsMapper kwcContractLogisticsGoodsMapper;
+    private final KwcContractTradeGoodsMapper kwcContractLogisticsGoodsMapper;
+    private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
 
 
     public void saveContractTradeGoods(long contractId, List<TradeGoodsInfoReqVo> goodsInfoList) {
@@ -35,26 +42,39 @@ public class KwcContractTradeGoodsService {
         //List<Long> goodsIdList = goodsInfoList.stream().map(TradeGoodsInfoReqVo::getGoodsId).toList();
 
         Long userId = LoginUserHolder.getUserId();
-        Date date = new Date();
-        for (TradeGoodsInfoReqVo tradeGoodsInfoReqVo : goodsInfoList) {
-            KwcContractTradeGoods kwcContractTradeGoods = new KwcContractTradeGoods();
-            BeanUtils.copyProperties(tradeGoodsInfoReqVo, kwcContractTradeGoods);
-            kwcContractTradeGoods.setId(new IdWorker(1L).nextId());
-            kwcContractTradeGoods.setContractId(contractId);
-            kwcContractTradeGoods.setSkuId(0L);
-            kwcContractTradeGoods.setPerformedAmount(new BigDecimal("0"));
-            kwcContractTradeGoods.setStatus(Global.NO);
-            kwcContractTradeGoods.setCreateBy(userId);
-            kwcContractTradeGoods.setCreateTime(date);
-            kwcContractTradeGoods.setUpdateBy(userId);
-            kwcContractTradeGoods.setUpdateTime(date);
-            kwcContractTradeGoods.setDelFlag(Global.NO);
-            if (kwcContractLogisticsGoodsMapper.insert(kwcContractTradeGoods) <= 0) {
-                throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
-            }
+
+        if (CollectionUtils.isEmpty(goodsInfoList)){
+            return;
+        }
+        Set<KwcContractTradeGoods> tradeGoods = goodsInfoList.stream()
+                .map(g -> getKwcContractTradeGoods(contractId, g, userId))
+                .collect(Collectors.toSet());
+        if (CollectionUtils.isNotEmpty(tradeGoods)){
+            kwcContractTradeGoodsRepository.saveBatch(tradeGoods);
+
         }
     }
 
+    @NotNull
+    private static KwcContractTradeGoods getKwcContractTradeGoods(long contractId, TradeGoodsInfoReqVo g, Long userId) {
+        Date date = new Date();
+        KwcContractTradeGoods kwcContractTradeGoods = new KwcContractTradeGoods();
+        kwcContractTradeGoods.setId(new IdWorker(1L).nextId());
+        kwcContractTradeGoods.setContractId(contractId);
+        kwcContractTradeGoods.setGoodsId(g.getGoodsId());
+        kwcContractTradeGoods.setSkuId(0L);
+        kwcContractTradeGoods.setPerformedAmount(new BigDecimal("0"));
+        kwcContractTradeGoods.setStatus(Global.NO);
+        kwcContractTradeGoods.setUnit(g.getUnit());
+        kwcContractTradeGoods.setPrice(g.getPrice());
+        kwcContractTradeGoods.setCreateBy(userId);
+        kwcContractTradeGoods.setCreateTime(date);
+        kwcContractTradeGoods.setUpdateBy(userId);
+        kwcContractTradeGoods.setUpdateTime(date);
+        kwcContractTradeGoods.setDelFlag(Global.NO);
+        return kwcContractTradeGoods;
+    }
+
     /**
      * @param contractId 合同id
      * @return KwcContractTradeGoods

+ 172 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.google.common.collect.Lists;
 import com.sckw.contract.dao.KwcContractTradeMapper;
 import com.sckw.contract.model.dto.req.QueryListReqDto;
 import com.sckw.contract.model.dto.res.QueryListResDto;
@@ -15,12 +16,14 @@ import com.sckw.contract.model.entity.KwcContractTradeUnit;
 import com.sckw.contract.model.report.TradeListExport;
 import com.sckw.contract.model.vo.req.*;
 import com.sckw.contract.model.vo.res.*;
+import com.sckw.contract.repository.KwcContractTradeGoodsRepository;
 import com.sckw.contract.service.CommonBusinessService;
 import com.sckw.contract.service.KwcContractTradeGoodsService;
 import com.sckw.contract.service.KwcContractTradeTrackService;
 import com.sckw.contract.service.KwcContractTradeUnitService;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ContractStatusEnum;
@@ -32,6 +35,7 @@ import com.sckw.core.model.page.PageResult;
 import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
 import com.sckw.order.api.model.ContractSignCompletedParam;
@@ -46,6 +50,8 @@ import com.sckw.system.api.model.dto.res.KwsUserResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -65,6 +71,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @Slf4j
+@RequiredArgsConstructor
 public class KwcContractTradeService {
 
 
@@ -83,6 +90,8 @@ public class KwcContractTradeService {
     @Autowired
     private CommonBusinessService commonBusinessService;
 
+    private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
+
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteSystemService remoteSystemService;
 
@@ -195,6 +204,11 @@ public class KwcContractTradeService {
                 queryListResVo.setProvideEntName(queryListResDto.getUnitType().compareTo(EntTypeEnum.SUPPLIER.getCode()) == 0 ? queryListResDto.getEntName() : queryListResDto.getTargetEntName());
                 queryListResVo.setPurchaseEntName(queryListResDto.getUnitType().compareTo(EntTypeEnum.SUPPLIER.getCode()) == 0 ? queryListResDto.getTargetEntName() : queryListResDto.getEntName());
             }
+            if(Objects.equals(queryListResDto.getUnitType(),EntTypeEnum.SUPPLIER.getCode())){
+                queryListResVo.setProvideEntId(String.valueOf(queryListResDto.getProvideEntId()));
+            }else if(Objects.equals(queryListResDto.getUnitType(),EntTypeEnum.PURCHASER.getCode())){
+                queryListResVo.setPurchaseEntId(String.valueOf(queryListResDto.getPurchaseEntId()));
+            }
 
             UserCacheResDto userCacheResDto = longUserCacheResDtoMap.get(queryListResDto.getInitiateBy());
             if (Objects.nonNull(userCacheResDto)) {
@@ -204,7 +218,9 @@ public class KwcContractTradeService {
             queryListResVo.setTradingName(DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(), String.valueOf(queryListResDto.getTrading())));
             queryListResVo.setStatusName(Objects.requireNonNull(ContractStatusEnum.getName(queryListResDto.getStatus())).getName());
             queryListResVo.setSigningWayName(DictEnum.getLabel(DictTypeEnum.SIGNING_TYPE.getType(), queryListResDto.getSigningWay()));
-            queryListResVo.setSigningWay(queryListResDto.getSigningWay());
+            queryListResVo.setSigningWay(String.valueOf(queryListResDto.getSigningWay()));
+            queryListResVo.setUnloadWay(String.valueOf(queryListResDto.getUnloadWay()));
+            queryListResVo.setUnloadWayName(DictEnum.getLabel(String.valueOf(queryListResDto.getUnloadWay())));
             queryListResVo.setAmount(queryListResDto.getAmount());
             queryListResVo.setPerformedAmount(queryListResDto.getPerformedAmount());
 
@@ -274,6 +290,11 @@ public class KwcContractTradeService {
         }
 
         if (CollectionUtils.isNotEmpty(goodsInfo)) {
+
+            boolean b = hasDuplicateGoodsId(goodsInfo);
+            if (b) {
+                throw new SystemException("商品不能重复!");
+            }
             for (TradeGoodsInfoReqVo goodsInfoReqVo : goodsInfo) {
                 if (Objects.nonNull(goodsInfoReqVo.getPrice()) && !RegularUtils.matchNumberWithFix(goodsInfoReqVo.getPrice().toString(), 10, 2)) {
                     throw new SystemException("单价超长!");
@@ -286,6 +307,21 @@ public class KwcContractTradeService {
         }
     }
 
+    private static boolean hasDuplicateGoodsId(List<TradeGoodsInfoReqVo> goodsInfo) {
+        if (goodsInfo == null || goodsInfo.isEmpty()) {
+            return false;
+        }
+
+        Set<Long> goodsIdSet = new HashSet<>();
+        for (TradeGoodsInfoReqVo info : goodsInfo) {
+            if (info.getGoodsId() != null) {
+                if (!goodsIdSet.add(info.getGoodsId())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 
     /**
      * @param baseInfo 贸易基本信息 remark备注  pid父id
@@ -315,6 +351,13 @@ public class KwcContractTradeService {
         kwcContractTrade.setUpdateTime(date);
         kwcContractTrade.setDelFlag(Global.NO);
 
+        kwcContractTrade.setSettlement(baseInfo.getSettlement());
+        kwcContractTrade.setConsignment(baseInfo.getConsignment());
+        kwcContractTrade.setUnloadWay(baseInfo.getUnloadWay());
+        kwcContractTrade.setSalesmanId(baseInfo.getSalesmanId());
+        kwcContractTrade.setSalesmanPhone(baseInfo.getSalesmanPhone());
+
+
         BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
         if (CollectionUtils.isNotEmpty(goodsInfo)) {
             for (TradeGoodsInfoReqVo tradeGoodsInfoReqVo : goodsInfo) {
@@ -640,6 +683,11 @@ public class KwcContractTradeService {
         kwcContractTrade.setContractPid(reqVo.getPid());
         kwcContractTrade.setRemark(reqVo.getRemark());
 
+        kwcContractTrade.setSettlement(baseInfo.getSettlement());
+        kwcContractTrade.setConsignment(baseInfo.getConsignment());
+        kwcContractTrade.setUnloadWay(baseInfo.getUnloadWay());
+        kwcContractTrade.setSalesmanId(baseInfo.getSalesmanId());
+        kwcContractTrade.setSalesmanPhone(baseInfo.getSalesmanPhone());
         List<TradeGoodsInfoReqVo> goodsInfo = reqVo.getGoodsInfo();
         BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
         if (CollectionUtils.isNotEmpty(goodsInfo)) {
@@ -1035,4 +1083,127 @@ public class KwcContractTradeService {
         ExcelUtil.downData(response, TradeListExport.class, dataList);
     }
 
+    public PageDataResult<QueryTradeContractResp> queryTradeContractByPage(QueryTradeContractReq req) {
+        return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void addSupplyTradeContract(@Valid SupplyContractTradeReq req) {
+        log.info("补充合同请求参数,req:{}", JSON.toJSONString(req));
+        //校验标的信息是否有重复
+        checkParams(req);
+        //保存补充合同
+        saveTradeContract(req);
+
+        //获取商品id
+        List<Long> goodsIds = req.getGoodsInfo()
+                .stream()
+                .map(SupplyContractTradeReq.TradeGoodsInfo::getGoodsId)
+                .collect(Collectors.toList());
+        //根据商品id查询标的信息和主合同
+        List<KwcContractTradeGoods> kwcContractTradeGoods =
+                kwcContractTradeGoodsRepository.queryByConTractIdGoodsIds(req.getPid(),goodsIds);
+        //商品id映射交易商品信息
+        Map<Long, KwcContractTradeGoods> goodsIdAndCtgMap = kwcContractTradeGoods.stream()
+                .collect(Collectors.toMap(KwcContractTradeGoods::getGoodsId, Function.identity(), (a, b) -> a));
+        List<KwcContractTradeGoods> tradeGoodsList = Lists.newArrayList();
+        req.getGoodsInfo().forEach(x->{
+            KwcContractTradeGoods tradeGoods = goodsIdAndCtgMap.getOrDefault(x.getGoodsId(),new KwcContractTradeGoods());
+            // cxdf todo  补充合同的逻辑
+//            if (tradeGoods){
+//
+//            }
+        });
+
+    }
+
+    private void saveTradeContract(SupplyContractTradeReq req) {
+        SupplyContractTradeReq.TradeBaseInfo baseInfo = req.getBaseInfo();
+        List<SupplyContractTradeReq.TradeGoodsInfo> goodsInfo = req.getGoodsInfo();
+        Date date = new Date();
+        KwcContractTrade kwcContractTrade = new KwcContractTrade();
+        kwcContractTrade.setEntId(LoginUserHolder.getEntId());
+        kwcContractTrade.setContractNo(baseInfo.getContractCode());
+        kwcContractTrade.setName(baseInfo.getContractName());
+        kwcContractTrade.setSigningWay(baseInfo.getSigningWay());
+        kwcContractTrade.setTrading(baseInfo.getTrading());
+        kwcContractTrade.setStartTime(baseInfo.getStartTime());
+        if (Objects.nonNull(baseInfo.getEndTime())) {
+            kwcContractTrade.setEndTime(DateUtils.getEndOfDay(baseInfo.getEndTime()));
+        }
+        kwcContractTrade.setPerformedAmount(new BigDecimal("0"));
+        kwcContractTrade.setContractPid(req.getPid());
+        kwcContractTrade.setRemark(req.getRemark());
+        kwcContractTrade.setCreateBy(LoginUserHolder.getUserId());
+        kwcContractTrade.setCreateTime(date);
+        kwcContractTrade.setUpdateBy(LoginUserHolder.getUserId());
+        kwcContractTrade.setUpdateTime(date);
+        kwcContractTrade.setDelFlag(Global.NO);
+
+        kwcContractTrade.setSettlement(baseInfo.getSettlement());
+        kwcContractTrade.setConsignment(baseInfo.getConsignment());
+        kwcContractTrade.setUnloadWay(baseInfo.getUnloadWay());
+        kwcContractTrade.setSalesmanId(baseInfo.getSalesmanId());
+        kwcContractTrade.setSalesmanPhone(baseInfo.getSalesmanPhone());
+
+
+        BigDecimal amountTotal = new BigDecimal(Global.NUMERICAL_ZERO);
+        if (CollectionUtils.isNotEmpty(goodsInfo)) {
+            for (SupplyContractTradeReq.TradeGoodsInfo tradeGoodsInfoReqVo : goodsInfo) {
+                if (Objects.nonNull(tradeGoodsInfoReqVo.getAmount())) {
+                    amountTotal = amountTotal.add(tradeGoodsInfoReqVo.getAmount());
+                }
+            }
+        }
+        kwcContractTrade.setAmount(amountTotal);
+
+        long contactId = new IdWorker(1L).nextId();
+        kwcContractTrade.setId(contactId);
+        kwcContractTrade.setStatus(ContractStatusEnum.SAVE.getCode());
+        kwcContractTrade.setSigningUrl(changeFile(req.getContractFile()));
+        if (kwcContractTradeMapper.insert(kwcContractTrade) <= 0) {
+            throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.INSERT_FAIL);
+        }
+    }
+
+    private static void checkParams(SupplyContractTradeReq req) {
+        if (hasDuplicateGoodsIds(req.getGoodsInfo())){
+            throw new BusinessException( "标信息有重复");
+        }
+        //判断时间大小
+        boolean startTimeBefore = req.getGoodsInfo().stream()
+                .filter(t -> Objects.nonNull(t.getEffectiveStartTime()) && Objects.nonNull(req.getBaseInfo().getStartTime()))
+                .anyMatch(t -> t.getEffectiveStartTime().before(req.getBaseInfo().getStartTime()));
+        if (startTimeBefore) {
+            throw new BusinessException( "标信息开始时间不能早于合同开始时间");
+        }
+        boolean endTimeAfter = req.getGoodsInfo().stream()
+                .filter(t -> Objects.nonNull(t.getEffectiveEntTime()) && Objects.nonNull(req.getBaseInfo().getEndTime()))
+                .anyMatch(t -> t.getEffectiveEntTime().after(req.getBaseInfo().getEndTime()));
+        if (endTimeAfter){
+            throw new BusinessException( "标信息结束时间不能晚于合同结束时间");
+        }
+        boolean b = req.getGoodsInfo().stream()
+                .filter(t -> Objects.nonNull(t.getEffectiveEntTime()) && Objects.nonNull(t.getEffectiveStartTime()))
+                .anyMatch(t -> t.getEffectiveEntTime().before(t.getEffectiveStartTime()));
+        if (b){
+            throw new BusinessException( "标信息结束时间不能早于开始时间");
+        }
+    }
+
+    private static boolean hasDuplicateGoodsIds(List<SupplyContractTradeReq.TradeGoodsInfo> goodsInfo) {
+        if (goodsInfo == null || goodsInfo.isEmpty()) {
+            return false;
+        }
+
+        Set<Long> goodsIdSet = new HashSet<>();
+        for (SupplyContractTradeReq.TradeGoodsInfo info : goodsInfo) {
+            if (info.getGoodsId() != null) {
+                if (!goodsIdSet.add(info.getGoodsId())) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
 }

+ 20 - 1
sckw-modules/sckw-contract/src/main/resources/mapper/KwcContractTradeMapper.xml

@@ -26,7 +26,8 @@
                e.firm_name targetEntName,
                a.contract_pid contractPid,
                a.performed_amount performedAmount,
-               f.name contractPname
+               f.name contractPname,
+               f.unload_way   unloadWay
           from kwc_contract_trade a
           left join kwc_contract_trade_unit b
             on a.id = b.contract_id
@@ -88,6 +89,24 @@
         <if test="targetEntId != null">
             and e.ent_id = #{targetEntId}
         </if>
+        <if test="contractCode != null  and '' != contractCode">
+            and f.contract_no like concat('%',#{contractCode},'%')
+        </if>
+        <if test="contractName != null  and '' != contractName">
+            and f.name  like concat('%',#{contractName},'%')
+        </if>
+        <if test="supplementCode != null  and '' != supplementCode">
+            and f.contract_pid != null
+            and f.contract_no  like concat('%',#{supplementCode},'%')
+        </if>
+        <if test="purchaseEntId != null  and '' != purchaseEntId">
+            and e.unit_type = 2
+            and e.id  = #{purchaseEntId}
+        </if>
+        <if test="supplyEntId != null  and '' != supplyEntId">
+            and e.unit_type = 1
+            and e.id = #{supplyEntId}
+        </if>
         order by a.create_time desc
     </select>
 

+ 11 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/controller/KwpGoodsController.java

@@ -5,14 +5,17 @@ import com.sckw.core.exception.CustomPromptException;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.product.model.GoodsListExport;
 import com.sckw.product.model.vo.req.*;
+import com.sckw.product.model.vo.res.GoodsInfoResp;
 import com.sckw.product.service.KwpGoodsService;
 import com.sckw.product.service.KwpGoodsUnitService;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
@@ -253,4 +256,12 @@ public class KwpGoodsController {
     public HttpResult getPrice(@RequestBody @Validated GetPriceParam param) {
         return HttpResult.ok("获取商品价格成功", kwpGoodsService.getPrice(param));
     }
+
+    /**
+     * 查询商品信息
+     */
+    @PostMapping("/getGoods")
+    public BaseResult<GoodsInfoResp> getGoods(@Valid @RequestBody GoodsInfoReq req) {
+        return BaseResult.success(kwpGoodsService.getGoods(req));
+    }
 }

+ 6 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/KwpGoods.java

@@ -1,5 +1,6 @@
 package com.sckw.product.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.sckw.core.model.base.BaseModel;
@@ -125,4 +126,9 @@ public class KwpGoods extends BaseModel implements Serializable {
     @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date shelfTime;
 
+    /**
+     * 价格单位
+     */
+    @TableField("price_unit")
+    private String priceUnit;
 }

+ 30 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/req/GoodsInfoReq.java

@@ -0,0 +1,30 @@
+package com.sckw.product.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 查询商品信息请求参数
+ * @create :2025-11-04 15:42:00
+ */
+@Data
+public class GoodsInfoReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 257421379531491703L;
+    /**
+     * 企业id
+     */
+    @Schema(description = "企业id")
+    @NotBlank(message = "企业id不能为空")
+    private Long entId;
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+}

+ 48 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/model/vo/res/GoodsInfoResp.java

@@ -0,0 +1,48 @@
+package com.sckw.product.model.vo.res;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 查询商品信息响应参数
+ * @create :2025-11-04 15:42:00
+ */
+@Data
+public class GoodsInfoResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 257421379531491703L;
+    @Schema(description = "商品信息列表")
+    List<GoodsInfo> goodsInfoRespList;
+    @Data
+    public static class GoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 4725584482835210124L;
+        /**
+         * 商品id
+         */
+        @Schema(description = "商品id")
+        private Long goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
+        /**
+         * 价格单位
+         */
+        @Schema(description = "价格单位")
+        private String priceUnit;
+        /**
+         * 数量单位
+         */
+        @Schema(description = "数量单位")
+        private String amountUnit;
+    }
+}

+ 29 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/repository/KwpGoodsRepository.java

@@ -0,0 +1,29 @@
+package com.sckw.product.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.product.dao.KwpGoodsMapper;
+import com.sckw.product.model.KwpGoods;
+import jakarta.validation.constraints.NotBlank;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 商品接口
+ * @create :2025-11-04 15:50:00
+ */
+@Repository
+public class KwpGoodsRepository extends ServiceImpl<KwpGoodsMapper, KwpGoods> {
+    public List<KwpGoods> queryByEntIdAndGoodsName(Long entId, String goodsName) {
+        return list(Wrappers.<KwpGoods>lambdaQuery()
+                .eq(KwpGoods::getDelFlag,0)
+                .eq(KwpGoods::getEntId,entId)
+                .like(StringUtils.isNotBlank(goodsName),KwpGoods::getName,goodsName));
+
+    }
+}

+ 29 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -30,6 +30,7 @@ import com.sckw.product.enums.GoodsStatusEnum;
 import com.sckw.product.model.*;
 import com.sckw.product.model.vo.req.*;
 import com.sckw.product.model.vo.res.*;
+import com.sckw.product.repository.KwpGoodsRepository;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.stream.enums.MessageEnum;
@@ -42,9 +43,11 @@ import com.sckw.system.api.model.dto.res.KwsUserResDto;
 import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.stream.function.StreamBridge;
 import org.springframework.stereotype.Service;
@@ -81,6 +84,7 @@ public class KwpGoodsService {
     private final KwpGoodsPriceRangeService kwpGoodsPriceRangeService;
     private final KwpGoodsUnitService kwpGoodsUnitService;
     private final StreamBridge streamBridge;
+    private final KwpGoodsRepository kwpGoodsRepository;
 
     @Value("${goods.url.list.pc}")
     private String pcGoodsListUrl;
@@ -1324,4 +1328,29 @@ public class KwpGoodsService {
         }
         return list.stream().map(KwpGoods::getId).toList();
     }
+
+    public GoodsInfoResp getGoods( GoodsInfoReq req) {
+        log.info("查询商品信息,请求参数 :{}", JSON.toJSONString(req));
+        //查询上商品信息
+        List<KwpGoods> goods =  kwpGoodsRepository.queryByEntIdAndGoodsName(req.getEntId(), req.getGoodsName());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty( goods)){
+            return new GoodsInfoResp();
+        }
+        //组装商品参数
+        List<GoodsInfoResp.GoodsInfo> goodsInfos = goods.stream()
+                .map(KwpGoodsService::getGoodsInfo)
+                .collect(Collectors.toList());
+        GoodsInfoResp goodsInfoResp = new GoodsInfoResp();
+        goodsInfoResp.setGoodsInfoRespList(goodsInfos);
+        return goodsInfoResp;
+    }
+
+    private static GoodsInfoResp.GoodsInfo getGoodsInfo(KwpGoods x) {
+        GoodsInfoResp.GoodsInfo goodsInfo = new GoodsInfoResp.GoodsInfo();
+        goodsInfo.setGoodsId(x.getId());
+        goodsInfo.setGoodsName(x.getName());
+        goodsInfo.setAmountUnit(x.getUnit());
+        goodsInfo.setPriceUnit(x.getPriceUnit());
+        return goodsInfo;
+    }
 }

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

@@ -2,9 +2,11 @@ package com.sckw.system.controller;
 
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.system.model.KwsEnterprise;
 import com.sckw.system.model.vo.req.*;
+import com.sckw.system.model.vo.res.EntInfoResp;
 import com.sckw.system.model.vo.res.KwsUserSystemTypeVo;
 import com.sckw.system.service.KwsEnterpriseService;
 import jakarta.servlet.http.HttpServletRequest;
@@ -333,5 +335,12 @@ public class KwsEnterpriseController {
         kwsEntService.exportEntSettle(pageReqVo, response);
     }
 
+    /**
+     * 查询供应商或者采购方的企业信息
+     */
+    @PostMapping("/queryEntInfo")
+    public BaseResult<EntInfoResp> queryEntInfo(@RequestBody EntInfoReq req) {
+        return BaseResult.success(kwsEntService.queryEntInfo(req));
+    }
 
 }

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

@@ -9,6 +9,7 @@ import com.sckw.core.model.page.PageHelperUtil;
 import com.sckw.core.model.page.PageResult;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.redis.constant.RedisConstant;
 import com.sckw.redis.utils.RedissonUtils;
@@ -16,8 +17,10 @@ import com.sckw.system.api.model.dto.req.RegisterReqDto;
 import com.sckw.system.api.model.dto.req.UpdatePasswordReqDto;
 import com.sckw.system.model.vo.req.ForgetPasswordReqVo;
 import com.sckw.system.model.vo.req.ResetPasswordReqVo;
+import com.sckw.system.model.vo.req.SalesReq;
 import com.sckw.system.model.vo.req.UserAddReqVo;
 import com.sckw.system.model.vo.res.KwsUserResVo;
+import com.sckw.system.model.vo.res.SalesResp;
 import com.sckw.system.service.KwsUserService;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -251,4 +254,11 @@ public class KwsUserController {
         kwsUserService.test(Collections.singletonList(1));
         return HttpResult.ok(HttpStatus.MSG_004);
     }
+    /**
+     * 查询供应方的销售信息
+     */
+    @PostMapping("/getSales")
+    public BaseResult<SalesResp> getSales(@RequestBody SalesReq req) {
+        return BaseResult.success(kwsUserService.getSales(req));
+    }
 }

+ 2 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsEntTypeDao.java

@@ -1,5 +1,6 @@
 package com.sckw.system.dao;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.system.model.KwsEntType;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -12,7 +13,7 @@ import java.util.List;
  * @date 2023-06-02
  */
 @Mapper
-public interface KwsEntTypeDao {
+public interface KwsEntTypeDao extends BaseMapper<KwsEntType> {
     /**
      * 新增
      * @param record

+ 2 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsRoleDao.java

@@ -1,5 +1,6 @@
 package com.sckw.system.dao;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.system.model.KwsRole;
 import com.sckw.system.model.vo.res.RoleResVo;
 import org.apache.ibatis.annotations.Mapper;
@@ -14,7 +15,7 @@ import java.util.Map;
  * @date 2023-05-31
  */
 @Mapper
-public interface KwsRoleDao {
+public interface KwsRoleDao extends BaseMapper<KwsRole> {
     /**
      * 新增
      * @param record

+ 2 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsUserDao.java

@@ -1,5 +1,6 @@
 package com.sckw.system.dao;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.system.model.KwsDept;
 import com.sckw.system.model.KwsUser;
 import com.sckw.system.model.KwsUserDept;
@@ -17,7 +18,7 @@ import java.util.Map;
  * @date 2023-05-31
  */
 @Mapper
-public interface KwsUserDao {
+public interface KwsUserDao extends BaseMapper<KwsUser> {
     /**
      * 新增
      * @param record

+ 2 - 1
sckw-modules/sckw-system/src/main/java/com/sckw/system/dao/KwsUserRoleDao.java

@@ -1,5 +1,6 @@
 package com.sckw.system.dao;
 
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.system.model.KwsUserRole;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -12,7 +13,7 @@ import java.util.List;
  * @date 2023-05-31
  */
 @Mapper
-public interface  KwsUserRoleDao {
+public interface  KwsUserRoleDao extends BaseMapper<KwsUserRole> {
     /**
      * 新增
      * @param record

+ 6 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/KwsRole.java

@@ -1,5 +1,6 @@
 package com.sckw.system.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.sckw.core.model.base.BaseModel;
 import lombok.Data;
 /**
@@ -19,5 +20,10 @@ public class KwsRole extends BaseModel {
      * 当前单位id,可以是机构也可以是企业,目前产品设计是企业
      */
     private Long deptId;
+    /**
+     * 企业id
+     */
+    @TableField("ent_id")
+    private Long entId;
 
 }

+ 38 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/EntInfoReq.java

@@ -0,0 +1,38 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 查询企业信息
+ * @create :2025-11-04 13:43:00
+ */
+@Data
+public class EntInfoReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 7086846167295941832L;
+    /**
+     * 企业ID
+     */
+    @Schema(description = "企业ID")
+    private String entId;
+    /**
+     * 企业类型
+     */
+    @Schema(description = "企业类型")
+    private String entType;
+    /**
+     * 登录用户的企业类型
+     */
+    private String loginEntType;
+    /**
+     * 企业名称
+     */
+    @Schema(description = "企业名称")
+    private String entName;
+}

+ 27 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/req/SalesReq.java

@@ -0,0 +1,27 @@
+package com.sckw.system.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 销售信息
+ * @create :2025-11-04 14:49:00
+ */
+@Data
+public class SalesReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 8686213053425570332L;
+    /*
+    * 企业id
+     */
+    @Schema(description = "企业id")
+    @NotBlank(message = "企业id不能为空")
+    private String entId;
+
+}

+ 39 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/EntInfoResp.java

@@ -0,0 +1,39 @@
+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;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 企业信息响应参数
+ * @create :2025-11-04 13:45:00
+ */
+@Data
+public class EntInfoResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -8957989833318602612L;
+
+    private List<EntInfo> entInfos;
+
+    @Data
+    public static class EntInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 2247838821327708080L;
+        /**
+         * 企业id
+         */
+        @Schema(description = "企业id")
+        private String entId;
+
+        /**
+         * 企业名称
+         */
+        @Schema(description = "企业名称")
+        private String entName;
+    }
+}

+ 43 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/model/vo/res/SalesResp.java

@@ -0,0 +1,43 @@
+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;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 销售信息
+ * @create :2025-11-04 14:49:00
+ */
+@Data
+public class SalesResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 8686213053425570332L;
+    private List<Sales> salesRespList;
+
+
+    @Data
+    public static class Sales implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -6976911823647853508L;
+        /*
+         * 销售名称
+         */
+        @Schema (description = "销售名称")
+        private String salesName;
+        /*
+         * 销售ID
+         */
+        @Schema (description = "销售ID")
+        private String salesId;
+        /*
+         * 销售手机号
+         */
+        @Schema (description = "销售手机号")
+        private String salesPhone;
+    }
+}

+ 33 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsEntTypeRepository.java

@@ -0,0 +1,33 @@
+package com.sckw.system.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.system.dao.KwsEntTypeDao;
+import com.sckw.system.model.KwsEntType;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 企业类型接口
+ * @create :2025-11-04 13:47:00
+ */
+@Repository
+public class KwsEntTypeRepository extends ServiceImpl<KwsEntTypeDao, KwsEntType> {
+    public List<KwsEntType> queryByEntIdsAndType(Set<Long> entIds, String entType) {
+        return list(Wrappers.<KwsEntType>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwsEntType::getEntId, entIds)
+                .eq(KwsEntType::getType, entType));
+    }
+
+    public List<KwsEntType> queryByType(String entType) {
+        return list(Wrappers.<KwsEntType>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwsEntType::getType, entType));
+    }
+}

+ 19 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsEnterpriseRepository.java

@@ -8,9 +8,12 @@ import com.sckw.core.model.base.BaseModel;
 import com.sckw.system.dao.KwsEnterpriseDao;
 import com.sckw.system.model.KwsEnterprise;
 
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 
 /**
  * @author PC
@@ -22,4 +25,20 @@ public class KwsEnterpriseRepository extends ServiceImpl<KwsEnterpriseDao,KwsEnt
                 .eq(BaseModel::getDelFlag,0)
                 .eq(Objects.nonNull(entId),KwsEnterprise::getId, entId));
     }
+
+    public List<KwsEnterprise> queryByEntIdAndName(String entId, String entName) {
+        return list(Wrappers.<KwsEnterprise>lambdaQuery()
+                .eq(BaseModel::getDelFlag, 0)
+                .and(StringUtils.isNotBlank(entId), wrapper -> wrapper
+                        .eq(BaseModel::getId, entId)
+                        .or()
+                        .eq(KwsEnterprise::getId, entId))
+                .like(StringUtils.isNotBlank(entName), KwsEnterprise::getFirmName, entName));
+    }
+
+    public List<KwsEnterprise> queryByEntIds(Set<Long> entIds) {
+        return list(Wrappers.<KwsEnterprise>lambdaQuery()
+                .eq(BaseModel::getDelFlag, 0)
+                .in(KwsEnterprise::getId, entIds));
+    }
 }

+ 30 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsRoleRepository.java

@@ -0,0 +1,30 @@
+package com.sckw.system.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.system.dao.KwsRoleDao;
+import com.sckw.system.model.KwsRole;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 角色信息
+ * @create :2025-11-04 18:23:00
+ */
+@Repository
+public class KwsRoleRepository extends ServiceImpl<KwsRoleDao, KwsRole> {
+    /**
+     * 根据企业id查询角色信息
+     * @param entId 企业id
+     * @return 角色信息
+     */
+    public List<KwsRole> queryByEntId(String entId) {
+        return list(Wrappers.<KwsRole>lambdaQuery()
+                .eq(KwsRole::getEntId,entId)
+                .eq(BaseModel::getDelFlag,0));
+    }
+}

+ 27 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsUserRepository.java

@@ -0,0 +1,27 @@
+package com.sckw.system.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.system.dao.KwsUserDao;
+import com.sckw.system.model.KwsUser;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 员工信息接口
+ * @create :2025-11-04 18:37:00
+ */
+@Repository
+public class KwsUserRepository extends ServiceImpl<KwsUserDao, KwsUser> {
+    public List<KwsUser> queryByUserIds(Set<Long> userIds) {
+
+        return list(Wrappers.<KwsUser>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwsUser::getId,userIds));
+    }
+}

+ 28 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/repository/KwsUserRoleRepository.java

@@ -0,0 +1,28 @@
+package com.sckw.system.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.core.model.base.BaseModel;
+import com.sckw.system.dao.KwsUserRoleDao;
+import com.sckw.system.model.KwsUserRole;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 角色员工关接口
+ * @create :2025-11-04 18:31:00
+ */
+
+@Repository
+public class KwsUserRoleRepository extends ServiceImpl<KwsUserRoleDao, KwsUserRole> {
+    public List<KwsUserRole> queryByRoleIds(Set<Long> roleIds) {
+
+        return list(Wrappers.<KwsUserRole>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .in(KwsUserRole::getRoleId,roleIds));
+    }
+}

+ 82 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -4,7 +4,9 @@ import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageInfo;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.exception.SystemException;
+import com.sckw.core.model.base.BaseModel;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.constant.NumberConstant;
 import com.sckw.core.model.enums.*;
@@ -35,8 +37,13 @@ import com.sckw.system.model.report.EntCustomerExcel;
 import com.sckw.system.model.report.EntSettleExcel;
 import com.sckw.system.model.vo.req.*;
 import com.sckw.system.model.vo.res.*;
+import com.sckw.system.repository.KwsEntTypeRepository;
+import com.sckw.system.repository.KwsEnterpriseRepository;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.collections4.MapUtils;
+import org.jetbrains.annotations.NotNull;
 import org.redisson.api.RSet;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -54,6 +61,7 @@ import java.util.stream.Collectors;
  * @date 2023-05-31
  */
 @Service
+@RequiredArgsConstructor
 public class KwsEnterpriseService {
 
     @Autowired
@@ -107,6 +115,9 @@ public class KwsEnterpriseService {
     @Autowired
     private KwsSpecialDao specialDao;
 
+    private final KwsEntTypeRepository kwsEntTypeRepository;
+    private final KwsEnterpriseRepository kwsEnterpriseRepository;
+
     @Value(value = "${jumpUrl.entCertificate}")
     private String entCertificateUrl;
 
@@ -1537,4 +1548,75 @@ public class KwsEnterpriseService {
         List<KwsEnterprise> enterprises = kwsEnterpriseDao.findAllEnterprise();
         return HttpResult.ok(enterprises);
     }
+
+    public EntInfoResp queryEntInfo(EntInfoReq req) {
+        //如果是发起方是采购方,采购方只能是自己和下级,供应方可以选所有入住的供应企业
+        // 如果发起方是供应方,则供应方是能自己和下级,采购方可以是所有入住企业
+        if (org.apache.commons.lang3.StringUtils.equals(req.getEntType(),req.getLoginEntType())){
+            //登录客户的企业类型和查询的类型是一直的说明只能查询自己和自己的下级
+            //发起方的公司信息
+            return getEntInfoResp(req);
+        }
+        //被邀请方的企业信息
+        //根据类型查询企业id
+        return getInfoResp(req);
+    }
+
+    @NotNull
+    private EntInfoResp getInfoResp(EntInfoReq req) {
+        List<KwsEntType> kwsEntTypes = kwsEntTypeRepository.queryByType(req.getEntType());
+        if (CollectionUtils.isEmpty(kwsEntTypes)){
+            return new EntInfoResp();
+        }
+        Set<Long> entIds = kwsEntTypes.stream().map(KwsEntType::getEntId).collect(Collectors.toSet());
+        //根据企业id查询企业信息
+        List<KwsEnterprise> kwsEnterprises = kwsEnterpriseRepository.queryByEntIds(entIds);
+        if (CollectionUtils.isEmpty(kwsEnterprises)){
+            return new EntInfoResp();
+        }
+        //组装返回对象
+        List<EntInfoResp.EntInfo> entInfos = kwsEnterprises.stream().map(k -> {
+            EntInfoResp.EntInfo entInfoResp = new EntInfoResp.EntInfo();
+            entInfoResp.setEntId(String.valueOf(k.getId()));
+            entInfoResp.setEntName(k.getFirmName());
+            return entInfoResp;
+        }).collect(Collectors.toList());
+        EntInfoResp entInfoResp = new EntInfoResp();
+        entInfoResp.setEntInfos(entInfos);
+        return entInfoResp;
+    }
+
+    @NotNull
+    private EntInfoResp getEntInfoResp(EntInfoReq req) {
+        if (org.apache.commons.lang3.StringUtils.isBlank(req.getEntId())){
+            throw new BusinessException("企业id不能为空");
+        }
+        List<KwsEnterprise> kwsEnterprises = kwsEnterpriseRepository.queryByEntIdAndName(req.getEntId(), req.getEntName());
+        if (CollectionUtils.isEmpty(kwsEnterprises)){
+            return new EntInfoResp();
+        }
+        Set<Long> entIds = kwsEnterprises.stream()
+                .map(BaseModel::getId)
+                .collect(Collectors.toSet());
+        //根据类型进行过滤
+        List<KwsEntType> kwsEntTypes = kwsEntTypeRepository.queryByEntIdsAndType(entIds, req.getEntType());
+        if (CollectionUtils.isEmpty(kwsEntTypes)){
+            return new EntInfoResp();
+        }
+        Set<Long> entIdList = kwsEntTypes.stream()
+                .map(KwsEntType::getEntId)
+                .collect(Collectors.toSet());
+        //过滤类型表中包含的数据
+        List<EntInfoResp.EntInfo> entInfos = kwsEnterprises.stream()
+                .filter(x -> entIdList.contains(x.getId()))
+                .map(k -> {
+                    EntInfoResp.EntInfo entInfoResp = new EntInfoResp.EntInfo();
+                    entInfoResp.setEntId(String.valueOf(k.getId()));
+                    entInfoResp.setEntName(k.getFirmName());
+                    return entInfoResp;
+                }).collect(Collectors.toList());
+        EntInfoResp entInfoResp = new EntInfoResp();
+        entInfoResp.setEntInfos(entInfos);
+        return entInfoResp;
+    }
 }

+ 60 - 0
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsUserService.java

@@ -1,5 +1,6 @@
 package com.sckw.system.service;
 
+import com.alibaba.fastjson.JSON;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.exception.SystemException;
 import com.sckw.core.model.constant.Global;
@@ -25,10 +26,16 @@ import com.sckw.system.model.report.KwsUserExcel;
 import com.sckw.system.model.vo.req.*;
 import com.sckw.system.model.vo.res.KwsUserResVo;
 import com.sckw.system.model.vo.res.KwsUserSystemTypeVo;
+import com.sckw.system.model.vo.res.SalesResp;
+import com.sckw.system.repository.KwsRoleRepository;
+import com.sckw.system.repository.KwsUserRepository;
+import com.sckw.system.repository.KwsUserRoleRepository;
 import com.sckw.transport.api.dubbo.TransportRemoteStatisticsService;
 import jakarta.servlet.http.HttpServletResponse;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -44,6 +51,7 @@ import java.util.stream.Collectors;
  */
 @Slf4j
 @Service
+@RequiredArgsConstructor
 public class KwsUserService {
 
     @Autowired
@@ -79,6 +87,12 @@ public class KwsUserService {
     @Autowired
     private CommonService commonService;
 
+    private final KwsRoleRepository kwsRoleRepository;
+
+    private final KwsUserRoleRepository kwsUserRoleRepository;
+
+    private final KwsUserRepository kwsUserRepository;
+
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private TransportRemoteStatisticsService transportStatisticsService;
 
@@ -705,4 +719,50 @@ public class KwsUserService {
     public List<KwsUserSystemTypeVo> getManager() {
         return kwsUserDao.selectUserBySystemTypeAndMain(SystemTypeEnum.MANAGE.getCode(),0);
     }
+
+    public SalesResp getSales(SalesReq req) {
+        log.info("查询销售参数:{}", JSON.toJSONString( req));
+        //根据供应方的企业id查出供应方员工作为销售
+       List<KwsRole> roles = kwsRoleRepository.queryByEntId(req.getEntId());
+       if (CollectionUtils.isEmpty(roles)){
+           return new SalesResp();
+       }
+       //获取角色id
+       Set<Long> roleIds = roles.stream()
+               .map(KwsRole::getId)
+               .collect(Collectors.toSet());
+       if (org.apache.commons.collections4.CollectionUtils.isEmpty(roleIds)){
+           return new SalesResp();
+       }
+        //获取角色用户管理数据
+       List<KwsUserRole> kwsUserRoles = kwsUserRoleRepository.queryByRoleIds(roleIds);
+       if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwsUserRoles)){
+           return new SalesResp();
+       }
+       //获取用户id
+       Set<Long> userIds = kwsUserRoles.stream()
+               .map(KwsUserRole::getUserId)
+               .collect(Collectors.toSet());
+       if (org.apache.commons.collections4.CollectionUtils.isEmpty(userIds)){
+           return new SalesResp();
+       }
+
+       //获取用户信息
+       List<KwsUser> kwsUsers = kwsUserRepository.queryByUserIds(userIds);
+       //组装返回数据
+        List<SalesResp.Sales> salesList = kwsUsers.stream()
+                .map(KwsUserService::getSales)
+                .collect(Collectors.toList());
+        SalesResp salesResp = new SalesResp();
+        salesResp.setSalesRespList(salesList);
+        return salesResp;
+    }
+
+    private static SalesResp.Sales getSales(KwsUser u) {
+        SalesResp.Sales sales = new SalesResp.Sales();
+        sales.setSalesName(u.getName());
+        sales.setSalesId(String.valueOf(u.getId()));
+        sales.setSalesPhone(u.getPhone());
+        return sales;
+    }
 }

+ 10 - 0
sql/2025/11/30/2025_11_30_cxf_alert.sql

@@ -0,0 +1,10 @@
+ALTER TABLE kwc_contract_trade ADD settlement tinyint NOT NULL default 1 comment '结算方式 (1线下结算,线上结算)';
+ALTER TABLE kwc_contract_trade ADD consignment tinyint NOT NULL default 0 comment '托运方式 1-采购方托运,2-供应方托运';
+ALTER TABLE kwc_contract_trade ADD unload_way tinyint      NOT NULL default 0  comment '1按装货量、2按卸货量';
+ALTER TABLE kwc_contract_trade ADD salesman_id tinyint   NOT NULL default 0  comment '销售人员id(对应供应方的员工信息)';
+ALTER TABLE kwc_contract_trade ADD salesman_phone varchar(11)   NOT NULL default ''  comment '销售人员电话';
+
+ALTER TABLE kwp_goods ADD price_unit varchar(10)   NOT NULL default ''  comment '价格单位(元,万元)';
+
+
+ALTER TABLE kws_role ADD ent_id bigint NOT NULL default 0  comment '企业id';