浏览代码

1.调试航线成本费用模板导入
2.调试航线成本COC接口
3.箱档案表结构修改
4.场站增加港口字段
5.买、卖、租、代理箱表结构修改
6.航线成本计算公式逻辑修改

纪新园 1 年之前
父节点
当前提交
a238a1b99c
共有 35 个文件被更改,包括 1443 次插入267 次删除
  1. 117 24
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/Archives.java
  2. 122 68
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBox.java
  3. 17 0
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxFees.java
  4. 110 23
      blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxItem.java
  5. 34 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/dto/FeesTemplateSonItemsDTO.java
  6. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/entity/FeesTemplateItems.java
  7. 159 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/entity/FeesTemplateSonItems.java
  8. 38 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/entity/LosBFeesTemplate.java
  9. 36 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/vo/FeesTemplateSonItemsVO.java
  10. 20 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/locations/entity/BLocations.java
  11. 57 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCost.java
  12. 20 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCostItem.java
  13. 2 2
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/BoxDataAnalysisController.java
  14. 1 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TradingBoxItemController.java
  15. 1 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TransportItemController.java
  16. 17 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/mapper/ArchivesMapper.xml
  17. 15 0
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/mapper/TradingBoxItemMapper.xml
  18. 17 2
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/mapper/TradingBoxMapper.xml
  19. 6 6
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/ArchivesServiceImpl.java
  20. 1 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/RepairServiceImpl.java
  21. 6 6
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java
  22. 2 2
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransferServiceImpl.java
  23. 1 1
      blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java
  24. 14 4
      blade-service/blade-los/src/main/java/org/springblade/los/Util/BigDecimalUtils.java
  25. 126 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/controller/FeesTemplateSonItemsController.java
  26. 11 1
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/controller/LosBFeesTemplateController.java
  27. 42 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/mapper/FeesTemplateSonItemsMapper.java
  28. 37 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/mapper/FeesTemplateSonItemsMapper.xml
  29. 41 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/IFeesTemplateSonItemsService.java
  30. 41 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/impl/FeesTemplateSonItemsServiceImpl.java
  31. 68 2
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/impl/LosBFeesTemplateServiceImpl.java
  32. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/basic/locations/mapper/LocationsMapper.xml
  33. 43 1
      blade-service/blade-los/src/main/java/org/springblade/los/basic/units/controller/BUnitsController.java
  34. 11 11
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java
  35. 201 110
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostServiceImpl.java

+ 117 - 24
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/Archives.java

@@ -117,15 +117,25 @@ public class Archives implements Serializable {
 	@ApiModelProperty(value = "分类id")
 	private Long typeId;
 	/**
-	 * 最新地点id
+	 * 港口id
 	 */
-	@ApiModelProperty(value = "最新地点id")
+	@ApiModelProperty(value = "港口id")
 	private Long addressId;
 	/**
-	 * 最新地点
+	 * 港口编码
 	 */
-	@ApiModelProperty(value = "最新地点")
-	private String address;
+	@ApiModelProperty(value = "港口编码")
+	private String addressCode;
+	/**
+	 * 港口中文
+	 */
+	@ApiModelProperty(value = "港口中文")
+	private String addressCname;
+	/**
+	 * 港口英文
+	 */
+	@ApiModelProperty(value = "港口英文")
+	private String addressEname;
 	/**
 	 * 最新日期
 	 */
@@ -133,12 +143,6 @@ public class Archives implements Serializable {
 	private Date newDate;
 
 	/**
-	 * 最新日期(开始-结束)
-	 */
-	@TableField(exist = false)
-	private List<String> newDateList;
-
-	/**
 	 * 租赁公司ID
 	 */
 	@ApiModelProperty(value = "租赁公司ID")
@@ -195,25 +199,12 @@ public class Archives implements Serializable {
 	private Date boxMakingDate;
 
 	/**
-	 * 造箱日期(开始-结束)
-	 */
-	@TableField(exist = false)
-	private List<String> boxMakingDateList;
-
-
-	/**
 	 * 起租日期
 	 */
 	@ApiModelProperty(value = "起租日期")
 	private Date leaseCommencementDate;
 
 	/**
-	 * 起租日期(开始-结束)
-	 */
-	@TableField(exist = false)
-	private List<String> leaseCommencementDateList;
-
-	/**
 	 * 购入日期
 	 */
 	@ApiModelProperty(value = "购入日期")
@@ -240,6 +231,91 @@ public class Archives implements Serializable {
 	@ApiModelProperty(value = "箱出入场状态")
 	private String boxAccessStatus;
 
+	/**
+	 * 放箱号
+	 */
+	@ApiModelProperty(value = "放箱号")
+	private String containerNumber;
+
+	/**
+	 * 箱属
+	 */
+	@ApiModelProperty(value = "箱属")
+	private String boxBelongsTo;
+
+	/**
+	 * 箱种类
+	 */
+	@ApiModelProperty(value = "箱种类")
+	private String boxType;
+
+	/**
+	 * 箱东
+	 */
+	@ApiModelProperty(value = "箱东")
+	private String boxEast;
+
+	/**
+	 * 原箱东
+	 */
+	@ApiModelProperty(value = "原箱东")
+	private String originalBoxEast;
+
+	/**
+	 * 场站
+	 */
+	@ApiModelProperty(value = "场站")
+	private String stationId;
+
+	/**
+	 * 场站编码
+	 */
+	@ApiModelProperty(value = "场站编码")
+	private String stationCode;
+
+	/**
+	 * 场站中文
+	 */
+	@ApiModelProperty(value = "场站中文")
+	private String stationCname;
+
+	/**
+	 * 场站英文
+	 */
+	@ApiModelProperty(value = "场站英文")
+	private String stationEname;
+
+	/**
+	 * 限制港口
+	 */
+	@ApiModelProperty(value = "限制港口")
+	private String restrictedPortsIds;
+
+	/**
+	 * 限制港口
+	 */
+	@ApiModelProperty(value = "限制港口")
+	private String restrictedPortsName;
+
+	/**
+	 * 限制船公司
+	 */
+	@ApiModelProperty(value = "限制船公司")
+	private String restrictingShippingCompaniesIds;
+
+	/**
+	 * 限制船公司
+	 */
+	@ApiModelProperty(value = "限制船公司")
+	private String restrictingShippingCompaniesName;
+
+	/**
+	 * 启用日期
+	 */
+	@ApiModelProperty(value = "启用日期")
+	private Date activationDate;
+
+
 
 	/**
 	 * 文件
@@ -272,4 +348,21 @@ public class Archives implements Serializable {
 	private String billNO;
 
 
+	/**
+	 * 起租日期(开始-结束)
+	 */
+	@TableField(exist = false)
+	private List<String> leaseCommencementDateList;
+	/**
+	 * 造箱日期(开始-结束)
+	 */
+	@TableField(exist = false)
+	private List<String> boxMakingDateList;
+	/**
+	 * 最新日期(开始-结束)
+	 */
+	@TableField(exist = false)
+	private List<String> newDateList;
+
+
 }

+ 122 - 68
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBox.java

@@ -65,13 +65,6 @@ public class TradingBox implements Serializable {
 	private Date effectiveDate;
 
 	/**
-	 * 合同生效日期(开始-结束)
-	 *
-	 */
-	@TableField(exist = false)
-	private List<String> effectiveDateList;
-
-	/**
 	 * 合同失效日期
 	 */
 	@ApiModelProperty(value = "合同失效日期")
@@ -93,11 +86,6 @@ public class TradingBox implements Serializable {
 	@ApiModelProperty(value = "买入时间")
 	private Date purchaseDate;
 	/**
-	 * 买入时间(开始-结束)
-	 */
-	@TableField(exist = false)
-	private List<String> purchaseDateList;
-	/**
 	 * 备注
 	 */
 	@ApiModelProperty(value = "备注")
@@ -148,9 +136,9 @@ public class TradingBox implements Serializable {
 	@ApiModelProperty(value = "状态")
 	private Integer status;
 	/**
-	 * 类别(buy 买箱 ,sell卖箱)
+	 * 类别(buy 买箱 、sell卖箱、ZR租入、ZC租出、DL代理箱)
 	 */
-	@ApiModelProperty(value = "类别(buy 买箱 ,sell卖箱)")
+	@ApiModelProperty(value = "类别")
 	private String type;
 
 	/**
@@ -160,6 +148,123 @@ public class TradingBox implements Serializable {
 	private String tenantId;
 
 	/**
+	 * 审核状态
+	 */
+	@ApiModelProperty(value = "审核状态")
+	private String approvalStatus;
+
+	/**
+	 * 审核时间
+	 */
+	@ApiModelProperty(value = "审核时间")
+	private Date approvalDate;
+
+	/**
+	 * 箱数
+	 */
+	@ApiModelProperty(value = "箱数")
+	private int boxNumber;
+
+	/**
+	 * TEU
+	 */
+	@ApiModelProperty(value = "TEU")
+	private String boxTypeNumber;
+	/**
+	 * 港口id
+	 */
+	@ApiModelProperty(value = "港口id")
+	private Long addressId;
+	/**
+	 * 港口编码
+	 */
+	@ApiModelProperty(value = "港口编码")
+	private String addressCode;
+	/**
+	 * 港口中文
+	 */
+	@ApiModelProperty(value = "港口中文")
+	private String addressCname;
+	/**
+	 * 港口英文
+	 */
+	@ApiModelProperty(value = "港口英文")
+	private String addressEname;
+	/**
+	 * 明细箱号集合
+	 */
+	@ApiModelProperty(value = "明细箱号集合")
+	private String code;
+	/**
+	 * 订单合计金额
+	 */
+	@ApiModelProperty(value = "订单合计金额")
+	private BigDecimal totalAmount;
+
+	/**
+	 * 订单合计金额(美金)
+	 */
+	@ApiModelProperty(value = "订单合计金额(美金)")
+	private BigDecimal totalAmountU;
+
+	/**
+	 * 协议
+	 */
+	@ApiModelProperty(value = "协议")
+	private String agreement;
+
+	/**
+	 * 箱况
+	 */
+	@ApiModelProperty(value = "箱况")
+	private String boxCondition;
+	/**
+	 * 场站
+	 */
+	@ApiModelProperty(value = "场站")
+	private String stationId;
+
+	/**
+	 * 场站编码
+	 */
+	@ApiModelProperty(value = "场站编码")
+	private String stationCode;
+
+	/**
+	 * 场站中文
+	 */
+	@ApiModelProperty(value = "场站中文")
+	private String stationCname;
+
+	/**
+	 * 场站英文
+	 */
+	@ApiModelProperty(value = "场站英文")
+	private String stationEname;
+
+	/**
+	 * log
+	 */
+	@ApiModelProperty(value = "log")
+	private String log;
+	/**
+	 * 标准
+	 */
+	@ApiModelProperty(value = "标准")
+	private String standard;
+
+	/**
+	 * 买入时间(开始-结束)
+	 */
+	@TableField(exist = false)
+	private List<String> purchaseDateList;
+	/**
+	 * 合同生效日期(开始-结束)
+	 */
+	@TableField(exist = false)
+	private List<String> effectiveDateList;
+
+	/**
 	 * 明细
 	 */
 	@TableField(exist = false)
@@ -169,7 +274,7 @@ public class TradingBox implements Serializable {
 	 * 费用明细
 	 */
 	@TableField(exist = false)
-	private  List<TradingBoxFees> tradingBoxFeesList;
+	private List<TradingBoxFees> tradingBoxFeesList;
 
 	/**
 	 * 费用明细(进出口)
@@ -181,19 +286,7 @@ public class TradingBox implements Serializable {
 	 * 文件
 	 */
 	@TableField(exist = false)
-	private  List<TradingBoxFiles> tradingBoxFilesList;
-
-	/**
-	 * 审核状态
-	 */
-	@ApiModelProperty(value = "审核状态")
-	private String approvalStatus;
-
-	/**
-	 * 审核时间
-	 */
-	@ApiModelProperty(value = "审核时间")
-	private Date approvalDate;
+	private List<TradingBoxFiles> tradingBoxFilesList;
 
 	//请核标识  1买箱 2卖箱
 	@TableField(exist = false)
@@ -207,22 +300,11 @@ public class TradingBox implements Serializable {
 	//页面名字
 	@TableField(exist = false)
 	private String pageLabel;
+	//审核类型
 	@TableField(exist = false)
 	private String checkType;
 
 	/**
-	 * 箱数
-	 */
-	@ApiModelProperty(value = "箱数")
-	private int boxNumber;
-
-	/**
-	 * TEU
-	 */
-	@ApiModelProperty(value = "TEU")
-	private String boxTypeNumber;
-
-	/**
 	 * 起租,退租
 	 */
 	@TableField(exist = false)
@@ -234,17 +316,6 @@ public class TradingBox implements Serializable {
 	@TableField(exist = false)
 	private Date rentDate;
 
-	/**
-	 * 起租,退租地点
-	 */
-	@ApiModelProperty(value = "地点")
-	private String address;
-
-	/**
-	 * 起租,退租地点id
-	 */
-	@ApiModelProperty(value = "地点id")
-	private Long addressId;
 
 	/**
 	 * 租金计费截止日期
@@ -270,28 +341,11 @@ public class TradingBox implements Serializable {
 	private List<String> updateTimeList;
 
 	/**
-	 * 明细箱号集合
-	 */
-	@ApiModelProperty(value = "明细箱号集合")
-	private String code;
-
-	/**
 	 * 来源
 	 */
 	@TableField(exist = false)
 	private String source;
 
-	/**
-	 * 订单合计金额
-	 */
-	@ApiModelProperty(value = "订单合计金额")
-	private BigDecimal totalAmount;
-
-	/**
-	 * 订单合计金额(美金)
-	 */
-	@ApiModelProperty(value = "订单合计金额(美金)")
-	private BigDecimal totalAmountU;
 
 	/**
 	 * 租金计算起始时间

+ 17 - 0
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxFees.java

@@ -57,12 +57,29 @@ public class TradingBoxFees implements Serializable {
 	@ApiModelProperty(value = "排序")
 	private Integer sort;
 	/**
+	 * 类别
+	 */
+	@ApiModelProperty(value = "类别")
+	private String type;
+	/**
 	 * 费用id
 	 */
 	@ApiModelProperty(value = "费用id")
 	private Long itemId;
 
 	/**
+	 * 费用编码
+	 */
+	@ApiModelProperty(value = "费用编码")
+	private String feeCode;
+
+	/**
+	 * 费用中文
+	 */
+	@ApiModelProperty(value = "费用中文")
+	private String feeName;
+
+	/**
 	 * 费用
 	 */
 	@TableField(exist = false)

+ 110 - 23
blade-service-api/blade-box-tube-api/src/main/java/org/springblade/box/tube/entity/TradingBoxItem.java

@@ -126,11 +126,6 @@ public class TradingBoxItem implements Serializable {
 	private Date leaseCommencementDate;
 
 	/**
-	 * 起租日期
-	 */
-	@TableField(exist = false)
-	private List<String> leaseCommencementDateList;
-	/**
 	 * 箱龄
 	 */
 	@ApiModelProperty(value = "箱龄")
@@ -193,12 +188,6 @@ public class TradingBoxItem implements Serializable {
 	private String tenantId;
 
 	/**
-	 * 文件
-	 */
-	@TableField(exist = false)
-	private List<TradingBoxFiles> tradingBoxFilesList;
-
-	/**
 	 * 最新地点
 	 */
 	@ApiModelProperty(value = "最新地点")
@@ -212,12 +201,6 @@ public class TradingBoxItem implements Serializable {
 	private Date rentEndDate;
 
 	/**
-	 * 租金计算截止日期
-	 */
-	@TableField(exist = false)
-	private List<String> rentEndDateList;
-
-	/**
 	 * 租金计算起始时间
 	 */
 	@ApiModelProperty(value = "租金计算起始时间")
@@ -231,12 +214,6 @@ public class TradingBoxItem implements Serializable {
 	private Date rentingOutDate;
 
 	/**
-	 * 退租日期
-	 */
-	@TableField(exist = false)
-	private List<String> rentingOutDateList;
-
-	/**
 	 * 是否计算过租金
 	 */
 	@ApiModelProperty(value = "费用数量")
@@ -315,4 +292,114 @@ public class TradingBoxItem implements Serializable {
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	@TableField(updateStrategy = FieldStrategy.IGNORED)//时间为空
 	private Date stackingDate;
+
+	/**
+	 * 放箱号
+	 */
+	@ApiModelProperty(value = "放箱号")
+	private String containerNumber;
+
+	/**
+	 * 箱属
+	 */
+	@ApiModelProperty(value = "箱属")
+	private String boxBelongsTo;
+
+	/**
+	 * 箱种类
+	 */
+	@ApiModelProperty(value = "箱种类")
+	private String boxCategory;
+
+	/**
+	 * 箱东
+	 */
+	@ApiModelProperty(value = "箱东")
+	private String boxEast;
+
+	/**
+	 * 原箱东
+	 */
+	@ApiModelProperty(value = "原箱东")
+	private String originalBoxEast;
+
+	/**
+	 * 场站
+	 */
+	@ApiModelProperty(value = "场站")
+	private String stationId;
+
+	/**
+	 * 场站编码
+	 */
+	@ApiModelProperty(value = "场站编码")
+	private String stationCode;
+
+	/**
+	 * 场站中文
+	 */
+	@ApiModelProperty(value = "场站中文")
+	private String stationCname;
+
+	/**
+	 * 场站英文
+	 */
+	@ApiModelProperty(value = "场站英文")
+	private String stationEname;
+
+	/**
+	 * 限制港口
+	 */
+	@ApiModelProperty(value = "限制港口")
+	private String restrictedPortsIds;
+
+	/**
+	 * 限制港口
+	 */
+	@ApiModelProperty(value = "限制港口")
+	private String restrictedPortsName;
+
+	/**
+	 * 限制船公司
+	 */
+	@ApiModelProperty(value = "限制船公司")
+	private String restrictingShippingCompaniesIds;
+
+	/**
+	 * 限制船公司
+	 */
+	@ApiModelProperty(value = "限制船公司")
+	private String restrictingShippingCompaniesName;
+	/**
+	 * 是否启用
+	 */
+	@ApiModelProperty(value = "是否启用")
+	private String whetherEnable;
+
+	/**
+	 * 启用日期
+	 */
+	@ApiModelProperty(value = "启用日期")
+	private Date activationDate;
+
+	/**
+	 * 起租日期
+	 */
+	@TableField(exist = false)
+	private List<String> leaseCommencementDateList;
+	/**
+	 * 文件
+	 */
+	@TableField(exist = false)
+	private List<TradingBoxFiles> tradingBoxFilesList;
+	/**
+	 * 租金计算截止日期
+	 */
+	@TableField(exist = false)
+	private List<String> rentEndDateList;
+	/**
+	 * 退租日期
+	 */
+	@TableField(exist = false)
+	private List<String> rentingOutDateList;
 }

+ 34 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/dto/FeesTemplateSonItemsDTO.java

@@ -0,0 +1,34 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.dto;
+
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 基础资料-费用模版子明细数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class FeesTemplateSonItemsDTO extends FeesTemplateSonItems {
+	private static final long serialVersionUID = 1L;
+
+}

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/entity/FeesTemplateItems.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.los.basic.fees.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -25,6 +26,7 @@ import lombok.Data;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 基础资料-费用模版及明细实体类
@@ -213,5 +215,8 @@ public class FeesTemplateItems implements Serializable {
 	@ApiModelProperty(value = "核算英文名称")
 	private String elementsEnName;
 
+	@TableField(exist = false)
+	private List<FeesTemplateSonItems> sonItemsList;
+
 
 }

+ 159 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/entity/FeesTemplateSonItems.java

@@ -0,0 +1,159 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 基础资料-费用模版子明细实体类
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+@Data
+@TableName("los_b_fees_template_son_items")
+@ApiModel(value = "FeesTemplateSonItems对象", description = "基础资料-费用模版子明细")
+public class FeesTemplateSonItems implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 创建人 Id
+	 */
+	@ApiModelProperty(value = "创建人 Id")
+	private Long createUser;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private String createUserName;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**
+	 * 修改人 Id
+	 */
+	@ApiModelProperty(value = "修改人 Id")
+	private Long updateUser;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private String updateUserName;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**
+	 * 费用模版 Id
+	 */
+	@ApiModelProperty(value = "费用模版 Id")
+	private Long pid;
+	/**
+	 * 明细id
+	 */
+	@ApiModelProperty(value = "明细id")
+	private Long ppid;
+	/**
+	 * 版本
+	 */
+	@ApiModelProperty(value = "版本")
+	private String version;
+	/**
+	 * 状态(0 正常 1停用)
+	 */
+	@ApiModelProperty(value = "状态(0 正常 1停用)")
+	private Integer status;
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0 否 1是)")
+	private Integer isDeleted;
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注")
+	private String remarks;
+	/**
+	 * 类别
+	 */
+	@ApiModelProperty(value = "类别")
+	private String type;
+	/**
+	 * 费用 Id
+	 */
+	@ApiModelProperty(value = "费用 Id")
+	private Long feeId;
+	/**
+	 * 费用中文名称
+	 */
+	@ApiModelProperty(value = "费用中文名称")
+	private String feeCode;
+	/**
+	 * 费用中文名称
+	 */
+	@ApiModelProperty(value = "费用中文名称")
+	private String feeCnName;
+	/**
+	 * 费用英文名称
+	 */
+	@ApiModelProperty(value = "费用英文名称")
+	private String feeEnName;
+	/**
+	 * 成本价
+	 */
+	@ApiModelProperty(value = "成本价")
+	private BigDecimal costPrice;
+	/**
+	 * 销售价
+	 */
+	@ApiModelProperty(value = "销售价")
+	private BigDecimal salesPrice;
+	/**
+	 * 币种
+	 */
+	@ApiModelProperty(value = "币种")
+	private String curCode;
+	/**
+	 * 计量单位
+	 */
+	@ApiModelProperty(value = "计量单位")
+	private String unitNo;
+	/**
+	 * 计量单位
+	 */
+	@ApiModelProperty(value = "计量单位")
+	private Long unitId;
+	/**
+	 * 租户
+	 */
+	@ApiModelProperty(value = "租户")
+	private String tenantId;
+
+
+}

+ 38 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/entity/LosBFeesTemplate.java

@@ -159,6 +159,44 @@ public class LosBFeesTemplate implements Serializable {
 	private String tenantId;
 
 	/**
+	 * 船公司
+	 */
+	@ApiModelProperty(value = "船公司")
+	private Long shippingCompanyId;
+	/**
+	 * 船公司中文
+	 */
+	@ApiModelProperty(value = "船公司中文")
+	private String shippingCompanyCname;
+	/**
+	 * 船公司代码
+	 */
+	@ApiModelProperty(value = "船公司代码")
+	private String shippingCompanyCode;
+
+	/**
+	 * 港口地址
+	 */
+	@ApiModelProperty(value = "港口地址")
+	private Long addressId;
+	/**
+	 * 港口地址中文
+	 */
+	@ApiModelProperty(value = "港口地址中文")
+	private String addressCname;
+	/**
+	 * 港口地址代码
+	 */
+	@ApiModelProperty(value = "港口地址代码")
+	private String addressCode;
+
+	/**
+	 * 运输条款
+	 */
+	@ApiModelProperty(value = "运输条款")
+	private String transportationTerms;
+
+	/**
 	 * 费用模版及明细
 	 */
 	@TableField(exist = false)

+ 36 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/fees/vo/FeesTemplateSonItemsVO.java

@@ -0,0 +1,36 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.vo;
+
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 基础资料-费用模版子明细视图实体类
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "FeesTemplateSonItemsVO对象", description = "基础资料-费用模版子明细")
+public class FeesTemplateSonItemsVO extends FeesTemplateSonItems {
+	private static final long serialVersionUID = 1L;
+
+}

+ 20 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/locations/entity/BLocations.java

@@ -148,6 +148,26 @@ public class BLocations implements Serializable {
 	 */
 	@ApiModelProperty(value = "租户")
 	private String tenantId;
+	/**
+	 * 港口id
+	 */
+	@ApiModelProperty(value = "港口id")
+	private Long addressId;
+	/**
+	 * 港口编码
+	 */
+	@ApiModelProperty(value = "港口编码")
+	private String addressCode;
+	/**
+	 * 港口中文
+	 */
+	@ApiModelProperty(value = "港口中文")
+	private String addressCname;
+	/**
+	 * 港口英文
+	 */
+	@ApiModelProperty(value = "港口英文")
+	private String addressEname;
 
 
 }

+ 57 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCost.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.los.logistics.route.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -110,156 +111,187 @@ public class RouteCost implements Serializable {
 	 * 所属公司
 	 */
 	@ApiModelProperty(value = "所属公司")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long belongingCompanyId;
 	/**
 	 * 所属公司
 	 */
 	@ApiModelProperty(value = "所属公司")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String belongingCompanyName;
 	/**
 	 * 起运港
 	 */
 	@ApiModelProperty(value = "起运港")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long podId;
 	/**
 	 * 起运港中文
 	 */
 	@ApiModelProperty(value = "起运港中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String podCname;
 	/**
 	 * 起运港英文
 	 */
 	@ApiModelProperty(value = "起运港英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String podEname;
 	/**
 	 * 起运港代码
 	 */
 	@ApiModelProperty(value = "起运港代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String podCode;
 	/**
 	 * 目的港
 	 */
 	@ApiModelProperty(value = "目的港")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long destinationId;
 	/**
 	 * 目的港中文
 	 */
 	@ApiModelProperty(value = "目的港中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String destinationCname;
 	/**
 	 * 目的港英文
 	 */
 	@ApiModelProperty(value = "目的港英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String destinationEname;
 	/**
 	 * 目的港代码
 	 */
 	@ApiModelProperty(value = "目的港代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String destinationCode;
 	/**
 	 * 航线
 	 */
 	@ApiModelProperty(value = "航线")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long airlineId;
 	/**
 	 * 航线中文
 	 */
 	@ApiModelProperty(value = "航线中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String airlineCname;
 	/**
 	 * 航线英文
 	 */
 	@ApiModelProperty(value = "航线英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String airlineEname;
 	/**
 	 * 航线代码
 	 */
 	@ApiModelProperty(value = "航线代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String airlineCode;
 	/**
 	 * 船公司
 	 */
 	@ApiModelProperty(value = "船公司")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long shippingCompanyId;
 	/**
 	 * 船公司中文
 	 */
 	@ApiModelProperty(value = "船公司中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shippingCompanyCname;
 	/**
 	 * 船公司英文
 	 */
 	@ApiModelProperty(value = "船公司英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shippingCompanyEname;
 	/**
 	 * 船公司代码
 	 */
 	@ApiModelProperty(value = "船公司代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shippingCompanyCode;
 	/**
 	 * 船公司简称
 	 */
 	@ApiModelProperty(value = "船公司简称")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shippingCompanyAbbreviation;
 	/**
 	 * 实际船公司
 	 */
 	@ApiModelProperty(value = "实际船公司")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long actualShippingCompanyId;
 	/**
 	 * 实际船公司中文
 	 */
 	@ApiModelProperty(value = "实际船公司中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyCname;
 	/**
 	 * 实际船公司英文
 	 */
 	@ApiModelProperty(value = "实际船公司英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyEname;
 	/**
 	 * 实际船公司代码
 	 */
 	@ApiModelProperty(value = "实际船公司代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyCode;
 	/**
 	 * 实际船公司简称
 	 */
 	@ApiModelProperty(value = "实际船公司简称")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyAbbreviation;
 	/**
 	 * 船名
 	 */
 	@ApiModelProperty(value = "船名")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long shipNameId;
 	/**
 	 * 船名中文
 	 */
 	@ApiModelProperty(value = "船名中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shipCname;
 	/**
 	 * 船名英文
 	 */
 	@ApiModelProperty(value = "船名英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shipEname;
 	/**
 	 * 船名代码
 	 */
 	@ApiModelProperty(value = "船名代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shipCode;
 	/**
 	 * 航次
 	 */
 	@ApiModelProperty(value = "航次")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String voyage;
 	/**
 	 * 舱位类型  固定/非固定
 	 */
 	@ApiModelProperty(value = "舱位类型  固定/非固定")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String cabinType;
 	/**
 	 * 固定:单程/往返    非固定 :CSA/舱保
 	 */
 	@ApiModelProperty(value = "固定:单程/往返    非固定 :CSA/舱保")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String cabinTypeData;
 	/**
 	 * 舱位数
@@ -285,71 +317,85 @@ public class RouteCost implements Serializable {
 	 * 班次
 	 */
 	@ApiModelProperty(value = "班次")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String classes;
 	/**
 	 * 航班类型  转船/直达
 	 */
 	@ApiModelProperty(value = "航班类型  转船/直达")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String flightType;
 	/**
 	 * 转船类型  船公司/自转
 	 */
 	@ApiModelProperty(value = "转船类型  船公司/自转")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String changeShipType;
 	/**
 	 * 中转港
 	 */
 	@ApiModelProperty(value = "中转港")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long transitPortId;
 	/**
 	 * 中转港中文
 	 */
 	@ApiModelProperty(value = "中转港中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String transitPortCname;
 	/**
 	 * 中转港英文
 	 */
 	@ApiModelProperty(value = "中转港英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String transitPortEname;
 	/**
 	 * 中转港代码
 	 */
 	@ApiModelProperty(value = "中转港代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String transitPortCode;
 	/**
 	 * 合作伙伴
 	 */
 	@ApiModelProperty(value = "合作伙伴")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long cooperativePartnerId;
 	/**
 	 * 合作伙伴
 	 */
 	@ApiModelProperty(value = "合作伙伴")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String cooperativePartnerName;
 	/**
 	 * 运输条款
 	 */
 	@ApiModelProperty(value = "运输条款")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String transportationTerms;
 	/**
 	 * pol码头代码
 	 */
 	@ApiModelProperty(value = "pol码头代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String polWharfCode;
 	/**
 	 * pod码头代码
 	 */
 	@ApiModelProperty(value = "pod码头代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String podWharfCode;
 	/**
 	 * 有效期启
 	 */
 	@ApiModelProperty(value = "有效期启")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date effectiveStartDate;
 	/**
 	 * 有效期止
 	 */
 	@ApiModelProperty(value = "有效期止")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Date effectiveEndDate;
 	/**
 	 * 租户
@@ -403,56 +449,67 @@ public class RouteCost implements Serializable {
 	 * 二程实际船公司
 	 */
 	@ApiModelProperty(value = "二程实际船公司")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long actualShippingCompanyIdTwo;
 	/**
 	 * 二程实际船公司中文
 	 */
 	@ApiModelProperty(value = "二程实际船公司中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyCnameTwo;
 	/**
 	 * 二程实际船公司英文
 	 */
 	@ApiModelProperty(value = "二程实际船公司英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyEnameTwo;
 	/**
 	 * 二程实际船公司代码
 	 */
 	@ApiModelProperty(value = "二程实际船公司代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyCodeTwo;
 	/**
 	 * 二程实际船公司简称
 	 */
 	@ApiModelProperty(value = "二程实际船公司简称")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String actualShippingCompanyAbbreviationTwo;
 	/**
 	 * 二程船名
 	 */
 	@ApiModelProperty(value = "二程船名")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private Long shipNameIdTwo;
 	/**
 	 * 二程船名中文
 	 */
 	@ApiModelProperty(value = "二程船名中文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shipCnameTwo;
 	/**
 	 * 二程船名英文
 	 */
 	@ApiModelProperty(value = "二程船名英文")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shipEnameTwo;
 	/**
 	 * 二程船名代码
 	 */
 	@ApiModelProperty(value = "二程船名代码")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String shipCodeTwo;
 	/**
 	 * 二程航次
 	 */
 	@ApiModelProperty(value = "二程航次")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String voyageTwo;
 	/**
 	 * 二程运输条款
 	 */
 	@ApiModelProperty(value = "二程运输条款")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String transportationTermsTwo;
 
 

+ 20 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCostItem.java

@@ -140,11 +140,21 @@ public class RouteCostItem implements Serializable {
 	@ApiModelProperty(value = "一程POL杂费成本")
 	private BigDecimal polCost;
 	/**
+	 * 一程POL杂费收入
+	 */
+	@ApiModelProperty(value = "一程POL杂费收入")
+	private BigDecimal polIncome;
+	/**
 	 * 一程POD杂费成本
 	 */
 	@ApiModelProperty(value = "一程POD杂费成本")
 	private BigDecimal podCost;
 	/**
+	 * 一程POD杂费收入
+	 */
+	@ApiModelProperty(value = "一程POD杂费收入")
+	private BigDecimal podIncome;
+	/**
 	 * POT费用(作废)
 	 */
 	@ApiModelProperty(value = "POT费用")
@@ -175,11 +185,21 @@ public class RouteCostItem implements Serializable {
 	@ApiModelProperty(value = "二程POL杂费成本")
 	private BigDecimal polCostTwo;
 	/**
+	 * 二程POL杂费收入
+	 */
+	@ApiModelProperty(value = "二程POL杂费收入")
+	private BigDecimal polIncomeTwo;
+	/**
 	 * 二程POD杂费成本
 	 */
 	@ApiModelProperty(value = "二程POD杂费成本")
 	private BigDecimal podCostTwo;
 	/**
+	 * 二程POD杂费收入
+	 */
+	@ApiModelProperty(value = "二程POD杂费收入")
+	private BigDecimal podIncomeTwo;
+	/**
 	 * 合计利润
 	 */
 	@ApiModelProperty(value = "合计利润")

+ 2 - 2
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/BoxDataAnalysisController.java

@@ -79,7 +79,7 @@ public class BoxDataAnalysisController extends BladeController {
 		LambdaQueryWrapper<Archives> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(Archives::getTenantId, AuthUtil.getTenantId())
 			.eq(Archives::getIsDeleted, 0)
-			.eq(Archives::getAddress, address);
+			.eq(Archives::getAddressCname, address);
 		IPage<Archives> archivesList = archivesService.page(Condition.getPage(query),lambdaQueryWrapper);
 		return R.data(archivesList);
 	}
@@ -94,7 +94,7 @@ public class BoxDataAnalysisController extends BladeController {
 		LambdaQueryWrapper<Archives> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(Archives::getTenantId, AuthUtil.getTenantId())
 			.eq(Archives::getIsDeleted, 0)
-			.eq(Archives::getAddress, address);
+			.eq(Archives::getAddressCname, address);
 		List<Archives> list = archivesService.list(lambdaQueryWrapper);
 		List<ArchivesExcel> excelList = BeanUtil.copy(list, ArchivesExcel.class);
 		ExcelUtil.export(response, "箱分布明细-" + address, "箱分布明细-" + address, excelList , ArchivesExcel.class);

+ 1 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TradingBoxItemController.java

@@ -463,7 +463,7 @@ public class TradingBoxItemController extends BladeController {
 				archives.setStatus(tradingBoxItem.getStatus());
 				archives.setTypeId(tradingBoxItem.getBoxTypeId());
 				archives.setAddressId(tradingBoxItem.getAddressId());
-				archives.setAddress(tradingBoxItem.getAddress());
+				archives.setAddressCname(tradingBoxItem.getAddress());
 				archives.setNewDate(tradingBoxItem.getNewDate());
 				archives.setLeasingCompanyId(tradingBox.getPurchaseCompanyId());
 				archives.setLeasingCompany(tradingBox.getPurchaseCompanyName());

+ 1 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/controller/TransportItemController.java

@@ -143,7 +143,7 @@ public class TransportItemController extends BladeController {
 			Archives archives = new Archives();
 			archives.setStatus("使用");
 			archives.setCode(transportItem.getCode());
-			archives.setAddress(transportItem.getAddress());
+			archives.setAddressCname(transportItem.getAddress());
 			archives.setAddressId(transportItem.getAddressId());
 			archives.setNewDate(transportItem.getNewDate());
 			archives.setBoxAccessStatus("");

+ 17 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/mapper/ArchivesMapper.xml

@@ -21,7 +21,9 @@
         <result column="status" property="status"/>
         <result column="type_id" property="typeId"/>
         <result column="address_id" property="addressId"/>
-        <result column="address" property="address"/>
+        <result column="address_code" property="addressCode"/>
+        <result column="address_cname" property="addressCname"/>
+        <result column="address_ename" property="addressEname"/>
         <result column="new_date" property="newDate"/>
         <result column="leasing_company_id" property="leasingCompanyId"/>
         <result column="leasing_company" property="leasingCompany"/>
@@ -38,6 +40,20 @@
         <result column="purchase_date" property="purchaseDate"/>
         <result column="box_age" property="boxAge"/>
         <result column="contract_no" property="contractNo"/>
+        <result column="container_number" property="containerNumber"/>
+        <result column="box_belongs_to" property="boxBelongsTo"/>
+        <result column="box_type" property="boxType"/>
+        <result column="box_east" property="boxEast"/>
+        <result column="original_box_east" property="originalBoxEast"/>
+        <result column="station_id" property="stationId"/>
+        <result column="station_code" property="stationCode"/>
+        <result column="station_cname" property="stationCname"/>
+        <result column="station_ename" property="stationEname"/>
+        <result column="restricted_ports_ids" property="restrictedPortsIds"/>
+        <result column="restricted_ports_name" property="restrictedPortsName"/>
+        <result column="restricting_shipping_companies_ids" property="restrictingShippingCompaniesIds"/>
+        <result column="restricting_shipping_companies_name" property="restrictingShippingCompaniesName"/>
+        <result column="activation_date" property="activationDate"/>
     </resultMap>
     <update id="updateCode" parameterType="org.springblade.box.tube.entity.Archives">
         update container_archives

+ 15 - 0
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/mapper/TradingBoxItemMapper.xml

@@ -34,6 +34,21 @@
         <result column="is_deleted" property="isDeleted"/>
         <result column="status" property="status"/>
         <result column="remarks" property="remarks"/>
+        <result column="container_number" property="containerNumber"/>
+        <result column="box_belongs_to" property="boxBelongsTo"/>
+        <result column="box_type" property="boxCategory"/>
+        <result column="box_east" property="boxEast"/>
+        <result column="original_box_east" property="originalBoxEast"/>
+        <result column="station_id" property="stationId"/>
+        <result column="station_code" property="stationCode"/>
+        <result column="station_cname" property="stationCname"/>
+        <result column="station_ename" property="stationEname"/>
+        <result column="restricted_ports_ids" property="restrictedPortsIds"/>
+        <result column="restricted_ports_name" property="restrictedPortsName"/>
+        <result column="restricting_shipping_companies_ids" property="restrictingShippingCompaniesIds"/>
+        <result column="restricting_shipping_companies_name" property="restrictingShippingCompaniesName"/>
+        <result column="activation_date" property="activationDate"/>
+        <result column="whether_enable" property="whetherEnable"/>
     </resultMap>
 
 

+ 17 - 2
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/mapper/TradingBoxMapper.xml

@@ -21,11 +21,25 @@
         <result column="is_deleted" property="isDeleted"/>
         <result column="status" property="status"/>
         <result column="type" property="type"/>
+        <result column="address_id" property="addressId"/>
+        <result column="address_code" property="addressCode"/>
+        <result column="address_cname" property="addressCname"/>
+        <result column="address_ename" property="addressEname"/>
+        <result column="station_id" property="stationId"/>
+        <result column="station_code" property="stationCode"/>
+        <result column="station_cname" property="stationCname"/>
+        <result column="station_ename" property="stationEname"/>
+        <result column="agreement" property="agreement"/>
+        <result column="box_condition" property="boxCondition"/>
+        <result column="log" property="log"/>
+        <result column="standard" property="standard"/>
     </resultMap>
 
 
     <select id="selectTradingBoxPage" resultMap="tradingBoxResultMap">
-        select * from container_trading_box where is_deleted = 0
+        select *
+        from container_trading_box
+        where is_deleted = 0
     </select>
     <select id="exportTradingBoxItemOut" resultType="org.springblade.box.tube.dto.ExportTradingBoxItemOut">
         SELECT
@@ -35,7 +49,8 @@
         i.amount AS amount,
         i.address AS address,
         i.`status` AS STATUS,
-        ( CASE c.type WHEN 'ZR' THEN '租入' WHEN 'ZC' THEN '租出' WHEN 'BUY' THEN '买箱' WHEN 'SELL' THEN '卖箱' END ) AS type
+        ( CASE c.type WHEN 'ZR' THEN '租入' WHEN 'ZC' THEN '租出' WHEN 'BUY' THEN '买箱' WHEN 'SELL' THEN '卖箱' END )
+        AS type
         FROM
         container_trading_box_item i
         LEFT JOIN container_trading_box c ON i.pid = c.id

+ 6 - 6
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/ArchivesServiceImpl.java

@@ -135,7 +135,7 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 			if (ObjectUtils.isNull(archives.getCode())) {
 				throw new RuntimeException("箱号不能为空");
 			}
-			if (ObjectUtils.isNull(archives.getAddress())) {
+			if (ObjectUtils.isNull(archives.getAddressCname())) {
 				throw new RuntimeException("最新地点不能为空");
 			}
 			if (ObjectUtils.isNull(archives.getNewDate())) {
@@ -154,16 +154,16 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 				throw new RuntimeException("箱型不能为空");
 			}
 			//最新地点
-			if (ObjectUtils.isNotNull(archives.getAddress())) {
+			if (ObjectUtils.isNotNull(archives.getAddressCname())) {
 				BasicPortDesc basicPortDesc = new BasicPortDesc();
-				basicPortDesc.setName(archives.getAddress());
+				basicPortDesc.setName(archives.getAddressCname());
 				BasicPortDesc detail = portClient.getPortData(basicPortDesc);
 				if (ObjectUtils.isNotNull(detail)) {
-					archives.setAddress(detail.getName());
+					archives.setAddressCname(detail.getName());
 					archives.setAddressId(detail.getId());
 
 				} else {
-					archives.setAddress(null);
+					archives.setAddressCname(null);
 					archives.setAddressId(null);
 				}
 			}
@@ -214,7 +214,7 @@ public class ArchivesServiceImpl extends ServiceImpl<ArchivesMapper, Archives> i
 				lambdaQueryWrapper.eq(Archives::getTenantId, AuthUtil.getTenantId())
 					.eq(Archives::getIsDeleted, 0)
 //					.ne(Archives::getStatus, "退租")
-					.eq(ObjectUtils.isNotNull(portDesc.getName()), Archives::getAddress, portDesc.getName());//状态
+					.eq(ObjectUtils.isNotNull(portDesc.getName()), Archives::getAddressCname, portDesc.getName());//状态
 				int count = baseMapper.selectCount(lambdaQueryWrapper);
 				addressOld.add(portDesc.getName());
 				if (portDesc.getName().length() > 4){

+ 1 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/RepairServiceImpl.java

@@ -255,7 +255,7 @@ public class RepairServiceImpl extends ServiceImpl<RepairMapper, Repair> impleme
 					if (ObjectUtils.isNotNull(repairItem.getCode())) {
 						Archives archives = new Archives();
 						archives.setCode(repairItem.getCode());
-						archives.setAddress(repair.getAddress());
+						archives.setAddressCname(repair.getAddress());
 						archives.setAddressId(repair.getAddressId());
 						archives.setNewDate(repair.getNewDate());
 						archivesMapper.updateCode(archives);

+ 6 - 6
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TradingBoxServiceImpl.java

@@ -547,7 +547,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 					archives.setGorssWeight(tradingBoxItem.getGrossWeight());
 					archives.setTypeId(tradingBoxItem.getBoxTypeId());
 					archives.setAddressId(tradingBoxItem.getAddressId());
-					archives.setAddress(tradingBoxItem.getAddress());
+					archives.setAddressCname(tradingBoxItem.getAddress());
 					archives.setNewDate(tradingBoxItem.getNewDate());
 					archives.setLeasingCompanyId(tradingBox.getPurchaseCompanyId());
 					archives.setLeasingCompany(tradingBox.getPurchaseCompanyName());
@@ -722,7 +722,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 		List<TradingBoxFees> tradingBoxFeesList = new ArrayList<>();
 		for (TradingBoxItem tradingBoxItem : tradingBoxItemList) {
 			ArchivesTrajectory archivesTrajectory = new ArchivesTrajectory();
-			archivesTrajectory.setAddress(tradingBox.getAddress());
+			archivesTrajectory.setAddress(tradingBox.getAddressCname());
 			archivesTrajectory.setNewDate(tradingBox.getRentDate());
 			tradingBoxItem.setUpdateUser(AuthUtil.getUserId());
 			tradingBoxItem.setUpdateTime(new Date());
@@ -786,7 +786,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 						archives.setStatus(tradingBoxItem.getStatus());
 						archives.setTypeId(tradingBoxItem.getBoxTypeId());
 						archives.setAddressId(tradingBox.getAddressId());
-						archives.setAddress(tradingBox.getAddress());
+						archives.setAddressCname(tradingBox.getAddressCname());
 						archives.setNewDate(tradingBoxItem.getNewDate());
 						archives.setEmptyWeight(tradingBoxItem.getEmptyWeight());
 						archives.setTare(tradingBoxItem.getTare());
@@ -861,7 +861,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 						archivesR.setUpdateTime(new Date());
 						archivesR.setUpdateUserName(AuthUtil.getUserName());
 						archivesR.setUpdateUser(AuthUtil.getUserId());
-						archivesR.setAddress(tradingBox.getAddress());
+						archivesR.setAddressCname(tradingBox.getAddressCname());
 						archivesR.setAddressId(tradingBox.getAddressId());
 						archivesR.setNewDate(tradingBox.getRentDate());
 						archivesMapper.updateById(archivesR);
@@ -871,7 +871,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 						archivesR.setUpdateTime(new Date());
 						archivesR.setUpdateUserName(AuthUtil.getUserName());
 						archivesR.setUpdateUser(AuthUtil.getUserId());
-						archivesR.setAddress(tradingBox.getAddress());
+						archivesR.setAddressCname(tradingBox.getAddressCname());
 						archivesR.setAddressId(tradingBox.getAddressId());
 						archivesR.setNewDate(tradingBox.getRentDate());
 						archivesMapper.updateById(archivesR);
@@ -958,7 +958,7 @@ public class TradingBoxServiceImpl extends ServiceImpl<TradingBoxMapper, Trading
 
 				tradingBoxItem.setRentEndDate(tradingBox.getRentDate());
 				tradingBoxItem.setRentingOutDate(tradingBox.getRentDate());
-				tradingBoxItem.setAddress(tradingBox.getAddress());
+				tradingBoxItem.setAddress(tradingBox.getAddressCname());
 				tradingBoxItem.setAddressId(tradingBox.getAddressId());
 			}
 			tradingBoxItemService.updateById(tradingBoxItem);

+ 2 - 2
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransferServiceImpl.java

@@ -156,7 +156,7 @@ public class TransferServiceImpl implements ITransferService {
 					tradingBoxItem.setSrcBillType(tradingBox.getSource());
 					tradingBoxItem.setId(null);
 				}
-				tradingBoxItem.setAddress(tradingBox.getAddress());
+				tradingBoxItem.setAddress(tradingBox.getAddressCname());
 				tradingBoxItem.setAddressId(tradingBox.getAddressId());
 				//明细数据修改添加
 				if (tradingBoxItem.getId() == null) {
@@ -186,7 +186,7 @@ public class TransferServiceImpl implements ITransferService {
 					Archives archives = new Archives();
 					archives.setStatus("待使用");
 					archives.setCode(tradingBoxItem.getCode());
-					archives.setAddress(tradingBox.getAddress());
+					archives.setAddressCname(tradingBox.getAddressCname());
 					archives.setAddressId(tradingBox.getAddressId());
 					archives.setNewDate(new Date());
 					archivesMapper.updateCode(archives);

+ 1 - 1
blade-service/blade-box-tube/src/main/java/org/springblade/box/tube/service/impl/TransportServiceImpl.java

@@ -339,7 +339,7 @@ public class TransportServiceImpl extends ServiceImpl<TransportMapper, Transport
 			//更新箱档案信息
 
 			archives.setCode(transportItem.getCode());
-			archives.setAddress(address);
+			archives.setAddressCname(address);
 			archives.setAddressId(Long.parseLong(addressId));
 			archives.setNewDate(newDate);
 			archives.setBoxAccessStatus(type);

+ 14 - 4
blade-service/blade-los/src/main/java/org/springblade/los/Util/BigDecimalUtils.java

@@ -15,13 +15,21 @@ public class BigDecimalUtils {
 	 * @return 结果
 	 */
 	public static String convertToEnglish(BigDecimal number) {
-		long integralPart = number.longValue();
-		return convert(integralPart).trim();
+		BigDecimal integerPart = number.setScale(0, BigDecimal.ROUND_DOWN);
+		String decimal = number.toString();
+		BigDecimal decimalAmount = new BigDecimal(decimal.substring(decimal.indexOf(".") + 1));
+		long integralPart = integerPart.longValue();
+		String uppercaseInteger = convert(integralPart).trim();
+		if (new BigDecimal("0.00").compareTo(decimalAmount) != 0) {
+			uppercaseInteger = uppercaseInteger + " POINT " + convert(decimalAmount.longValue()).trim();
+		}
+		return uppercaseInteger;
 	}
 
 	private static String convert(long number) {
-		if (number == 0) return "ZERO";
-
+		if (number == 0) {
+			return "ZERO";
+		}
 		StringBuilder result = new StringBuilder();
 
 		if ((number / 1000) > 0) {
@@ -43,6 +51,8 @@ public class BigDecimalUtils {
 					result.append(MagicValues.units[(int) number % 10]).append(" ");
 				}
 			}
+		}else {
+			result.append(" AND ");
 		}
 		return result.toString();
 	}

+ 126 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/controller/FeesTemplateSonItemsController.java

@@ -0,0 +1,126 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
+import org.springblade.los.basic.fees.vo.FeesTemplateSonItemsVO;
+import org.springblade.los.basic.fees.service.IFeesTemplateSonItemsService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 基础资料-费用模版子明细 控制器
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/feestemplatesonitems")
+@Api(value = "基础资料-费用模版子明细", tags = "基础资料-费用模版子明细接口")
+public class FeesTemplateSonItemsController extends BladeController {
+
+	private final IFeesTemplateSonItemsService feesTemplateSonItemsService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入feesTemplateSonItems")
+	public R<FeesTemplateSonItems> detail(FeesTemplateSonItems feesTemplateSonItems) {
+		FeesTemplateSonItems detail = feesTemplateSonItemsService.getOne(Condition.getQueryWrapper(feesTemplateSonItems));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 基础资料-费用模版子明细
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入feesTemplateSonItems")
+	public R<IPage<FeesTemplateSonItems>> list(FeesTemplateSonItems feesTemplateSonItems, Query query) {
+		IPage<FeesTemplateSonItems> pages = feesTemplateSonItemsService.page(Condition.getPage(query), Condition.getQueryWrapper(feesTemplateSonItems));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 基础资料-费用模版子明细
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入feesTemplateSonItems")
+	public R<IPage<FeesTemplateSonItemsVO>> page(FeesTemplateSonItemsVO feesTemplateSonItems, Query query) {
+		IPage<FeesTemplateSonItemsVO> pages = feesTemplateSonItemsService.selectFeesTemplateSonItemsPage(Condition.getPage(query), feesTemplateSonItems);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 基础资料-费用模版子明细
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入feesTemplateSonItems")
+	public R save(@Valid @RequestBody FeesTemplateSonItems feesTemplateSonItems) {
+		return R.status(feesTemplateSonItemsService.save(feesTemplateSonItems));
+	}
+
+	/**
+	 * 修改 基础资料-费用模版子明细
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入feesTemplateSonItems")
+	public R update(@Valid @RequestBody FeesTemplateSonItems feesTemplateSonItems) {
+		return R.status(feesTemplateSonItemsService.updateById(feesTemplateSonItems));
+	}
+
+	/**
+	 * 新增或修改 基础资料-费用模版子明细
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入feesTemplateSonItems")
+	public R submit(@Valid @RequestBody FeesTemplateSonItems feesTemplateSonItems) {
+		return R.status(feesTemplateSonItemsService.saveOrUpdate(feesTemplateSonItems));
+	}
+
+	
+	/**
+	 * 删除 基础资料-费用模版子明细
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(feesTemplateSonItemsService.removeByIds(Func.toLongList(ids)));
+	}
+
+	
+}

+ 11 - 1
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/controller/LosBFeesTemplateController.java

@@ -86,6 +86,11 @@ public class LosBFeesTemplateController extends BladeController {
 			.like(ObjectUtils.isNotNull(losBFeesTemplate.getEnName()), LosBFeesTemplate::getEnName, losBFeesTemplate.getEnName())
 			.like(ObjectUtils.isNotNull(losBFeesTemplate.getStatus()), LosBFeesTemplate::getStatus, losBFeesTemplate.getStatus())
 			.like(ObjectUtils.isNotNull(losBFeesTemplate.getBusinessTypeId()), LosBFeesTemplate::getBusinessTypeId, losBFeesTemplate.getBusinessTypeId())
+			.eq(ObjectUtils.isNotNull(losBFeesTemplate.getAddressId()), LosBFeesTemplate::getAddressId, losBFeesTemplate.getAddressId())
+			.like(ObjectUtils.isNotNull(losBFeesTemplate.getAddressCname()), LosBFeesTemplate::getAddressCname, losBFeesTemplate.getAddressCname())
+			.eq(ObjectUtils.isNotNull(losBFeesTemplate.getShippingCompanyId()), LosBFeesTemplate::getShippingCompanyId, losBFeesTemplate.getShippingCompanyId())
+			.like(ObjectUtils.isNotNull(losBFeesTemplate.getShippingCompanyCname()), LosBFeesTemplate::getShippingCompanyCname, losBFeesTemplate.getShippingCompanyCname())
+			.like(ObjectUtils.isNotNull(losBFeesTemplate.getTransportationTerms()), LosBFeesTemplate::getTransportationTerms, losBFeesTemplate.getTransportationTerms())
 			.orderByDesc(LosBFeesTemplate::getCreateTime);
 		IPage<LosBFeesTemplate> pages = losBFeesTemplateService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
@@ -202,13 +207,18 @@ public class LosBFeesTemplateController extends BladeController {
 		LambdaQueryWrapper<LosBFeesTemplate> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(LosBFeesTemplate::getTenantId, AuthUtil.getTenantId())
 			.eq(LosBFeesTemplate::getIsDeleted, 0)
-			.eq(ObjectUtils.isNotNull(losBFeesTemplate.getDc()),LosBFeesTemplate::getDc, losBFeesTemplate.getDc())
+			.eq(ObjectUtils.isNotNull(losBFeesTemplate.getDc()), LosBFeesTemplate::getDc, losBFeesTemplate.getDc())
 			.like(ObjectUtils.isNotNull(losBFeesTemplate.getCode()), LosBFeesTemplate::getCode, losBFeesTemplate.getCode())
 			.like(LosBFeesTemplate::getBusinessTypeCode, losBFeesTemplate.getType())
 			.like(ObjectUtils.isNotNull(losBFeesTemplate.getCnName()), LosBFeesTemplate::getCnName, losBFeesTemplate.getCnName())
 			.like(ObjectUtils.isNotNull(losBFeesTemplate.getEnName()), LosBFeesTemplate::getEnName, losBFeesTemplate.getEnName())
 			.eq(ObjectUtils.isNotNull(losBFeesTemplate.getStatus()), LosBFeesTemplate::getStatus, losBFeesTemplate.getStatus())
 			.and(i -> i.eq(LosBFeesTemplate::getCreateUser, AuthUtil.getUserId()).or().eq(LosBFeesTemplate::getIsShared, 1))
+			.eq( LosBFeesTemplate::getAddressId, losBFeesTemplate.getAddressId())
+			.like(ObjectUtils.isNotNull(losBFeesTemplate.getAddressCname()), LosBFeesTemplate::getAddressCname, losBFeesTemplate.getAddressCname())
+			.eq( LosBFeesTemplate::getShippingCompanyId, losBFeesTemplate.getShippingCompanyId())
+			.like(ObjectUtils.isNotNull(losBFeesTemplate.getShippingCompanyCname()), LosBFeesTemplate::getShippingCompanyCname, losBFeesTemplate.getShippingCompanyCname())
+			.eq( LosBFeesTemplate::getTransportationTerms, losBFeesTemplate.getTransportationTerms())
 			.orderByDesc(LosBFeesTemplate::getCreateTime);
 		IPage<LosBFeesTemplate> pages = losBFeesTemplateService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);

+ 42 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/mapper/FeesTemplateSonItemsMapper.java

@@ -0,0 +1,42 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.mapper;
+
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
+import org.springblade.los.basic.fees.vo.FeesTemplateSonItemsVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 基础资料-费用模版子明细 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+public interface FeesTemplateSonItemsMapper extends BaseMapper<FeesTemplateSonItems> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param feesTemplateSonItems
+	 * @return
+	 */
+	List<FeesTemplateSonItemsVO> selectFeesTemplateSonItemsPage(IPage page, FeesTemplateSonItemsVO feesTemplateSonItems);
+
+}

+ 37 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/mapper/FeesTemplateSonItemsMapper.xml

@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.los.basic.fees.mapper.FeesTemplateSonItemsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="feesTemplateSonItemsResultMap" type="org.springblade.los.basic.fees.entity.FeesTemplateSonItems">
+        <id column="id" property="id"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_user_name" property="createUserName"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_user_name" property="updateUserName"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="pid" property="pid"/>
+        <result column="ppid" property="ppid"/>
+        <result column="version" property="version"/>
+        <result column="status" property="status"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="remarks" property="remarks"/>
+        <result column="type" property="type"/>
+        <result column="fee_id" property="feeId"/>
+        <result column="fee_code" property="feeCode"/>
+        <result column="fee_cn_name" property="feeCnName"/>
+        <result column="fee_en_name" property="feeEnName"/>
+        <result column="cost_price" property="costPrice"/>
+        <result column="sales_price" property="salesPrice"/>
+        <result column="cur_code" property="curCode"/>
+        <result column="unit_no" property="unitNo"/>
+        <result column="unit_id" property="unitId"/>
+    </resultMap>
+
+
+    <select id="selectFeesTemplateSonItemsPage" resultMap="feesTemplateSonItemsResultMap">
+        select * from los_b_fees_template_son_items where is_deleted = 0
+    </select>
+
+</mapper>

+ 41 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/IFeesTemplateSonItemsService.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.service;
+
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
+import org.springblade.los.basic.fees.vo.FeesTemplateSonItemsVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 基础资料-费用模版子明细 服务类
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+public interface IFeesTemplateSonItemsService extends IService<FeesTemplateSonItems> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param feesTemplateSonItems
+	 * @return
+	 */
+	IPage<FeesTemplateSonItemsVO> selectFeesTemplateSonItemsPage(IPage<FeesTemplateSonItemsVO> page, FeesTemplateSonItemsVO feesTemplateSonItems);
+
+}

+ 41 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/impl/FeesTemplateSonItemsServiceImpl.java

@@ -0,0 +1,41 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.basic.fees.service.impl;
+
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
+import org.springblade.los.basic.fees.vo.FeesTemplateSonItemsVO;
+import org.springblade.los.basic.fees.mapper.FeesTemplateSonItemsMapper;
+import org.springblade.los.basic.fees.service.IFeesTemplateSonItemsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 基础资料-费用模版子明细 服务实现类
+ *
+ * @author BladeX
+ * @since 2025-04-10
+ */
+@Service
+public class FeesTemplateSonItemsServiceImpl extends ServiceImpl<FeesTemplateSonItemsMapper, FeesTemplateSonItems> implements IFeesTemplateSonItemsService {
+
+	@Override
+	public IPage<FeesTemplateSonItemsVO> selectFeesTemplateSonItemsPage(IPage<FeesTemplateSonItemsVO> page, FeesTemplateSonItemsVO feesTemplateSonItems) {
+		return page.setRecords(baseMapper.selectFeesTemplateSonItemsPage(page, feesTemplateSonItems));
+	}
+
+}

+ 68 - 2
blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/service/impl/LosBFeesTemplateServiceImpl.java

@@ -28,9 +28,11 @@ import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.basic.fees.entity.FeesTemplateItems;
+import org.springblade.los.basic.fees.entity.FeesTemplateSonItems;
 import org.springblade.los.basic.fees.entity.LosBFeesTemplate;
 import org.springblade.los.basic.fees.mapper.LosBFeesTemplateMapper;
 import org.springblade.los.basic.fees.service.IFeesTemplateItemsService;
+import org.springblade.los.basic.fees.service.IFeesTemplateSonItemsService;
 import org.springblade.los.basic.fees.service.ILosBFeesTemplateService;
 import org.springblade.los.basic.fees.vo.LosBFeesTemplateVO;
 import org.springblade.los.excel.LosBFeesTemplateExcel;
@@ -63,6 +65,8 @@ public class LosBFeesTemplateServiceImpl extends ServiceImpl<LosBFeesTemplateMap
 
 	private final IBusinessTypeService bBusinessTypeService;
 
+	private final IFeesTemplateSonItemsService feesTemplateSonItemsService;
+
 	@Override
 	public IPage<LosBFeesTemplateVO> selectLosBFeesTemplatePage(IPage<LosBFeesTemplateVO> page, LosBFeesTemplateVO losBFeesTemplate) {
 		return page.setRecords(baseMapper.selectLosBFeesTemplatePage(page, losBFeesTemplate));
@@ -194,6 +198,51 @@ public class LosBFeesTemplateServiceImpl extends ServiceImpl<LosBFeesTemplateMap
 				}
 			}
 			feesTemplateItemsService.saveOrUpdateBatch(losBFeesTemplate.getFeesTemplateItemsList());
+			List<FeesTemplateSonItems> sonItemsList = new ArrayList<>();
+			for (FeesTemplateItems item : losBFeesTemplate.getFeesTemplateItemsList()) {
+				if (ObjectUtils.isNotNull(item.getSonItemsList()) && !item.getSonItemsList().isEmpty()) {
+					for (FeesTemplateSonItems sonItems : item.getSonItemsList()) {
+						sonItems.setPid(losBFeesTemplate.getId());
+						sonItems.setPpid(item.getId());
+						sonItems.setFeeId(item.getFeeId());
+						sonItems.setFeeCode(item.getFeeCode());
+						sonItems.setFeeCnName(item.getFeeCnName());
+						sonItems.setFeeEnName(item.getFeeEnName());
+						sonItems.setCurCode(item.getCurCode());
+						if (sonItems.getId() == null) {
+							sonItems.setCreateTime(new Date());
+							sonItems.setCreateUser(AuthUtil.getUserId());
+							sonItems.setCreateUserName(AuthUtil.getUserName());
+						} else {
+							sonItems.setUpdateUser(AuthUtil.getUserId());
+							sonItems.setUpdateTime(new Date());
+							sonItems.setUpdateUserName(AuthUtil.getUserName());
+						}
+						sonItemsList.add(sonItems);
+					}
+				} else {
+					FeesTemplateSonItems sonItems = new FeesTemplateSonItems();
+					sonItems.setPid(losBFeesTemplate.getId());
+					sonItems.setPpid(item.getId());
+					sonItems.setCreateTime(new Date());
+					sonItems.setCreateUser(AuthUtil.getUserId());
+					sonItems.setCreateUserName(AuthUtil.getUserName());
+					sonItems.setType(item.getCorpType());
+					sonItems.setFeeId(item.getFeeId());
+					sonItems.setFeeCode(item.getFeeCode());
+					sonItems.setFeeCnName(item.getFeeCnName());
+					sonItems.setFeeEnName(item.getFeeEnName());
+					sonItems.setCostPrice(item.getPrice());
+					sonItems.setSalesPrice(item.getPrice());
+					sonItems.setCurCode(item.getCurCode());
+					sonItems.setUnitNo(item.getUnitNo());
+					sonItems.setUnitId(item.getUnitId());
+					sonItemsList.add(sonItems);
+				}
+			}
+			if (!sonItemsList.isEmpty()) {
+				feesTemplateSonItemsService.saveOrUpdateBatch(sonItemsList);
+			}
 		}
 		return R.data(losBFeesTemplate);
 	}
@@ -204,11 +253,28 @@ public class LosBFeesTemplateServiceImpl extends ServiceImpl<LosBFeesTemplateMap
 			throw new RuntimeException("缺少必要参数");
 		}
 		LosBFeesTemplate detail = baseMapper.selectById(losBFeesTemplate.getId());
-		detail.setFeesTemplateItemsList(feesTemplateItemsService.list(new LambdaQueryWrapper<FeesTemplateItems>()
+		List<FeesTemplateItems> feesTemplateItemsList = feesTemplateItemsService.list(new LambdaQueryWrapper<FeesTemplateItems>()
 			.eq(FeesTemplateItems::getIsDeleted, 0)
 			.eq(FeesTemplateItems::getTenantId, AuthUtil.getTenantId())
 			.eq(FeesTemplateItems::getPid, detail.getId())
-		));
+		);
+		if (!feesTemplateItemsList.isEmpty()) {
+			List<FeesTemplateSonItems> sonItemsList = feesTemplateSonItemsService.list(new LambdaQueryWrapper<FeesTemplateSonItems>()
+				.eq(FeesTemplateSonItems::getIsDeleted, 0)
+				.eq(FeesTemplateSonItems::getTenantId, AuthUtil.getTenantId())
+				.eq(FeesTemplateSonItems::getPid, detail.getId())
+			);
+			for (FeesTemplateItems item : feesTemplateItemsList) {
+				if (!sonItemsList.isEmpty()) {
+					List<FeesTemplateSonItems> itemsList = sonItemsList.stream().filter(e -> e.getPpid().equals(item.getId()))
+						.collect(Collectors.toList());
+					item.setSonItemsList(itemsList.isEmpty() ? new ArrayList<>() : itemsList);
+				} else {
+					item.setSonItemsList(new ArrayList<>());
+				}
+			}
+		}
+		detail.setFeesTemplateItemsList(feesTemplateItemsList);
 		return detail;
 	}
 

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/basic/locations/mapper/LocationsMapper.xml

@@ -25,6 +25,10 @@
         <result column="is_deleted" property="isDeleted"/>
         <result column="remarks" property="remarks"/>
         <result column="tenant_id" property="tenantId"/>
+        <result column="address_id" property="addressId"/>
+        <result column="address_code" property="addressCode"/>
+        <result column="address_cname" property="addressCname"/>
+        <result column="address_ename" property="addressEname"/>
     </resultMap>
 
 

+ 43 - 1
blade-service/blade-los/src/main/java/org/springblade/los/basic/units/controller/BUnitsController.java

@@ -34,7 +34,8 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
-import org.springblade.los.basic.terms.entity.BServiceTerms;
+import org.springblade.los.basic.cntr.entity.BCntrTypes;
+import org.springblade.los.basic.cntr.service.IBCntrTypesService;
 import org.springblade.los.basic.units.entity.BUnits;
 import org.springblade.los.basic.units.service.IBUnitsService;
 import org.springblade.los.excel.BUnitsExcel;
@@ -62,6 +63,8 @@ public class BUnitsController extends BladeController {
 	private final IBUnitsService bUnitsService;
 	private final ISysClient sysClient;
 
+	private final IBCntrTypesService bCntrTypesService;
+
 	/**
 	 * 详情
 	 */
@@ -214,4 +217,43 @@ public class BUnitsController extends BladeController {
 	}
 
 
+	/**
+	 * 分页 基础资料-计量单位
+	 */
+	@GetMapping("/listAll")
+	public R<List<BUnits>> listAll(BUnits bUnits) {
+		LambdaQueryWrapper<BUnits> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(BUnits::getTenantId, AuthUtil.getTenantId())
+			.eq(BUnits::getIsDeleted, 0)
+			.and(ObjectUtils.isNotNull(bUnits.getCode()), i -> i.like(BUnits::getCnName, bUnits.getCode()).or()
+				.like(BUnits::getEnName, bUnits.getCode()).or().like(BUnits::getCode, bUnits.getCode()))
+			.like(ObjectUtils.isNotNull(bUnits.getCodeSw()), BUnits::getCodeSw, bUnits.getCodeSw())
+			.like(ObjectUtils.isNotNull(bUnits.getStatus()), BUnits::getStatus, bUnits.getStatus())
+			.like(ObjectUtils.isNotNull(bUnits.getQuantityRule()), BUnits::getQuantityRule, bUnits.getQuantityRule());
+		String status = sysClient.getParamServiceNew("basic.data.sort");
+		if ("name".equals(status)) {
+			lambdaQueryWrapper.orderByAsc(BUnits::getCnName);
+		} else if ("letter".equals(status)) {
+			lambdaQueryWrapper.orderByAsc(BUnits::getCode);
+		} else {
+			lambdaQueryWrapper.orderByDesc(BUnits::getCreateTime);
+		}
+		List<BUnits> bUnitsList = bUnitsService.list(lambdaQueryWrapper);
+		List<BCntrTypes> cntrTypesList = bCntrTypesService.list(new LambdaQueryWrapper<BCntrTypes>()
+			.eq(BCntrTypes::getTenantId, AuthUtil.getTenantId())
+			.eq(BCntrTypes::getIsDeleted, 0)
+			.and(ObjectUtils.isNotNull(bUnits.getCode()), i -> i.like(BCntrTypes::getCnName, bUnits.getCode()).or()
+				.like(BCntrTypes::getEnName, bUnits.getCode()).or().like(BCntrTypes::getCode, bUnits.getCode())));
+		for (BCntrTypes item : cntrTypesList) {
+			BUnits units = new BUnits();
+			units.setId(item.getId());
+			units.setCode(item.getCode());
+			units.setCnName(item.getCnName());
+			units.setEnName(item.getEnName());
+			bUnitsList.add(units);
+		}
+		return R.data(bUnitsList);
+	}
+
+
 }

+ 11 - 11
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java

@@ -313,7 +313,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							}
 						}
 					}
-					if ("1".equals(items.getQuantityRule())) {
+					if ("按箱型".equals(items.getQuantityRule())) {
 						if (preContainers.isEmpty()) {
 							text += "费用:" + items.getFeeCnName() + "未找到集装箱信息!";
 							continue;
@@ -325,13 +325,13 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						}
 						feeCenter.setQuantity(new BigDecimal(quantity + ""));
 						feeCenter.setAmount(feeCenter.getPrice().multiply(feeCenter.getQuantity()));
-					} else if ("2".equals(items.getQuantityRule())) {
+					} else if ("按票".equals(items.getQuantityRule())) {
 						feeCenter.setQuantity(new BigDecimal("1"));
 						feeCenter.setAmount(feeCenter.getPrice().multiply(new BigDecimal("1")));
-					} else if ("3".equals(items.getQuantityRule())) {
+					} else if ("按重量".equals(items.getQuantityRule())) {
 						feeCenter.setQuantity(bills.getGrossWeight());
 						feeCenter.setAmount(feeCenter.getPrice().multiply(feeCenter.getQuantity()));
-					} else if ("4".equals(items.getQuantityRule())) {
+					} else if ("按TEU".equals(items.getQuantityRule())) {
 						if (preContainers.isEmpty()) {
 							text += "费用:" + items.getFeeCnName() + "未找到集装箱信息!";
 							continue;
@@ -345,7 +345,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						}
 						feeCenter.setQuantity(new BigDecimal(quantity + ""));
 						feeCenter.setAmount(feeCenter.getPrice().multiply(feeCenter.getQuantity()));
-					} else if ("5".equals(items.getQuantityRule())) {
+					} else if ("按尺码".equals(items.getQuantityRule())) {
 						feeCenter.setQuantity(bills.getMeasurement());
 						feeCenter.setAmount(feeCenter.getPrice().multiply(feeCenter.getQuantity()));
 					} else {
@@ -415,7 +415,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							}
 						}
 					}
-					if ("2".equals(items.getQuantityRule())) {
+					if ("按票".equals(items.getQuantityRule())) {
 						if ("JOB".equals(items.getUnitNo())) {
 							feeCenter.setQuantity(new BigDecimal("1"));
 							feeCenter.setAmount(items.getPrice().multiply(new BigDecimal("1")));
@@ -423,7 +423,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							text += "费用:" + items.getFeeCnName() + "计量单位不等于JOB!";
 							continue;
 						}
-					} else if ("3".equals(items.getQuantityRule())) {
+					} else if ("按重量".equals(items.getQuantityRule())) {
 						if ("KGS".equals(items.getUnitNo())) {
 							feeCenter.setQuantity(bills.getGrossWeight());
 							feeCenter.setAmount(items.getPrice().multiply(bills.getGrossWeight()));
@@ -431,7 +431,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							text += "费用:" + items.getFeeCnName() + "计量单位不等于KGS!";
 							continue;
 						}
-					} else if ("5".equals(items.getQuantityRule())) {
+					} else if ("按尺码".equals(items.getQuantityRule())) {
 						if ("CBM".equals(items.getUnitNo())) {
 							feeCenter.setQuantity(bills.getMeasurement());
 							feeCenter.setAmount(items.getPrice().multiply(bills.getMeasurement()));
@@ -504,7 +504,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							}
 						}
 					}
-					if ("2".equals(items.getQuantityRule())) {
+					if ("按票".equals(items.getQuantityRule())) {
 						if ("JOB".equals(items.getUnitNo())) {
 							feeCenter.setQuantity(new BigDecimal("1"));
 							feeCenter.setAmount(items.getPrice().multiply(new BigDecimal("1")));
@@ -512,7 +512,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							text += "费用:" + items.getFeeCnName() + "计量单位不等于JOB!";
 							continue;
 						}
-					} else if ("3".equals(items.getQuantityRule())) {
+					} else if ("按重量".equals(items.getQuantityRule())) {
 						if ("KGS".equals(items.getUnitNo())) {
 							feeCenter.setQuantity(bills.getGrossWeight());
 							feeCenter.setAmount(items.getPrice().multiply(bills.getGrossWeight()));
@@ -520,7 +520,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							text += "费用:" + items.getFeeCnName() + "计量单位不等于KGS!";
 							continue;
 						}
-					} else if ("5".equals(items.getQuantityRule())) {
+					} else if ("按尺码".equals(items.getQuantityRule())) {
 						if ("CBM".equals(items.getUnitNo())) {
 							feeCenter.setQuantity(new BigDecimal("1"));
 							feeCenter.setAmount(items.getPrice().multiply(new BigDecimal("1")));

+ 201 - 110
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostServiceImpl.java

@@ -163,35 +163,52 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 			int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
 			List<RouteCostFee> costFeeList = routeCost.getCostFeeList();
 			for (RouteCostItem routeCostItem : routeCost.getCostItemList()) {
-				//一程POL杂费成本
-				routeCostItem.setPolCost(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-				//一程POD杂费成本
-				routeCostItem.setPodCost(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-				//一程用箱成本
-				if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
-					routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
-					BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
-					routeCostItem.setUseBoxCost(boxCost.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
+				if ("SOC".equals(routeCost.getBusinessType())) {
+					//一程POL杂费成本
+					routeCostItem.setPolCost(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POL杂费收入
+					routeCostItem.setPolIncome(computationalIncome(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POD杂费成本
+					routeCostItem.setPodCost(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POD杂费收入
+					routeCostItem.setPodIncome(computationalIncome(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程用箱成本
+					if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
+						routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
+						BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
+						routeCostItem.setUseBoxCost(boxCost);
+					} else {
+						routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
+					}
+					// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
+					routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
+						.add(routeCostItem.getUseBoxCost()));
+					//一程合计利润
+					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().add(routeCostItem.getPolIncome())
+						.add(routeCostItem.getPodIncome()).subtract(routeCostItem.getCostPrice()));
+					if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
+						//二程POL杂费成本
+						routeCostItem.setPolCostTwo(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POL杂费收入
+						routeCostItem.setPolIncomeTwo(computationalIncome(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POD杂费成本
+						routeCostItem.setPodCostTwo(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POD杂费收入
+						routeCostItem.setPodIncomeTwo(computationalIncome(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
+						routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
+						//二程合计利润
+						routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().add(routeCostItem.getPolIncomeTwo())
+							.add(routeCostItem.getPodIncomeTwo()).subtract(routeCostItem.getCostPriceTwo()));
+					}
+					//合计利润
+					routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 				} else {
-					routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
-				}
-				// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
-				routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
-					.add(routeCostItem.getUseBoxCost()));
-				//一程合计利润
-				routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
-				if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
-					//二程POL杂费成本
-					routeCostItem.setPolCostTwo(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-					//二程POD杂费成本
-					routeCostItem.setPodCostTwo(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-					// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
-					routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
-					//二程合计利润
-					routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().subtract(routeCostItem.getCostPriceTwo()));
+					//一程合计利润
+					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
+					//合计利润
+					routeCostItem.setProfit(routeCostItem.getTotalProfit());
 				}
-				//合计利润
-				routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 				if (routeCostItem.getId() == null) {
 					routeCostItem.setPid(routeCost.getId());
 					routeCostItem.setCreateTime(new Date());
@@ -466,35 +483,52 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 			if (ObjectUtils.isNotNull(routeCostItemList)) {
 				int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
 				for (RouteCostItem routeCostItem : routeCostItemList) {
-					//一程POL杂费成本
-					routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-					//一程POD杂费成本
-					routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-					//一程用箱成本
-					if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
-						routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
-						BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
-						routeCostItem.setUseBoxCost(boxCost.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
+					if ("SOC".equals(routeCost.getBusinessType())) {
+						//一程POL杂费成本
+						routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程POL杂费收入
+						routeCostItem.setPolIncome(computationalIncome(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程POD杂费成本
+						routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程POD杂费收入
+						routeCostItem.setPodIncome(computationalIncome(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程用箱成本
+						if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
+							routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
+							BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
+							routeCostItem.setUseBoxCost(boxCost);
+						} else {
+							routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
+						}
+						// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
+						routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
+							.add(routeCostItem.getUseBoxCost()));
+						//一程合计利润
+						routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().add(routeCostItem.getPolIncome())
+							.add(routeCostItem.getPodIncome()).subtract(routeCostItem.getCostPrice()));
+						if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
+							//二程POL杂费成本
+							routeCostItem.setPolCostTwo(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							//二程POL杂费收入
+							routeCostItem.setPolIncomeTwo(computationalIncome(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							//二程POD杂费成本
+							routeCostItem.setPodCostTwo(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							//二程POD杂费收入
+							routeCostItem.setPodIncomeTwo(computationalIncome(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
+							routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
+							//二程合计利润
+							routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().add(routeCostItem.getPolIncomeTwo())
+								.add(routeCostItem.getPodIncomeTwo()).subtract(routeCostItem.getCostPriceTwo()));
+						}
+						//合计利润
+						routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 					} else {
-						routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
-					}
-					// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
-					routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
-						.add(routeCostItem.getUseBoxCost()));
-					//一程合计利润
-					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
-					if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
-						//二程POL杂费成本
-						routeCostItem.setPolCostTwo(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-						//二程POD杂费成本
-						routeCostItem.setPodCostTwo(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-						// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
-						routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
-						//二程合计利润
-						routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().subtract(routeCostItem.getCostPriceTwo()));
+						//一程合计利润
+						routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
+						//合计利润
+						routeCostItem.setProfit(routeCostItem.getTotalProfit());
 					}
-					//合计利润
-					routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 					if (routeCostItem.getId() == null) {
 						routeCostItem.setPid(routeCost.getId());
 						routeCostItem.setCreateTime(new Date());
@@ -535,35 +569,53 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 			if (ObjectUtils.isNotNull(routeCostItemList)) {
 				int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
 				for (RouteCostItem routeCostItem : routeCostItemList) {
-					//一程POL杂费成本
-					routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-					//一程POD杂费成本
-					routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-					//一程用箱成本
-					if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
-						routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
-						BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
-						routeCostItem.setUseBoxCost(boxCost.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
+					if ("SOC".equals(routeCost.getBusinessType())) {
+						//一程POL杂费成本
+						routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程POL杂费收入
+						routeCostItem.setPolIncome(computationalIncome(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程POD杂费成本
+						routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程POD杂费收入
+						routeCostItem.setPodIncome(computationalIncome(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+						//一程用箱成本
+						if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
+							routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
+							BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
+							routeCostItem.setUseBoxCost(boxCost);
+
+						} else {
+							routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
+						}
+						// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
+						routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
+							.add(routeCostItem.getUseBoxCost()));
+						//一程合计利润
+						routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().add(routeCostItem.getPolIncome())
+							.add(routeCostItem.getPodIncome()).subtract(routeCostItem.getCostPrice()));
+						if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
+							//二程POL杂费成本
+							routeCostItem.setPolCostTwo(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							//二程POL杂费收入
+							routeCostItem.setPolIncomeTwo(computationalIncome(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							//二程POD杂费成本
+							routeCostItem.setPodCostTwo(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							//二程POD杂费收入
+							routeCostItem.setPodIncomeTwo(computationalIncome(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+							// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
+							routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
+							//二程合计利润
+							routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().add(routeCostItem.getPolIncomeTwo())
+								.add(routeCostItem.getPodIncomeTwo()).subtract(routeCostItem.getCostPriceTwo()));
+						}
+						//合计利润
+						routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 					} else {
-						routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
+						//一程合计利润
+						routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
+						//合计利润
+						routeCostItem.setProfit(routeCostItem.getTotalProfit());
 					}
-					// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
-					routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
-						.add(routeCostItem.getUseBoxCost()));
-					//一程合计利润
-					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
-					if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
-						//二程POL杂费成本
-						routeCostItem.setPolCostTwo(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-						//二程POD杂费成本
-						routeCostItem.setPodCostTwo(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-						// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
-						routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
-						//二程合计利润
-						routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().subtract(routeCostItem.getCostPriceTwo()));
-					}
-					//合计利润
-					routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 					if (routeCostItem.getId() == null) {
 						routeCostItem.setPid(routeCost.getId());
 						routeCostItem.setCreateTime(new Date());
@@ -583,7 +635,7 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 				routeCost.setTotalProfit(routeCost.getProfit20().add(routeCost.getProfit40()).add(routeCost.getProfitHc()).add(routeCost.getOtherProfit()));
 				baseMapper.updateById(routeCost);
 			}
-			this.removeByIds(longList);
+			routeCostFeeService.removeByIds(longList);
 		}
 		return R.success("操作成功");
 	}
@@ -599,35 +651,52 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 				.eq(RouteCostFee::getPid, routeCostItemList.get(0).getPid()));
 			int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
 			for (RouteCostItem routeCostItem : routeCostItemList) {
-				//一程POL杂费成本
-				routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-				//一程POD杂费成本
-				routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
-				//一程用箱成本
-				if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
-					routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
-					BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
-					routeCostItem.setUseBoxCost(boxCost.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
+				if ("SOC".equals(routeCost.getBusinessType())) {
+					//一程POL杂费成本
+					routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POL杂费收入
+					routeCostItem.setPolIncome(computationalIncome(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POD杂费成本
+					routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程POD杂费收入
+					routeCostItem.setPodIncome(computationalIncome(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "0"));
+					//一程用箱成本
+					if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
+						routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
+						BigDecimal boxCost = new BigDecimal(days).multiply(routeCostItem.getBoxCost());
+						routeCostItem.setUseBoxCost(boxCost);
+					} else {
+						routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
+					}
+					// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
+					routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
+						.add(routeCostItem.getUseBoxCost()));
+					//一程合计利润
+					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().add(routeCostItem.getPolIncome())
+						.add(routeCostItem.getPodIncome()).subtract(routeCostItem.getCostPrice()));
+					if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
+						//二程POL杂费成本
+						routeCostItem.setPolCostTwo(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POL杂费收入
+						routeCostItem.setPolIncomeTwo(computationalIncome(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POD杂费成本
+						routeCostItem.setPodCostTwo(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						//二程POD杂费收入
+						routeCostItem.setPodIncomeTwo(computationalIncome(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
+						// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
+						routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
+						//二程合计利润
+						routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().add(routeCostItem.getPolIncomeTwo())
+							.add(routeCostItem.getPodIncomeTwo()).subtract(routeCostItem.getCostPriceTwo()));
+					}
+					//合计利润
+					routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 				} else {
-					routeCostItem.setUseBoxCost(new BigDecimal("0.00"));
-				}
-				// 一程成本价 = 一程海运费+一程用箱成本+一程pol杂费+一程pod成本
-				routeCostItem.setCostPrice(routeCostItem.getOceanFreight().add(routeCostItem.getPodCost()).add(routeCostItem.getPolCost())
-					.add(routeCostItem.getUseBoxCost()));
-				//一程合计利润
-				routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
-				if ("转船".equals(routeCost.getFlightType()) && "自转".equals(routeCost.getChangeShipType())) {
-					//二程POL杂费成本
-					routeCostItem.setPolCostTwo(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-					//二程POD杂费成本
-					routeCostItem.setPodCostTwo(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate(), "1"));
-					// 二程成本价 = 二程海运费+二程pol杂费+二程pod成本
-					routeCostItem.setCostPriceTwo(routeCostItem.getOceanFreightTwo().add(routeCostItem.getPodCostTwo()).add(routeCostItem.getPolCostTwo()));
-					//二程合计利润
-					routeCostItem.setTotalProfitTwo(routeCostItem.getSalesPriceTwo().subtract(routeCostItem.getCostPriceTwo()));
+					//一程合计利润
+					routeCostItem.setTotalProfit(routeCostItem.getSalesPrice().subtract(routeCostItem.getCostPrice()));
+					//合计利润
+					routeCostItem.setProfit(routeCostItem.getTotalProfit());
 				}
-				//合计利润
-				routeCostItem.setProfit(routeCostItem.getTotalProfit().add(routeCostItem.getTotalProfitTwo()));
 				if (routeCostItem.getId() == null) {
 					routeCostItem.setPid(routeCost.getId());
 					routeCostItem.setCreateTime(new Date());
@@ -677,7 +746,7 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 
 
 	/**
-	 * 合计费用
+	 * 合计费用成本
 	 *
 	 * @param routeCostFeeList 费用明细
 	 * @param type             费用类型
@@ -699,6 +768,28 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 	}
 
 	/**
+	 * 合计费用收入
+	 *
+	 * @param routeCostFeeList 费用明细
+	 * @param type             费用类型
+	 * @param boxType          箱型
+	 * @param exrate           汇率
+	 */
+	public BigDecimal computationalIncome(List<RouteCostFee> routeCostFeeList, String type, String boxType, BigDecimal exrate, String srcType) {
+		BigDecimal amount = new BigDecimal("0.00");
+		if (!routeCostFeeList.isEmpty()) {
+			amount = routeCostFeeList.stream().filter(e -> e.getBoxType().equals(boxType)
+				&& type.equals(e.getBusType()) && srcType.equals(e.getSrcType())).reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getExrate().multiply(y.getSalesPrice())), BigDecimal::add);
+			if (new BigDecimal("0.00").compareTo(amount) != 0) {
+				amount = amount.divide(exrate, 4, RoundingMode.HALF_UP);
+			} else {
+				amount = new BigDecimal("0.00");
+			}
+		}
+		return amount;
+	}
+
+	/**
 	 * 合计利润
 	 *
 	 * @param routeCostItemList 箱明细