Browse Source

贸易代理 2024年7月30日17:30:43

纪新园 1 year ago
parent
commit
94e7b26d9c

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

@@ -924,5 +924,11 @@ public class FeeCenter implements Serializable {
 	@ApiModelProperty(value = "是否已同步增值税")
 	private String whetherSynchronizationZzs;
 
+	/**
+	 * 利润
+	 */
+	@ApiModelProperty(value = "利润")
+	private BigDecimal profit;
+
 }
 

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

@@ -454,6 +454,46 @@ public class Agent implements Serializable {
 	 */
 	@ApiModelProperty(value = "结算单据类型")
 	private String dc;
+	/**
+	 * 利润
+	 */
+	@ApiModelProperty(value = "利润")
+	private BigDecimal profit;
+
+	/**
+	 * 付汇美元金额
+	 */
+	@ApiModelProperty(value = "付汇美元金额")
+	private BigDecimal paymentInUsd;
+
+	/**
+	 * 当天汇率
+	 */
+	@ApiModelProperty(value = "当天汇率")
+	private BigDecimal exchangeRate;
+
+	/**
+	 * 实际支付人民币金额
+	 */
+	@ApiModelProperty(value = "实际支付人民币金额")
+	private BigDecimal actualAmount;
+
+	/**
+	 * 邮电费
+	 */
+	@ApiModelProperty(value = "邮电费")
+	private BigDecimal postElectricFee;
+	/**
+	 * 手续费
+	 */
+	@ApiModelProperty(value = "手续费")
+	private BigDecimal serviceCharge;
+
+	/**
+	 * 申报单号
+	 */
+	@ApiModelProperty(value = "申报单号")
+	private String declarationNumber;
 
 	/**
 	 * 收费
@@ -539,9 +579,6 @@ public class Agent implements Serializable {
 	//页面名字
 	@TableField(exist = false)
 	private String pageLabel;
-	//汇率
-	@TableField(exist = false)
-	private BigDecimal exchangeRate;
 
 	//付费申请类型
 	@TableField(exist = false)

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

@@ -1046,6 +1046,19 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 				if (agent == null) {
 					throw new RuntimeException("未找到主表信息");
 				}
+				List<FeeCenter> feeCenters = list.stream().filter(e -> "SFK,WK".contains(e.getFeeCode()))
+					.collect(Collectors.toList());
+				BigDecimal profit = new BigDecimal("0.00");
+				for (FeeCenter item : feeCenters) {
+					if (ObjectUtils.isNull(item.getDiscountExrate())){
+						throw new RuntimeException("首款、尾款优惠汇率不能为空");
+					}
+					BigDecimal amount = item.getAmountLoc().multiply(item.getDiscountExrate());
+					item.setProfit(item.getAmount().subtract(amount));
+					profit = profit.add(item.getAmount().subtract(amount));
+				}
+				agent.setProfit(profit);
+				agentMapper.updateById(agent);
 			}
 			for (FeeCenter feeCenter : list) {
 				if ("SI".equals(list.get(0).getBusinessType())) {

+ 347 - 123
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/AgentServiceImpl.java

@@ -33,6 +33,8 @@ import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.basic.corps.entity.BCorpsBank;
 import org.springblade.los.basic.corps.service.IBCorpsBankService;
+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.billno.entity.BusinessBillNo;
@@ -141,6 +143,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 
 	private final IPreContainersService preContainersService;
 
+	private final CurExrateMapper curExrateMapper;
+
 	@Override
 	public IPage<AgentVO> selectAgentPage(IPage<AgentVO> page, AgentVO agent) {
 		return page.setRecords(baseMapper.selectAgentPage(page, agent));
@@ -158,10 +162,51 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				.eq(FeeCenter::getIsDeleted, 0)
 				.eq(FeeCenter::getPid, agent.getId()));
 			if (!feeCenterList.isEmpty()) {
+				List<Record> recordList = new ArrayList<>();
+				List<Long> ids = new ArrayList<>();
 				List<FeeCenter> feeCenterListD = feeCenterList.stream().filter(e -> "D".equals(e.getDc())).collect(Collectors.toList());
-				detail.setFeeCenterListD(!feeCenterListD.isEmpty() ? feeCenterListD : new ArrayList<>());
+				if (!feeCenterListD.isEmpty()) {
+					detail.setFeeCenterListD(feeCenterListD);
+					ids.addAll(feeCenterListD.stream().map(FeeCenter::getStlPid).distinct().collect(Collectors.toList()));
+				} else {
+					detail.setFeeCenterListD(new ArrayList<>());
+				}
 				List<FeeCenter> feeCenterListC = feeCenterList.stream().filter(e -> "C".equals(e.getDc())).collect(Collectors.toList());
-				detail.setFeeCenterListC(!feeCenterListC.isEmpty() ? feeCenterListC : new ArrayList<>());
+				if (!feeCenterListC.isEmpty()) {
+					detail.setFeeCenterListC(feeCenterListC);
+					ids.addAll(feeCenterListC.stream().map(FeeCenter::getStlPid).distinct().collect(Collectors.toList()));
+				} else {
+					detail.setFeeCenterListC(new ArrayList<>());
+				}
+				List<Agent> agentList = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
+					.eq(Agent::getTenantId, AuthUtil.getTenantId())
+					.eq(Agent::getIsDeleted, 0)
+					.in(Agent::getId, ids));
+				if (!agentList.isEmpty()) {
+					for (Agent item : agentList) {
+						Record record = new Record();
+						record.setPid(agent.getId());
+						record.setSrcId(item.getId());
+						record.setAmount(item.getActualAmount());
+						record.setDate(item.getBusinessDate());
+						record.setBillNo(item.getBillNoJoin());
+						record.setRemarks(item.getRemarks());
+						record.setCustomsDeclarationNo(item.getDeclarationNumber());
+						if ("D".equals(item.getDc())) {
+							record.setStatus("付汇已结算");
+							record.setSrcType("STL-D-FH");
+						} else {
+							record.setStatus("购汇已结算");
+							record.setSrcType("STL-C-GH");
+						}
+						recordList.add(record);
+					}
+				}
+				if (!recordList.isEmpty()) {
+					detail.setRecordRateList(recordList);
+				} else {
+					detail.setRecordRateList(new ArrayList<>());
+				}
 			} else {
 				detail.setFeeCenterListD(new ArrayList<>());
 				detail.setFeeCenterListC(new ArrayList<>());
@@ -174,7 +219,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			List<FinStlBillsItems> finStlBillsItemsList = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
 				.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
 				.eq(FinStlBillsItems::getIsDeleted, 0)
-				.eq(FinStlBillsItems::getBillNo, agent.getBusinessNo()));
+				.apply("find_in_set(" + detail.getContractNo() + ",bill_no)"));
 			if (!finStlBillsItemsList.isEmpty()) {
 				List<Long> ids = finStlBillsItemsList.stream().map(FinStlBillsItems::getPid).collect(Collectors.toList());
 				List<FinStlBills> finStlBillsList = finStlBillsService.list(new LambdaQueryWrapper<FinStlBills>()
@@ -212,7 +257,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 							record.setBank(item.getBankAccountBank());
 							record.setPid(agent.getId());
 							record.setSrcId(item.getId());
-							record.setAmount(item.getAmountDr());
+							record.setAmount(item.getAmountCr());
 							record.setDate(item.getBillDate());
 							record.setBillNo(item.getBillNo());
 							record.setRemarks(item.getRemarks());
@@ -222,36 +267,10 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 						}
 						detail.setRecordListC(recordList);
 					}
-					List<FinStlBills> recordRateList = finStlBillsList.stream().filter(e -> "0".equals(e.getWhetherManual())).collect(Collectors.toList());
-					if (!recordRateList.isEmpty()) {
-						List<Record> recordList = new ArrayList<>();
-						for (FinStlBills item : recordRateList) {
-							Record record = new Record();
-							record.setAccount(item.getBankAccountName());
-							record.setAccountNumber(item.getBankAccountNo());
-							record.setBank(item.getBankAccountBank());
-							record.setPid(agent.getId());
-							record.setSrcId(item.getId());
-							record.setAmount(item.getAmountDr());
-							record.setDate(item.getBillDate());
-							record.setBillNo(item.getBillNo());
-							record.setRemarks(item.getRemarks());
-							if ("D".equals(item.getDc())) {
-								record.setStatus("付汇已结算");
-								record.setSrcType("STL-D-FH");
-							} else {
-								record.setStatus("购汇已结算");
-								record.setSrcType("STL-C-GH");
-							}
-							recordList.add(record);
-						}
-						detail.setRecordRateList(recordList);
-					}
 				}
 			} else {
 				detail.setRecordListD(new ArrayList<>());
 				detail.setRecordListC(new ArrayList<>());
-				detail.setRecordRateList(new ArrayList<>());
 			}
 			List<FinInvoicesItems> finInvoicesItemsList = finInvoicesItemsService.list(new LambdaQueryWrapper<FinInvoicesItems>()
 				.eq(FinInvoicesItems::getTenantId, AuthUtil.getTenantId())
@@ -362,6 +381,15 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		this.saveOrUpdate(agent);
 		if (!"MYDL-STL".equals(agent.getBusinessType())) {
 			if (ObjectUtils.isNotNull(agent.getAgentItemsList()) && !agent.getAgentItemsList().isEmpty()) {
+				String billNo = agent.getAgentItemsList().stream().map(AgentItems::getBillNo).filter(Objects::nonNull)
+					.distinct().collect(Collectors.joining(","));
+				agent.setBillNoJoin(billNo);
+				String boxNoJoin = agent.getAgentItemsList().stream().map(AgentItems::getBoxNo).filter(Objects::nonNull)
+					.distinct().collect(Collectors.joining(","));
+				agent.setBoxNoJoin(boxNoJoin);
+				String orderNoJoin = agent.getAgentItemsList().stream().map(AgentItems::getOrderNo).filter(Objects::nonNull)
+					.distinct().collect(Collectors.joining(","));
+				agent.setOrderNoJoin(orderNoJoin);
 				for (AgentItems item : agent.getAgentItemsList()) {
 					if (item.getId() == null) {
 						item.setPid(agent.getId());
@@ -410,8 +438,53 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				filesCenterService.saveOrUpdateBatch(agent.getFilesCenterList());
 			}
 		}
+		if ("MYDL-STL".equals(agent.getBusinessType())) {
+			LocalDate localDate = new Date().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 ("D".equals(agent.getDc())) {
+				if (bCurExrate == null) {
+					throw new RuntimeException("未找到" + year + "年-" + month + "月-" + day + "日实收汇率");
+				}
+				agent.setExchangeRate(bCurExrate.getExrateReceipts());
+			} else {
+				if (bCurExrate == null) {
+					throw new RuntimeException("未找到" + year + "年-" + month + "月-" + day + "日实付汇率");
+				}
+				agent.setExchangeRate(bCurExrate.getExratePayment());
+			}
+			String postElectricFee = sysClient.getParamServiceByDept("post.electric.fee", AuthUtil.getTenantId(), AuthUtil.getDeptId());
+			if (ObjectUtils.isNotNull(postElectricFee)) {
+				BigDecimal postElectricFeeAmount = new BigDecimal(postElectricFee);
+				agent.setPostElectricFee(postElectricFeeAmount);
+			} else {
+				agent.setPostElectricFee(new BigDecimal("0"));
+			}
+		}
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		if (ObjectUtils.isNotNull(agent.getFeeCenterListC()) && !agent.getFeeCenterListC().isEmpty()) {
+			long ydfCount = 0L;
+			long sxfCount = 0L;
+			if ("MYDL-STL".equals(agent.getBusinessType())) {
+				String billNo = agent.getFeeCenterListC().stream().map(FeeCenter::getMblno).filter(Objects::nonNull)
+					.distinct().collect(Collectors.joining(","));
+				agent.setBillNoJoin(billNo);
+				agent.setPaymentInUsd(agent.getFeeCenterListC().stream().filter(e -> "SFK,WK".contains(e.getFeeCode()))
+					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add));
+				agent.setActualAmount(agent.getExchangeRate().multiply(agent.getPaymentInUsd()));
+				ydfCount = agent.getFeeCenterListC().stream().filter(e -> "YDF".equals(e.getFeeCode())).count();
+				sxfCount = agent.getFeeCenterListC().stream().filter(e -> "SXF".equals(e.getFeeCode())).count();
+			}
 			for (FeeCenter item : agent.getFeeCenterListC()) {
 				if (!"MYDL-STL".equals(agent.getBusinessType())) {
 					item.setBusinessType(agent.getBusinessType());
@@ -433,6 +506,14 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					item.setPid(agent.getId());
 				} else {
 					item.setStlPid(agent.getId());
+					if ("YDF".equals(item.getFeeCode())) {
+						item.setAmount(agent.getPostElectricFee().divide(new BigDecimal(ydfCount), 2, RoundingMode.HALF_UP));
+						item.setPrice(item.getAmount());
+					}
+					if ("SXF".equals(item.getFeeCode())) {
+						item.setAmount(agent.getServiceCharge().divide(new BigDecimal(sxfCount), 2, RoundingMode.HALF_UP));
+						item.setPrice(item.getAmount());
+					}
 				}
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
@@ -449,8 +530,36 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				}
 			}
 			feeCenterList.addAll(agent.getFeeCenterListC());
+			List<FeeCenter> feeCenters = agent.getFeeCenterListC().stream().filter(e -> "SFK,WK".contains(e.getFeeCode()))
+				.collect(Collectors.toList());
+			BigDecimal profit = new BigDecimal("0.00");
+			for (FeeCenter item : feeCenters) {
+				if (ObjectUtils.isNull(item.getDiscountExrate())) {
+					throw new RuntimeException("首款、尾款优惠汇率不能为空");
+				}
+				BigDecimal amount = item.getAmountLoc().multiply(item.getDiscountExrate());
+				item.setProfit(item.getAmount().subtract(amount));
+				profit = profit.add(item.getAmount().subtract(amount));
+			}
+			agent.setProfit(profit);
 		}
 		if (ObjectUtils.isNotNull(agent.getFeeCenterListD()) && !agent.getFeeCenterListD().isEmpty()) {
+			long ydfCount = 0L;
+			long sxfCount = 0L;
+			if ("MYDL-STL".equals(agent.getBusinessType())) {
+				String billNo = agent.getFeeCenterListD().stream().map(FeeCenter::getMblno).filter(Objects::nonNull)
+					.distinct().collect(Collectors.joining(","));
+				if (ObjectUtils.isNull(agent.getBillNoJoin())) {
+					agent.setBillNoJoin(billNo);
+				} else {
+					agent.setBillNoJoin(agent.getBillNoJoin() + "," + billNo);
+				}
+				agent.setPaymentInUsd(agent.getFeeCenterListD().stream().filter(e -> "SFK,WK".contains(e.getFeeCode()))
+					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add));
+				agent.setActualAmount(agent.getExchangeRate().multiply(agent.getPaymentInUsd()));
+				ydfCount = agent.getFeeCenterListD().stream().filter(e -> "YDF".equals(e.getFeeCode())).count();
+				sxfCount = agent.getFeeCenterListD().stream().filter(e -> "SXF".equals(e.getFeeCode())).count();
+			}
 			for (FeeCenter item : agent.getFeeCenterListD()) {
 				if (!"MYDL-STL".equals(agent.getBusinessType())) {
 					item.setBusinessType(agent.getBusinessType());
@@ -471,6 +580,14 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					item.setPid(agent.getId());
 				} else {
 					item.setStlPid(agent.getId());
+					if ("YDF".equals(item.getFeeCode())) {
+						item.setAmount(agent.getPostElectricFee().divide(new BigDecimal(ydfCount), 2, RoundingMode.HALF_UP));
+						item.setPrice(item.getAmount());
+					}
+					if ("SXF".equals(item.getFeeCode())) {
+						item.setAmount(agent.getServiceCharge().divide(new BigDecimal(sxfCount), 2, RoundingMode.HALF_UP));
+						item.setPrice(item.getAmount());
+					}
 				}
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
@@ -491,7 +608,21 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (!feeCenterList.isEmpty()) {
 			feeCenterService.saveOrUpdateBatch(feeCenterList);
 		}
-
+		if ("MYDL-STL".equals(agent.getBusinessType())) {
+			String serviceCharge = sysClient.getParamServiceByDept("service.charge", AuthUtil.getTenantId(), AuthUtil.getDeptId());
+			if (ObjectUtils.isNotNull(serviceCharge)) {
+				BigDecimal serviceChargeAmount = new BigDecimal("1").divide(new BigDecimal(serviceCharge), serviceCharge.length(), RoundingMode.HALF_UP);
+				BigDecimal amount = serviceChargeAmount.multiply(agent.getActualAmount());
+				if (amount.compareTo(new BigDecimal("1000")) > 0) {
+					agent.setServiceCharge(new BigDecimal("1000"));
+				} else {
+					agent.setServiceCharge(amount);
+				}
+			} else {
+				agent.setServiceCharge(new BigDecimal("0.00"));
+			}
+		}
+		this.saveOrUpdate(agent);
 		return R.data(agent);
 	}
 
@@ -897,9 +1028,15 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (!feeCenters.isEmpty()) {
 			BigDecimal amountWk = feeCenters.stream().map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
 			BigDecimal amount = detail.getGoodsValue().subtract(detail.getPrepaidAmount());
+			BigDecimal thisSettlementAmount = agent.getAgentItemsRList().stream().map(AgentItemsR::getThisSettlementAmount)
+				.reduce(BigDecimal.ZERO, BigDecimal::add);
 			if (amount.compareTo(amountWk) == 0) {
 				throw new RuntimeException("尾款剩余生成金额为零,生成失败");
 			}
+			BigDecimal sub = detail.getGoodsValue().subtract(detail.getPrepaidAmount()).subtract(amountWk);
+			if (thisSettlementAmount.compareTo(sub) > 0) {
+				throw new RuntimeException("本次生成金额大于剩余金额,剩余未生成金额:" + sub);
+			}
 		}
 
 		List<FeeCenter> feeCenterList = new ArrayList<>();
@@ -966,38 +1103,51 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (feeCenterList.isEmpty()) {
 			throw new RuntimeException("未找到费用明细");
 		}
-		Agent detail = baseMapper.selectById(feeCenterList.get(0).getPid());
-		if (detail == null) {
+		String billNo = feeCenterList.stream().map(FeeCenter::getBillNo).filter(Objects::nonNull).distinct().collect(Collectors.joining(","));
+		String mblno = feeCenterList.stream().map(FeeCenter::getMblno).filter(Objects::nonNull).distinct().collect(Collectors.joining(","));
+		List<Agent> agentList = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
+			.eq(Agent::getTenantId, AuthUtil.getTenantId())
+			.eq(Agent::getIsDeleted, 0)
+			.apply("find_in_set(contract_no,'" + billNo + "')"));
+//		Agent detail = baseMapper.selectById(feeCenterList.get(0).getPid());
+		if (agentList.isEmpty()) {
 			throw new RuntimeException("未查到贸易代理单据信息");
 		}
+		List<Long> agentIdList = agentList.stream().map(Agent::getId).distinct().collect(Collectors.toList());
 		BigDecimal firstPaidInPayment = feeCenterList.stream().filter(e -> "SFK".equals(e.getFeeCode())).map(FeeCenter::getAmountLoc)
 			.reduce(BigDecimal.ZERO, BigDecimal::add);
-		if (new BigDecimal("0").compareTo(firstPaidInPayment) != 0) {
-			if (firstPaidInPayment.compareTo(detail.getPrepaidAmount()) != 0) {
-				throw new RuntimeException("结算金额与首付款金额不一致,确认收款失败");
-			}
-			detail.setFirstPaidInPayment(firstPaidInPayment);
-			detail.setFirstPaidInPaymentDate(date);
-			detail.setOrderStatus("部分货款");
-			detail.setWhetherReceivedDownPayments("部分货款");
-		}
 		BigDecimal finalPaymentReceived = feeCenterList.stream().filter(e -> "WK".equals(e.getFeeCode())).map(FeeCenter::getAmountLoc)
 			.reduce(BigDecimal.ZERO, BigDecimal::add);
-		if (new BigDecimal("0").compareTo(finalPaymentReceived) != 0) {
-			if (detail.getFinalPaymentReceived().add(finalPaymentReceived).compareTo(detail.getFinalPaymentReceivable()) > 0) {
-				throw new RuntimeException("实收金额大于应收金额");
-			}
-			detail.setFinalPaymentReceived(detail.getFinalPaymentReceived().add(finalPaymentReceived));
-			detail.setFinalPaymentReceivedDate(date);
-			detail.setOrderStatus("已收货款");
-			if (detail.getFinalPaymentReceived().add(finalPaymentReceived).compareTo(detail.getFinalPaymentReceivable()) == 0) {
-				detail.setWhetherReceivedDownPayments("已收货款");
+		for (Agent item : agentList) {
+			if (new BigDecimal("0").compareTo(firstPaidInPayment) != 0) {
+				BigDecimal amount = feeCenterList.stream().filter(e -> "SFK".equals(e.getFeeCode()) && item.getContractNo().equals(e.getBillNo()))
+					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (amount.compareTo(item.getPrepaidAmount()) != 0) {
+					throw new RuntimeException("结算金额与首付款金额不一致,确认收款失败");
+				}
+				item.setFirstPaidInPayment(amount);
+				item.setFirstPaidInPaymentDate(date);
+				item.setOrderStatus("部分货款");
+				item.setWhetherReceivedDownPayments("部分货款");
+			}
+			if (new BigDecimal("0").compareTo(finalPaymentReceived) != 0) {
+				BigDecimal amount = feeCenterList.stream().filter(e -> "WK".equals(e.getFeeCode()) && item.getContractNo().equals(e.getBillNo()))
+					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (item.getFinalPaymentReceived().add(amount).compareTo(item.getFinalPaymentReceivable()) > 0) {
+					throw new RuntimeException("实收金额大于应收金额");
+				}
+				item.setFinalPaymentReceived(item.getFinalPaymentReceived().add(amount));
+				item.setFinalPaymentReceivedDate(date);
+				item.setOrderStatus("已收货款");
+				if (item.getFinalPaymentReceived().add(amount).compareTo(item.getFinalPaymentReceivable()) == 0) {
+					item.setWhetherReceivedDownPayments("已收货款");
+				}
 			}
 		}
 		List<AgentItems> agentItemsList = agentItemsService.list(new LambdaQueryWrapper<AgentItems>()
 			.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
 			.eq(AgentItems::getIsDeleted, 0)
-			.eq(AgentItems::getPid, feeCenterList.get(0).getPid()));
+			.in(AgentItems::getPid, agentIdList));
 		if (!agentItemsList.isEmpty()) {
 			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 			Date now = new Date();
@@ -1022,7 +1172,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			AdvanceCharge advanceCharge = advanceChargeService.getOne(new LambdaQueryWrapper<AdvanceCharge>()
 				.eq(AdvanceCharge::getTenantId, AuthUtil.getTenantId())
 				.eq(AdvanceCharge::getIsDeleted, 0)
-				.eq(AdvanceCharge::getCorpId, detail.getDomesticConsigneeId()));
+				.eq(AdvanceCharge::getCorpId, agentList.get(0).getDomesticConsigneeId()));
 			if (advanceCharge != null) {
 				advanceCharge.setAdvancePaymentBalance(advanceCharge.getAdvancePaymentBalance().add(advanceChargeAmount));
 				if (new BigDecimal("0").compareTo(advanceChargeAmount) < 0) {
@@ -1036,7 +1186,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
 			.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
 			.eq(FinAccBills::getIsDeleted, 0)
-			.eq(FinAccBills::getBusinessBillId, detail.getId())
+			.in(FinAccBills::getBusinessBillId, agentIdList)
 			.eq(FinAccBills::getAccountType, "LOCAL-D"));
 		List<FinAccBills> finAccBills = new ArrayList<>();
 		List<FinStlBillsItems> stlBillsItemsList = new ArrayList<>();
@@ -1157,8 +1307,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				stlBillsItems.setCreateDeptName(deptName);
 			}
 			stlBillsItems.setLineNo(1);
-			stlBillsItems.setBusinessType(detail.getBusinessType());
-			stlBillsItems.setBillNo(detail.getBusinessNo());
+			stlBillsItems.setBusinessType(agentList.get(0).getBusinessType());
+			stlBillsItems.setBillNo(billNo);
 			stlBillsItems.setBillDate(date);
 			stlBillsItems.setAccountDate(data.getAccountDate());
 			stlBillsItems.setAccountYear(year);
@@ -1249,17 +1399,17 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			finStlBills.setCreateDeptName(deptName);
 		}
 		finStlBills.setBusinessType("STL");
-		finStlBills.setCorpId(detail.getCorpId());
-		finStlBills.setCorpCnName(detail.getCorpName());
-		finStlBills.setBusinessTypes(detail.getBusinessType());
-		finStlBills.setBusinessNo(detail.getBusinessNo());
-		finStlBills.setDeptId(detail.getCreateDept());
-		finStlBills.setDeptName(detail.getCreateDeptName());
+		finStlBills.setCorpId(agentList.get(0).getCorpId());
+		finStlBills.setCorpCnName(agentList.get(0).getCorpName());
+		finStlBills.setBusinessTypes(agentList.get(0).getBusinessType());
+		finStlBills.setBusinessNo(billNo);
+		finStlBills.setDeptId(agentList.get(0).getCreateDept());
+		finStlBills.setDeptName(agentList.get(0).getCreateDeptName());
 		finStlBills.setOperatorId(AuthUtil.getUserId());
 		finStlBills.setOperatorName(AuthUtil.getUserName());
 		finStlBills.setDc("D");
 		finStlBills.setSettlementType("D");
-		finStlBills.setMblno(detail.getContractNo());
+		finStlBills.setMblno(mblno);
 		finStlBills.setStatus(3);
 		finStlBills.setIsCleared(1);
 		finStlBills.setAmountDr(stlBillsItemsList.stream().map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
@@ -1269,7 +1419,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		List<BCorpsBank> corpsBankList = bCorpsBankService.list(new LambdaQueryWrapper<BCorpsBank>()
 			.eq(BCorpsBank::getTenantId, AuthUtil.getTenantId())
 			.eq(BCorpsBank::getIsDeleted, 0)
-			.eq(BCorpsBank::getPid, detail.getCorpId()));
+			.eq(BCorpsBank::getPid, agentList.get(0).getCorpId()));
 		if (!corpsBankList.isEmpty()) {
 			finStlBills.setBankId(corpsBankList.get(0).getId());
 			finStlBills.setBankAccountName(corpsBankList.get(0).getAccountName());
@@ -1292,7 +1442,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			finAccBillsService.saveOrUpdateBatch(finAccBills);
 		}
 		updateById(agent);
-		updateById(detail);
+		this.updateBatchById(agentList);
 		return agent;
 	}
 
@@ -1456,10 +1606,17 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (feeCenterListD.isEmpty()) {
 			throw new RuntimeException("未找到应收费用明细");
 		}
-		Agent detail = baseMapper.selectById(feeCenterListD.get(0).getPid());
-		if (detail == null) {
+		String billNo = feeCenters.stream().map(FeeCenter::getBillNo).filter(Objects::nonNull).distinct().collect(Collectors.joining(","));
+		String mblno = feeCenters.stream().map(FeeCenter::getMblno).filter(Objects::nonNull).distinct().collect(Collectors.joining(","));
+		List<Agent> agentList = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
+			.eq(Agent::getTenantId, AuthUtil.getTenantId())
+			.eq(Agent::getIsDeleted, 0)
+			.apply("find_in_set(contract_no,'" + billNo + "')"));
+//		Agent detail = baseMapper.selectById(feeCenterList.get(0).getPid());
+		if (agentList.isEmpty()) {
 			throw new RuntimeException("未查到贸易代理单据信息");
 		}
+		List<Long> agentIdList = agentList.stream().map(Agent::getId).distinct().collect(Collectors.toList());
 		BigDecimal amountD = feeCenterListD.stream().map(FeeCenter::getStlTtlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 		BigDecimal amount = feeCenterListD.stream().map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
 		List<FeeCenter> feeCenterList = feeCenters.stream().filter(e -> "C".equals(e.getDc())).collect(Collectors.toList());
@@ -1473,7 +1630,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				AdvanceCharge advanceCharge = advanceChargeService.getOne(new LambdaQueryWrapper<AdvanceCharge>()
 					.eq(AdvanceCharge::getTenantId, AuthUtil.getTenantId())
 					.eq(AdvanceCharge::getIsDeleted, 0)
-					.eq(AdvanceCharge::getCorpId, detail.getDomesticConsigneeId()));
+					.eq(AdvanceCharge::getCorpId, agentList.get(0).getDomesticConsigneeId()));
 				if (advanceCharge != null) {
 					advanceCharge.setAdvancePaymentBalance(advanceCharge.getAdvancePaymentBalance().add(amountSub));
 					advanceCharge.setInOverpayment(advanceCharge.getInOverpayment().add(amountSub));
@@ -1481,8 +1638,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					advanceCharge = new AdvanceCharge();
 					advanceCharge.setAdvancePaymentBalance(amountSub);
 					advanceCharge.setInOverpayment(amountSub);
-					advanceCharge.setCorpId(detail.getCorpId());
-					advanceCharge.setCorpName(detail.getCorpName());
+					advanceCharge.setCorpId(agentList.get(0).getDomesticConsigneeId());
+					advanceCharge.setCorpName(agentList.get(0).getDomesticConsigneeCname());
 					advanceCharge.setCreateUser(AuthUtil.getUserId());
 					advanceCharge.setCreateUserName(AuthUtil.getUserName());
 					advanceCharge.setCreateTime(new Date());
@@ -1497,13 +1654,13 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				advanceChargeItem.setCreateDept(deptId);
 				advanceChargeItem.setCreateDeptName(deptName);
 				advanceChargeItem.setPid(advanceCharge.getId());
-				advanceChargeItem.setSrcId(detail.getId());
-				advanceChargeItem.setSrcPid(detail.getId());
-				advanceChargeItem.setOrderNo(detail.getBusinessNo());
+				advanceChargeItem.setSrcId(agent.getId());
+				advanceChargeItem.setSrcPid(agent.getId());
+				advanceChargeItem.setOrderNo(agent.getBusinessNo());
 				advanceChargeItem.setOverpayment(amountSub);
 				advanceChargeItem.setOverpaymentType(0);
-				advanceChargeItem.setSrcOrderNo(detail.getBusinessNo());
-				advanceChargeItem.setBillNo(detail.getBusinessNo());
+				advanceChargeItem.setSrcOrderNo(agent.getBusinessNo());
+				advanceChargeItem.setBillNo(agent.getBusinessNo());
 				advanceChargeItem.setIdentifier(0);
 				advanceChargeItemService.save(advanceChargeItem);
 			} else if (amountSub.compareTo(new BigDecimal("0")) < 0) {
@@ -1516,24 +1673,24 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					feeCenter.setBranchId(deptId + "");
 					feeCenter.setCreateDeptName(deptName);
 				}
-				feeCenter.setBusinessType(detail.getBusinessType());
-				feeCenter.setPid(detail.getId());
+				feeCenter.setBusinessType(agentList.get(0).getBusinessType());
+				feeCenter.setPid(agentList.get(0).getId());
 				feeCenter.setLineNo(feeCenterListD.size() + 1L);
-				feeCenter.setBillNo(detail.getBusinessNo());
-				feeCenter.setBillDate(detail.getBusinessDate());
-				feeCenter.setCorpId(detail.getDomesticConsigneeId());
-				feeCenter.setCorpCnName(detail.getDomesticConsigneeCname());
-				feeCenter.setBillCorpId(detail.getCorpId());
-				feeCenter.setBillCorpCnName(detail.getCorpName());
-				feeCenter.setMblno(detail.getContractNo());
-				feeCenter.setPolId(detail.getPolId());
-				feeCenter.setPolCode(detail.getPolCode());
-				feeCenter.setPolCnName(detail.getPolCnName());
-				feeCenter.setPolEnName(detail.getPolEnName());
-				feeCenter.setPodId(detail.getPodId());
-				feeCenter.setPodCode(detail.getPodCode());
-				feeCenter.setPodCnName(detail.getPodCnName());
-				feeCenter.setPodEnName(detail.getPodEnName());
+				feeCenter.setBillNo(agentList.get(0).getBusinessNo());
+				feeCenter.setBillDate(agentList.get(0).getBusinessDate());
+				feeCenter.setCorpId(agentList.get(0).getDomesticConsigneeId());
+				feeCenter.setCorpCnName(agentList.get(0).getDomesticConsigneeCname());
+				feeCenter.setBillCorpId(agentList.get(0).getCorpId());
+				feeCenter.setBillCorpCnName(agentList.get(0).getCorpName());
+				feeCenter.setMblno(agentList.get(0).getContractNo());
+				feeCenter.setPolId(agentList.get(0).getPolId());
+				feeCenter.setPolCode(agentList.get(0).getPolCode());
+				feeCenter.setPolCnName(agentList.get(0).getPolCnName());
+				feeCenter.setPolEnName(agentList.get(0).getPolEnName());
+				feeCenter.setPodId(agentList.get(0).getPodId());
+				feeCenter.setPodCode(agentList.get(0).getPodCode());
+				feeCenter.setPodCnName(agentList.get(0).getPodCnName());
+				feeCenter.setPodEnName(agentList.get(0).getPodEnName());
 				BFees feesSFK = bFeesService.getOne(new LambdaQueryWrapper<BFees>()
 					.eq(BFees::getTenantId, AuthUtil.getTenantId())
 					.eq(BFees::getIsDeleted, 0)
@@ -1568,29 +1725,37 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		int day = localDate.getDayOfMonth();
 		BigDecimal firstActualPayment = feeCenterList.stream().filter(e -> "SFK".equals(e.getFeeCode())).map(FeeCenter::getAmountLoc)
 			.reduce(BigDecimal.ZERO, BigDecimal::add);
-		if (new BigDecimal("0").compareTo(firstActualPayment) != 0) {
-			detail.setFirstActualPayment(firstActualPayment);
-			detail.setFirstActualPaymentDate(date);
-			detail.setOrderStatus("部分付汇");
-			detail.setWhetherReceivedBalancePayment("部分付汇");
-		}
 		BigDecimal finalPaymentInFull = feeCenterList.stream().filter(e -> "WK".equals(e.getFeeCode())).map(FeeCenter::getAmountLoc)
 			.reduce(BigDecimal.ZERO, BigDecimal::add);
-		if (new BigDecimal("0").compareTo(finalPaymentInFull) != 0) {
-			if (detail.getFinalPaymentInFull().add(finalPaymentInFull).compareTo(detail.getFinalPaymentPayable()) > 0) {
-				throw new RuntimeException("实付金额大于应付金额");
+		for (Agent item : agentList) {
+			if (new BigDecimal("0").compareTo(firstActualPayment) != 0) {
+				BigDecimal amountSfk = feeCenterList.stream().filter(e -> "SFK".equals(e.getFeeCode()) && item.getContractNo().equals(e.getBillNo()))
+					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (new BigDecimal("0").compareTo(amountSfk) != 0) {
+					item.setFirstActualPayment(amountSfk);
+					item.setFirstActualPaymentDate(date);
+					item.setOrderStatus("部分付汇");
+					item.setWhetherReceivedBalancePayment("部分付汇");
+				}
 			}
-			detail.setFinalPaymentInFull(detail.getFinalPaymentInFull().add(finalPaymentInFull));
-			detail.setFinalPaymentInFullDate(date);
-			detail.setOrderStatus("已付汇");
-			if (detail.getFinalPaymentInFull().add(finalPaymentInFull).compareTo(detail.getFinalPaymentPayable()) == 0) {
-				detail.setWhetherReceivedBalancePayment("已付汇");
+			if (new BigDecimal("0").compareTo(finalPaymentInFull) != 0) {
+				BigDecimal amountWk = feeCenterList.stream().filter(e -> "WK".equals(e.getFeeCode()) && item.getContractNo().equals(e.getBillNo()))
+					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (item.getFinalPaymentInFull().add(amountWk).compareTo(item.getFinalPaymentPayable()) > 0) {
+					throw new RuntimeException("实付金额大于应付金额");
+				}
+				item.setFinalPaymentInFull(item.getFinalPaymentInFull().add(amountWk));
+				item.setFinalPaymentInFullDate(date);
+				item.setOrderStatus("已付汇");
+				if (item.getFinalPaymentInFull().add(amountWk).compareTo(item.getFinalPaymentPayable()) == 0) {
+					item.setWhetherReceivedBalancePayment("已付汇");
+				}
 			}
 		}
 		List<AgentItems> agentItemsList = agentItemsService.list(new LambdaQueryWrapper<AgentItems>()
 			.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
 			.eq(AgentItems::getIsDeleted, 0)
-			.eq(AgentItems::getPid, feeCenters.get(0).getStlPid()));
+			.in(AgentItems::getPid, agentIdList));
 		if (!agentItemsList.isEmpty()) {
 			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 			Date now = new Date();
@@ -1612,7 +1777,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
 			.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
 			.eq(FinAccBills::getIsDeleted, 0)
-			.eq(FinAccBills::getBusinessBillId, detail.getId())
+			.in(FinAccBills::getBusinessBillId, agentIdList)
 			.eq(FinAccBills::getAccountType, "LOCAL-C"));
 		List<FinAccBills> finAccBills = new ArrayList<>();
 		List<FinStlBillsItems> stlBillsItemsList = new ArrayList<>();
@@ -1733,8 +1898,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				stlBillsItems.setCreateDeptName(deptName);
 			}
 			stlBillsItems.setLineNo(1);
-			stlBillsItems.setBusinessType(detail.getBusinessType());
-			stlBillsItems.setBillNo(detail.getBusinessNo());
+			stlBillsItems.setBusinessType(agentList.get(0).getBusinessType());
+			stlBillsItems.setBillNo(billNo);
 			stlBillsItems.setBillDate(date);
 			stlBillsItems.setAccountDate(data.getAccountDate());
 			stlBillsItems.setAccountYear(year);
@@ -1825,27 +1990,27 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			finStlBills.setCreateDeptName(deptName);
 		}
 		finStlBills.setBusinessType("STL");
-		finStlBills.setCorpId(detail.getCorpId());
-		finStlBills.setCorpCnName(detail.getCorpName());
-		finStlBills.setBusinessTypes(detail.getBusinessType());
-		finStlBills.setBusinessNo(detail.getBusinessNo());
-		finStlBills.setDeptId(detail.getCreateDept());
-		finStlBills.setDeptName(detail.getCreateDeptName());
+		finStlBills.setCorpId(agentList.get(0).getCorpId());
+		finStlBills.setCorpCnName(agentList.get(0).getCorpName());
+		finStlBills.setBusinessTypes(agentList.get(0).getBusinessType());
+		finStlBills.setBusinessNo(billNo);
+		finStlBills.setDeptId(agentList.get(0).getCreateDept());
+		finStlBills.setDeptName(agentList.get(0).getCreateDeptName());
 		finStlBills.setOperatorId(AuthUtil.getUserId());
 		finStlBills.setOperatorName(AuthUtil.getUserName());
 		finStlBills.setDc("C");
 		finStlBills.setSettlementType("C");
-		finStlBills.setMblno(detail.getContractNo());
+		finStlBills.setMblno(mblno);
 		finStlBills.setStatus(3);
 		finStlBills.setIsCleared(1);
-		finStlBills.setAmountDr(stlBillsItemsList.stream().map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
-		finStlBills.setAmountDrLoc(finStlBills.getAmountDr());
-		finStlBills.setAmountSub(finStlBills.getAmountDr());
-		finStlBills.setAmountSubLoc(finStlBills.getAmountDr());
+		finStlBills.setAmountCr(stlBillsItemsList.stream().map(FinStlBillsItems::getCurrentStlAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
+		finStlBills.setAmountCrLoc(finStlBills.getAmountCr());
+		finStlBills.setAmountSub(finStlBills.getAmountCr());
+		finStlBills.setAmountSubLoc(finStlBills.getAmountCr());
 		List<BCorpsBank> corpsBankList = bCorpsBankService.list(new LambdaQueryWrapper<BCorpsBank>()
 			.eq(BCorpsBank::getTenantId, AuthUtil.getTenantId())
 			.eq(BCorpsBank::getIsDeleted, 0)
-			.eq(BCorpsBank::getPid, detail.getCorpId()));
+			.eq(BCorpsBank::getPid, agentList.get(0).getCorpId()));
 		if (!corpsBankList.isEmpty()) {
 			finStlBills.setBankId(corpsBankList.get(0).getId());
 			finStlBills.setBankAccountName(corpsBankList.get(0).getAccountName());
@@ -1868,7 +2033,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			finAccBillsService.saveOrUpdateBatch(finAccBills);
 		}
 		updateById(agent);
-		updateById(detail);
+		this.updateBatchById(agentList);
 		return agent;
 	}
 
@@ -2441,6 +2606,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			BeanUtil.copyProperties(item, feeCenter);
 			feeCenter.setDc("C");
 			feeCenter.setId(null);
+			feeCenter.setCorpId(declare.getAbroadConsignorId());
+			feeCenter.setCorpCnName(declare.getAbroadConsignorCname());
 			feeCenter.setCreateTime(new Date());
 			feeCenter.setCreateUser(AuthUtil.getUserId());
 			feeCenter.setCreateUserName(AuthUtil.getUserName());
@@ -2551,6 +2718,53 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		stlAgent.setDc(feeCenterList.get(0).getDc());
 		stlAgent.setBusinessDate(date);
 		stlAgent.setGoodsValue(feeCenterList.stream().map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
+		stlAgent.setPaymentInUsd(feeCenterList.stream().filter(e -> "SFK,WK".contains(e.getFeeCode()))
+			.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add));
+		LocalDate localDate = new Date().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 ("D".equals(stlAgent.getDc())) {
+			if (bCurExrate == null) {
+				throw new RuntimeException("未找到" + year + "年-" + month + "月-" + day + "日实收汇率");
+			}
+			stlAgent.setExchangeRate(bCurExrate.getExrateReceipts());
+		} else {
+			if (bCurExrate == null) {
+				throw new RuntimeException("未找到" + year + "年-" + month + "月-" + day + "日实付汇率");
+			}
+			stlAgent.setExchangeRate(bCurExrate.getExratePayment());
+		}
+		stlAgent.setActualAmount(stlAgent.getExchangeRate().multiply(stlAgent.getPaymentInUsd()));
+		String postElectricFee = sysClient.getParamServiceByDept("post.electric.fee", AuthUtil.getTenantId(), AuthUtil.getDeptId());
+		if (ObjectUtils.isNotNull(postElectricFee)) {
+			BigDecimal postElectricFeeAmount = new BigDecimal(postElectricFee);
+			stlAgent.setPostElectricFee(postElectricFeeAmount);
+		} else {
+			stlAgent.setPostElectricFee(new BigDecimal("0"));
+		}
+		String serviceCharge = sysClient.getParamServiceByDept("service.charge", AuthUtil.getTenantId(), AuthUtil.getDeptId());
+		if (ObjectUtils.isNotNull(serviceCharge)) {
+			BigDecimal serviceChargeAmount = new BigDecimal("1").divide(new BigDecimal(serviceCharge), serviceCharge.length(), RoundingMode.HALF_UP);
+			BigDecimal amount = serviceChargeAmount.multiply(stlAgent.getActualAmount());
+			if (amount.compareTo(new BigDecimal("1000")) > 0) {
+				stlAgent.setServiceCharge(new BigDecimal("1000"));
+			} else {
+				stlAgent.setServiceCharge(amount);
+			}
+		} else {
+			stlAgent.setServiceCharge(new BigDecimal("0.00"));
+		}
+
 		BusinessBillNo businessBillNo = new BusinessBillNo();
 		businessBillNo.setBusinessTypeId(businessType.getId());
 		businessBillNo.setCode("MYDL-STL");
@@ -2568,10 +2782,20 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			stlAgent.setCreateDeptName(deptName);
 		}
 		baseMapper.insert(stlAgent);
+		long ydfCount = feeCenterList.stream().filter(e -> "YDF".equals(e.getFeeCode())).count();
+		long sxfCount = feeCenterList.stream().filter(e -> "SXF".equals(e.getFeeCode())).count();
 		for (FeeCenter item : feeCenterList) {
 			if ("5".equals(item.getAuditStatus())) {
 				throw new RuntimeException("费用:" + item.getFeeCnName() + "已申请");
 			}
+			if ("YDF".equals(item.getFeeCode())) {
+				item.setAmount(stlAgent.getPostElectricFee().divide(new BigDecimal(ydfCount), 2, RoundingMode.HALF_UP));
+				item.setPrice(item.getAmount());
+			}
+			if ("SXF".equals(item.getFeeCode())) {
+				item.setAmount(stlAgent.getServiceCharge().divide(new BigDecimal(sxfCount), 2, RoundingMode.HALF_UP));
+				item.setPrice(item.getAmount());
+			}
 			item.setAuditStatus("5");
 			item.setStlPid(stlAgent.getId());
 		}

+ 12 - 2
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -3095,7 +3095,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R generateShipTask(PjOrder order) {
 		PjOrder pjOrder = baseMapper.selectById(order.getId());
-
+		if (OrderTypeEnum.SCRW.getType().equals(pjOrder.getGenerateTask())) {
+			throw new RuntimeException("订单数据已生成出库,请刷新数据重新操作!");
+		}
 		PjShip pjShip = new PjShip();
 		// 获取系统编号
 		R billNo = serialClient.getBillNo(OrderTypeEnum.FHRW.getType(), OrderTypeEnum.FHRW.getType(), OrderTypeEnum.FHRW.getType());
@@ -3355,6 +3357,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			throw new RuntimeException("已有收费记录,撤销失败");
 		}
 		PjOrder pjOrder = baseMapper.selectById(order.getId());
+		if (OrderTypeEnum.NSCRW.getType().equals(pjOrder.getGenerateTask())) {
+			throw new RuntimeException("订单数据已生成出库,请刷新数据重新操作!");
+		}
 		PjShip pjShip = shipMapper.selectOne(new LambdaQueryWrapper<PjShip>().eq(PjShip::getIsDeleted, 0)
 			.eq(PjShip::getOrdId, order.getId())
 			.eq(PjShip::getBizTypeName, "FHRW"));
@@ -3444,7 +3449,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R inboundTask(PjOrder order) {
 		PjOrder pjOrder = baseMapper.selectById(order.getId());
-
+		if (OrderTypeEnum.SCRW.getType().equals(pjOrder.getGenerateTask())) {
+			throw new RuntimeException("订单数据已生成出库,请刷新数据重新操作!");
+		}
 		PjShip pjShip = new PjShip();
 		// 获取系统编号
 		R billNo = serialClient.getBillNo(OrderTypeEnum.SHRW.getType(), OrderTypeEnum.SHRW.getType(), OrderTypeEnum.SHRW.getType());
@@ -4200,6 +4207,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeInboundTask(PjOrder order) {
 		PjOrder pjOrder = baseMapper.selectById(order.getId());
+		if (OrderTypeEnum.NSCRW.getType().equals(pjOrder.getGenerateTask())) {
+			throw new RuntimeException("订单数据已生成出库,请刷新数据重新操作!");
+		}
 		PjShip pjShip = shipMapper.selectOne(new LambdaQueryWrapper<PjShip>().eq(PjShip::getIsDeleted, 0)
 			.eq(PjShip::getOrdId, order.getId())
 			.eq(PjShip::getBizTypeName, "SHRW"));