Browse Source

1.永发物流-成本中心,航线利润 2.0版优化细节

纪新园 9 months ago
parent
commit
00397bf623
18 changed files with 512 additions and 257 deletions
  1. 36 8
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCost.java
  2. 1 1
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCostFee.java
  3. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/basic/cntr/service/impl/BCntrTypesServiceImpl.java
  4. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/basic/fees/controller/LosBFeesTemplateController.java
  5. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditProecessController.java
  6. 5 21
      blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java
  7. 44 136
      blade-service/blade-los/src/main/java/org/springblade/los/excel/RouteCostExcel.java
  8. 27 8
      blade-service/blade-los/src/main/java/org/springblade/los/excel/RouteCostProfitExcel.java
  9. 81 16
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/controller/RouteCostController.java
  10. 3 2
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/controller/RouteCostFeeController.java
  11. 3 2
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/controller/RouteCostItemController.java
  12. 12 0
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/mapper/RouteCostMapper.xml
  13. 2 3
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/IRouteCostFeeService.java
  14. 2 3
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/IRouteCostItemService.java
  15. 10 0
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/IRouteCostService.java
  16. 3 5
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostFeeServiceImpl.java
  17. 5 5
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostItemServiceImpl.java
  18. 275 44
      blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostServiceImpl.java

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

@@ -87,7 +87,7 @@ public class RouteCost implements Serializable {
 	@ApiModelProperty(value = "修改人")
 	private String updateUserName;
 	/**
-	 * 单据状态
+	 * 单据状态  录入  审核提交  审核中  审核通过
 	 */
 	@ApiModelProperty(value = "单据状态")
 	private String status;
@@ -370,6 +370,36 @@ public class RouteCost implements Serializable {
 	private Date exrateDate;
 
 	/**
+	 * 20利润
+	 */
+	@ApiModelProperty(value = "20利润")
+	private BigDecimal profit20;
+
+	/**
+	 * 40利润
+	 */
+	@ApiModelProperty(value = "40利润")
+	private BigDecimal profit40;
+
+	/**
+	 * 40HC利润
+	 */
+	@ApiModelProperty(value = "40HC利润")
+	private BigDecimal profitHc;
+
+	/**
+	 * 其他利润
+	 */
+	@ApiModelProperty(value = "其他利润")
+	private BigDecimal otherProfit;
+
+	/**
+	 * 合计利润
+	 */
+	@ApiModelProperty(value = "合计利润")
+	private BigDecimal totalProfit;
+
+	/**
 	 * 费用明细
 	 */
 	@TableField(exist = false)
@@ -385,13 +415,7 @@ public class RouteCost implements Serializable {
 	 * 排序方式   0=按箱利润 1=按起运港 2=按目的港
 	 */
 	@TableField(exist = false)
-	private Integer sort;
-
-	/**
-	 * 利润
-	 */
-	@TableField(exist = false)
-	private BigDecimal profit;
+	private String sort;
 
 	/**
 	 * 编码生成code
@@ -421,5 +445,9 @@ public class RouteCost implements Serializable {
 	@TableField(exist = false)
 	private List<LosAuditPathsLevels> auditPathsLevels;
 
+	//是否存在明细
+	@TableField(exist = false)
+	private String item;
+
 
 }

+ 1 - 1
blade-service-api/blade-los-api/src/main/java/org/springblade/los/logistics/route/entity/RouteCostFee.java

@@ -103,7 +103,7 @@ public class RouteCostFee implements Serializable {
 	 * 费用
 	 */
 	@ApiModelProperty(value = "费用")
-	private Integer feeId;
+	private Long feeId;
 	/**
 	 * 费用编码
 	 */

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/basic/cntr/service/impl/BCntrTypesServiceImpl.java

@@ -93,7 +93,7 @@ public class BCntrTypesServiceImpl extends ServiceImpl<CntrTypesMapper, BCntrTyp
 			bCntrTypes.setUpdateTime(new Date());
 			bCntrTypes.setUpdateUserName(AuthUtil.getUserName());
 		}
-		if(ObjectUtils.isNull(bCntrTypes.getExtendedData())){
+		if(ObjectUtils.isNull(bCntrTypes.getExtendedData()) || "\"\"".equals(bCntrTypes.getExtendedData())){
 			bCntrTypes.setExtendedData("[]");
 		}
 		this.saveOrUpdate(bCntrTypes);

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

@@ -202,7 +202,7 @@ public class LosBFeesTemplateController extends BladeController {
 		LambdaQueryWrapper<LosBFeesTemplate> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 		lambdaQueryWrapper.eq(LosBFeesTemplate::getTenantId, AuthUtil.getTenantId())
 			.eq(LosBFeesTemplate::getIsDeleted, 0)
-			.eq(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())

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/check/controller/AuditProecessController.java

@@ -246,7 +246,7 @@ public class AuditProecessController extends BladeController {
 			|| "FFSQ-WK".equals(proecess.getCheckType())|| "YSQR-D".equals(proecess.getCheckType())
 			|| "YSQR-C".equals(proecess.getCheckType())) {
 			auditProecessService.agentCheck(auditProecess);
-		}else if ("SOC".equals(proecess.getCheckType()) || "COC".equals(proecess.getCheckType())) {
+		}else if ("HXCB_SOC".equals(proecess.getCheckType()) || "HXCB_COC".equals(proecess.getCheckType())) {
 			auditProecessService.routeCostCheck(auditProecess);
 		}
 		return R.data(auditProecess);

+ 5 - 21
blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java

@@ -3623,18 +3623,10 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 			//通过
 			if (operate == 1) {
 				auditProecess.setAuditStatus("A");
-				Agent detail = agentMapper.selectById(auditProecess.getSrcBillId());
-				if (detail == null) {
-					throw new SecurityException("审批通过失败");
-				}
-				if ("FFSQ-SK".equals(auditProecess.getCheckType())) {
-					detail.setFirstStatus("审核通过");
-				} else {
-					detail.setBusinessStatus("审核通过");
-				}
-				int count = agentMapper.updateById(detail);
+				routeCost.setStatus("审核通过");
+				int count = routeCostMapper.updateById(routeCost);
 				if (count == 0) {
-					throw new SecurityException("修改订单数据失败");
+					throw new SecurityException("审批开始修改审核状态失败");
 				}
 				if ("航线成本(SOC)审核".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的航线成本(SOC)审核已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
@@ -3650,16 +3642,8 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 			else if (operate == 2) {
 				//todo 调用feign取消
 				auditProecess.setAuditStatus("B");
-				Agent detail = agentMapper.selectById(auditProecess.getSrcBillId());
-				if (detail == null) {
-					throw new SecurityException("审批通过失败");
-				}
-				if ("FFSQ-SK".equals(auditProecess.getPaidApplication())) {
-					detail.setFirstStatus("录入");
-				} else {
-					detail.setBusinessStatus("录入");
-				}
-				int count = agentMapper.updateById(detail);
+				routeCost.setStatus("录入");
+				int count = routeCostMapper.updateById(routeCost);
 				if (count == 0) {
 					throw new SecurityException("修改订单数据失败");
 				}

+ 44 - 136
blade-service/blade-los/src/main/java/org/springblade/los/excel/RouteCostExcel.java

@@ -41,111 +41,31 @@ public class RouteCostExcel implements Serializable {
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * 主键
-	 */
-	@ExcelProperty(value = "主键")
-	private Long id;
-	/**
-	 * 创建时间
-	 */
-	@ExcelProperty(value = "创建时间")
-	private Date createTime;
-	/**
-	 * 修改时间
-	 */
-	@ExcelProperty(value = "修改时间")
-	private Date updateTime;
-	/**
-	 * 备注
-	 */
-	@ExcelProperty(value = "备注")
-	private String remarks;
-	/**
-	 * 创建人
-	 */
-	@ExcelProperty(value = "创建人")
-	private String createUserName;
-	/**
-	 * 修改人
-	 */
-	@ExcelProperty(value = "修改人")
-	private String updateUserName;
-	/**
-	 * 单据状态
-	 */
-	@ExcelProperty(value = "单据状态")
-	private String status;
-	/**
 	 * 系统号
 	 */
 	@ExcelProperty(value = "系统号")
 	private String businessNo;
 	/**
-	 * 业务日期
-	 */
-	@ExcelProperty(value = "业务日期")
-	private Date businessDate;
-	/**
-	 * 业务类型  soc  coc
-	 */
-	@ExcelProperty(value = "业务类型  soc  coc ")
-	private String businessType;
-	/**
-	 * 所属公司
-	 */
-	@ExcelProperty(value = "所属公司")
-	private String belongingCompanyName;
-	/**
 	 * 起运港中文
 	 */
 	@ExcelProperty(value = "起运港中文")
 	private String podCname;
 	/**
-	 * 起运港英文
-	 */
-	@ExcelProperty(value = "起运港英文")
-	private String podEname;
-	/**
 	 * 目的港中文
 	 */
 	@ExcelProperty(value = "目的港中文")
 	private String destinationCname;
 	/**
-	 * 目的港英文
-	 */
-	@ExcelProperty(value = "目的港英文")
-	private String destinationEname;
-	/**
 	 * 航线中文
 	 */
 	@ExcelProperty(value = "航线中文")
 	private String airlineCname;
 	/**
-	 * 航线英文
-	 */
-	@ExcelProperty(value = "航线英文")
-	private String airlineEname;
-	/**
 	 * 船公司中文
 	 */
 	@ExcelProperty(value = "船公司中文")
 	private String shippingCompanyCname;
 	/**
-	 * 船公司简称
-	 */
-	@ExcelProperty(value = "船公司简称")
-	private String shippingCompanyAbbreviation;
-	/**
-	 * 实际船公司中文
-	 */
-	@ExcelProperty(value = "实际船公司中文")
-	private String actualShippingCompanyCname;
-	/**
-	 * 实际船公司简称
-	 */
-	@ExcelProperty(value = "实际船公司简称")
-	private String actualShippingCompanyAbbreviation;
-	/**
 	 * 船名中文
 	 */
 	@ExcelProperty(value = "船名中文")
@@ -156,90 +76,78 @@ public class RouteCostExcel implements Serializable {
 	@ExcelProperty(value = "航次")
 	private String voyage;
 	/**
-	 * 舱位类型  固定/非固定
-	 */
-	@ExcelProperty(value = "舱位类型  固定/非固定")
-	private String cabinType;
-	/**
-	 * 固定:单程/往返    非固定 :CSA/舱保
-	 */
-	@ExcelProperty(value = "固定:单程/往返    非固定 :CSA/舱保")
-	private String cabinTypeData;
-	/**
-	 * 舱位数
-	 */
-	@ExcelProperty(value = "舱位数")
-	private Integer shippingSpaceNumber;
-	/**
-	 * 限重含皮(吨)
-	 */
-	@ExcelProperty(value = "限重含皮(吨)")
-	private BigDecimal weightLimit;
-	/**
 	 * 航行天数
 	 */
 	@ExcelProperty(value = "航行天数")
 	private Integer navigateDay;
 	/**
-	 * 在场站天数
-	 */
-	@ExcelProperty(value = "在场站天数")
-	private Integer existStationDay;
-	/**
 	 * 班次
 	 */
 	@ExcelProperty(value = "班次")
 	private String classes;
 	/**
-	 * 航班类型  转船/直达
+	 * 有效期启
 	 */
-	@ExcelProperty(value = "航班类型  转船/直达")
-	private String flightType;
+	@ExcelProperty(value = "有效期启")
+	private Date effectiveStartDate;
 	/**
-	 * 转船类型  船公司/自转
+	 * 有效期止
 	 */
-	@ExcelProperty(value = "转船类型  船公司/自转")
-	private String changeShipType;
+	@ExcelProperty(value = "有效期止")
+	private Date effectiveEndDate;
 	/**
-	 * 中转港中文
+	 * 20利润
 	 */
-	@ExcelProperty(value = "中转港中文")
-	private String transitPortCname;
+	@ExcelProperty(value = "20利润")
+	private BigDecimal profit20;
+
 	/**
-	 * 合作伙伴
+	 * 40利润
 	 */
-	@ExcelProperty(value = "合作伙伴")
-	private String cooperativePartnerName;
+	@ExcelProperty(value = "40利润")
+	private BigDecimal profit40;
+
 	/**
-	 * 运输条款
+	 * 40HC利润
 	 */
-	@ExcelProperty(value = "运输条款")
-	private String transportationTerms;
+	@ExcelProperty(value = "40HC利润")
+	private BigDecimal profitHc;
+
 	/**
-	 * pol码头代码
+	 * 其他利润
 	 */
-	@ExcelProperty(value = "pol码头代码")
-	private String polWharfCode;
+	@ExcelProperty(value = "其他利润")
+	private BigDecimal otherProfit;
+
 	/**
-	 * pod码头代码
+	 * 合计利润
 	 */
-	@ExcelProperty(value = "pod码头代码")
-	private String podWharfCode;
+	@ExcelProperty(value = "合计利润")
+	private BigDecimal totalProfit;
 	/**
-	 * 有效期启
+	 * 创建人
 	 */
-	@ExcelProperty(value = "有效期启")
-	private Date effectiveStartDate;
+	@ExcelProperty(value = "制单人")
+	private String createUserName;
 	/**
-	 * 有效期止
+	 * 创建时间
 	 */
-	@ExcelProperty(value = "有效期止")
-	private Date effectiveEndDate;
-
+	@ExcelProperty(value = "制单日期")
+	private Date createTime;
 	/**
-	 * 利润
+	 * 修改人
 	 */
-	@ExcelProperty(value = "利润")
-	private BigDecimal profit;
+	@ExcelProperty(value = "修改人")
+	private String updateUserName;
+	/**
+	 * 修改时间
+	 */
+	@ExcelProperty(value = "修改日期")
+	private Date updateTime;
+	/**
+	 * 备注
+	 */
+	@ExcelProperty(value = "备注")
+	private String remarks;
 
 }

+ 27 - 8
blade-service/blade-los/src/main/java/org/springblade/los/excel/RouteCostProfitExcel.java

@@ -46,7 +46,7 @@ public class RouteCostProfitExcel implements Serializable {
 	/**
 	 * 箱型
 	 */
-	@ApiModelProperty(value = "箱型")
+	@ExcelProperty(value = "箱型")
 	private String boxType;
 	/**
 	 * 起运港
@@ -110,6 +110,17 @@ public class RouteCostProfitExcel implements Serializable {
 	private String actualShippingCompanyCname;
 
 	/**
+	 * 船名
+	 */
+	@ExcelProperty(value = "船名")
+	private String shipCname;
+	/**
+	 * 航次
+	 */
+	@ExcelProperty(value = "航次")
+	private String voyage;
+
+	/**
 	 * 系统号
 	 */
 	@ExcelProperty(value = "系统号")
@@ -142,16 +153,12 @@ public class RouteCostProfitExcel implements Serializable {
 	 */
 	@ExcelIgnore
 	private Long pid;
+
 	/**
-	 * 船名
-	 */
-	@ExcelIgnore
-	private String shipCname;
-	/**
-	 * 航次
+	 * 单据主表id
 	 */
 	@ExcelIgnore
-	private String voyage;
+	private Long id;
 
 	/**
 	 * 排序方式   0=按箱利润 1=按起运港 2=按目的港
@@ -165,5 +172,17 @@ public class RouteCostProfitExcel implements Serializable {
 	@ExcelIgnore
 	private String tenantId;
 
+	/**
+	 * 来源类型
+	 */
+	@ExcelIgnore
+	private String businessType;
+
+	/**
+	 * 审核状态
+	 */
+	@ExcelIgnore
+	private String status;
+
 
 }

+ 81 - 16
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/controller/RouteCostController.java

@@ -33,11 +33,12 @@ 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.units.entity.BUnits;
-import org.springblade.los.business.sea.entity.Bills;
-import org.springblade.los.excel.BUnitsExcel;
 import org.springblade.los.excel.RouteCostExcel;
 import org.springblade.los.logistics.route.entity.RouteCost;
+import org.springblade.los.logistics.route.entity.RouteCostFee;
+import org.springblade.los.logistics.route.entity.RouteCostItem;
+import org.springblade.los.logistics.route.service.IRouteCostFeeService;
+import org.springblade.los.logistics.route.service.IRouteCostItemService;
 import org.springblade.los.logistics.route.service.IRouteCostService;
 import org.springblade.los.logistics.route.vo.RouteCostVO;
 import org.springframework.web.bind.annotation.*;
@@ -45,6 +46,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 航线成本 控制器
@@ -60,6 +62,10 @@ public class RouteCostController extends BladeController {
 
 	private final IRouteCostService routeCostService;
 
+	private final IRouteCostFeeService routeCostFeeService;
+
+	private final IRouteCostItemService routeCostItemService;
+
 	/**
 	 * 详情
 	 */
@@ -82,6 +88,7 @@ public class RouteCostController extends BladeController {
 		lambdaQueryWrapper.eq(RouteCost::getTenantId, AuthUtil.getTenantId())
 			.eq(RouteCost::getIsDeleted, 0)
 			.eq(RouteCost::getBusinessType, routeCost.getBusinessType())
+			.eq(ObjectUtils.isNotNull(routeCost.getStatus()), RouteCost::getStatus, routeCost.getStatus())
 			.like(ObjectUtils.isNotNull(routeCost.getBusinessNo()), RouteCost::getBusinessNo, routeCost.getBusinessNo())
 			.and(ObjectUtils.isNotNull(routeCost.getPodCname()), i -> i.like(RouteCost::getPodCname, routeCost.getPodCname()).or()
 				.like(RouteCost::getPodEname, routeCost.getPodCname()).or().like(RouteCost::getPodCode, routeCost.getPodCname()))
@@ -96,16 +103,39 @@ public class RouteCostController extends BladeController {
 			.like(ObjectUtils.isNotNull(routeCost.getVoyage()), RouteCost::getVoyage, routeCost.getVoyage())
 			.gt(ObjectUtils.isNotNull(routeCost.getExistStationDay()), RouteCost::getExistStationDay, routeCost.getExistStationDay())
 			.lt(ObjectUtils.isNotNull(routeCost.getEffectiveEndDate()), RouteCost::getEffectiveEndDate, routeCost.getEffectiveEndDate());
-		if (0 == routeCost.getExistStationDay()) {
-//			lambdaQueryWrapper.orderByAsc(RouteCost::getProfit);
-		} else if (1 == routeCost.getExistStationDay()) {
+		if ("0".equals(routeCost.getSort())) {
+			lambdaQueryWrapper.orderByAsc(RouteCost::getTotalProfit);
+		} else if ("1".equals(routeCost.getSort())) {
 			lambdaQueryWrapper.orderByAsc(RouteCost::getPodCname);
-		} else if (2 == routeCost.getExistStationDay()) {
+		} else if ("2".equals(routeCost.getSort())) {
 			lambdaQueryWrapper.orderByAsc(RouteCost::getDestinationCname);
 		} else {
-//			lambdaQueryWrapper.orderByAsc(RouteCost::getProfit);
+			lambdaQueryWrapper.orderByAsc(RouteCost::getTotalProfit);
 		}
 		IPage<RouteCost> pages = routeCostService.page(Condition.getPage(query), lambdaQueryWrapper);
+		if (!pages.getRecords().isEmpty()) {
+			List<Long> pid = pages.getRecords().stream().map(RouteCost::getId).collect(Collectors.toList());
+			List<RouteCostFee> routeCostFeeList = routeCostFeeService.list(new LambdaQueryWrapper<RouteCostFee>()
+				.eq(RouteCostFee::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostFee::getIsDeleted, 0)
+				.in(RouteCostFee::getPid, pid));
+			List<RouteCostItem> routeCostItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
+				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostItem::getIsDeleted, 0)
+				.in(RouteCostItem::getPid, pid));
+			for (RouteCost item : pages.getRecords()) {
+				if (!routeCostFeeList.isEmpty()) {
+					if (routeCostFeeList.stream().anyMatch(e -> e.getPid().equals(item.getId()))) {
+						item.setItem("1");
+					}
+				}
+				if (!routeCostItemList.isEmpty()) {
+					if (routeCostItemList.stream().anyMatch(e -> e.getPid().equals(item.getId()))) {
+						item.setItem("1");
+					}
+				}
+			}
+		}
 		return R.data(pages);
 	}
 
@@ -166,7 +196,7 @@ public class RouteCostController extends BladeController {
 	 */
 	@GetMapping("/copy")
 	@RepeatSubmit
-	public R copyBills(@RequestBody RouteCost routeCost) {
+	public R copyBills(RouteCost routeCost) {
 		RouteCost declare = routeCostService.copyBills(routeCost);
 		return R.data(declare);
 	}
@@ -228,6 +258,7 @@ public class RouteCostController extends BladeController {
 		lambdaQueryWrapper.eq(RouteCost::getTenantId, AuthUtil.getTenantId())
 			.eq(RouteCost::getIsDeleted, 0)
 			.eq(RouteCost::getBusinessType, routeCost.getBusinessType())
+			.eq(ObjectUtils.isNotNull(routeCost.getStatus()), RouteCost::getStatus, routeCost.getStatus())
 			.like(ObjectUtils.isNotNull(routeCost.getBusinessNo()), RouteCost::getBusinessNo, routeCost.getBusinessNo())
 			.and(ObjectUtils.isNotNull(routeCost.getPodCname()), i -> i.like(RouteCost::getPodCname, routeCost.getPodCname()).or()
 				.like(RouteCost::getPodEname, routeCost.getPodCname()).or().like(RouteCost::getPodCode, routeCost.getPodCname()))
@@ -242,23 +273,57 @@ public class RouteCostController extends BladeController {
 			.like(ObjectUtils.isNotNull(routeCost.getVoyage()), RouteCost::getVoyage, routeCost.getVoyage())
 			.gt(ObjectUtils.isNotNull(routeCost.getExistStationDay()), RouteCost::getExistStationDay, routeCost.getExistStationDay())
 			.lt(ObjectUtils.isNotNull(routeCost.getEffectiveEndDate()), RouteCost::getEffectiveEndDate, routeCost.getEffectiveEndDate());
-		if (0 == routeCost.getExistStationDay()) {
-//			lambdaQueryWrapper.orderByAsc(RouteCost::getProfit);
-		} else if (1 == routeCost.getExistStationDay()) {
+		if ("0".equals(routeCost.getSort())) {
+			lambdaQueryWrapper.orderByAsc(RouteCost::getTotalProfit);
+		} else if ("1".equals(routeCost.getSort())) {
 			lambdaQueryWrapper.orderByAsc(RouteCost::getPodCname);
-		} else if (2 == routeCost.getExistStationDay()) {
+		} else if ("2".equals(routeCost.getSort())) {
 			lambdaQueryWrapper.orderByAsc(RouteCost::getDestinationCname);
 		} else {
-//			lambdaQueryWrapper.orderByAsc(RouteCost::getProfit);
+			lambdaQueryWrapper.orderByAsc(RouteCost::getTotalProfit);
 		}
 		List<RouteCost> routeCostList = routeCostService.list(lambdaQueryWrapper);
-		if("SOC".equals(routeCost.getBusinessType())){
+		if ("SOC".equals(routeCost.getBusinessType())) {
 			ExcelUtil.export(response, "航线成本(SOC)", "航线成本", BeanUtil.copy(routeCostList, RouteCostExcel.class), RouteCostExcel.class);
-		}else{
+		} else {
 			ExcelUtil.export(response, "航线成本(COC)", "航线成本", BeanUtil.copy(routeCostList, RouteCostExcel.class), RouteCostExcel.class);
 		}
 
 	}
 
+	/**
+	 * 航线成本费用一键保存
+	 */
+	@PostMapping("/submitFeeList")
+	public R submitFeeList(@Valid @RequestBody List<RouteCostFee> routeCostFeeList) {
+		return routeCostService.submitFeeList(routeCostFeeList);
+	}
+
+
+	/**
+	 * 航线成本费用一键删除
+	 */
+	@PostMapping("/removeFeeList")
+	public R removeFeeList(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return routeCostService.removeFeeList(Func.toLongList(ids));
+	}
+
+	/**
+	 * 航线成本明细一键保存
+	 */
+	@PostMapping("/submitItemList")
+	public R submitItemList(@Valid @RequestBody List<RouteCostItem> routeCostItemList) {
+		return routeCostService.submitItemList(routeCostItemList);
+	}
+
+
+	/**
+	 * 航线成本明细一键删除
+	 */
+	@PostMapping("/removeItemList")
+	public R removeItemList(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return routeCostService.removeItemList(Func.toLongList(ids));
+	}
+
 
 }

+ 3 - 2
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/controller/RouteCostFeeController.java

@@ -34,6 +34,8 @@ import org.springblade.los.logistics.route.vo.RouteCostFeeVO;
 import org.springblade.los.logistics.route.service.IRouteCostFeeService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.List;
+
 /**
  * 航线成本费用 控制器
  *
@@ -111,7 +113,6 @@ public class RouteCostFeeController extends BladeController {
 		return R.status(routeCostFeeService.saveOrUpdate(routeCostFee));
 	}
 
-	
 	/**
 	 * 删除 航线成本费用
 	 */
@@ -122,5 +123,5 @@ public class RouteCostFeeController extends BladeController {
 		return R.status(routeCostFeeService.removeByIds(Func.toLongList(ids)));
 	}
 
-	
+
 }

+ 3 - 2
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/controller/RouteCostItemController.java

@@ -34,6 +34,8 @@ import org.springblade.los.logistics.route.vo.RouteCostItemVO;
 import org.springblade.los.logistics.route.service.IRouteCostItemService;
 import org.springblade.core.boot.ctrl.BladeController;
 
+import java.util.List;
+
 /**
  * 航线成本明细 控制器
  *
@@ -111,7 +113,6 @@ public class RouteCostItemController extends BladeController {
 		return R.status(routeCostItemService.saveOrUpdate(routeCostItem));
 	}
 
-	
 	/**
 	 * 删除 航线成本明细
 	 */
@@ -122,5 +123,5 @@ public class RouteCostItemController extends BladeController {
 		return R.status(routeCostItemService.removeByIds(Func.toLongList(ids)));
 	}
 
-	
+
 }

+ 12 - 0
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/mapper/RouteCostMapper.xml

@@ -89,6 +89,12 @@
         lrc.create_time as createTime,
         lrc.update_user_name as updateUserName,
         lrc.update_time as updateTime,
+        lrc.ship_cname as shipCname,
+        lrc.voyage as voyage,
+        lrc.id as pid,
+        item.id as id,
+        lrc.business_type as businessType,
+        lrc.status as status,
         item.remarks
         FROM
         logistics_route_cost_item item
@@ -160,6 +166,12 @@
         lrc.create_time as createTime,
         lrc.update_user_name as updateUserName,
         lrc.update_time as updateTime,
+        lrc.ship_cname as shipCname,
+        lrc.voyage as voyage,
+        lrc.id as pid,
+        item.id as id,
+        lrc.business_type as businessType,
+        lrc.status as status,
         item.remarks
         FROM
         logistics_route_cost_item item

+ 2 - 3
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/IRouteCostFeeService.java

@@ -16,10 +16,10 @@
  */
 package org.springblade.los.logistics.route.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.los.logistics.route.entity.RouteCostFee;
 import org.springblade.los.logistics.route.vo.RouteCostFeeVO;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * 航线成本费用 服务类
@@ -37,5 +37,4 @@ public interface IRouteCostFeeService extends IService<RouteCostFee> {
 	 * @return
 	 */
 	IPage<RouteCostFeeVO> selectRouteCostFeePage(IPage<RouteCostFeeVO> page, RouteCostFeeVO routeCostFee);
-
 }

+ 2 - 3
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/IRouteCostItemService.java

@@ -16,10 +16,10 @@
  */
 package org.springblade.los.logistics.route.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
 import org.springblade.los.logistics.route.entity.RouteCostItem;
 import org.springblade.los.logistics.route.vo.RouteCostItemVO;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * 航线成本明细 服务类
@@ -37,5 +37,4 @@ public interface IRouteCostItemService extends IService<RouteCostItem> {
 	 * @return
 	 */
 	IPage<RouteCostItemVO> selectRouteCostItemPage(IPage<RouteCostItemVO> page, RouteCostItemVO routeCostItem);
-
 }

+ 10 - 0
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/IRouteCostService.java

@@ -19,6 +19,8 @@ package org.springblade.los.logistics.route.service;
 import org.springblade.core.tool.api.R;
 import org.springblade.los.excel.RouteCostProfitExcel;
 import org.springblade.los.logistics.route.entity.RouteCost;
+import org.springblade.los.logistics.route.entity.RouteCostFee;
+import org.springblade.los.logistics.route.entity.RouteCostItem;
 import org.springblade.los.logistics.route.vo.RouteCostVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -61,4 +63,12 @@ public interface IRouteCostService extends IService<RouteCost> {
     IPage<RouteCostProfitExcel> listRouteCostProfit(IPage<RouteCostProfitExcel> page, RouteCostProfitExcel routeCost);
 
 	List<RouteCostProfitExcel> routeCostProfitListAll(RouteCostProfitExcel routeCost);
+
+	R submitFeeList(List<RouteCostFee> routeCostFeeList);
+
+	R removeFeeList(List<Long> longList);
+
+	R submitItemList(List<RouteCostItem> routeCostItemList);
+
+	R removeItemList(List<Long> longList);
 }

+ 3 - 5
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostFeeServiceImpl.java

@@ -16,13 +16,13 @@
  */
 package org.springblade.los.logistics.route.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springblade.los.logistics.route.entity.RouteCostFee;
-import org.springblade.los.logistics.route.vo.RouteCostFeeVO;
 import org.springblade.los.logistics.route.mapper.RouteCostFeeMapper;
 import org.springblade.los.logistics.route.service.IRouteCostFeeService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.los.logistics.route.vo.RouteCostFeeVO;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * 航线成本费用 服务实现类
@@ -32,10 +32,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
  */
 @Service
 public class RouteCostFeeServiceImpl extends ServiceImpl<RouteCostFeeMapper, RouteCostFee> implements IRouteCostFeeService {
-
 	@Override
 	public IPage<RouteCostFeeVO> selectRouteCostFeePage(IPage<RouteCostFeeVO> page, RouteCostFeeVO routeCostFee) {
 		return page.setRecords(baseMapper.selectRouteCostFeePage(page, routeCostFee));
 	}
-
 }

+ 5 - 5
blade-service/blade-los/src/main/java/org/springblade/los/logistics/route/service/impl/RouteCostItemServiceImpl.java

@@ -16,13 +16,14 @@
  */
 package org.springblade.los.logistics.route.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.AllArgsConstructor;
 import org.springblade.los.logistics.route.entity.RouteCostItem;
-import org.springblade.los.logistics.route.vo.RouteCostItemVO;
 import org.springblade.los.logistics.route.mapper.RouteCostItemMapper;
 import org.springblade.los.logistics.route.service.IRouteCostItemService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.los.logistics.route.vo.RouteCostItemVO;
 import org.springframework.stereotype.Service;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 
 /**
  * 航线成本明细 服务实现类
@@ -31,11 +32,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
  * @since 2025-03-31
  */
 @Service
+@AllArgsConstructor
 public class RouteCostItemServiceImpl extends ServiceImpl<RouteCostItemMapper, RouteCostItem> implements IRouteCostItemService {
-
 	@Override
 	public IPage<RouteCostItemVO> selectRouteCostItemPage(IPage<RouteCostItemVO> page, RouteCostItemVO routeCostItem) {
 		return page.setRecords(baseMapper.selectRouteCostItemPage(page, routeCostItem));
 	}
-
 }

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

@@ -29,7 +29,6 @@ import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
-import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
 import org.springblade.los.check.entity.LosAuditPathsActs;
 import org.springblade.los.check.entity.LosAuditPathsLevels;
@@ -37,8 +36,6 @@ import org.springblade.los.check.service.IAuditPathsActsService;
 import org.springblade.los.check.service.IAuditPathsLevelsService;
 import org.springblade.los.check.service.IAuditProecessService;
 import org.springblade.los.excel.RouteCostProfitExcel;
-import org.springblade.los.finance.fee.entity.FeeCenter;
-import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.logistics.route.entity.RouteCost;
 import org.springblade.los.logistics.route.entity.RouteCostFee;
 import org.springblade.los.logistics.route.entity.RouteCostItem;
@@ -48,7 +45,6 @@ import org.springblade.los.logistics.route.service.IRouteCostItemService;
 import org.springblade.los.logistics.route.service.IRouteCostService;
 import org.springblade.los.logistics.route.vo.RouteCostVO;
 import org.springblade.system.entity.Dept;
-import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -72,8 +68,6 @@ import java.util.stream.Collectors;
 public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost> implements IRouteCostService {
 
 
-	private final ISysClient sysClient;
-
 	private final IDeptUtils deptUtils;
 
 	private final IRouteCostFeeService routeCostFeeService;
@@ -169,42 +163,12 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 			int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
 			List<RouteCostFee> costFeeList = routeCost.getCostFeeList();
 			for (RouteCostItem routeCostItem : routeCost.getCostItemList()) {
-				if (!costFeeList.isEmpty()) {
-					//POL杂费成本
-					BigDecimal polAmount = costFeeList.stream().filter(e -> e.getBoxType().equals(routeCostItem.getBoxType())
-							&& "POL".equals(e.getBusType())).map(RouteCostFee::getCostPrice).filter(Objects::nonNull)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-					if (new BigDecimal("0.00").compareTo(polAmount) != 0) {
-						routeCostItem.setPolCost(polAmount.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
-					} else {
-						routeCostItem.setPolCost(new BigDecimal("0.00"));
-					}
-					//POD杂费成本
-					BigDecimal podAmount = costFeeList.stream().filter(e -> e.getBoxType().equals(routeCostItem.getBoxType())
-							&& "POD".equals(e.getBusType())).map(RouteCostFee::getCostPrice).filter(Objects::nonNull)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-					if (new BigDecimal("0.00").compareTo(podAmount) != 0) {
-						routeCostItem.setPodCost(podAmount.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
-					} else {
-						routeCostItem.setPodCost(new BigDecimal("0.00"));
-					}
-					//POT杂费成本
-					BigDecimal potAmount = costFeeList.stream().filter(e -> e.getBoxType().equals(routeCostItem.getBoxType())
-							&& "POT".equals(e.getBusType())).map(RouteCostFee::getCostPrice).filter(Objects::nonNull)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-					if (new BigDecimal("0.00").compareTo(potAmount) != 0) {
-						routeCostItem.setPotCost(potAmount.divide(routeCostItem.getExrate(), 4, RoundingMode.HALF_UP));
-					} else {
-						routeCostItem.setPotCost(new BigDecimal("0.00"));
-					}
-				} else {
-					//POL杂费成本
-					routeCostItem.setPolCost(new BigDecimal("0.00"));
-					//POD杂费成本
-					routeCostItem.setPodCost(new BigDecimal("0.00"));
-					//POT杂费成本
-					routeCostItem.setPotCost(new BigDecimal("0.00"));
-				}
+				//POL杂费成本
+				routeCostItem.setPolCost(computationalCost(costFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+				//POD杂费成本
+				routeCostItem.setPodCost(computationalCost(costFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+				//POT杂费成本
+				routeCostItem.setPotCost(computationalCost(costFeeList, "POT", routeCostItem.getBoxType(), routeCostItem.getExrate()));
 				//用箱成本
 				if (0 != days && ObjectUtils.isNotNull(routeCostItem.getBoxCost()) &&
 					routeCostItem.getBoxCost().compareTo(new BigDecimal("0.00")) != 0) {
@@ -230,6 +194,12 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 				}
 			}
 			routeCostItemService.saveOrUpdateBatch(routeCost.getCostItemList());
+			routeCost.setProfit20(totalProfit(routeCost.getCostItemList(), "20"));
+			routeCost.setProfit40(totalProfit(routeCost.getCostItemList(), "40"));
+			routeCost.setProfitHc(totalProfit(routeCost.getCostItemList(), "40HC"));
+			routeCost.setOtherProfit(totalProfit(routeCost.getCostItemList(), "other"));
+			routeCost.setTotalProfit(routeCost.getProfit20().add(routeCost.getProfit40()).add(routeCost.getProfitHc()).add(routeCost.getOtherProfit()));
+			this.saveOrUpdate(routeCost);
 		}
 		return R.data(routeCost);
 	}
@@ -282,7 +252,7 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 			item.setUpdateUserName(null);
 		}
 		detail.setCostItemList(costItemList.isEmpty() ? new ArrayList<>() : costItemList);
-		return null;
+		return detail;
 	}
 
 	@Override
@@ -396,7 +366,7 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 				throw new SecurityException("操作失败,请联系管理员");
 			}
 		}
-		declare.setStatus("请核中");
+		declare.setStatus("审核提交");
 		baseMapper.updateById(declare);
 		return declare;
 	}
@@ -451,12 +421,273 @@ public class RouteCostServiceImpl extends ServiceImpl<RouteCostMapper, RouteCost
 
 	@Override
 	public IPage<RouteCostProfitExcel> listRouteCostProfit(IPage<RouteCostProfitExcel> page, RouteCostProfitExcel routeCost) {
+		routeCost.setTenantId(AuthUtil.getTenantId());
 		return page.setRecords(baseMapper.listRouteCostProfit(page, routeCost));
 	}
 
 	@Override
 	public List<RouteCostProfitExcel> routeCostProfitListAll(RouteCostProfitExcel routeCost) {
+		routeCost.setTenantId(AuthUtil.getTenantId());
 		return baseMapper.routeCostProfitListAll(routeCost);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R submitFeeList(List<RouteCostFee> routeCostFeeList) {
+		if (!routeCostFeeList.isEmpty()) {
+			RouteCost routeCost = baseMapper.selectById(routeCostFeeList.get(0).getPid());
+			List<RouteCostItem> routeCostItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
+				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostItem::getIsDeleted, 0)
+				.eq(RouteCostItem::getPid, routeCostFeeList.get(0).getPid()));
+			for (RouteCostFee routeCostFee : routeCostFeeList) {
+				if (routeCostFee.getId() == null) {
+					routeCostFee.setPid(routeCost.getId());
+					routeCostFee.setCreateTime(new Date());
+					routeCostFee.setCreateUser(AuthUtil.getUserId());
+					routeCostFee.setCreateUserName(AuthUtil.getUserName());
+				} else {
+					routeCostFee.setUpdateUser(AuthUtil.getUserId());
+					routeCostFee.setUpdateTime(new Date());
+					routeCostFee.setUpdateUserName(AuthUtil.getUserName());
+				}
+			}
+			routeCostFeeService.saveOrUpdateBatch(routeCostFeeList);
+			if (ObjectUtils.isNotNull(routeCostItemList)) {
+				int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
+				for (RouteCostItem routeCostItem : routeCostItemList) {
+					//POL杂费成本
+					routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+					//POD杂费成本
+					routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+					//POT杂费成本
+					routeCostItem.setPotCost(computationalCost(routeCostFeeList, "POT", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+					//用箱成本
+					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));
+					} 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 (routeCostItem.getId() == null) {
+						routeCostItem.setPid(routeCost.getId());
+						routeCostItem.setCreateTime(new Date());
+						routeCostItem.setCreateUser(AuthUtil.getUserId());
+						routeCostItem.setCreateUserName(AuthUtil.getUserName());
+					} else {
+						routeCostItem.setUpdateUser(AuthUtil.getUserId());
+						routeCostItem.setUpdateTime(new Date());
+						routeCostItem.setUpdateUserName(AuthUtil.getUserName());
+					}
+				}
+				routeCostItemService.updateBatchById(routeCostItemList);
+				routeCost.setProfit20(totalProfit(routeCostItemList, "20"));
+				routeCost.setProfit40(totalProfit(routeCostItemList, "40"));
+				routeCost.setProfitHc(totalProfit(routeCostItemList, "40HC"));
+				routeCost.setOtherProfit(totalProfit(routeCostItemList, "other"));
+				routeCost.setTotalProfit(routeCost.getProfit20().add(routeCost.getProfit40()).add(routeCost.getProfitHc()).add(routeCost.getOtherProfit()));
+				baseMapper.updateById(routeCost);
+			}
+		}
+		return R.data(routeCostFeeList);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R removeFeeList(List<Long> longList) {
+		if (!longList.isEmpty()) {
+			RouteCostFee routeCostFee = routeCostFeeService.getById(longList.get(0));
+			List<RouteCostFee> routeCostFeeList = routeCostFeeService.list(new LambdaQueryWrapper<RouteCostFee>()
+				.eq(RouteCostFee::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostFee::getIsDeleted, 0)
+				.eq(RouteCostFee::getPid, routeCostFee.getPid()));
+			List<RouteCostFee> routeCostFeeListNew = routeCostFeeList.stream().filter(e -> !longList.contains(e.getId()))
+				.collect(Collectors.toList());
+			RouteCost routeCost = baseMapper.selectById(routeCostFee.getPid());
+			List<RouteCostItem> routeCostItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
+				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostItem::getIsDeleted, 0)
+				.eq(RouteCostItem::getPid, routeCostFee.getPid()));
+			if (ObjectUtils.isNotNull(routeCostItemList)) {
+				int days = routeCost.getNavigateDay() + routeCost.getExistStationDay();
+				for (RouteCostItem routeCostItem : routeCostItemList) {
+					//POL杂费成本
+					routeCostItem.setPolCost(computationalCost(routeCostFeeList, "POL", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+					//POD杂费成本
+					routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+					//POT杂费成本
+					routeCostItem.setPotCost(computationalCost(routeCostFeeList, "POT", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+
+					//用箱成本
+					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));
+					} 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 (routeCostItem.getId() == null) {
+						routeCostItem.setPid(routeCost.getId());
+						routeCostItem.setCreateTime(new Date());
+						routeCostItem.setCreateUser(AuthUtil.getUserId());
+						routeCostItem.setCreateUserName(AuthUtil.getUserName());
+					} else {
+						routeCostItem.setUpdateUser(AuthUtil.getUserId());
+						routeCostItem.setUpdateTime(new Date());
+						routeCostItem.setUpdateUserName(AuthUtil.getUserName());
+					}
+				}
+				routeCostItemService.updateBatchById(routeCostItemList);
+				routeCost.setProfit20(totalProfit(routeCostItemList, "20"));
+				routeCost.setProfit40(totalProfit(routeCostItemList, "40"));
+				routeCost.setProfitHc(totalProfit(routeCostItemList, "40HC"));
+				routeCost.setOtherProfit(totalProfit(routeCostItemList, "other"));
+				routeCost.setTotalProfit(routeCost.getProfit20().add(routeCost.getProfit40()).add(routeCost.getProfitHc()).add(routeCost.getOtherProfit()));
+				baseMapper.updateById(routeCost);
+			}
+			this.removeByIds(longList);
+		}
+		return R.success("操作成功");
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R submitItemList(List<RouteCostItem> routeCostItemList) {
+		if (!routeCostItemList.isEmpty()) {
+			RouteCost routeCost = baseMapper.selectById(routeCostItemList.get(0).getPid());
+			List<RouteCostFee> routeCostFeeList = routeCostFeeService.list(new LambdaQueryWrapper<RouteCostFee>()
+				.eq(RouteCostFee::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostFee::getIsDeleted, 0)
+				.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()));
+				//POD杂费成本
+				routeCostItem.setPodCost(computationalCost(routeCostFeeList, "POD", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+				//POT杂费成本
+				routeCostItem.setPotCost(computationalCost(routeCostFeeList, "POT", routeCostItem.getBoxType(), routeCostItem.getExrate()));
+				//用箱成本
+				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));
+				} 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 (routeCostItem.getId() == null) {
+					routeCostItem.setPid(routeCost.getId());
+					routeCostItem.setCreateTime(new Date());
+					routeCostItem.setCreateUser(AuthUtil.getUserId());
+					routeCostItem.setCreateUserName(AuthUtil.getUserName());
+				} else {
+					routeCostItem.setUpdateUser(AuthUtil.getUserId());
+					routeCostItem.setUpdateTime(new Date());
+					routeCostItem.setUpdateUserName(AuthUtil.getUserName());
+				}
+			}
+			routeCostItemService.saveOrUpdateBatch(routeCostItemList);
+			routeCost.setProfit20(totalProfit(routeCostItemList, "20"));
+			routeCost.setProfit40(totalProfit(routeCostItemList, "40"));
+			routeCost.setProfitHc(totalProfit(routeCostItemList, "40HC"));
+			routeCost.setOtherProfit(totalProfit(routeCostItemList, "other"));
+			routeCost.setTotalProfit(routeCost.getProfit20().add(routeCost.getProfit40()).add(routeCost.getProfitHc()).add(routeCost.getOtherProfit()));
+			baseMapper.updateById(routeCost);
+		}
+		return R.data(routeCostItemList);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R removeItemList(List<Long> longList) {
+		if (!longList.isEmpty()) {
+			RouteCostItem routeCostItem = routeCostItemService.getById(longList.get(0));
+			List<RouteCostItem> routeCostItemList = routeCostItemService.list(new LambdaQueryWrapper<RouteCostItem>()
+				.eq(RouteCostItem::getTenantId, AuthUtil.getTenantId())
+				.eq(RouteCostItem::getIsDeleted, 0)
+				.eq(RouteCostItem::getPid, routeCostItem.getPid()));
+			List<RouteCostItem> routeCostItems = routeCostItemList.stream().filter(e -> !longList.contains(e.getId()))
+				.collect(Collectors.toList());
+			RouteCost routeCost = baseMapper.selectById(routeCostItem.getPid());
+			if (ObjectUtils.isNotNull(routeCostItems)) {
+				routeCost.setProfit20(totalProfit(routeCostItemList, "20"));
+				routeCost.setProfit40(totalProfit(routeCostItemList, "40"));
+				routeCost.setProfitHc(totalProfit(routeCostItemList, "40HC"));
+				routeCost.setOtherProfit(totalProfit(routeCostItemList, "other"));
+				routeCost.setTotalProfit(routeCost.getProfit20().add(routeCost.getProfit40()).add(routeCost.getProfitHc()).add(routeCost.getOtherProfit()));
+				baseMapper.updateById(routeCost);
+			}
+			routeCostItemService.removeByIds(longList);
+		}
+		return R.success("操作成功");
+	}
+
+
+	/**
+	 * 合计费用
+	 *
+	 * @param routeCostFeeList 费用明细
+	 * @param type             费用类型
+	 * @param boxType          箱型
+	 * @param exrate           汇率
+	 */
+	public BigDecimal computationalCost(List<RouteCostFee> routeCostFeeList, String type, String boxType, BigDecimal exrate) {
+		BigDecimal amount = new BigDecimal("0.00");
+		if (!routeCostFeeList.isEmpty()) {
+			amount = routeCostFeeList.stream().filter(e -> e.getBoxType().equals(boxType)
+				&& type.equals(e.getBusType())).reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getExrate().multiply(y.getCostPrice())), 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 箱明细
+	 * @param type              箱尺寸
+	 */
+	public BigDecimal totalProfit(List<RouteCostItem> routeCostItemList, String type) {
+		BigDecimal profit;
+		if (!routeCostItemList.isEmpty()) {
+			if ("20".equals(type)) {
+				profit = routeCostItemList.stream().filter(e -> e.getBoxType().contains("20"))
+					.map(RouteCostItem::getTotalProfit).reduce(BigDecimal.ZERO, BigDecimal::add);
+			} else if ("40".equals(type)) {
+				profit = routeCostItemList.stream().filter(e -> e.getBoxType().contains("40") &&
+					!e.getBoxType().equals("40HC")).map(RouteCostItem::getTotalProfit).reduce(BigDecimal.ZERO, BigDecimal::add);
+			} else if ("40HC".equals(type)) {
+				profit = routeCostItemList.stream().filter(e -> e.getBoxType().contains("40HC"))
+					.map(RouteCostItem::getTotalProfit).reduce(BigDecimal.ZERO, BigDecimal::add);
+			} else {
+				profit = routeCostItemList.stream().filter(e -> !e.getBoxType().equals("40HC") &&
+						!e.getBoxType().contains("20") && !e.getBoxType().contains("40"))
+					.map(RouteCostItem::getTotalProfit).reduce(BigDecimal.ZERO, BigDecimal::add);
+			}
+		} else {
+			profit = new BigDecimal("0.00");
+		}
+		return profit;
+	}
+
 }