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

贸易代理 2024年7月26日17:29:50

纪新园 1 год назад
Родитель
Сommit
168b844cf6

+ 6 - 1
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FeeCenter.java

@@ -111,6 +111,11 @@ public class FeeCenter implements Serializable {
 	@ApiModelProperty(value = "主表 id")
 	private Long pid;
 	/**
+	 * 结算主表id
+	 */
+	@ApiModelProperty(value = "结算主表id")
+	private Long stlPid;
+	/**
 	 * 行号 基于pid 1...
 	 */
 	@ApiModelProperty(value = "行号 基于pid 1...")
@@ -796,7 +801,7 @@ public class FeeCenter implements Serializable {
 	/**
 	 * 审核状态 0 新建费用 1 已请核 2 审核中 3 驳回 4 通过
 	 */
-	@ApiModelProperty(value = "审核状态 0 新建费用 1 已请核 2 审核中 3 驳回 4 通过")
+	@ApiModelProperty(value = "审核状态 0 新建费用 1 已请核 2 审核中 3 驳回 4 通过 5 已申请")
 	private String auditStatus;
 
 	/**

+ 48 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/dto/AgentItemsR.java

@@ -0,0 +1,48 @@
+/*
+ *      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.trade.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 贸易代理明细表实体类
+ *
+ * @author BladeX
+ * @since 2024-07-12
+ */
+@Data
+public class AgentItemsR implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 提单号
+	 */
+	private String billNo;
+	/**
+	 * 金额
+	 */
+	private BigDecimal amount;
+	/**
+	 * 本次结算金额
+	 */
+	private BigDecimal thisSettlementAmount;
+
+}

+ 14 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/entity/Agent.java

@@ -24,6 +24,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import org.springblade.los.business.files.entity.FilesCenter;
 import org.springblade.los.finance.fee.entity.FeeCenter;
+import org.springblade.los.trade.dto.AgentItemsR;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
@@ -449,6 +450,12 @@ public class Agent implements Serializable {
 	private String whetherReceivedBalancePayment;
 
 	/**
+	 * 结算单据类型  D收C付
+	 */
+	@ApiModelProperty(value = "结算单据类型")
+	private String dc;
+
+	/**
 	 * 收费
 	 */
 	@TableField(exist = false)
@@ -502,6 +509,9 @@ public class Agent implements Serializable {
 	@TableField(exist = false)
 	private List<FilesCenter> filesCenterList;
 
+	@TableField(exist = false)
+	private List<AgentItemsR> agentItemsRList;
+
 	/**
 	 * 版本
 	 */
@@ -537,5 +547,9 @@ public class Agent implements Serializable {
 	@TableField(exist = false)
 	private String paidApplication;
 
+	//未结算金额
+	@TableField(exist = false)
+	private BigDecimal unresolvedAmount;
+
 
 }

+ 6 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/entity/AgentItems.java

@@ -272,5 +272,11 @@ public class AgentItems implements Serializable {
 	@ApiModelProperty(value = "是否入库")
 	private String whetherComplete;
 
+	/**
+	 * 是否生成尾款
+	 */
+	@ApiModelProperty(value = "是否生成尾款")
+	private String whetherBalancePayment;
+
 
 }

+ 24 - 2
blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/controller/FeeCenterController.java

@@ -229,6 +229,28 @@ public class FeeCenterController extends BladeController {
 		return R.status(feeCenterService.removeByIds(Func.toLongList(ids)));
 	}
 
+	/**
+	 * 删除 物流-费用中心-所有业务费用集中在该表中
+	 */
+	@PostMapping("/removeTrade")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	@RepeatSubmit
+	public R removeTrade(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.apply("find_in_set(id,'" + ids + "')"));
+		for (FeeCenter item : feeCenterList) {
+			if (item.getAccStatus() != 0) {
+				throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单,删除失败");
+			}
+			item.setAuditStatus("0");
+			item.setStlPid(0L);
+		}
+		return R.status(feeCenterService.updateBatchById(feeCenterList));
+	}
+
 
 	/**
 	 * 模板导入
@@ -262,8 +284,8 @@ public class FeeCenterController extends BladeController {
 	 */
 	@GetMapping("/getFeeCenterCorpIds")
 	@ApiOperationSupport(order = 2)
-	public R<List<BCorps>> getFeeCenterCorpIds(@RequestParam("billId") Long billId,@RequestParam("dc") String dc,@RequestParam("type") String type) {
-		return R.data(feeCenterService.getFeeCenterCorpIds(billId,dc,type));
+	public R<List<BCorps>> getFeeCenterCorpIds(@RequestParam("billId") Long billId, @RequestParam("dc") String dc, @RequestParam("type") String type) {
+		return R.data(feeCenterService.getFeeCenterCorpIds(billId, dc, type));
 	}
 
 

+ 112 - 42
blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/AgentController.java

@@ -17,32 +17,30 @@
 package org.springblade.los.trade.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 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.common.annotation.RepeatSubmit;
+import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 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.business.aea.entity.AeaBills;
+import org.springblade.los.finance.fee.entity.FeeCenter;
+import org.springblade.los.finance.fee.service.IFeeCenterService;
+import org.springblade.los.trade.entity.Agent;
 import org.springblade.los.trade.entity.AgentItems;
-import org.springblade.los.trade.entity.AgentView;
 import org.springblade.los.trade.service.IAgentItemsService;
-import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import org.springblade.los.trade.entity.Agent;
-import org.springblade.los.trade.vo.AgentVO;
 import org.springblade.los.trade.service.IAgentService;
-import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.los.trade.vo.AgentVO;
+import org.springframework.web.bind.annotation.*;
 
+import javax.validation.Valid;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -62,6 +60,8 @@ public class AgentController extends BladeController {
 
 	private final IAgentItemsService agentItemsService;
 
+	private final IFeeCenterService feeCenterService;
+
 	/**
 	 * 详情
 	 */
@@ -74,6 +74,17 @@ public class AgentController extends BladeController {
 	}
 
 	/**
+	 * 详情
+	 */
+	@GetMapping("/detailStl")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入agent")
+	public R<Agent> detailStl(Agent agent) {
+		Agent detail = agentService.detailStl(agent);
+		return R.data(detail);
+	}
+
+	/**
 	 * 分页 贸易代理表
 	 */
 	@GetMapping("/list")
@@ -81,16 +92,16 @@ public class AgentController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入agent")
 	public R<IPage<Agent>> list(Agent agent, Query query) {
 		LambdaQueryWrapper<Agent> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(Agent::getIsDeleted,0)
+		lambdaQueryWrapper.eq(Agent::getIsDeleted, 0)
 			.eq(Agent::getTenantId, AuthUtil.getTenantId())
-			.eq(ObjectUtils.isNotNull(agent.getCorpId()),Agent::getCorpId,agent.getCorpId())
-			.like(ObjectUtils.isNotNull(agent.getContractNo()),Agent::getContractNo,agent.getContractNo())
-			.like(ObjectUtils.isNotNull(agent.getBusinessNo()),Agent::getBusinessNo,agent.getBusinessNo())
-			.like(ObjectUtils.isNotNull(agent.getBillNoJoin()),Agent::getBillNoJoin,agent.getBillNoJoin())
-			.like(ObjectUtils.isNotNull(agent.getOrderNoJoin()),Agent::getOrderNoJoin,agent.getOrderNoJoin())
-			.like(ObjectUtils.isNotNull(agent.getBoxNoJoin()),Agent::getBoxNoJoin,agent.getBoxNoJoin())
+			.eq(ObjectUtils.isNotNull(agent.getCorpId()), Agent::getCorpId, agent.getCorpId())
+			.like(ObjectUtils.isNotNull(agent.getContractNo()), Agent::getContractNo, agent.getContractNo())
+			.like(ObjectUtils.isNotNull(agent.getBusinessNo()), Agent::getBusinessNo, agent.getBusinessNo())
+			.like(ObjectUtils.isNotNull(agent.getBillNoJoin()), Agent::getBillNoJoin, agent.getBillNoJoin())
+			.like(ObjectUtils.isNotNull(agent.getOrderNoJoin()), Agent::getOrderNoJoin, agent.getOrderNoJoin())
+			.like(ObjectUtils.isNotNull(agent.getBoxNoJoin()), Agent::getBoxNoJoin, agent.getBoxNoJoin())
 			.orderByDesc(Agent::getCreateTime);
-		if (ObjectUtils.isNotNull(agent.getBusinessDateList()) && !agent.getBusinessDateList().isEmpty()){
+		if (ObjectUtils.isNotNull(agent.getBusinessDateList()) && !agent.getBusinessDateList().isEmpty()) {
 			lambdaQueryWrapper.gt(Agent::getBusinessDate, agent.getBusinessDateList().get(0));
 			lambdaQueryWrapper.lt(Agent::getBusinessDate, agent.getBusinessDateList().get(1));
 		}
@@ -149,13 +160,35 @@ public class AgentController extends BladeController {
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
 		List<Long> idList = Func.toLongList(ids).stream().distinct().collect(Collectors.toList());
 		List<AgentItems> agentItemsList = agentItemsService.list(new LambdaQueryWrapper<AgentItems>()
-			.eq(AgentItems::getTenantId,AuthUtil.getTenantId())
-			.eq(AgentItems::getIsDeleted,0)
-			.in(AgentItems::getPid,idList));
-		if (!agentItemsList.isEmpty()){
+			.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
+			.eq(AgentItems::getIsDeleted, 0)
+			.in(AgentItems::getPid, idList));
+		if (!agentItemsList.isEmpty()) {
 			List<Long> itemIds = agentItemsList.stream().map(AgentItems::getId).collect(Collectors.toList());
 			agentItemsService.removeByIds(itemIds);
 		}
+		List<Agent> agentList = agentService.list(new LambdaQueryWrapper<Agent>()
+			.eq(Agent::getTenantId, AuthUtil.getTenantId())
+			.eq(Agent::getIsDeleted, 0)
+			.in(Agent::getId, idList));
+		List<Long> stlPidList = agentList.stream().filter(e -> "MYDL-STL".equals(e.getBusinessType())).map(Agent::getId)
+			.distinct().collect(Collectors.toList());
+		if (!stlPidList.isEmpty()) {
+			List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.in(FeeCenter::getStlPid, stlPidList));
+			for (FeeCenter item : feeCenterList) {
+				if (1 == item.getStlStatus()) {
+					throw new RuntimeException("费用" + item.getFeeCnName() + "已结算,删除失败");
+				}
+				item.setStlPid(0L);
+				item.setAuditStatus("0");
+			}
+			if (!feeCenterList.isEmpty()) {
+				feeCenterService.updateBatchById(feeCenterList);
+			}
+		}
 		return R.status(agentService.removeByIds(idList));
 	}
 
@@ -199,6 +232,15 @@ public class AgentController extends BladeController {
 	}
 
 	/**
+	 * 生成尾款费用应收-列表
+	 */
+	@PostMapping("/balancePayment")
+	@RepeatSubmit
+	public R balancePayment(@RequestBody Agent agent) {
+		return agentService.balancePayment(agent);
+	}
+
+	/**
 	 * 生成尾款费用应收
 	 */
 	@PostMapping("/generateBalancePaymentBill")
@@ -209,6 +251,16 @@ public class AgentController extends BladeController {
 	}
 
 	/**
+	 * 生成应付费用
+	 */
+	@PostMapping("/generatePayment")
+	@RepeatSubmit
+	public R generatePayment(@RequestBody Agent agent) {
+		Agent declare = agentService.generatePayment(agent);
+		return R.data(declare);
+	}
+
+	/**
 	 * 生成账单
 	 */
 	@PostMapping("/generateBill")
@@ -228,35 +280,41 @@ public class AgentController extends BladeController {
 		return R.data(declare);
 	}
 
+	/**
+	 * 生成申请付款/收款-列表
+	 */
+	@GetMapping("/applyForPaymentList")
+	@RepeatSubmit
+	public R applyForPaymentList(String ids, String dc) {
+		return agentService.applyForPaymentList(ids, dc);
+	}
 
 	/**
-	 * 确认收款
+	 * 生成申请付款/收款
 	 */
-	@PostMapping("/confirmCollectionOfPayments")
+	@PostMapping("/generate")
 	@RepeatSubmit
-	public R confirmCollectionOfPayments(@RequestBody Agent agent) {
-		Agent declare = agentService.confirmCollectionOfPayments(agent);
-		return R.data(declare);
+	public R generate(@RequestBody List<FeeCenter> feeCenterList) {
+		return agentService.generate(feeCenterList);
 	}
 
 	/**
-	 * 申请付
+	 * 确认收
 	 */
-	@PostMapping("/ApplyForPayment")
+	@PostMapping("/confirmCollectionOfPayments")
 	@RepeatSubmit
-	public R ApplyForPayment(@RequestBody Agent agent) {
-		Agent declare = agentService.ApplyForPayment(agent);
+	public R confirmCollectionOfPayments(@RequestBody Agent agent) {
+		Agent declare = agentService.confirmCollectionOfPayments(agent);
 		return R.data(declare);
 	}
 
 	/**
-	 * 撤销申请付款
+	 * 确认付款-是否实收已收
 	 */
-	@PostMapping("/revokeApplyForPayment")
+	@PostMapping("/confirmReceived")
 	@RepeatSubmit
-	public R revokeApplyForPayment(@RequestBody Agent agent) {
-		Agent declare = agentService.revokeApplyForPayment(agent);
-		return R.data(declare);
+	public R confirmReceived(@RequestBody Agent agent) {
+		return agentService.confirmReceived(agent);
 	}
 
 	/**
@@ -270,13 +328,25 @@ public class AgentController extends BladeController {
 	}
 
 	/**
-	 * 确认付款-是否实收已收
+	 * 申请付款
 	 */
-	@PostMapping("/confirmReceived")
+	/*@PostMapping("/ApplyForPayment")
 	@RepeatSubmit
-	public R confirmReceived(@RequestBody Agent agent) {
-		return agentService.confirmReceived(agent);
-	}
+	public R ApplyForPayment(@RequestBody Agent agent) {
+		Agent declare = agentService.ApplyForPayment(agent);
+		return R.data(declare);
+	}*/
+
+	/**
+	 * 撤销申请付款
+	 */
+	/*@PostMapping("/revokeApplyForPayment")
+	@RepeatSubmit
+	public R revokeApplyForPayment(@RequestBody Agent agent) {
+		Agent declare = agentService.revokeApplyForPayment(agent);
+		return R.data(declare);
+	}*/
+
 
 	/**
 	 * 首款/尾款应收待确认通知

+ 10 - 5
blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/StorageController.java

@@ -70,7 +70,12 @@ public class StorageController extends BladeController {
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入storage")
 	public R<IPage<Storage>> list(Storage storage, Query query) {
-		IPage<Storage> pages = storageService.page(Condition.getPage(query), Condition.getQueryWrapper(storage));
+		LambdaQueryWrapper<Storage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Storage::getTenantId, AuthUtil.getTenantId())
+			.eq(Storage::getIsDeleted, 0)
+			.like(ObjectUtils.isNotNull(storage.getCode()), Storage::getCode, storage.getCode())
+			.like(ObjectUtils.isNotNull(storage.getCname()), Storage::getCname, storage.getCname());
+		IPage<Storage> pages = storageService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}
 
@@ -82,11 +87,11 @@ public class StorageController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入storage")
 	public R<List<Storage>> selectList(Storage storage) {
 		LambdaQueryWrapper<Storage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(Storage::getIsDeleted,0)
+		lambdaQueryWrapper.eq(Storage::getIsDeleted, 0)
 			.eq(Storage::getTenantId, AuthUtil.getTenantId())
-			.like(ObjectUtils.isNotNull(storage.getCode()),Storage::getCode,storage.getCode())
-			.like(ObjectUtils.isNotNull(storage.getCname()),Storage::getCname,storage.getCname());
-		List<Storage> pages = storageService.list( lambdaQueryWrapper);
+			.like(ObjectUtils.isNotNull(storage.getCode()), Storage::getCode, storage.getCode())
+			.like(ObjectUtils.isNotNull(storage.getCname()), Storage::getCname, storage.getCname());
+		List<Storage> pages = storageService.list(lambdaQueryWrapper);
 		return R.data(pages);
 	}
 

+ 13 - 0
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/IAgentService.java

@@ -17,11 +17,14 @@
 package org.springblade.los.trade.service;
 
 import org.springblade.core.tool.api.R;
+import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.trade.entity.Agent;
 import org.springblade.los.trade.vo.AgentVO;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 
+import java.util.List;
+
 /**
  * 贸易代理表 服务类
  *
@@ -70,4 +73,14 @@ public interface IAgentService extends IService<Agent> {
 	Agent confirmationNotification(Agent agent);
 
 	R confirmReceived(Agent agent);
+
+	Agent generatePayment(Agent agent);
+
+	R balancePayment(Agent agent);
+
+	R applyForPaymentList(String ids,String dc);
+
+	R generate(List<FeeCenter> feeCenterList);
+
+	Agent detailStl(Agent agent);
 }

Разница между файлами не показана из-за своего большого размера
+ 548 - 258
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/AgentServiceImpl.java


+ 123 - 12
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/InOutStorageServiceImpl.java

@@ -26,13 +26,16 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.los.Util.IDeptUtils;
+import org.springblade.los.basic.cur.entity.BCurExrate;
+import org.springblade.los.basic.cur.mapper.CurExrateMapper;
 import org.springblade.los.basic.fees.entity.BFees;
 import org.springblade.los.basic.fees.service.IBFeesService;
 import org.springblade.los.business.sea.entity.Bills;
+import org.springblade.los.business.sea.entity.PreContainers;
 import org.springblade.los.business.sea.mapper.BillsMapper;
+import org.springblade.los.business.sea.mapper.PreContainersMapper;
 import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.mapper.FeeCenterMapper;
-import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.trade.entity.AgentItems;
 import org.springblade.los.trade.entity.InOutStorage;
 import org.springblade.los.trade.entity.StorageFee;
@@ -49,9 +52,13 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 贸易代理-出入库明细表 服务实现类
@@ -79,6 +86,10 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
 
 	private final FeeCenterMapper feeCenterMapper;
 
+	private final PreContainersMapper preContainersMapper;
+
+	private final CurExrateMapper curExrateMapper;
+
 	@Override
 	public IPage<InOutStorageVO> selectInOutStoragePage(IPage<InOutStorageVO> page, InOutStorageVO inOutStorage) {
 		return page.setRecords(baseMapper.selectInOutStoragePage(page, inOutStorage));
@@ -95,21 +106,121 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
 		if ("RK".equals(inOutStorage.getBillType())) {
 			Bills bills = billsMapper.selectById(inOutStorage.getPid());
 			if (ObjectUtils.isNotNull(bills.getMconsigneeCntyName())) {
+				List<FeeCenter> feeCenterList = feeCenterMapper.selectList(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getPid, bills.getId())
+					.eq(FeeCenter::getDc, "C")
+					.apply("find_in_set(fee_code,'ZZS,GS')"));
+				if (feeCenterList.stream().noneMatch(e -> "GS".equals(e.getFeeCode()))) {
+					throw new RuntimeException("请先维护关税费用");
+				}
+				BigDecimal amountGS = feeCenterList.stream().filter(e -> "GS".equals(e.getFeeCode())).map(FeeCenter::getAmount)
+					.reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (feeCenterList.stream().noneMatch(e -> "ZZS".equals(e.getFeeCode()))) {
+					throw new RuntimeException("请先维护增值税费用");
+				}
+				BigDecimal amountZZS = feeCenterList.stream().filter(e -> "ZZS".equals(e.getFeeCode())).map(FeeCenter::getAmount)
+					.reduce(BigDecimal.ZERO, BigDecimal::add);
+				List<FeeCenter> feeCenterTradeList = feeCenterMapper.selectList(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getDc, "C")
+					.apply("find_in_set(fee_code,'SXF,YDF')")
+					.apply("find_in_set(" + bills.getMblno() + ",'mblno')"));
+				if (feeCenterTradeList.isEmpty()) {
+					throw new RuntimeException("未查到提单号:" + bills.getMblno() + "对应贸易代理费用信息");
+				}
 				List<AgentItems> agentItemsList = agentItemsMapper.selectList(new LambdaQueryWrapper<AgentItems>()
-					.apply("find_in_set(id,'" + bills.getMconsigneeCntyName() + "')")
+					.eq(AgentItems::getPid, feeCenterTradeList.get(0).getPid())
 					.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
 					.eq(AgentItems::getIsDeleted, 0));
-				for (AgentItems items : agentItemsList) {
-					items.setUpdateTime(new Date());
-					items.setUpdateUser(AuthUtil.getUserId());
-					items.setUpdateUserName(AuthUtil.getUserName());
-					items.setWhetherComplete("已入库");
-					items.setDispatchDate(new Date());
-					agentItemsMapper.updateById(items);
+				if (agentItemsList.isEmpty()) {
+					throw new RuntimeException("未查到提单号:" + bills.getMblno() + "对应贸易代理明细信息");
+				}
+				if (feeCenterTradeList.stream().noneMatch(e -> "SXF".equals(e.getFeeCode()) && "1".equals(e.getFeeType()))) {
+					throw new RuntimeException("请先维护首款手续费用");
+				}
+				BigDecimal amountSkSxf = feeCenterTradeList.stream().filter(e -> "SXF".equals(e.getFeeCode()) && "1".equals(e.getFeeType()))
+					.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (feeCenterTradeList.stream().noneMatch(e -> "SXF".equals(e.getFeeCode()) && "2".equals(e.getFeeType()))) {
+					throw new RuntimeException("请先维护尾款手续费用");
+				}
+				if (feeCenterTradeList.stream().noneMatch(e -> "YDF".equals(e.getFeeCode()) && "1".equals(e.getFeeType()))) {
+					throw new RuntimeException("请先维护首款邮电费用");
+				}
+				BigDecimal amountSkYdf = feeCenterTradeList.stream().filter(e -> "YDF".equals(e.getFeeCode()) && "1".equals(e.getFeeType()))
+					.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (feeCenterTradeList.stream().noneMatch(e -> "YDF".equals(e.getFeeCode()) && "2".equals(e.getFeeType()))) {
+					throw new RuntimeException("请先维护尾款邮电费用");
+				}
+				long count = agentItemsList.stream().map(AgentItems::getBillNo).distinct().count();
+
+				//首款手续费平摊金额 = 手续费 ÷ 总提单数量
+				BigDecimal singleSkSxf = amountSkSxf.divide(new BigDecimal(count), 2, RoundingMode.HALF_UP);
+				//首款邮电费平摊金额 = 邮电费 ÷ 总提单数量
+				BigDecimal singleSkYdf = amountSkYdf.divide(new BigDecimal(count), 2, RoundingMode.HALF_UP);
+				//单个提单号尾款手续费金额 = 手续费 ÷ 提单数量
+				BigDecimal singleWkSxf = new BigDecimal("0.00");
+				//单个提单号尾款邮电费金额 = 邮电费 ÷ 提单数量
+				BigDecimal singleWkYdf = new BigDecimal("0.00");
+				for (FeeCenter item : feeCenterTradeList) {
+					if ("SXF".equals(item.getFeeCode()) && "2".equals(item.getFeeType())) {
+						String[] arr = item.getMblno().split(",");
+						singleWkSxf = singleWkSxf.add(item.getAmount().divide(new BigDecimal(arr.length), 2, RoundingMode.HALF_UP));
+					}
+					if ("YDF".equals(item.getFeeCode()) && "2".equals(item.getFeeType())) {
+						String[] arr = item.getMblno().split(",");
+						singleWkYdf = singleWkYdf.add(item.getAmount().divide(new BigDecimal(arr.length), 2, RoundingMode.HALF_UP));
+					}
+				}
+				//总的分摊金额 = 关税 + 增值税 + 单个提单号手续费金额 + 单个提单号邮电费金额
+				BigDecimal sharedAmountSum = singleSkSxf.add(singleSkYdf).add(singleWkSxf).add(singleWkYdf).add(amountGS).add(amountZZS);
+				//箱的货值
+				BigDecimal amount = inOutStorage.getQuantity().multiply(inOutStorage.getPrice());
+				List<PreContainers> preContainersList = preContainersMapper.selectList(new LambdaQueryWrapper<PreContainers>()
+					.eq(PreContainers::getIsDeleted, 0)
+					.eq(PreContainers::getTenantId, AuthUtil.getTenantId())
+					.eq(PreContainers::getPid, bills.getId()));
+				//提单号的总货值
+				BigDecimal amountSum = preContainersList.stream().reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getNumber().multiply(y.getPrice())), BigDecimal::add).setScale(2, RoundingMode.HALF_UP);
+				LocalDate localDate = bills.getEta().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
+				int year = localDate.getYear();
+				int month = localDate.getMonthValue();
+				int day = localDate.getDayOfMonth();
+				LambdaQueryWrapper<BCurExrate> lambdaQueryWrapper = new LambdaQueryWrapper<BCurExrate>()
+					.eq(BCurExrate::getCode, "USD")
+					.eq(BCurExrate::getTenantId, AuthUtil.getTenantId())
+					.eq(BCurExrate::getIsDeleted, 0)
+					.eq(BCurExrate::getExrateYear, year)
+					.eq(BCurExrate::getExrateMonth, month)
+					.eq(BCurExrate::getExrateDay, day)
+					.eq(BCurExrate::getType, "日汇率");
+				BCurExrate bCurExrate = curExrateMapper.selectOne(lambdaQueryWrapper);
+				if (bCurExrate == null) {
+					throw new RuntimeException("未找到" + year + "年-" + month + "月-" + day + "日实付汇率");
+				}
+				//分摊比例 = 箱的货值 ÷ 提单号的总货值 * 汇率
+				BigDecimal sharingRatio = amount.divide(amountSum, 2, RoundingMode.HALF_UP).multiply(bCurExrate.getExratePayment());
+				//本次分摊金额 = 总的分摊金额 * 分摊比例 ÷ 件数
+				BigDecimal sharedAmount = sharedAmountSum.multiply(sharingRatio).divide(inOutStorage.getQuantity(), 2, RoundingMode.HALF_UP);
+				//仓储单价 = 单价 + 本次分摊金额
+				inOutStorage.setWarehouseUnitPrice(inOutStorage.getPrice().add(sharedAmount));
+				List<AgentItems> agentItems = agentItemsList.stream().filter(e -> bills.getMconsigneeCntyName().contains(e.getId() + ""))
+					.collect(Collectors.toList());
+				if (!agentItems.isEmpty()) {
+					for (AgentItems items : agentItems) {
+						items.setUpdateTime(new Date());
+						items.setUpdateUser(AuthUtil.getUserId());
+						items.setUpdateUserName(AuthUtil.getUserName());
+						items.setWhetherComplete("已入库");
+						items.setDispatchDate(new Date());
+						agentItemsMapper.updateById(items);
+					}
 				}
 			}
 		} else {
-			if (ObjectUtils.isNotNull(inOutStorage.getOutStorageDate())){
+			if (ObjectUtils.isNotNull(inOutStorage.getOutStorageDate())) {
 				inOutStorage.setOutStorageDate(new Date());
 			}
 			InOutStorage inStorage = baseMapper.selectById(inOutStorage.getSrcId());
@@ -220,11 +331,11 @@ public class InOutStorageServiceImpl extends ServiceImpl<InOutStorageMapper, InO
 				feeCenter.setPrice(amount);
 				feeCenter.setAmount(amount);
 				feeCenter.setRemarks(remark.toString());
-				feeCenter.setDays(Integer.parseInt(day+""));
+				feeCenter.setDays(Integer.parseInt(day + ""));
 				feeCenter.setStorageDate(inOutStorage.getOutStorageDate());
 				feeCenter.setOutboundDate(inStorage.getStorageDate());
 				feeCenterMapper.insert(feeCenter);
-				inOutStorage.setStorageDays(Integer.parseInt(day+""));
+				inOutStorage.setStorageDays(Integer.parseInt(day + ""));
 				inOutStorage.setStorageFeesAmount(amount);
 			}
 		}

Некоторые файлы не были показаны из-за большого количества измененных файлов