Parcourir la source

贸易订单修改、受理接口4.2.0迭代功能

yzc il y a 1 an
Parent
commit
6165d982ea
23 fichiers modifiés avec 1331 ajouts et 193 suppressions
  1. 2 0
      sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java
  2. 12 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java
  3. 11 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java
  4. 100 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderListSelectDTO.java
  5. 13 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AcceptanceOrderParam.java
  6. 2 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AddressInfo.java
  7. 110 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExport.java
  8. 21 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExportParam.java
  9. 25 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListSelectParam.java
  10. 89 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListStatisticParam.java
  11. 66 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderStatementList.java
  12. 28 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateAddressAmountParam.java
  13. 0 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateOrderParam.java
  14. 24 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateUnitParam.java
  15. 222 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderListResVO.java
  16. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/UnitInfoDetailRes.java
  17. 33 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAddressService.java
  18. 32 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAmountService.java
  19. 293 191
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  20. 4 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderUnitService.java
  21. 220 0
      sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml
  22. 7 0
      sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java
  23. 12 1
      sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

+ 2 - 0
sckw-modules-api/sckw-product-api/src/main/java/com/sckw/product/api/dubbo/GoodsInfoService.java

@@ -71,4 +71,6 @@ public interface GoodsInfoService {
     Boolean associateSupplyEnt(Long entId);
 
     KwpGoods getGoodsByGoodsName(String goodsName);
+
+    List<Long> selectIdsLikeGoodsName(String name);
 }

+ 12 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java

@@ -209,4 +209,16 @@ public class KwoTradeOrderController {
         return HttpResult.ok("贸易订单地址信息查询成功", kwoTradeOrderService.getAddressInfo(id));
     }
 
+    /**
+     * @desc: 贸易订单列表分页查询
+     * @author: yzc
+     * @date: 2023-07-17 10:29
+     * @Param params:
+     * @return: com.sckw.core.web.response.HttpResult
+     */
+    @PostMapping(value = "/tradeOrderSelect", produces = MediaType.APPLICATION_JSON_VALUE)
+    public HttpResult select(@RequestBody @Validated TradeOrderListSelectParam params) {
+        return HttpResult.ok(kwoTradeOrderService.tradeOrderSelect(params));
+    }
+
 }

+ 11 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dao/KwoTradeOrderMapper.java

@@ -3,8 +3,10 @@ package com.sckw.order.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckw.order.api.model.TradeOrderCountStatisticsDTO;
 import com.sckw.order.model.KwoTradeOrder;
+import com.sckw.order.model.dto.TradeOrderListSelectDTO;
 import com.sckw.order.model.dto.WbTOrderExcelStsReqDTO;
 import com.sckw.order.model.dto.WbTOrderExcelStsResDTO;
+import com.sckw.order.model.vo.res.OrderListResVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
@@ -45,4 +47,13 @@ public interface KwoTradeOrderMapper extends BaseMapper<KwoTradeOrder> {
      * @return: java.util.List<com.sckw.order.model.dto.WbTOrderExcelStsResDTO>
      */
     List<WbTOrderExcelStsResDTO> workbenchExcel(@Param("item") WbTOrderExcelStsReqDTO item);
+
+    /**
+     * @param query
+     * @return java.util.List<com.sckw.order.model.vo.res.OrderListResVO>
+     * @desc 贸易订单列表查询
+     * @author yzc
+     * @date 2024/3/6 15:50
+     */
+    List<OrderListResVO> tradeOrderSelect(@Param("query") TradeOrderListSelectDTO query);
 }

+ 100 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/dto/TradeOrderListSelectDTO.java

@@ -0,0 +1,100 @@
+package com.sckw.order.model.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-06  15:14
+ * @desc: 贸易订单列表查询dto对象
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class TradeOrderListSelectDTO {
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 是否主账号(0是/1否)
+     */
+    private Integer isMain;
+
+    /**
+     * 用户权限
+     */
+    private List<Long> authUserIdList;
+
+    /**
+     * 订单类型(1采购订单、2销售订单)
+     */
+    private Integer orderType;
+    /**
+     * 订单编号、单位、商品名称(模糊匹配共用)
+     */
+    private String keywords;
+
+    /**
+     * 商品id集合(模糊匹配查出来的商品)
+     */
+    private List<Long> goodsIds;
+
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    private Date endCreateTime;
+
+    /**
+     * 装货地址code
+     */
+    private String loadAddressCode;
+
+    /**
+     * 卸货地址code
+     */
+    private String unloadAddressCode;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 下单方式(1采购下单/2代客下单)
+     */
+    private String source;
+
+    /**
+     * 订单状态
+     */
+    private Integer status;
+}

+ 13 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AcceptanceOrderParam.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.validation.Valid;
 import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Getter;
 import lombok.Setter;
@@ -11,6 +12,7 @@ import lombok.ToString;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.util.List;
 
 /**
  * @desc: 受理订单请求参数
@@ -54,6 +56,17 @@ public class AcceptanceOrderParam {
     @NotBlank(message = "交付类型不能为空")
     private String deliveryType;
 
+    @NotNull(message = "我方联系人信息不能为空")
+    private UpdateUnitParam saleUnitParam;
+
+    @NotEmpty(message = "卸货信息不能为空")
+    @Valid
+    private List<UpdateAddressAmountParam> addressAmountParams;
+
+    @NotEmpty(message = "装货信息不能为空")
+    @Valid
+    private List<AddressInfo> addressInfo;
+
     @NotNull(message = "合同信息不能为空")
     @Valid
     private ContractInfo contractInfo;

+ 2 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/AddressInfo.java

@@ -1,5 +1,6 @@
 package com.sckw.order.model.vo.req;
 
+import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotNull;
 import jakarta.validation.constraints.Pattern;
@@ -91,6 +92,7 @@ public class AddressInfo {
      * 货物数量
      */
     @NotNull(message = "货物数量不能为空")
+    @DecimalMin(value = "0.00",message = "分配量必须大于零")
     private BigDecimal amount;
 
     /**

+ 110 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExport.java

@@ -0,0 +1,110 @@
+package com.sckw.order.model.vo.req;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.sckw.excel.annotation.ExcelContext;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @desc: 交易列表信息导出对象
+ * @author: yzc
+ * @date: 2023-07-17 10:36
+ */
+@Data
+@Accessors(chain = true)
+@ExcelContext(fileName = "交易列表信息", sheetName = "交易列表信息")
+public class TradeOrderListExport implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -5895230502149598364L;
+
+    @ExcelProperty(value = "状态" )
+    private String status;
+
+    @ExcelProperty(value = "订单编号" )
+    private String tOrderNo;
+
+    @ExcelProperty(value = "采购单位")
+    private String procureFirmName;
+
+    @ExcelProperty(value = "销售单位")
+    private String supplyFirmName;
+
+    @ExcelProperty(value = "商品名称")
+    private String goodsName;
+
+    @ExcelProperty(value = "规格")
+    private String goodsSpec;
+
+    @ExcelProperty(value = "单价/元")
+    private String unitPrice;
+
+    @ExcelProperty(value = "订单总量")
+    private String amount;
+
+    @ExcelProperty(value = "订单金额")
+    private String price;
+
+    @ExcelProperty(value = "税率/%")
+    private String goodsTaxRate;
+
+    @ExcelProperty(value = "已分配运输量")
+    private String entrustAmount;
+
+    @ExcelProperty(value = "已履约量")
+    private String actualAmount;
+
+    @ExcelProperty(value = "待分配运输量")
+    private String waitEntrustAmount;
+
+    @ExcelProperty(value = "提货方式" )
+    private String pickupType;
+
+    @ExcelProperty(value = "交付类型" )
+    private String deliveryType;
+
+    @ExcelProperty(value = "下单方式" )
+    private String source;
+
+    @ExcelProperty(value = "支付方式")
+    private String trading;
+
+    @ExcelProperty(value = "装货地址名称")
+    private String loadName;
+
+    @ExcelProperty(value = "地址明细")
+    private String loadDetailAddressInfo;
+
+    @ExcelProperty(value = "卸货地址名称")
+    private String unloadName;
+
+    @ExcelProperty(value = "地址明细")
+    private String unloadDetailAddressInfo;
+
+    @ExcelProperty(value = "计划开始日期")
+    private String startTime;
+
+    @ExcelProperty(value = "计划结束日期")
+    private String endTime;
+
+    @ExcelProperty(value = "关联合同")
+    private String contractNo;
+
+    @ExcelProperty(value = "签约方式")
+    private String contractSigningWay;
+
+    @ExcelProperty(value = "归属项目")
+    private String projectName;
+
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+    @ExcelProperty(value = "创建人")
+    private String createByName;
+
+    @ExcelProperty(value = "创建时间")
+    private String createTime;
+
+}

+ 21 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListExportParam.java

@@ -0,0 +1,21 @@
+package com.sckw.order.model.vo.req;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: 订单列表导出请求参数
+ * @author: yzc
+ * @date: 2023-07-12 17:41
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderListExportParam extends TradeOrderListStatisticParam {
+
+    /**
+     * 订单ids
+     */
+    private String ids;
+}

+ 25 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListSelectParam.java

@@ -0,0 +1,25 @@
+package com.sckw.order.model.vo.req;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: 订单列表分页请求参数
+ * @author: yzc
+ * @date: 2023-07-12 17:38
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderListSelectParam extends TradeOrderListStatisticParam {
+
+    /**
+     * 当前页码
+     */
+    private int page = 1;
+    /**
+     * 每页数量
+     */
+    private int pageSize = 10;
+}

+ 89 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderListStatisticParam.java

@@ -0,0 +1,89 @@
+package com.sckw.order.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+import java.util.Date;
+
+/**
+ * @desc: 订单列表统计请求参数
+ * @author: yzc
+ * @date: 2023-07-12 17:37
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderListStatisticParam {
+
+    /**
+     * 订单类型(2销售订单、1采购订单)
+     */
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+    /**
+     * 订单编号、单位、商品名称(模糊匹配共用)
+     */
+    private String keywords;
+    /**
+     * 创建时间开始(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date startCreateTime;
+
+    /**
+     * 创建时间结束(yyyy-MM-dd HH:mm:ss)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endCreateTime;
+
+    /**
+     * 装货地址code
+     */
+    private String shippingAddressCode;
+
+    /**
+     * 装货地址等级
+     */
+    private Integer shippingAddressLevel;
+
+    /**
+     * 装货地址code
+     */
+    private String unloadingAddressCode;
+
+    /**
+     * 卸货地址等级
+     */
+    private Integer unloadingAddressLevel;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 下单方式(1采购下单/2代客下单)
+     */
+    private String source;
+
+    /**
+     * 订单状态
+     */
+    private Integer status;
+
+}

+ 66 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderStatementList.java

@@ -0,0 +1,66 @@
+package com.sckw.order.model.vo.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.sckw.core.model.page.PageRequest;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.hibernate.validator.constraints.Range;
+
+import java.time.LocalDate;
+
+/**
+ * @desc: 贸易订单对账单列表请求参数
+ * @author: yzc
+ * @date: 2023-07-20 14:43
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderStatementList extends PageRequest {
+
+    /**
+     * 订单类型(1采购订单2销售订单)
+     */
+    @Range(min = 1, max = 2, message = "非法订单类型")
+    @NotNull(message = "订单类型不能为空")
+    private Integer orderType;
+
+    /**
+     * 采购单位id
+     */
+    private Long procureEntId;
+
+    /**
+     * 计划开始时间(yyyy-MM-dd)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startTime;
+
+    /**
+     * 计划结束时间(yyyy-MM-dd)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endTime;
+
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 商品税率
+     */
+    private String goodsTaxRate;
+
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+
+    /**
+     * 排除订单ids
+     */
+    private String excludeIds;
+}

+ 28 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateAddressAmountParam.java

@@ -0,0 +1,28 @@
+package com.sckw.order.model.vo.req;
+
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.math.BigDecimal;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  09:46
+ * @desc: 更新地点分配量参数
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateAddressAmountParam {
+
+    @NotNull(message = "地址id不能为空")
+    private Long id;
+
+    @NotNull(message = "分配量不能为空")
+    @DecimalMin(value = "0.00",message = "分配量必须大于零")
+    private BigDecimal amount;
+
+}

+ 0 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateOrderParam.java

@@ -75,7 +75,6 @@ public class UpdateOrderParam {
     /**
      * 地址信息
      */
-    @Size(max = 2, message = "地址信息最多有两条")
     private List<AddressInfo> addressInfo;
 
     /**

+ 24 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/UpdateUnitParam.java

@@ -0,0 +1,24 @@
+package com.sckw.order.model.vo.req;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @author: yzc
+ * @date: 2024-03-12  10:13
+ * @desc: 修改单位参数
+ */
+@Getter
+@Setter
+@ToString
+public class UpdateUnitParam {
+
+    @NotNull(message = "单位信息主键id不能为空")
+    private Long id;
+
+    @NotNull(message = "联系人id不能为空")
+    private Long contactsId;
+
+}

+ 222 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderListResVO.java

@@ -0,0 +1,222 @@
+package com.sckw.order.model.vo.res;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+
+/**
+ * @desc: 订单列表响应参数
+ * @author: yzc
+ * @date: 2023-07-12 17:45
+ */
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+public class OrderListResVO {
+
+    /**
+     * 订单id
+     */
+    @JsonProperty("tOrderId")
+    private Long tOrderId;
+    /**
+     * 订单状态
+     */
+    private Integer status;
+    /**
+     * 订单状态label
+     */
+    private String statusLabel;
+    /**
+     * 订单编号
+     */
+    @JsonProperty("tOrderNo")
+    private String tOrderNo;
+    /**
+     * 采购企业主键ID
+     */
+    private Long procureEntId;
+
+    /**
+     * 采购单位
+     */
+    private String procureFirmName;
+
+    /**
+     * 销售单位主键ID
+     */
+    private Long supplyEntId;
+    /**
+     * 销售单位
+     */
+    private String supplyFirmName;
+    /**
+     * 交易方式(预付款、货到付款)
+     */
+    private String trading;
+
+    /**
+     * 交易方式label
+     */
+    private String tradingLabel;
+    /**
+     * 交付类型(签发交付、签收交付)
+     */
+    private String deliveryType;
+
+    /**
+     * 交付类型label
+     */
+    private String deliveryTypeLabel;
+    /**
+     * 提货方式(采方自提、供应配送)
+     */
+    private String pickupType;
+    /**
+     * 提货方式label
+     */
+    private String pickupTypeLabel;
+    /**
+     * 下单方式(自主下单/代客下单)
+     */
+    private String source;
+
+    /**
+     * 下单方式label
+     */
+    private String sourceLabel;
+
+    /**
+     * 合同主键
+     */
+    private Long contractId;
+
+    /**
+     * 合同编号
+     */
+    private String contractNo;
+
+    /**
+     * 合同mc
+     */
+    private String contractName;
+
+    /**
+     * 合同签约方式
+     */
+    private String contractSigningWay;
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+    /**
+     * 商品名称
+     */
+    private String goodsName;
+    /**
+     * 单位(吨、方、箱、件)
+     */
+    private String goodsSpec;
+
+    private String goodsTaxRate;
+
+    /**
+     * 商品缩略图
+     */
+    private String goodsThumb;
+
+    /**
+     * 订单成交单价
+     */
+    private BigDecimal unitPrice;
+    /**
+     * 订单金额
+     */
+    private BigDecimal price;
+
+    /**
+     * 订单总量
+     */
+    private BigDecimal amount;
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+    /**
+     * 待委托量
+     */
+    private BigDecimal waitEntrustAmount;
+    /**
+     * 实际交付量
+     */
+    private BigDecimal actualAmount;
+
+    /**
+     * 实际订单金额
+     */
+    private BigDecimal actualPrice;
+    /**
+     * 归属项目
+     */
+    private String projectName;
+    /**
+     * 装货地点
+     */
+    private String loadName;
+
+    /**
+     * 装货详细地址=loadCityName+loadDetailAddress
+     */
+    private String loadDetailAddressInfo;
+    /**
+     * 卸货地点
+     */
+    private String unloadName;
+
+    /**
+     * 卸货详细地址=unloadCityName+unloadDetailAddress
+     */
+    private String unloadDetailAddressInfo;
+    /**
+     * 计划开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate startTime;
+    /**
+     * 计划结束时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate endTime;
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 单位
+     */
+    private String unit;
+
+    /**
+     * 单位
+     */
+    private String unitLabel;
+
+    /**
+     * 创建人e
+     */
+    private String createByName;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+}

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/UnitInfoDetailRes.java

@@ -25,4 +25,9 @@ public class UnitInfoDetailRes extends UnitInfo implements Serializable {
      */
     private String unitTypeLabel;
 
+    /**
+     * 主键id
+     */
+    private Long id;
+
 }

+ 33 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAddressService.java

@@ -82,6 +82,24 @@ public class KwoTradeOrderAddressService {
         return CollUtil.emptyIfNull(list);
     }
 
+    /**
+     * @param torderId
+     * @param type
+     * @return java.util.List<com.sckw.order.model.KwoTradeOrderAddress>
+     * @desc 根据贸易订单id和地址类型查询
+     * @author yzc
+     * @date 2024/3/12 11:51
+     */
+    public List<KwoTradeOrderAddress> getByOrderIdAndType(Long torderId, String type) {
+        LambdaQueryWrapper<KwoTradeOrderAddress> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(KwoTradeOrderAddress::getTOrderId, torderId)
+                .eq(KwoTradeOrderAddress::getAddressType, type)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO)
+                .orderByAsc(KwoTradeOrderAddress::getSort);
+        List<KwoTradeOrderAddress> list = kwoTradeOrderAddressMapper.selectList(wrapper);
+        return CollUtil.emptyIfNull(list);
+    }
+
     /**
      * @desc: 根据orderId获取
      * @author: yzc
@@ -132,6 +150,21 @@ public class KwoTradeOrderAddressService {
         kwoTradeOrderAddressMapper.update(null, wrapper);
     }
 
+    /**
+     * @desc 根据ids删除
+     * @param ids
+     * @return void
+     * @author yzc
+     * @date 2024/3/12 11:54
+     */
+    public void delByIds(List<Long> ids) {
+        LambdaUpdateWrapper<KwoTradeOrderAddress> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.in(KwoTradeOrderAddress::getId, ids)
+                .eq(KwoTradeOrderAddress::getDelFlag, Global.NO)
+                .set(KwoTradeOrderAddress::getDelFlag, Global.YES);
+        kwoTradeOrderAddressMapper.update(null, wrapper);
+    }
+
     /**
      * @desc: 根据orderIds查询
      * @author: yzc

+ 32 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderAmountService.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.sckw.core.model.constant.Global;
 import com.sckw.order.dao.KwoTradeOrderAmountMapper;
 import com.sckw.order.model.KwoTradeOrderAmount;
+import com.sckw.order.model.vo.req.UpdateAddressAmountParam;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -63,6 +64,23 @@ public class KwoTradeOrderAmountService {
         tradeOrderAmountMapper.update(null, wrapper);
     }
 
+    /**
+     * @param orderId
+     * @param addressIds
+     * @return void
+     * @desc 根据订单id及地址ids删除
+     * @author yzc
+     * @date 2024/3/12 13:45
+     */
+    public void delByOrderIdAndAddressIds(Long orderId, List<Long> addressIds) {
+        LambdaUpdateWrapper<KwoTradeOrderAmount> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.eq(KwoTradeOrderAmount::getTOrderId, orderId)
+                .in(KwoTradeOrderAmount::getTAddressId, addressIds)
+                .eq(KwoTradeOrderAmount::getDelFlag, Global.NO)
+                .set(KwoTradeOrderAmount::getDelFlag, Global.YES);
+        tradeOrderAmountMapper.update(null, wrapper);
+    }
+
     /**
      * @desc: 根据orderId获取
      * @author: yzc
@@ -76,4 +94,18 @@ public class KwoTradeOrderAmountService {
         List<KwoTradeOrderAmount> list = tradeOrderAmountMapper.selectList(wrapper);
         return CollUtil.emptyIfNull(list);
     }
+
+    /**
+     * @param param
+     * @return void
+     * @desc 更新
+     * @author yzc
+     * @date 2024/3/12 11:45
+     */
+    public void update(UpdateAddressAmountParam param) {
+        LambdaUpdateWrapper<KwoTradeOrderAmount> wrapper = new LambdaUpdateWrapper<>();
+        wrapper.set(KwoTradeOrderAmount::getAmount, param.getAmount())
+                .eq(KwoTradeOrderAmount::getId, param.getId());
+        tradeOrderAmountMapper.update(null, wrapper);
+    }
 }

+ 293 - 191
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -1,9 +1,13 @@
 package com.sckw.order.serivce;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.github.pagehelper.PageHelper;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
@@ -15,7 +19,11 @@ import com.sckw.core.model.enums.ClientTypeEnum;
 import com.sckw.core.model.enums.CooperateTypeEnum;
 import com.sckw.core.model.enums.OrderRuleEnum;
 import com.sckw.core.model.enums.RedisOrderGenerateEnum;
-import com.sckw.core.utils.*;
+import com.sckw.core.model.page.PageResult;
+import com.sckw.core.utils.CollectionUtils;
+import com.sckw.core.utils.DateUtils;
+import com.sckw.core.utils.OrderGenerateSeqNoUtils;
+import com.sckw.core.utils.StringUtils;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
@@ -27,6 +35,7 @@ import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.enums.*;
 import com.sckw.order.model.*;
 import com.sckw.order.model.dto.OrderCheckDTO;
+import com.sckw.order.model.dto.TradeOrderListSelectDTO;
 import com.sckw.order.model.dto.WbTOrderExcelStsReqDTO;
 import com.sckw.order.model.dto.WbTOrderExcelStsResDTO;
 import com.sckw.order.model.vo.req.*;
@@ -122,7 +131,7 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addPurchaseOrderDraft(PurchaseOrderDraftParam param) {
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -130,7 +139,7 @@ public class KwoTradeOrderService {
                 .setUnit(Objects.nonNull(param.getGoodsInfo()) ? param.getGoodsInfo().getUnit() : null)
                 .setSource(OrderSourceEnum.PURCHASE.getType()).setStatus(OrderStatusEnum.SAVED.getCode());
         kwoTradeOrderMapper.insert(order);
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false);
     }
 
     /**
@@ -143,154 +152,152 @@ public class KwoTradeOrderService {
      * @return: void
      */
     private void addOtherOrderInfo(KwoTradeOrder tradeOrder, ValetOrderParam param, Boolean isUpdate) {
-        try {
-            Long id = tradeOrder.getId();
-            String tOrderNo = tradeOrder.getTOrderNo();
-            SckwTradeOrder order = new SckwTradeOrder();
-            order.setFirmName(LoginUserHolder.getEntName())
-                    .setCreateByName(LoginUserHolder.getUserName())
-                    .setUpdateByName(LoginUserHolder.getUserName())
-                    .setTOrderId(id)
-                    .setAssociateStatement(0)
-                    .setPrice(tradeOrder.getPrice().doubleValue())
-                    .setAmount(tradeOrder.getAmount().doubleValue())
-                    .setEntrustAmount(tradeOrder.getEntrustAmount().doubleValue())
-                    .setActualAmount(tradeOrder.getActualAmount().doubleValue());
-
-            BeanUtils.copyProperties(tradeOrder, order);
-
-            //商品信息
-            kwoTradeOrderGoodsService.delByOrderId(id);
-            GoodsInfo goodsInfo = param.getGoodsInfo();
-            KwoTradeOrderGoods goods = BeanUtils.copyProperties(goodsInfo, KwoTradeOrderGoods.class);
-            if (Objects.nonNull(goods) && Objects.nonNull(goods.getGoodsId())) {
-                GoodsDetail goodsDetail = goodsInfoService.getDetailById(goods.getGoodsId());
-                if (Objects.isNull(goodsDetail)
-                        || !Objects.equals(goodsDetail.getStatus(), 1)
-                        || Objects.equals(goodsDetail.getDelFlag(), Global.YES)) {
-                    throw new BusinessException("商品不存在或已下架!");
-                }
-                goods.setTOrderId(id).setTOrderNo(tOrderNo).setGoodsType(goodsDetail.getGoodsType());
-                kwoTradeOrderGoodsService.insert(goods);
-
-                //商品辅助单位
-                kwoTradeOrderGoodsUnitService.delByOrderId(id);
-                List<GoodsUnitDetail> assistUnit = goodsDetail.getAssistUnit();
-                if (CollectionUtils.isNotEmpty(assistUnit)) {
-                    List<KwoTradeOrderGoodsUnit> units = new ArrayList<>(assistUnit.size());
-                    assistUnit.forEach(e -> {
-                        KwoTradeOrderGoodsUnit unit = BeanUtils.copyProperties(e, KwoTradeOrderGoodsUnit.class);
-                        unit.setGoodsId(goodsDetail.getId());
-                        unit.setTOrderId(id);
-                        unit.setUnit(order.getUnit().equals(e.getFromUnit()) ? e.getToUnit() : e.getFromUnit());
-                        units.add(unit);
-                    });
-                    kwoTradeOrderGoodsUnitService.insertBatch(units);
-                }
+        Long id = tradeOrder.getId();
+        String tOrderNo = tradeOrder.getTOrderNo();
+        SckwTradeOrder order = new SckwTradeOrder();
+        order.setFirmName(LoginUserHolder.getEntName())
+                .setCreateByName(LoginUserHolder.getUserName())
+                .setUpdateByName(LoginUserHolder.getUserName())
+                .setTOrderId(id)
+                .setAssociateStatement(0)
+                .setPrice(tradeOrder.getPrice().doubleValue())
+                .setAmount(tradeOrder.getAmount().doubleValue())
+                .setEntrustAmount(tradeOrder.getEntrustAmount().doubleValue())
+                .setActualAmount(tradeOrder.getActualAmount().doubleValue());
 
-                //订单关联商品信息
-                order.setGoodsId(goodsDetail.getId()).setUnit(goodsDetail.getUnit()).setUnitPrice(goods.getUnitPrice().doubleValue())
-                        .setGoodsName(goodsDetail.getName()).setGoodsType(goodsDetail.getGoodsType()).setGoodsCode(goodsDetail.getCode())
-                        .setGoodsTaxRate(goodsDetail.getTaxRate()).setGoodsSpec(goodsDetail.getSpec()).setGoodsThumb(goodsDetail.getThumb());
-            }
-            if (Objects.isNull(order.getUnitPrice())) {
-                order.setUnitPrice(BigDecimal.ZERO.doubleValue());
-            }
+        BeanUtil.copyProperties(tradeOrder, order);
 
-            //单位信息
-            kwoTradeOrderUnitService.delByOrderId(id);
-            List<UnitInfo> unitInfos = param.getUnitInfo();
-            if (CollectionUtils.isNotEmpty(unitInfos)) {
-                List<KwoTradeOrderUnit> list = new ArrayList<>(unitInfos.size());
-                List<Long> entIds = unitInfos.stream().map(UnitInfo::getEntId).distinct().toList();
-                Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
-                unitInfos.forEach(e -> {
-                    EntCacheResDto ent = entMap.get(e.getEntId());
-                    if (Objects.isNull(ent)) {
-                        throw new BusinessException("企业:" + e.getFirmName() + "的一级企业信息不存在!");
-                    }
-                    KwoTradeOrderUnit unit = BeanUtils.copyProperties(e, KwoTradeOrderUnit.class);
-                    unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(ent.getId());
-                    list.add(unit);
-                    if (Objects.equals(e.getUnitType(), OrderUnitTypeEnum.PURCHASE.getType())) {
-                        order.setProcureEntId(e.getEntId()).setProcureTopEntId(unit.getTopEntId()).setProcureFirmName(e.getFirmName())
-                                .setProcureContacts(e.getContacts()).setProcurePhone(e.getPhone()).setProcureContactsId(e.getContactsId());
-                    } else {
-                        order.setSupplyEntId(e.getEntId()).setSupplyTopEntId(unit.getTopEntId()).setSupplyFirmName(e.getFirmName())
-                                .setSupplyContacts(e.getContacts()).setSupplyPhone(e.getPhone()).setSupplyContactsId(e.getContactsId());
-                    }
+        //商品信息
+        kwoTradeOrderGoodsService.delByOrderId(id);
+        GoodsInfo goodsInfo = param.getGoodsInfo();
+        KwoTradeOrderGoods goods = BeanUtil.copyProperties(goodsInfo, KwoTradeOrderGoods.class);
+        if (Objects.nonNull(goods) && Objects.nonNull(goods.getGoodsId())) {
+            GoodsDetail goodsDetail = goodsInfoService.getDetailById(goods.getGoodsId());
+            if (Objects.isNull(goodsDetail)
+                    || !Objects.equals(goodsDetail.getStatus(), 1)
+                    || Objects.equals(goodsDetail.getDelFlag(), Global.YES)) {
+                throw new BusinessException("商品不存在或已下架!");
+            }
+            goods.setTOrderId(id).setTOrderNo(tOrderNo).setGoodsType(goodsDetail.getGoodsType());
+            kwoTradeOrderGoodsService.insert(goods);
+
+            //商品辅助单位
+            kwoTradeOrderGoodsUnitService.delByOrderId(id);
+            List<GoodsUnitDetail> assistUnit = goodsDetail.getAssistUnit();
+            if (CollUtil.isNotEmpty(assistUnit)) {
+                List<KwoTradeOrderGoodsUnit> units = new ArrayList<>(assistUnit.size());
+                assistUnit.forEach(e -> {
+                    KwoTradeOrderGoodsUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderGoodsUnit.class);
+                    unit.setGoodsId(goodsDetail.getId());
+                    unit.setTOrderId(id);
+                    unit.setUnit(order.getUnit().equals(e.getFromUnit()) ? e.getToUnit() : e.getFromUnit());
+                    units.add(unit);
                 });
-                kwoTradeOrderUnitService.insertBatch(list);
+                kwoTradeOrderGoodsUnitService.insertBatch(units);
             }
 
-            //地址信息
-            kwoTradeOrderAddressService.delByOrderId(id);
-            tradeOrderAmountService.delByOrderId(id);
-            List<AddressInfo> addressInfos = param.getAddressInfo();
-            if (CollectionUtils.isNotEmpty(addressInfos)) {
-                BigDecimal amount = Objects.isNull(param.getAmount()) ? BigDecimal.ZERO : param.getAmount();
-                List<KwoTradeOrderAddress> list = new ArrayList<>(addressInfos.size());
-                BigDecimal totalLoadAmount = BigDecimal.ZERO;
-                BigDecimal totalUnloadAmount = BigDecimal.ZERO;
-                boolean loadFlag = false;
-                boolean unloadFlag = false;
-                for (AddressInfo e : addressInfos) {
-                    KwoTradeOrderAddress address = BeanUtils.copyProperties(e, KwoTradeOrderAddress.class);
-                    address.setTOrderId(id).setTOrderNo(tOrderNo);
-                    list.add(address);
-                    if (Objects.equals(e.getAddressType(), OrderAddressTypeEnum.LOAD.getType())) {
-                        //todo MongoDB如何存多个地址信息?
-                        order.setLoadName(e.getName()).setLoadType(e.getType()).setLoadContacts(e.getContacts())
-                                .setLoadPhone(e.getPhone()).setLoadCityCode(String.valueOf(e.getCityCode())).setLoadCityName(e.getCityName())
-                                .setLoadDetailAddress(e.getDetailAddress()).setLoadLat(e.getLat()).setLoadLng(e.getLng());
-                        totalLoadAmount = totalLoadAmount.add(e.getAmount());
-                        loadFlag = true;
-                    } else {
-                        //todo MongoDB如何存多个地址信息?
-                        order.setUnloadName(e.getName()).setUnloadType(e.getType()).setUnloadContacts(e.getContacts())
-                                .setUnloadPhone(e.getPhone()).setUnloadCityCode(String.valueOf(e.getCityCode())).setUnloadCityName(e.getCityName())
-                                .setUnloadDetailAddress(e.getDetailAddress()).setUnloadLat(e.getLat()).setUnloadLng(e.getLng());
-                        totalUnloadAmount = totalUnloadAmount.add(e.getAmount());
-                        unloadFlag = true;
-                    }
-                    //地址信息
-                    Long addressId = kwoTradeOrderAddressService.add(address);
-                    //分配量信息
-                    KwoTradeOrderAmount orderAmount = new KwoTradeOrderAmount();
-                    orderAmount.setTOrderId(id).setAmount(e.getAmount())
-                            .setTAddressId(addressId);
-                    tradeOrderAmountService.add(orderAmount);
+            //订单关联商品信息
+            order.setGoodsId(goodsDetail.getId()).setUnit(goodsDetail.getUnit()).setUnitPrice(goods.getUnitPrice().doubleValue())
+                    .setGoodsName(goodsDetail.getName()).setGoodsType(goodsDetail.getGoodsType()).setGoodsCode(goodsDetail.getCode())
+                    .setGoodsTaxRate(goodsDetail.getTaxRate()).setGoodsSpec(goodsDetail.getSpec()).setGoodsThumb(goodsDetail.getThumb());
+        }
+        if (Objects.isNull(order.getUnitPrice())) {
+            order.setUnitPrice(BigDecimal.ZERO.doubleValue());
+        }
+
+        //单位信息
+        kwoTradeOrderUnitService.delByOrderId(id);
+        List<UnitInfo> unitInfos = param.getUnitInfo();
+        if (CollUtil.isNotEmpty(unitInfos)) {
+            List<KwoTradeOrderUnit> list = new ArrayList<>(unitInfos.size());
+            List<Long> entIds = unitInfos.stream().map(UnitInfo::getEntId).distinct().toList();
+            Map<Long, EntCacheResDto> entMap = remoteSystemService.queryEntTreeByIds(entIds);
+            unitInfos.forEach(e -> {
+                EntCacheResDto ent = entMap.get(e.getEntId());
+                if (Objects.isNull(ent)) {
+                    throw new BusinessException("企业:" + e.getFirmName() + "的一级企业信息不存在!");
                 }
-                if (loadFlag && totalLoadAmount.compareTo(amount) != 0) {
-                    throw new BusinessException("装货分配量总量与订单总量不符!");
+                KwoTradeOrderUnit unit = BeanUtil.copyProperties(e, KwoTradeOrderUnit.class);
+                unit.setTOrderId(id).setTOrderNo(tOrderNo).setTopEntId(ent.getId());
+                list.add(unit);
+                if (Objects.equals(e.getUnitType(), OrderUnitTypeEnum.PURCHASE.getType())) {
+                    order.setProcureEntId(e.getEntId()).setProcureTopEntId(unit.getTopEntId()).setProcureFirmName(e.getFirmName())
+                            .setProcureContacts(e.getContacts()).setProcurePhone(e.getPhone()).setProcureContactsId(e.getContactsId());
+                } else {
+                    order.setSupplyEntId(e.getEntId()).setSupplyTopEntId(unit.getTopEntId()).setSupplyFirmName(e.getFirmName())
+                            .setSupplyContacts(e.getContacts()).setSupplyPhone(e.getPhone()).setSupplyContactsId(e.getContactsId());
                 }
-                if (unloadFlag && totalUnloadAmount.compareTo(amount) != 0) {
-                    throw new BusinessException("卸货分配量总量与订单总量不符!");
+            });
+            kwoTradeOrderUnitService.insertBatch(list);
+        }
+
+        //地址信息
+        kwoTradeOrderAddressService.delByOrderId(id);
+        tradeOrderAmountService.delByOrderId(id);
+        List<AddressInfo> addressInfos = param.getAddressInfo();
+        if (CollUtil.isNotEmpty(addressInfos)) {
+            BigDecimal amount = Objects.isNull(param.getAmount()) ? BigDecimal.ZERO : param.getAmount();
+            BigDecimal totalLoadAmount = BigDecimal.ZERO;
+            BigDecimal totalUnloadAmount = BigDecimal.ZERO;
+            boolean loadFlag = false;
+            boolean unloadFlag = false;
+            for (AddressInfo e : addressInfos) {
+                if (Objects.equals(e.getAddressType(), OrderAddressTypeEnum.LOAD.getType())) {
+                    totalLoadAmount = totalLoadAmount.add(e.getAmount());
+                    loadFlag = true;
+                } else {
+                    totalUnloadAmount = totalUnloadAmount.add(e.getAmount());
+                    unloadFlag = true;
                 }
             }
-
-            //合同信息
-            kwoTradeOrderContractService.delByOrderId(id);
-            ContractInfo contractInfo = param.getContractInfo();
-            KwoTradeOrderContract contract = BeanUtils.copyProperties(contractInfo, KwoTradeOrderContract.class);
-            if (Objects.nonNull(contract)) {
-                contract.setTOrderId(id).setTOrderNo(tOrderNo);
-                kwoTradeOrderContractService.insert(contract);
-                BeanUtils.copyProperties(contractInfo, order);
+            if (loadFlag && totalLoadAmount.compareTo(amount) != 0) {
+                throw new BusinessException("装货分配量总量与订单总量不符!");
             }
-
-            //状态信息(草稿更新不加状态记录)
-            if (!isUpdate || !Objects.equals(OrderStatusEnum.SAVED.getCode(), tradeOrder.getStatus())) {
-                KwoTradeOrderTrack track = new KwoTradeOrderTrack();
-                track.setTOrderId(id).setTOrderNo(tOrderNo).setStatus(tradeOrder.getStatus()).setRemark(tradeOrder.getRemark());
-                kwoTradeOrderTrackService.insert(track);
+            if (unloadFlag && totalUnloadAmount.compareTo(amount) != 0) {
+                throw new BusinessException("卸货分配量总量与订单总量不符!");
             }
-            int method = isUpdate ? 2 : 1;
-            //存MongoDb
-            saveMongoDb(method, order);
-        } catch (Exception e) {
-            e.printStackTrace();
+            addressInfos.forEach(e -> {
+                KwoTradeOrderAddress address = BeanUtil.copyProperties(e, KwoTradeOrderAddress.class);
+                address.setTOrderId(id).setTOrderNo(tOrderNo);
+                //todo MongoDB如何存多个地址信息?
+                if (Objects.equals(address.getAddressType(), OrderAddressTypeEnum.LOAD.getType())) {
+                    order.setLoadName(e.getName()).setLoadType(e.getType()).setLoadContacts(e.getContacts())
+                            .setLoadPhone(e.getPhone()).setLoadCityCode(String.valueOf(e.getCityCode())).setLoadCityName(e.getCityName())
+                            .setLoadDetailAddress(e.getDetailAddress()).setLoadLat(e.getLat()).setLoadLng(e.getLng());
+                } else {
+                    order.setUnloadName(e.getName()).setUnloadType(e.getType()).setUnloadContacts(e.getContacts())
+                            .setUnloadPhone(e.getPhone()).setUnloadCityCode(String.valueOf(e.getCityCode())).setUnloadCityName(e.getCityName())
+                            .setUnloadDetailAddress(e.getDetailAddress()).setUnloadLat(e.getLat()).setUnloadLng(e.getLng());
+                }
+                //地址信息
+                Long addressId = kwoTradeOrderAddressService.add(address);
+                //分配量信息
+                KwoTradeOrderAmount orderAmount = new KwoTradeOrderAmount();
+                orderAmount.setTOrderId(id).setAmount(e.getAmount())
+                        .setTAddressId(addressId);
+                tradeOrderAmountService.add(orderAmount);
+            });
         }
+
+        //合同信息
+        kwoTradeOrderContractService.delByOrderId(id);
+        ContractInfo contractInfo = param.getContractInfo();
+        KwoTradeOrderContract contract = BeanUtil.copyProperties(contractInfo, KwoTradeOrderContract.class);
+        if (Objects.nonNull(contract)) {
+            contract.setTOrderId(id).setTOrderNo(tOrderNo);
+            kwoTradeOrderContractService.insert(contract);
+            BeanUtil.copyProperties(contractInfo, order);
+        }
+
+        //状态信息(草稿更新不加状态记录)
+        if (!isUpdate || !Objects.equals(OrderStatusEnum.SAVED.getCode(), tradeOrder.getStatus())) {
+            KwoTradeOrderTrack track = new KwoTradeOrderTrack();
+            track.setTOrderId(id).setTOrderNo(tOrderNo).setStatus(tradeOrder.getStatus()).setRemark(tradeOrder.getRemark());
+            kwoTradeOrderTrackService.insert(track);
+        }
+        int method = isUpdate ? 2 : 1;
+        //存MongoDb
+        saveMongoDb(method, order);
     }
 
     /**
@@ -318,7 +325,7 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addValetOrderDraft(ValetOrderDraftParam param) {
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -326,7 +333,7 @@ public class KwoTradeOrderService {
                 .setUnit(Objects.nonNull(param.getGoodsInfo()) ? param.getGoodsInfo().getUnit() : null)
                 .setSource(OrderSourceEnum.SALE.getType()).setStatus(OrderStatusEnum.SAVED.getCode());
         kwoTradeOrderMapper.insert(order);
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false);
     }
 
     /**
@@ -341,12 +348,12 @@ public class KwoTradeOrderService {
         if (Objects.isNull(goodsInfo.getPriceRangeId())) {
             throw new BusinessException("采购下单价格梯度信息不能为空!");
         }
-        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        OrderCheckDTO orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, param.getUnitInfo());
         orderCheck.setGoodsId(goodsInfo.getGoodsId()).setUnitPrice(goodsInfo.getUnitPrice())
                 .setOrderSource(OrderSourceEnum.PURCHASE.getType());
         orderCheck(orderCheck, false);
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -361,7 +368,7 @@ public class KwoTradeOrderService {
             throw new BusinessException(updateResult.getMsg());
         }
         //添加订单其他信息
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false);
         //发送消息提醒
         submitOrderSendMsg(orderCheck, order.getTOrderNo());
     }
@@ -538,7 +545,7 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void addValetOrderSubmit(ValetOrderParam param) {
-        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        OrderCheckDTO orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, param.getUnitInfo());
         orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice())
                 .setOrderSource(OrderSourceEnum.SALE.getType());
@@ -546,7 +553,7 @@ public class KwoTradeOrderService {
         ContractInfo contract = param.getContractInfo();
         contractCheck(contract);
         param.setContractInfo(contract);
-        KwoTradeOrder order = BeanUtils.copyProperties(param, KwoTradeOrder.class);
+        KwoTradeOrder order = BeanUtil.copyProperties(param, KwoTradeOrder.class);
         order.setEntId(LoginUserHolder.getEntId())
                 .setTOrderNo(getOrderNo())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -575,7 +582,7 @@ public class KwoTradeOrderService {
                 throw new BusinessException(freezeResult.getMsg());
             }
         }
-        addOtherOrderInfo(order, BeanUtils.copyProperties(param, ValetOrderParam.class), false);
+        addOtherOrderInfo(order, BeanUtil.copyProperties(param, ValetOrderParam.class), false);
         //发送消息提醒
         submitOrderSendMsg(orderCheck, order.getTOrderNo());
     }
@@ -595,7 +602,7 @@ public class KwoTradeOrderService {
                 if (Boolean.FALSE.equals(RedissonUtils.tryLock(lockKey, 5L, 10L))) {
                     throw new BusinessException("业务繁忙,请稍后再试!");
                 }
-                DateTime dateTime = DateUtils.beginOfDay(date);
+                DateTime dateTime = DateUtil.beginOfDay(date);
                 String maxOrderNo = kwoTradeOrderMapper.getMaxOrderNoByDate(dateTime);
                 if (StringUtils.isNotBlank(maxOrderNo)) {
                     Long maxNum = Long.valueOf(StringUtils.subStrFromIndexToEnd(maxOrderNo, 4));
@@ -648,11 +655,11 @@ public class KwoTradeOrderService {
         List<Long> createBys = tracks.stream().map(KwoTradeOrderTrack::getCreateBy).distinct().toList();
         Map<Long, UserCacheResDto> map = remoteSystemService.queryUserCacheMapByIds(createBys);
         tracks.forEach(e -> {
-            OrderProcess process = BeanUtils.copyProperties(e, OrderProcess.class);
+            OrderProcess process = BeanUtil.copyProperties(e, OrderProcess.class);
             UserCacheResDto user = map.get(process.getCreateBy());
             if (Objects.nonNull(user)) {
                 process.setCreateByName(user.getName());
-                if (CollectionUtils.isNotEmpty(user.getRoleInfo())) {
+                if (CollUtil.isNotEmpty(user.getRoleInfo())) {
                     List<String> roleNames = user.getRoleInfo().stream().map(KwsRoleResDto::getName).distinct().toList();
                     process.setRoleName(String.join(",", roleNames));
                 }
@@ -690,7 +697,7 @@ public class KwoTradeOrderService {
         Map<String, String> unitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> taxRateMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         Map<String, String> orderUnitMap, orderAddressMap, addressMap;
-        if (CollectionUtils.isNotEmpty(dict)) {
+        if (CollUtil.isNotEmpty(dict)) {
             tradeMap = dict.get(DictTypeEnum.TRADE_TYPE.getType());
             pickupMap = dict.get(DictTypeEnum.PICKUP_TYPE.getType());
             deleveryMap = dict.get(DictTypeEnum.DELIVERY_TYPE.getType());
@@ -708,16 +715,16 @@ public class KwoTradeOrderService {
             addressMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
         }
         //订单基本信息
-        OrderDetailRes detail = BeanUtils.copyProperties(order, OrderDetailRes.class);
+        OrderDetailRes detail = BeanUtil.copyProperties(order, OrderDetailRes.class);
         UserCacheResDto createUser = remoteSystemService.queryUserCacheById(detail.getCreateBy());
         EntCacheResDto ent = remoteSystemService.queryEntCacheById(detail.getEntId());
         detail.setFirmName(Objects.isNull(ent) ? null : ent.getFirmName())
                 .setCreateByName(Objects.isNull(createUser) ? null : createUser.getName())
-                .setTradingLabel(CollectionUtils.isNotEmpty(tradeMap) ? tradeMap.get(detail.getTrading()) : null)
-                .setPickupTypeLabel(CollectionUtils.isNotEmpty(pickupMap) ? pickupMap.get(detail.getPickupType()) : null)
-                .setDeliveryTypeLabel(CollectionUtils.isNotEmpty(deleveryMap) ? deleveryMap.get(detail.getDeliveryType()) : null)
-                .setSourceLabel(CollectionUtils.isNotEmpty(sourceMap) ? sourceMap.get(detail.getSource()) : null)
-                .setStatusLabel(CollectionUtils.isNotEmpty(statusMap) ? statusMap.get(String.valueOf(detail.getStatus())) : null);
+                .setTradingLabel(CollUtil.isNotEmpty(tradeMap) ? tradeMap.get(detail.getTrading()) : null)
+                .setPickupTypeLabel(CollUtil.isNotEmpty(pickupMap) ? pickupMap.get(detail.getPickupType()) : null)
+                .setDeliveryTypeLabel(CollUtil.isNotEmpty(deleveryMap) ? deleveryMap.get(detail.getDeliveryType()) : null)
+                .setSourceLabel(CollUtil.isNotEmpty(sourceMap) ? sourceMap.get(detail.getSource()) : null)
+                .setStatusLabel(CollUtil.isNotEmpty(statusMap) ? statusMap.get(String.valueOf(detail.getStatus())) : null);
         //商品信息
         KwoTradeOrderGoods orderGoods = kwoTradeOrderGoodsService.getByOrderId(id);
         if (Objects.nonNull(orderGoods)) {
@@ -725,9 +732,9 @@ public class KwoTradeOrderService {
             if (Objects.nonNull(goods)) {
                 EntCacheResDto entCache = remoteSystemService.queryEntCacheById(goods.getEntId());
                 GoodsInfoDetailRes goodsDetail = new GoodsInfoDetailRes();
-                goodsDetail.setGoodsTypeLabel(CollectionUtils.isNotEmpty(prodcutNameMap) ? prodcutNameMap.get(goods.getGoodsType()) : null)
-                        .setUnitLabel(CollectionUtils.isNotEmpty(unitMap) ? unitMap.get(goods.getUnit()) : null)
-                        .setTaxRateLabel(CollectionUtils.isNotEmpty(taxRateMap) ? taxRateMap.get(goods.getTaxRate()) : null)
+                goodsDetail.setGoodsTypeLabel(CollUtil.isNotEmpty(prodcutNameMap) ? prodcutNameMap.get(goods.getGoodsType()) : null)
+                        .setUnitLabel(CollUtil.isNotEmpty(unitMap) ? unitMap.get(goods.getUnit()) : null)
+                        .setTaxRateLabel(CollUtil.isNotEmpty(taxRateMap) ? taxRateMap.get(goods.getTaxRate()) : null)
                         .setGoodsAmount(goods.getAmount())
                         .setGoodsId(goods.getId()).setCode(goods.getCode()).setName(goods.getName())
                         .setGoodsType(goods.getGoodsType()).setTaxRate(goods.getTaxRate()).setSpec(goods.getSpec())
@@ -739,11 +746,11 @@ public class KwoTradeOrderService {
 
                 //商品辅助单位信息
                 List<GoodsUnitDetailRes> assistUnit = kwoTradeOrderGoodsUnitService.findGoodsUnitDetail(id);
-                if (CollectionUtils.isNotEmpty(assistUnit)) {
+                if (CollUtil.isNotEmpty(assistUnit)) {
                     Map<String, String> finalUnitMap = unitMap;
                     assistUnit.forEach(e -> {
-                        e.setFromUnitName(CollectionUtils.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getFromUnit()) : null);
-                        e.setToUnitName(CollectionUtils.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getToUnit()) : null);
+                        e.setFromUnitName(CollUtil.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getFromUnit()) : null);
+                        e.setToUnitName(CollUtil.isNotEmpty(finalUnitMap) ? finalUnitMap.get(e.getToUnit()) : null);
                     });
                 }
                 detail.setAssistUnit(assistUnit);
@@ -752,26 +759,26 @@ public class KwoTradeOrderService {
 
         //单位信息
         List<KwoTradeOrderUnit> units = kwoTradeOrderUnitService.getByOrderId(id);
-        if (CollectionUtils.isNotEmpty(units)) {
+        if (CollUtil.isNotEmpty(units)) {
             List<UnitInfoDetailRes> unitInfos = new ArrayList<>(units.size());
             units.forEach(e -> {
-                UnitInfoDetailRes unit = BeanUtils.copyProperties(e, UnitInfoDetailRes.class);
-                unit.setUnitTypeLabel(CollectionUtils.isNotEmpty(orderUnitMap) ? orderUnitMap.get(unit.getUnitType()) : null);
+                UnitInfoDetailRes unit = BeanUtil.copyProperties(e, UnitInfoDetailRes.class);
+                unit.setUnitTypeLabel(CollUtil.isNotEmpty(orderUnitMap) ? orderUnitMap.get(unit.getUnitType()) : null);
                 unitInfos.add(unit);
             });
             detail.setUnitInfo(unitInfos);
         }
         //地址信息
         List<KwoTradeOrderAddress> addressList = kwoTradeOrderAddressService.getByOrderId(id);
-        if (CollectionUtils.isNotEmpty(addressList)) {
+        if (CollUtil.isNotEmpty(addressList)) {
             //分配量信息
             List<KwoTradeOrderAmount> amountList = tradeOrderAmountService.getByOrderId(id);
             Map<Long, KwoTradeOrderAmount> amountMap = amountList.stream().collect(Collectors.toMap(KwoTradeOrderAmount::getTAddressId, e -> e, (k1, k2) -> k1));
             List<AddressInfoDetailRes> addressInfoDetails = new ArrayList<>(addressList.size());
             addressList.forEach(e -> {
-                AddressInfoDetailRes address = BeanUtils.copyProperties(e, AddressInfoDetailRes.class);
-                address.setAddressTypeLabel(CollectionUtils.isNotEmpty(orderAddressMap) ? orderAddressMap.get(address.getAddressType()) : null);
-                address.setTypeLabel(CollectionUtils.isNotEmpty(addressMap) ? addressMap.get(address.getType()) : null);
+                AddressInfoDetailRes address = BeanUtil.copyProperties(e, AddressInfoDetailRes.class);
+                address.setAddressTypeLabel(CollUtil.isNotEmpty(orderAddressMap) ? orderAddressMap.get(address.getAddressType()) : null);
+                address.setTypeLabel(CollUtil.isNotEmpty(addressMap) ? addressMap.get(address.getType()) : null);
                 KwoTradeOrderAmount orderAmount = amountMap.get(e.getId());
                 if (Objects.nonNull(orderAmount)) {
                     address.setAmount(orderAmount.getAmount());
@@ -783,7 +790,7 @@ public class KwoTradeOrderService {
         //合同信息
         KwoTradeOrderContract contract = kwoTradeOrderContractService.getByOrderId(id);
         if (Objects.nonNull(contract)) {
-            ContractInfo contractInfo = BeanUtils.copyProperties(contract, ContractInfo.class);
+            ContractInfo contractInfo = BeanUtil.copyProperties(contract, ContractInfo.class);
             Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(List.of(contractInfo.getContractId()));
             ContractCommonInfoResDto contractRes = contractMap.get(contractInfo.getContractId());
             if (Objects.nonNull(contractRes)) {
@@ -839,7 +846,7 @@ public class KwoTradeOrderService {
                     throw new BusinessException("Invalid contract status");
                 }
             }
-            orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+            orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
             getTopEnt(orderCheck, param.getUnitInfo());
             orderCheck.setGoodsId(param.getGoodsInfo().getGoodsId()).setUnitPrice(param.getGoodsInfo().getUnitPrice())
                     .setOrderSource(source);
@@ -877,7 +884,7 @@ public class KwoTradeOrderService {
                 .set(KwoTradeOrder::getStatus, order.getStatus())
                 .eq(KwoTradeOrder::getId, order.getId());
         kwoTradeOrderMapper.update(null, wrapper);
-        ValetOrderParam valetOrderParam = BeanUtils.copyProperties(param, ValetOrderParam.class);
+        ValetOrderParam valetOrderParam = BeanUtil.copyProperties(param, ValetOrderParam.class);
 
         addOtherOrderInfo(order, valetOrderParam, true);
         //订单提交发送提醒消息
@@ -1006,6 +1013,23 @@ public class KwoTradeOrderService {
      * @return: void
      */
     public void acceptanceOrder(AcceptanceOrderParam param) {
+        BigDecimal amount = param.getAmount();
+        List<UpdateAddressAmountParam> addressAmountParams = param.getAddressAmountParams();
+        BigDecimal totalLoadAmount = addressAmountParams.stream()
+                .map(UpdateAddressAmountParam::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (amount.compareTo(totalLoadAmount) != 0) {
+            throw new BusinessException("分配卸货量总量与订单总量不相符!");
+        }
+        List<AddressInfo> loadAddressInfo = param.getAddressInfo();
+        long unloadCount = loadAddressInfo.stream().filter(e -> Objects.equals(OrderAddressTypeEnum.UNLOAD.getType(), e.getAddressType())).count();
+        if (unloadCount > 0) {
+            throw new BusinessException("装货地址类型信息有误!");
+        }
+        BigDecimal totalUnLoadAmount = loadAddressInfo.stream()
+                .map(AddressInfo::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+        if (amount.compareTo(totalUnLoadAmount) != 0) {
+            throw new BusinessException("分配装货量总量与订单总量不相符!");
+        }
         if (param.getPrice().compareTo(param.getUnitPrice().multiply(param.getAmount())) != 0) {
             throw new BusinessException("订单总金额不等于商品单价*订单总量!");
         }
@@ -1023,16 +1047,31 @@ public class KwoTradeOrderService {
         if (Objects.isNull(goods)) {
             throw new BusinessException("订单商品信息异常!");
         }
-        //受理订单总量-原订单总量=订单变化量
         List<KwoTradeOrderUnit> units = kwoTradeOrderUnitService.getByOrderId(order.getId());
-        List<UnitInfo> unitInfos = BeanUtils.copyToList(units, UnitInfo.class);
+        Long saleUnitId = param.getSaleUnitParam().getId();
+        KwoTradeOrderUnit saleUnit = units.stream().filter(e -> Objects.equals(e.getId(), saleUnitId) &&
+                Objects.equals(e.getUnitType(), OrderUnitTypeEnum.SALE.getType())).findFirst().orElse(null);
+        if (Objects.isNull(saleUnit)) {
+            throw new BusinessException("我方单位信息异常!");
+        }
+        Long contactsId = param.getSaleUnitParam().getContactsId();
+        boolean updateUnit = !Objects.equals(contactsId, saleUnit.getContactsId());
+        if (updateUnit) {
+            UserCacheResDto contactsInfo = remoteSystemService.queryUserCacheById(contactsId);
+            if (Objects.isNull(contactsInfo)) {
+                throw new BusinessException("未查询到我方联系人信息");
+            }
+            saleUnit.setContactsId(contactsId).setContacts(contactsInfo.getName()).setPhone(contactsInfo.getPhone());
+        }
+        List<UnitInfo> unitInfos = BeanUtil.copyToList(units, UnitInfo.class);
         if (CollectionUtils.isEmpty(unitInfos)) {
             throw new BusinessException("订单企业信息异常!");
         }
-        BigDecimal amount = param.getAmount().subtract(order.getAmount());
-        OrderCheckDTO orderCheck = BeanUtils.copyProperties(param, OrderCheckDTO.class);
+        //受理订单总量-原订单总量=订单变化量
+        BigDecimal changeAmount = amount.subtract(order.getAmount());
+        OrderCheckDTO orderCheck = BeanUtil.copyProperties(param, OrderCheckDTO.class);
         getTopEnt(orderCheck, unitInfos);
-        orderCheck.setGoodsId(goods.getGoodsId()).setAmount(amount);
+        orderCheck.setGoodsId(goods.getGoodsId()).setAmount(changeAmount);
         orderCheck(orderCheck, true);
         //冻结金额
         if (param.getTrading().startsWith("1")) {
@@ -1043,7 +1082,7 @@ public class KwoTradeOrderService {
             }
         }
         //更新订单信息
-        BeanUtils.copyProperties(param, order);
+        BeanUtil.copyProperties(param, order);
         ContractInfo contractInfo = param.getContractInfo();
         contractCheck(contractInfo);
         String contractStatus = contractInfo.getContractStatus();
@@ -1059,8 +1098,32 @@ public class KwoTradeOrderService {
         kwoTradeOrderMapper.updateById(order);
         //更新商品价格
         kwoTradeOrderGoodsService.updateUnitPrice(param.getId(), param.getUnitPrice());
+        //更新单位信息
+        if (updateUnit) {
+            kwoTradeOrderUnitService.updateById(saleUnit);
+        }
+        //更新装货地址信息
+        List<Long> oldLoadAddressIds = kwoTradeOrderAddressService.getByOrderIdAndType(param.getId(), OrderAddressTypeEnum.LOAD.getType())
+                .stream().map(KwoTradeOrderAddress::getId).toList();
+        if (CollUtil.isNotEmpty(oldLoadAddressIds)) {
+            kwoTradeOrderAddressService.delByIds(oldLoadAddressIds);
+            tradeOrderAmountService.delByOrderIdAndAddressIds(param.getId(), oldLoadAddressIds);
+        }
+        loadAddressInfo.forEach(e -> {
+            KwoTradeOrderAddress address = BeanUtil.copyProperties(e, KwoTradeOrderAddress.class);
+            address.setTOrderId(param.getId()).setTOrderNo(order.getTOrderNo());
+            //地址信息
+            Long addressId = kwoTradeOrderAddressService.add(address);
+            //分配量信息
+            KwoTradeOrderAmount orderAmount = new KwoTradeOrderAmount();
+            orderAmount.setTOrderId(param.getId()).setAmount(e.getAmount())
+                    .setTAddressId(addressId);
+            tradeOrderAmountService.add(orderAmount);
+        });
+        //更新卸货地址分配量信息
+        addressAmountParams.forEach(tradeOrderAmountService::update);
         //保存合同信息
-        KwoTradeOrderContract tradeOrderContract = BeanUtils.copyProperties(contractInfo, KwoTradeOrderContract.class);
+        KwoTradeOrderContract tradeOrderContract = BeanUtil.copyProperties(contractInfo, KwoTradeOrderContract.class);
         tradeOrderContract.setTOrderId(order.getId()).setTOrderNo(order.getTOrderNo());
         kwoTradeOrderContractService.insert(tradeOrderContract);
         //订单状态记录
@@ -1075,7 +1138,7 @@ public class KwoTradeOrderService {
             }
         }
         //更新mongodb
-        SckwTradeOrder updateParam = BeanUtils.copyProperties(param, SckwTradeOrder.class);
+        SckwTradeOrder updateParam = BeanUtil.copyProperties(param, SckwTradeOrder.class);
         updateParam.setTOrderId(param.getId())
                 .setStatus(order.getStatus())
                 .setStartTime(DateUtils.localDateToDateStart(param.getStartTime()))
@@ -1264,12 +1327,12 @@ public class KwoTradeOrderService {
         LambdaQueryWrapper<KwoTradeOrder> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(KwoTradeOrder::getId, ids).ne(KwoTradeOrder::getStatus, 0).eq(KwoTradeOrder::getDelFlag, Global.NO);
         List<KwoTradeOrder> list = kwoTradeOrderMapper.selectList(wrapper);
-        if (CollectionUtils.isNotEmpty(list)) {
+        if (CollUtil.isNotEmpty(list)) {
             throw new BusinessException("删除操作仅针对“已保存”状态的订单");
         }
         //排除草稿状态权限匹配
         List<Long> filterIds = list.stream().filter(e -> !(Objects.equals(e.getStatus(), 0))).map(KwoTradeOrder::getId).toList();
-        if (CollectionUtils.isNotEmpty(filterIds) &&
+        if (CollUtil.isNotEmpty(filterIds) &&
                 kwoTradeOrderUnitService.entBatchMatch(filterIds, LoginUserHolder.getEntId(), String.valueOf(param.getOrderType()))) {
             throw new BusinessException("无订单操作权限!");
         }
@@ -1328,7 +1391,7 @@ public class KwoTradeOrderService {
         wrapper.eq(KwoTradeOrder::getStatus, OrderStatusEnum.WAIT_SIGNED.getCode())
                 .in(KwoTradeOrder::getId, tOrderIds).eq(KwoTradeOrder::getDelFlag, Global.NO);
         List<KwoTradeOrder> list = kwoTradeOrderMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     /**
@@ -1390,7 +1453,7 @@ public class KwoTradeOrderService {
         wrapper.in(KwoTradeOrder::getId, tOrderIds).eq(KwoTradeOrder::getDelFlag, Global.NO)
                 .in(KwoTradeOrder::getStatus, 1, 2, 3, 4);
         List<KwoTradeOrder> list = kwoTradeOrderMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     /**
@@ -1413,7 +1476,7 @@ public class KwoTradeOrderService {
      */
     public List<WbTOrderExcelStsResDTO> workbenchExcel(WbTOrderExcelStsReqDTO reqDTO) {
         List<WbTOrderExcelStsResDTO> list = kwoTradeOrderMapper.workbenchExcel(reqDTO);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     /**
@@ -1431,27 +1494,27 @@ public class KwoTradeOrderService {
 
         //商品辅助单位
         List<GoodsUnitDetailRes> assistUnit = kwoTradeOrderGoodsUnitService.findGoodsUnitDetail(tOrderId);
-        if (CollectionUtils.isNotEmpty(assistUnit)) {
+        if (CollUtil.isNotEmpty(assistUnit)) {
             assistUnit.forEach(e -> {
                 unitDetails.add(new GoodsUnitRes(e.getToUnit(), null, false));
             });
         }
 
         //数据组装
-        if (CollectionUtils.isNotEmpty(unitDetails)) {
+        if (CollUtil.isNotEmpty(unitDetails)) {
             //货物单位与合理损耗单位
             List<SysDictResDto> dicts = remoteSystemService.queryDictByType(DictTypeEnum.UNIT_LOSS_TYPE.getType());
             //单位
             Map<String, Map<String, String>> dict = remoteSystemService.queryDictByType(List.of(DictTypeEnum.UNIT_TYPE.getType()));
             Map<String, String> unitMap = new HashMap<>(Global.NUMERICAL_SIXTEEN);
-            if (CollectionUtils.isNotEmpty(dict)) {
+            if (CollUtil.isNotEmpty(dict)) {
                 unitMap = dict.get(DictTypeEnum.UNIT_TYPE.getType());
             }
             Map<String, String> finalUnitMap = unitMap;
             unitDetails.forEach(e -> {
                 e.setLabel(finalUnitMap != null ? finalUnitMap.get(e.getValue()) : null);
                 //组装合理损耗
-                if (CollectionUtils.isNotEmpty(dicts)) {
+                if (CollUtil.isNotEmpty(dicts)) {
                     for (SysDictResDto ee : dicts)
                         if (ee.getParentId().equals((long) NumberConstant.ZERO)) {
                             if (ee.getValue().equals(e.getValue())) {
@@ -1475,9 +1538,9 @@ public class KwoTradeOrderService {
     }
 
     /**
-     * @desc 根据id获取地址信息
      * @param id
      * @return com.sckw.order.model.vo.res.OrderAddressInfoRes
+     * @desc 根据id获取地址信息
      * @author yzc
      * @date 2024/3/5 15:50
      */
@@ -1503,4 +1566,43 @@ public class KwoTradeOrderService {
                 .setUnloadDetailAddressList(unloadDetailAddressList);
         return res;
     }
+
+    public PageResult tradeOrderSelect(TradeOrderListSelectParam params) {
+        TradeOrderListSelectDTO dto = BeanUtil.copyProperties(params, TradeOrderListSelectDTO.class);
+        dto.setEntId(LoginUserHolder.getEntId())
+                .setUserId(LoginUserHolder.getUserId())
+                .setIsMain(LoginUserHolder.getIsMain())
+                .setAuthUserIdList(LoginUserHolder.getAuthUserIdList());
+        //装卸货地址
+        String loadCode = params.getShippingAddressCode();
+        if (StringUtils.isNotBlank(loadCode)) {
+            switch (params.getShippingAddressLevel()) {
+                case 1 -> dto.setLoadAddressCode(
+                        loadCode.substring(0, 2).trim());
+                case 2 -> dto.setLoadAddressCode(
+                        loadCode.substring(0, 4).trim());
+                case 3 -> dto.setLoadAddressCode(loadCode);
+            }
+        }
+        String unloadCode = params.getUnloadingAddressCode();
+        if (StringUtils.isNotBlank(unloadCode)) {
+            switch (params.getUnloadingAddressLevel()) {
+                case 1 -> dto.setUnloadAddressCode(
+                        loadCode.substring(0, 2).trim());
+                case 2 -> dto.setUnloadAddressCode(
+                        loadCode.substring(0, 4).trim());
+                case 3 -> dto.setUnloadAddressCode(loadCode);
+            }
+        }
+        String keywords = params.getKeywords();
+        if (StringUtils.isNotBlank(keywords)) {
+            List<Long> goodIds = goodsInfoService.selectIdsLikeGoodsName(keywords);
+            if (CollUtil.isNotEmpty(goodIds)) {
+                dto.setGoodsIds(goodIds);
+            }
+        }
+        PageHelper.startPage(params.getPage(), params.getPageSize());
+        List<OrderListResVO> result = kwoTradeOrderMapper.tradeOrderSelect(dto);
+        return null;
+    }
 }

+ 4 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderUnitService.java

@@ -153,4 +153,8 @@ public class KwoTradeOrderUnitService {
         });
         return orderIds;
     }
+
+    public void updateById(KwoTradeOrderUnit unit) {
+        kwoTradeOrderUnitMapper.updateById(unit);
+    }
 }

+ 220 - 0
sckw-modules/sckw-order/src/main/resources/mapper/KwoTradeOrderMapper.xml

@@ -2,6 +2,226 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sckw.order.dao.KwoTradeOrderMapper">
 
+    <sql id="New_Query_Column_List">
+        tOrderId,
+        status,
+        tOrderNo,
+        procureEntId,
+        procureFirmName,
+        supplyEntId,
+        supplyFirmName,
+        trading,
+        deliveryType,
+        pickupType,
+        source,
+        contractId,
+        contractNo,
+        goodsId,
+        unitPrice,
+        price,
+        amount,
+        entrustAmount,
+        waitEntrustAmount,
+        actualAmount,
+        actualPrice,
+        loadName,
+        loadType,
+        loadCityName,
+        loadCityCode,
+        loadAddress,
+        shipmentsContacts,
+        shipmentsPhone,
+        loadLat,
+        loadLng,
+        unloadName,
+        unloadType,
+        unloadCityName,
+        unloadCityCode,
+        unloadAddress,
+        unloadLat,
+        unloadLng,
+        contract,
+        createType
+    </sql>
+
+    <sql id="Query_Column_List_Accept_Carriage">
+        a.id                                                AS lOrderId,
+        a.l_order_no                                        AS lOrderNo,
+        a.t_order_id                                        AS tOrderId,
+        a.t_order_no                                        AS tOrderNo,
+        a.loss                                              AS loss,
+        a.loss_unit                                         AS lossUnit,
+        a.settlement_cycle                                  AS accountsCycle,
+        a.billing_mode                                      AS billingMode,
+        a.amount                                            AS carryingCapacity,
+        a.goods_price                                       AS goodsPrice,
+        a.goods_price_unit                                  AS goodsPriceUnit,
+        a.`status`                                          AS status,
+        a.settlement_cycle                                  AS settlementCycle,
+        a.price                                             AS price,
+        a.price_type                                        AS priceType,
+        a.type                                              AS orderSource,
+        a.unit                                              AS unit,
+        a.subcontract_amount                                AS subcontractAmount,
+        a.entrust_amount                                    AS entrustAmount,
+        a.unload_amount                                     AS unloadAmount,
+        a.load_amount                                       AS loadAmount,
+        a.ignore_amount                                     AS ignoreAmount,
+        a.deficit_amount                                    AS deficitAmount,
+        a.deficit_price                                     AS deficitPrice,
+        a.total_load_amount                                 AS totalLoadAmount,
+        a.total_unload_amount                               AS totalUnloadAmount,
+        a.payment                                           AS payment,
+        a.tax_rate                                          AS taxRate,
+        a.ent_id                                            AS entId,
+        a.create_by                                         AS createBy,
+        a.create_time                                       AS createTime,
+        a.update_by                                         AS updateBy,
+        a.update_time                                       AS updateTime,
+        a.start_time                                        AS shipmentsDateTime,
+        a.end_time                                          AS receiveGoodsDateTime,
+        a.remark                                            AS remark,
+        g.goods_id                                          AS goodsId,
+        g.goods_name                                        AS goodsName,
+        g.goods_type                                        AS goodsType,
+        f.contract_id                                       AS contractId,
+        f.contract_no                                       AS contractNo,
+        f.signing_way                                       AS signing,
+        d.ent_id                                            AS consignCompanyId,
+        d.top_ent_id                                        AS consignTopEntId,
+        d.firm_name                                         AS consignCompany,
+        d.contacts                                          AS consignContacts,
+        d.contacts_id                                       AS consignContactsId,
+        e.contacts_id                                       AS carrierContactsId,
+        d.phone                                             AS consignPhone,
+        e.ent_id                                            AS carrierCompanyId,
+        e.firm_name                                         AS carrierCompany,
+        e.top_ent_id                                        AS carrierTopEntId,
+        e.contacts                                          AS carrierContacts,
+        e.phone                                             AS carrierPhone,
+        b.`name`                                            AS loadName,
+        b.address_type                                      AS loadType,
+        b.city_name                                         AS loadCityName,
+        b.city_code                                         AS loadCityCode,
+        b.detail_address                                    AS loadAddress,
+        b.contacts                                          AS shipmentsContacts,
+        b.phone                                             AS shipmentsPhone,
+        b.lat                                               AS loadLat,
+        b.lng                                               AS loadLng,
+        c.`name`                                            AS unloadName,
+        c.address_type                                      AS unloadType,
+        c.contacts                                          AS receiveGoodsContacts,
+        c.phone                                             AS receiveGoodsPhone,
+        c.city_name                                         AS unloadCityName,
+        c.city_code                                         AS unloadCityCode,
+        c.detail_address                                    AS unloadAddress,
+        c.lat                                               AS unloadLat,
+        c.lng                                               AS unloadLng,
+        f.contract_name                                     as contract
+                ,
+        a.del_flag                                          as delFlag,
+        case when a.ent_id = e.top_ent_id then 1 ELSE 2 end as createType
+    </sql>
+
+    <select id="tradeOrderSelect"
+            resultType="com.sckw.order.model.vo.res.OrderListResVO">
+        SELECT
+        <include refid="New_Query_Column_List">
+        </include>
+        FROM (
+        SELECT
+        <include refid="Query_Column_List_Accept_Carriage">
+        </include>
+        FROM kwo_trade_order a
+        LEFT JOIN kwo_trade_order_address b ON a.id = b.t_order_id
+        AND b.address_type = "1" AND b.del_flag = 0
+        LEFT JOIN kwo_trade_order_address c ON a.id = c.t_order_id
+        AND c.address_type = "2" AND c.del_flag = 0
+        LEFT JOIN kwo_trade_order_unit d ON a.id = d.t_order_id
+        AND d.unit_type = "1" AND d.del_flag = 0
+        LEFT JOIN kwo_trade_order_unit e ON a.id = e.t_order_id
+        AND e.unit_type = "2" AND e.del_flag = 0
+        LEFT JOIN kwo_trade_order_goods g ON a.id = g.t_order_id AND g.del_flag = 0
+        LEFT JOIN kwo_trade_order_unit f ON a.id = f.t_order_id AND f.del_flag = 0
+        <where>
+            a.del_flag = 0
+            <if test="query.keywords != null and query.keywords != ''">
+                and (
+                a.t_order_no like concat('%', #{query.keywords}, '%')
+                or a.l_order_no like concat('%', #{query.keywords}, '%')
+                or d.firm_name like concat('%', #{query.keywords}, '%')
+                or e.firm_name like concat('%', #{query.keywords}, '%')
+                or g.goods_name like concat('%', #{query.keywords}, '%'))
+            </if>
+            <if test="orderList != null and orderList.size() > 0">
+                and a.status in
+                <foreach collection="orderList" item="status" open="(" close=")" separator=",">
+                    #{status}
+                </foreach>
+            </if>
+            <if test="idsList != null and idsList.size() > 0">
+                and a.id in
+                <foreach collection="idsList" close=")" open="(" separator="," item="item">
+                    #{item}
+                </foreach>
+            </if>
+            <if test="query.endBeginDateTime != null and query.endBeginDateTime != ''">
+                and DATE ( a.end_time) <![CDATA[ >= ]]> #{query.endBeginDateTime}
+            </if>
+            <if test="query.endOverDateTime != null and query.endOverDateTime != ''">
+                and DATE ( a.end_time ) <![CDATA[ <= ]]> #{query.endOverDateTime}
+            </if>
+            <if test="query.startBeginDateTime != null and query.startBeginDateTime != ''">
+                and DATE ( a.start_time) <![CDATA[ >= ]]> #{query.startBeginDateTime}
+            </if>
+            <if test="query.startOverDateTime != null and query.startOverDateTime != ''">
+                and DATE ( a.start_time ) <![CDATA[ <= ]]> #{query.startOverDateTime}
+            </if>
+            <if test="query.createStartTime != null and query.createStartTime != ''">
+                and a.create_time &gt;=#{query.createStartTime}
+            </if>
+            <if test="query.createEndTime != null and query.createEndTime != ''">
+                and a.create_time &lt;=#{query.createEndTime}
+            </if>
+            <if test="query.loadAddressCode != null and query.loadAddressCode != ''">
+                and b.city_code LIKE CONCAT(#{query.loadAddressCode}
+                , '%')
+            </if>
+            <if test="query.unloadAddressCode != null and query.unloadAddressCode != ''">
+                and c.city_code LIKE CONCAT(#{query.unloadAddressCode}
+                , '%')
+            </if>
+            <if test="query.billingMode != null and query.billingMode != ''">
+                and a.billing_mode =#{query.billingMode}
+            </if>
+        </where>
+        ORDER BY a.create_time DESC
+        ) tab
+        <where>
+            tab.delFlag = 0
+            AND ((
+            tab.createType = 1
+            <if test="entId != null">
+                and tab.entId = #{entId}
+            </if>
+            <if test="userIds != null and userIds.size() > 0">
+                AND tab.createBy IN
+                <foreach collection="userIds" open="(" close=")" item="item" separator=",">
+                    #{item}
+                </foreach>
+            </if>
+            )
+            OR (
+            tab.carrierTopEntId = #{entId}
+            <if test="contactsIds != null and contactsIds.size() > 0">
+                AND tab.carrierContactsId IN
+                <foreach collection="contactsIds" separator="," item="item" close=")" open="(">
+                    #{item}
+                </foreach>
+            </if>
+            ))
+        </where>
+    </select>
 
     <select id="getMaxOrderNoByDate" resultType="java.lang.String">
         SELECT MAX(t_order_no)

+ 7 - 0
sckw-modules/sckw-product/src/main/java/com/sckw/product/dubbo/GoodsInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.sckw.product.dubbo;
 
+import cn.hutool.core.collection.CollUtil;
 import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.web.response.HttpResult;
@@ -94,4 +95,10 @@ public class GoodsInfoServiceImpl implements GoodsInfoService {
     public KwpGoods getGoodsByGoodsName(String goodsName) {
         return kwpGoodsService.getGoodsByGoodsName(goodsName);
     }
+
+    @Override
+    public List<Long> selectIdsLikeGoodsName(String name) {
+        List<Long> ids = kwpGoodsService.selectIdsLikeGoodsName(name);
+        return CollUtil.emptyIfNull(ids);
+    }
 }

+ 12 - 1
sckw-modules/sckw-product/src/main/java/com/sckw/product/service/KwpGoodsService.java

@@ -1,5 +1,6 @@
 package com.sckw.product.service;
 
+import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -1296,7 +1297,7 @@ public class KwpGoodsService {
                 .orderByDesc(KwpGoods::getCreateTime)
                 .last("LIMIT 10");
         List<KwpGoods> list = kwpGoodsMapper.selectList(wrapper);
-        return CollectionUtils.emptyIfNull(list);
+        return CollUtil.emptyIfNull(list);
     }
 
     public com.sckw.product.api.model.KwpGoods getGoodsByGoodsName(String goodsName) {
@@ -1312,4 +1313,14 @@ public class KwpGoodsService {
         }
         return goods;
     }
+
+    public List<Long> selectIdsLikeGoodsName(String name) {
+        LambdaQueryWrapper<KwpGoods> wrapper = new LambdaQueryWrapper<>();
+        wrapper.like(KwpGoods::getName, name);
+        List<KwpGoods> list = kwpGoodsMapper.selectList(wrapper);
+        if (CollUtil.isEmpty(list)){
+            return Collections.emptyList();
+        }
+        return list.stream().map(KwpGoods::getId).toList();
+    }
 }