Преглед на файлове

贸易代理 2024年7月18日17:21:28

纪新园 преди 1 година
родител
ревизия
2cde98a647
променени са 13 файла, в които са добавени 928 реда и са изтрити 94 реда
  1. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java
  2. 203 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/dto/AgentViewExport.java
  3. 23 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/entity/Agent.java
  4. 57 10
      blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java
  5. 12 10
      blade-service/blade-los/src/main/java/org/springblade/los/finance/fee/service/impl/FeeCenterServiceImpl.java
  6. 1 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java
  7. 9 0
      blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/AgentController.java
  8. 76 0
      blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/AgentViewController.java
  9. 3 3
      blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/RecordController.java
  10. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/trade/service/IAgentService.java
  11. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/trade/service/IRecordService.java
  12. 488 71
      blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/AgentServiceImpl.java
  13. 47 0
      blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/RecordServiceImpl.java

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java

@@ -599,6 +599,11 @@ public class FinStlBills implements Serializable {
 	 */
 	@ApiModelProperty(value = "单据状态")
 	private String billStatus;
+	/**
+	 * 是否手动 0否 1是
+	 */
+	@ApiModelProperty(value = "是否手动 0否 1是")
+	private String whetherManual;
 
 	/**
 	 * 联系人姓名

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

@@ -0,0 +1,203 @@
+/*
+ *      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 com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * VIEW实体类
+ *
+ * @author BladeX
+ * @since 2024-07-15
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class AgentViewExport implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 客户名称
+	 */
+	@ExcelProperty(value = "客户名称")
+	private String corpName;
+	/**
+	 * 合同号
+	 */
+	@ExcelProperty(value = "合同号")
+	private String contractNo;
+	/**
+	 * 提单号
+	 */
+	@ExcelProperty(value = "提单号")
+	private String billNo;
+	/**
+	 * 放单方式
+	 */
+	@ExcelProperty(value = "放单方式")
+	private String orderReleaseMethod;
+	/**
+	 * 订单号
+	 */
+	@ExcelProperty(value = "订单号")
+	private String orderNo;
+	/**
+	 * 箱号
+	 */
+	@ExcelProperty(value = "箱号")
+	private String boxNo;
+	/**
+	 * 合同日期
+	 */
+	@ExcelProperty(value = "合同日期")
+	private Date contractDate;
+	/**
+	 * 国家名称
+	 */
+	@ExcelProperty(value = "国家")
+	private String country;
+	/**
+	 * 通关进度
+	 */
+	@ExcelProperty(value = "通关进度")
+	private String clearanceSpeedOfProgress;
+	/**
+	 * 付汇记录
+	 */
+	@ExcelProperty(value = "付汇记录")
+	private String paymentRecord;
+	/**
+	 * 运输方式
+	 */
+	@ExcelProperty(value = "运输方式")
+	private String typeOfShipping;
+	/**
+	 * 起运港英文名称
+	 */
+	@ExcelProperty(value = "起运港")
+	private String polCnName;
+	/**
+	 * 目的港中文名称
+	 */
+	@ExcelProperty(value = "目的港")
+	private String podCnName;
+	/**
+	 * 开船日期
+	 */
+	@ExcelProperty(value = "开船日期")
+	private Date etd;
+	/**
+	 * 预计到港日期
+	 */
+	@ExcelProperty(value = "预计到港")
+	private Date estimateReachHarbor;
+	/**
+	 * 实际到港日期
+	 */
+	@ExcelProperty(value = "实际到港")
+	private Date actualReachHarbor;
+	/**
+	 * 币别
+	 */
+	@ExcelProperty(value = "币别")
+	private String currency;
+	/**
+	 * 总金额
+	 */
+	@ExcelProperty(value = "总金额")
+	private BigDecimal sumAmount;
+	/**
+	 * 预付比例
+	 */
+	@ExcelProperty(value = "预付比例")
+	private BigDecimal advanceRatio;
+	/**
+	 * 预付金额
+	 */
+	@ExcelProperty(value = "预付金额")
+	private BigDecimal prepaidAmount;
+	/**
+	 * 铅封号
+	 */
+	@ExcelProperty(value = "封号")
+	private String leadSealNo;
+	/**
+	 * 货值
+	 */
+	@ExcelProperty(value = "金额")
+	private BigDecimal goodsValue;
+
+	/**
+	 * 首款实收
+	 */
+	@ExcelProperty(value = "首款实收")
+	private BigDecimal firstPaidInPayment;
+	/**
+	 * 首款实收时间
+	 */
+	@ExcelProperty(value = "首款实收时间")
+	private Date firstPaidInPaymentDate;
+	/**
+	 * 首款实付
+	 */
+	@ExcelProperty(value = "首款实付")
+	private BigDecimal firstActualPayment;
+	/**
+	 * 首款实付时间
+	 */
+	@ExcelProperty(value = "首款实付时间")
+	private Date firstActualPaymentDate;
+
+	/**
+	 * 尾款实收
+	 */
+	@ExcelProperty(value = "尾款实收")
+	private BigDecimal finalPaymentReceived;
+	/**
+	 * 尾款实收时间
+	 */
+	@ExcelProperty(value = "尾款实收时间")
+	private Date finalPaymentReceivedDate;
+	/**
+	 * 尾款实付
+	 */
+	@ExcelProperty(value = "尾款实付")
+	private BigDecimal finalPaymentInFull;
+	/**
+	 * 尾款实付时间
+	 */
+	@ExcelProperty(value = "尾款实付时间")
+	private Date finalPaymentInFullDate;
+
+	/**
+	 * 备注
+	 */
+	@ExcelProperty(value = "备注")
+	private String remarks;
+
+
+}

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

@@ -408,6 +408,29 @@ public class Agent implements Serializable {
 	private String documentType;
 
 	/**
+	 * 是否首款账单 0否1是
+	 */
+	@ApiModelProperty(value = "是否首款账单")
+	private String downPayment;
+	/**
+	 * 是否尾款账单 0否1是
+	 */
+	@ApiModelProperty(value = "是否尾款账单")
+	private String balancePayment;
+
+	/**
+	 * 是否申请付款首付款 0否1是
+	 */
+	@ApiModelProperty(value = "是否申请付款首付款")
+	private String applyForPayment;
+
+	/**
+	 * 是否申请付款尾款 0否1是
+	 */
+	@ApiModelProperty(value = "是否申请付款尾款")
+	private String applyForPaymentBalance;
+
+	/**
 	 * 收费
 	 */
 	@TableField(exist = false)

+ 57 - 10
blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java

@@ -28,6 +28,7 @@ import org.springblade.client.entity.Message;
 import org.springblade.client.feign.IMessageClient;
 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.acc.entity.Accounts;
 import org.springblade.los.basic.acc.service.IAccountsService;
@@ -170,6 +171,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 		pathsLevelsList.forEach(e -> {
 
 			LosAuditProecess auditProecess = new LosAuditProecess();
+			auditProecess.setPaidApplication(auditProecessDTO.getPaidApplication());
 			auditProecess.setCaseNo(auditProecessDTO.getCaseNo());
 			auditProecess.setMorderNo(auditProecessDTO.getMorderNo());
 			auditProecess.setActId(auditProecessDTO.getActId());
@@ -3313,12 +3315,12 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
 					);
-				}else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
 					message.setMessageBody("您有新的贸易代理首款应收待确认,业务单号:" + proecessTemp.getBillNo() + ","
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
 					);
-				}else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
 					message.setMessageBody("您有新的贸易代理尾款应收待确认,业务单号:" + proecessTemp.getBillNo() + ","
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
@@ -3357,9 +3359,9 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 					sendMessage.setMessageBody("您的贸易代理首款付费申请未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				} else if ("贸易代理尾款付费申请".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理尾款付费申请未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
-				}else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理首款应收确认未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
-				}else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理尾款应收确认未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				}
 				R save = messageClient.save(sendMessage);
@@ -3378,15 +3380,60 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 				if (detail == null) {
 					throw new SecurityException("审批通过失败");
 				}
+				String feeType = "";
+				String feeTypeName = "";
 				if ("FFSQ-SK".equals(auditProecess.getPaidApplication())) {
 					detail.setFirstStatus("审核通过");
-
+					feeType = "1";
+					feeTypeName = "首付款";
 				} else if ("FFSQ-WK".equals(auditProecess.getPaidApplication())) {
 					detail.setFinalStatus("审核通过");
-
+					feeType = "2";
+					feeTypeName = "尾款";
 				} else {
 					detail.setBusinessStatus("审核通过");
 				}
+				if ("FFSQ-SK".equals(auditProecess.getPaidApplication()) || "FFSQ-WK".equals(auditProecess.getPaidApplication())) {
+					List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+						.eq(FeeCenter::getPid, agent.getId())
+						.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+						.eq(FeeCenter::getIsDeleted, 0)
+						.eq(FeeCenter::getFeeType, feeType));
+					List<FeeCenter> feeCenterList = new ArrayList<>();
+					for (FeeCenter item : feeCenters) {
+						FeeCenter feeCenter = new FeeCenter();
+						BeanUtil.copyProperties(item, feeCenter);
+						feeCenter.setDc("C");
+						feeCenter.setId(null);
+						feeCenter.setCreateTime(new Date());
+						feeCenter.setCreateUser(AuthUtil.getUserId());
+						feeCenter.setCreateUserName(AuthUtil.getUserName());
+						feeCenter.setFeeType(feeType);
+						feeCenter.setAccBillId(null);
+						feeCenter.setAccBillNo(null);
+						feeCenter.setAccDate(null);
+						feeCenter.setAccAmount(new BigDecimal("0"));
+						feeCenter.setAccStatus(0);
+						feeCenter.setAccById(null);
+						feeCenter.setAccByName(null);
+						feeCenter.setUnsettledAmount(item.getAmount());
+						feeCenter.setStlTtlAmount(new BigDecimal("0.00"));
+						feeCenter.setStlOrgAmount(new BigDecimal("0.00"));
+						feeCenter.setStlCurCode(null);
+						feeCenter.setStlAmount(new BigDecimal("0.00"));
+						feeCenter.setStlAmountLoc(new BigDecimal("0.00"));
+						feeCenter.setStlStatus(0);
+						feeCenter.setStlById(null);
+						feeCenter.setStlByName(null);
+						feeCenter.setUnsettledAmount(new BigDecimal("0.00"));
+						feeCenter.setStlTtlAmount(new BigDecimal("0.00"));
+						feeCenterList.add(feeCenter);
+					}
+					if (!feeCenterList.isEmpty()) {
+						feeCenterService.saveBatch(feeCenterList);
+					}
+				}
+
 				int count = agentMapper.updateById(detail);
 				if (count == 0) {
 					throw new SecurityException("修改订单数据失败");
@@ -3397,9 +3444,9 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 					sendMessage.setMessageBody("您的贸易代理首款付费申请已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				} else if ("贸易代理尾款付费申请".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理尾款付费申请已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
-				}else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理首款应收确认已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
-				}else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理尾款应收确认已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				}
 				R save = messageClient.save(sendMessage);
@@ -3432,9 +3479,9 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 					sendMessage.setMessageBody("您的贸易代理首款付费申请未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				} else if ("贸易代理尾款付费申请".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理尾款付费申请未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
-				}else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理首款应收确认".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理首款应收确认未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
-				}else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
+				} else if ("贸易代理尾款应收确认".equals(auditProecess.getProcessType())) {
 					sendMessage.setMessageBody("您的贸易代理尾款应收确认未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				}
 				R save = messageClient.save(sendMessage);

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

@@ -290,12 +290,12 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 					}
 					if ("1".equals(items.getQuantityRule())) {
 						if (preContainers.isEmpty()) {
-							text += "费用:"+items.getFeeCnName() + "未找到集装箱信息!";
+							text += "费用:" + items.getFeeCnName() + "未找到集装箱信息!";
 							continue;
 						}
 						Integer quantity = preContainers.stream().filter(e -> items.getUnitNo().equals(e.getCntrTypeCode())).map(PreContainers::getQuantity).reduce(0, Integer::sum);
 						if (quantity == 0) {
-							text += "费用:"+items.getFeeCnName() + "集装箱数量为零!";
+							text += "费用:" + items.getFeeCnName() + "集装箱数量为零!";
 							continue;
 						}
 						feeCenter.setQuantity(new BigDecimal(quantity + ""));
@@ -308,14 +308,14 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 						feeCenter.setAmount(items.getPrice().multiply(bills.getGrossWeight()));
 					} else if ("4".equals(items.getQuantityRule())) {
 						if (preContainers.isEmpty()) {
-							text += "费用:"+items.getFeeCnName() + "未找到集装箱信息!";
+							text += "费用:" + items.getFeeCnName() + "未找到集装箱信息!";
 							continue;
 						}
 						BigDecimal quantityTeu = preContainers.stream().filter(e -> items.getUnitNo().equals(e.getCntrTypeCode())).map(PreContainers::getTeu).reduce(BigDecimal.ZERO, BigDecimal::add);
 						Integer quantityGP = preContainers.stream().filter(e -> items.getUnitNo().equals(e.getCntrTypeCode())).map(PreContainers::getQuantity).mapToInt(Integer::intValue).sum();
 						BigDecimal quantity = quantityTeu.multiply(new BigDecimal(quantityGP + ""));
 						if (quantity.compareTo(new BigDecimal("0")) == 0) {
-							text += "费用:"+items.getFeeCnName() + "集装箱teu或数量为零!";
+							text += "费用:" + items.getFeeCnName() + "集装箱teu或数量为零!";
 							continue;
 						}
 						feeCenter.setQuantity(new BigDecimal(quantity + ""));
@@ -391,7 +391,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							feeCenter.setQuantity(new BigDecimal("1"));
 							feeCenter.setAmount(items.getPrice().multiply(new BigDecimal("1")));
 						} else {
-							text += "费用:"+items.getFeeCnName() + "计量单位不等于JOB!";
+							text += "费用:" + items.getFeeCnName() + "计量单位不等于JOB!";
 							continue;
 						}
 					} else if ("3".equals(items.getQuantityRule())) {
@@ -399,7 +399,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							feeCenter.setQuantity(bills.getGrossWeight());
 							feeCenter.setAmount(items.getPrice().multiply(bills.getGrossWeight()));
 						} else {
-							text += "费用:"+items.getFeeCnName() + "计量单位不等于KGS!";
+							text += "费用:" + items.getFeeCnName() + "计量单位不等于KGS!";
 							continue;
 						}
 					} else if ("5".equals(items.getQuantityRule())) {
@@ -407,7 +407,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							feeCenter.setQuantity(bills.getMeasurement());
 							feeCenter.setAmount(items.getPrice().multiply(bills.getMeasurement()));
 						} else {
-							text += "费用:"+items.getFeeCnName() + "计量单位不等于CBM!";
+							text += "费用:" + items.getFeeCnName() + "计量单位不等于CBM!";
 							continue;
 						}
 					} else {
@@ -476,7 +476,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							feeCenter.setQuantity(new BigDecimal("1"));
 							feeCenter.setAmount(items.getPrice().multiply(new BigDecimal("1")));
 						} else {
-							text += "费用:"+items.getFeeCnName() + "计量单位不等于JOB!";
+							text += "费用:" + items.getFeeCnName() + "计量单位不等于JOB!";
 							continue;
 						}
 					} else if ("3".equals(items.getQuantityRule())) {
@@ -484,7 +484,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							feeCenter.setQuantity(bills.getGrossWeight());
 							feeCenter.setAmount(items.getPrice().multiply(bills.getGrossWeight()));
 						} else {
-							text += "费用:"+items.getFeeCnName() + "计量单位不等于KGS!";
+							text += "费用:" + items.getFeeCnName() + "计量单位不等于KGS!";
 							continue;
 						}
 					} else if ("5".equals(items.getQuantityRule())) {
@@ -492,7 +492,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 							feeCenter.setQuantity(new BigDecimal("1"));
 							feeCenter.setAmount(items.getPrice().multiply(new BigDecimal("1")));
 						} else {
-							text += "费用:"+items.getFeeCnName() + "计量单位不等于CBM!";
+							text += "费用:" + items.getFeeCnName() + "计量单位不等于CBM!";
 							continue;
 						}
 					} else {
@@ -1007,6 +1007,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 			feeCenter.setUpdateTime(new Date());
 			feeCenter.setUpdateUserName(AuthUtil.getUserName());
 		}
+		feeCenter.setStlTtlAmount(ObjectUtils.isNotNull(feeCenter.getStlTtlAmount()) ? feeCenter.getStlTtlAmount() : new BigDecimal("0"));
 		feeCenter.setUnsettledAmount(feeCenter.getAmount().subtract(feeCenter.getStlTtlAmount()));
 		this.saveOrUpdate(feeCenter);
 		return R.data(feeCenter);
@@ -1044,6 +1045,7 @@ public class FeeCenterServiceImpl extends ServiceImpl<FeeCenterMapper, FeeCenter
 					feeCenter.setUpdateTime(new Date());
 					feeCenter.setUpdateUserName(AuthUtil.getUserName());
 				}
+				feeCenter.setStlTtlAmount(ObjectUtils.isNotNull(feeCenter.getStlTtlAmount()) ? feeCenter.getStlTtlAmount() : new BigDecimal("0"));
 				feeCenter.setUnsettledAmount(feeCenter.getAmount().subtract(feeCenter.getStlTtlAmount()));
 				feeCenterList.add(feeCenter);
 			}

+ 1 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java

@@ -208,6 +208,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			}
 		}
 		if (finStlBills.getId() == null) {
+			finStlBills.setWhetherManual("1");
 			BusinessType businessType = bBusinessTypeService.getOne(new LambdaQueryWrapper<BusinessType>()
 				.eq(BusinessType::getTenantId, AuthUtil.getTenantId())
 				.eq(BusinessType::getIsDeleted, 0)

+ 9 - 0
blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/AgentController.java

@@ -254,6 +254,15 @@ public class AgentController extends BladeController {
 	}
 
 	/**
+	 * 确认付款-是否实收已收
+	 */
+	@PostMapping("/confirmReceived")
+	@RepeatSubmit
+	public R confirmReceived(@RequestBody Agent agent) {
+		return agentService.confirmReceived(agent);
+	}
+
+	/**
 	 * 首款/尾款应收待确认通知
 	 */
 	@PostMapping("/confirmationNotification")

+ 76 - 0
blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/AgentViewController.java

@@ -25,16 +25,22 @@ import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
 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.excel.BAccElementsExcel;
+import org.springblade.los.excel.BCntrTypesExcel;
+import org.springblade.los.trade.dto.AgentViewExport;
 import org.springblade.los.trade.entity.AgentView;
 import org.springblade.los.trade.service.IAgentViewService;
 import org.springblade.los.trade.vo.AgentViewVO;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.List;
@@ -136,6 +142,76 @@ public class AgentViewController extends BladeController {
 	}
 
 	/**
+	 * 导出
+	 */
+	@GetMapping("/export")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入agentView")
+	public void export(AgentView agentView, HttpServletResponse response) {
+		LambdaQueryWrapper<AgentView> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(AgentView::getTenantId, AuthUtil.getTenantId())
+			.eq(ObjectUtils.isNotNull(agentView.getCorpId()), AgentView::getCorpId, agentView.getCorpId())
+			.eq(ObjectUtils.isNotNull(agentView.getBusinessStatus()), AgentView::getBusinessStatus, agentView.getBusinessStatus())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherSail()), AgentView::getWhetherSail, agentView.getWhetherSail())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherReachHarbor()), AgentView::getWhetherReachHarbor, agentView.getWhetherReachHarbor())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherClearance()), AgentView::getWhetherClearance, agentView.getWhetherClearance())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherDispatchCar()), AgentView::getWhetherDispatchCar, agentView.getWhetherDispatchCar())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherComplete()), AgentView::getWhetherComplete, agentView.getWhetherComplete())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherCancel()), AgentView::getWhetherCancel, agentView.getWhetherCancel())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherReceivedDownPayments()), AgentView::getWhetherReceivedDownPayments, agentView.getWhetherReceivedDownPayments())
+			.eq(ObjectUtils.isNotNull(agentView.getWhetherReceivedBalancePayment()), AgentView::getWhetherReceivedBalancePayment, agentView.getWhetherReceivedBalancePayment())
+			.eq(ObjectUtils.isNotNull(agentView.getOrderStatus()), AgentView::getOrderStatus, agentView.getOrderStatus())
+			.like(ObjectUtils.isNotNull(agentView.getContractNo()), AgentView::getContractNo, agentView.getContractNo())
+			.like(ObjectUtils.isNotNull(agentView.getBillNo()), AgentView::getBillNo, agentView.getBillNo())
+			.like(ObjectUtils.isNotNull(agentView.getBusinessNo()), AgentView::getBusinessNo, agentView.getBusinessNo())
+			.like(ObjectUtils.isNotNull(agentView.getOrderNo()), AgentView::getOrderNo, agentView.getOrderNo())
+			.like(ObjectUtils.isNotNull(agentView.getBoxNo()), AgentView::getBoxNo, agentView.getBoxNo())
+			.like(ObjectUtils.isNotNull(agentView.getInvoiceNo()), AgentView::getInvoiceNo, agentView.getInvoiceNo());
+		if (ObjectUtils.isNotNull(agentView.getEtdList()) && !agentView.getEtdList().isEmpty()) {
+			lambdaQueryWrapper.gt(AgentView::getEtd, agentView.getEtdList().get(0));
+			lambdaQueryWrapper.lt(AgentView::getEtd, agentView.getEtdList().get(1));
+		}
+		if (ObjectUtils.isNotNull(agentView.getEstimateReachHarborList()) && !agentView.getEstimateReachHarborList().isEmpty()) {
+			lambdaQueryWrapper.gt(AgentView::getEstimateReachHarbor, agentView.getEstimateReachHarborList().get(0));
+			lambdaQueryWrapper.lt(AgentView::getEstimateReachHarbor, agentView.getEstimateReachHarborList().get(1));
+		}
+		if (ObjectUtils.isNotNull(agentView.getActualReachHarborList()) && !agentView.getActualReachHarborList().isEmpty()) {
+			lambdaQueryWrapper.gt(AgentView::getActualReachHarbor, agentView.getActualReachHarborList().get(0));
+			lambdaQueryWrapper.lt(AgentView::getActualReachHarbor, agentView.getActualReachHarborList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(AgentView::getBusinessDate);
+		List<AgentView> list = agentViewService.list( lambdaQueryWrapper);
+		if (!list.isEmpty()) {
+			List<AgentView> pageList = new ArrayList<>();
+			for (AgentView item : list) {
+				if (!pageList.isEmpty()) {
+					List<Long> ids = pageList.stream().map(AgentView::getId).distinct().collect(Collectors.toList());
+					if (ids.contains(item.getId())) {
+						item.setSumAmount(null);
+						item.setGoodsValue(null);
+						item.setAdvanceRatio(null);
+						item.setPrepaidAmount(null);
+						item.setFirstAccountsReceivable(null);
+						item.setFirstPaymentPayable(null);
+						item.setFirstPaidInPayment(null);
+						item.setFirstPaidInPaymentDate(null);
+						item.setFirstActualPayment(null);
+						item.setFirstActualPaymentDate(null);
+						item.setFinalPaymentReceivable(null);
+						item.setFinalPaymentPayable(null);
+						item.setFinalPaymentReceived(null);
+						item.setFinalPaymentReceivedDate(null);
+						item.setFinalPaymentInFull(null);
+						item.setFinalPaymentInFullDate(null);
+					}
+				}
+				pageList.add(item);
+			}
+		}
+		ExcelUtil.export(response, "导出-贸易代理数据", "贸易代理", BeanUtil.copy(list, AgentViewExport.class), AgentViewExport.class);
+	}
+
+	/**
 	 * 自定义分页 VIEW
 	 */
 	@GetMapping("/page")

+ 3 - 3
blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/RecordController.java

@@ -108,10 +108,10 @@ public class RecordController extends BladeController {
 	@ApiOperationSupport(order = 6)
 	@ApiOperation(value = "新增或修改", notes = "传入record")
 	public R submit(@Valid @RequestBody Record record) {
-		return R.status(recordService.saveOrUpdate(record));
+		return recordService.submit(record);
 	}
 
-	
+
 	/**
 	 * 删除 贸易代理-记录表
 	 */
@@ -122,5 +122,5 @@ public class RecordController extends BladeController {
 		return R.status(recordService.removeByIds(Func.toLongList(ids)));
 	}
 
-	
+
 }

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

@@ -68,4 +68,6 @@ public interface IAgentService extends IService<Agent> {
 	Agent revokeApplyForPayment(Agent agent);
 
 	Agent confirmationNotification(Agent agent);
+
+	R confirmReceived(Agent agent);
 }

+ 2 - 0
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/IRecordService.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.los.trade.service;
 
+import org.springblade.core.tool.api.R;
 import org.springblade.los.trade.entity.Record;
 import org.springblade.los.trade.vo.RecordVO;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -38,4 +39,5 @@ public interface IRecordService extends IService<Record> {
 	 */
 	IPage<RecordVO> selectRecordPage(IPage<RecordVO> page, RecordVO record);
 
+    R submit(Record record);
 }

+ 488 - 71
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/AgentServiceImpl.java

@@ -37,7 +37,6 @@ import org.springblade.los.basic.fees.entity.BFees;
 import org.springblade.los.basic.fees.service.IBFeesService;
 import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
-import org.springblade.los.business.aea.entity.AeaBills;
 import org.springblade.los.business.files.entity.FilesCenter;
 import org.springblade.los.business.files.service.IFilesCenterService;
 import org.springblade.los.check.dto.LosAuditProecessDTO;
@@ -50,19 +49,20 @@ import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.finance.fee.service.IFinAccBillsService;
+import org.springblade.los.finance.invoices.entity.FinInvoices;
+import org.springblade.los.finance.invoices.entity.FinInvoicesItems;
+import org.springblade.los.finance.invoices.service.IFinInvoicesItemsService;
+import org.springblade.los.finance.invoices.service.IFinInvoicesService;
 import org.springblade.los.finance.stl.entity.FinStlBills;
 import org.springblade.los.finance.stl.entity.FinStlBillsItems;
 import org.springblade.los.finance.stl.service.IFinStlBillsItemsService;
 import org.springblade.los.finance.stl.service.IFinStlBillsService;
-import org.springblade.los.trade.entity.AdvanceCharge;
-import org.springblade.los.trade.entity.Agent;
-import org.springblade.los.trade.entity.AgentItems;
-import org.springblade.los.trade.entity.Record;
+import org.springblade.los.trade.entity.*;
 import org.springblade.los.trade.mapper.AgentMapper;
+import org.springblade.los.trade.service.IAdvanceChargeItemService;
 import org.springblade.los.trade.service.IAdvanceChargeService;
 import org.springblade.los.trade.service.IAgentItemsService;
 import org.springblade.los.trade.service.IAgentService;
-import org.springblade.los.trade.service.IRecordService;
 import org.springblade.los.trade.vo.AgentVO;
 import org.springblade.system.entity.Dept;
 import org.springblade.system.feign.ISysClient;
@@ -100,8 +100,6 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 
 	private final IFilesCenterService filesCenterService;
 
-	private final IRecordService recordService;
-
 	private final ISysClient sysClient;
 
 	private final IUserClient userClient;
@@ -122,10 +120,16 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 
 	private final IAdvanceChargeService advanceChargeService;
 
+	private final IAdvanceChargeItemService advanceChargeItemService;
+
 	private final IFinStlBillsService finStlBillsService;
 
 	private final IFinStlBillsItemsService finStlBillsItemsService;
 
+	private final IFinInvoicesService finInvoicesService;
+
+	private final IFinInvoicesItemsService finInvoicesItemsService;
+
 	private final IBCorpsBankService bCorpsBankService;
 
 	private final IMessageClient messageClient;
@@ -160,27 +164,119 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				.eq(AgentItems::getIsDeleted, 0)
 				.eq(AgentItems::getPid, agent.getId()));
 			detail.setAgentItemsList(!agentItemsList.isEmpty() ? agentItemsList : new ArrayList<>());
-			List<Record> recordList = recordService.list(new LambdaQueryWrapper<Record>()
-				.eq(Record::getTenantId, AuthUtil.getTenantId())
-				.eq(Record::getIsDeleted, 0)
-				.eq(Record::getPid, agent.getId()));
-			if (!recordList.isEmpty()) {
-				List<Record> recordListD = recordList.stream().filter(e -> "D".equals(e.getSrcType())).collect(Collectors.toList());
-				detail.setRecordListD(!recordListD.isEmpty() ? recordListD : new ArrayList<>());
-				List<Record> recordListC = recordList.stream().filter(e -> "C".equals(e.getSrcType())).collect(Collectors.toList());
-				detail.setRecordListC(!recordListC.isEmpty() ? recordListC : new ArrayList<>());
-				List<Record> recordInvoiceList = recordList.stream().filter(e -> "KP".equals(e.getSrcType())).collect(Collectors.toList());
-				detail.setRecordInvoiceList(!recordInvoiceList.isEmpty() ? recordInvoiceList : new ArrayList<>());
-				List<Record> recordRateList = recordList.stream().filter(e -> "FH".equals(e.getSrcType())).collect(Collectors.toList());
-				detail.setRecordRateList(!recordRateList.isEmpty() ? recordRateList : new ArrayList<>());
-				List<Record> recordClearanceList = recordList.stream().filter(e -> "TG".equals(e.getSrcType())).collect(Collectors.toList());
-				detail.setRecordClearanceList(!recordClearanceList.isEmpty() ? recordClearanceList : new ArrayList<>());
+			List<FinStlBillsItems> finStlBillsItemsList = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
+				.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
+				.eq(FinStlBillsItems::getIsDeleted, 0)
+				.eq(FinStlBillsItems::getBillNo, agent.getBusinessNo()));
+			if (!finStlBillsItemsList.isEmpty()) {
+				List<Long> ids = finStlBillsItemsList.stream().map(FinStlBillsItems::getPid).collect(Collectors.toList());
+				List<FinStlBills> finStlBillsList = finStlBillsService.list(new LambdaQueryWrapper<FinStlBills>()
+					.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
+					.eq(FinStlBills::getIsDeleted, 0)
+					.in(FinStlBills::getId, ids));
+				if (!finStlBillsList.isEmpty()) {
+					List<FinStlBills> recordListD = finStlBillsList.stream().filter(e -> "D".equals(e.getDc()) && "1".equals(e.getWhetherManual())).collect(Collectors.toList());
+					if (!recordListD.isEmpty()) {
+						List<Record> recordList = new ArrayList<>();
+						for (FinStlBills item : recordListD) {
+							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());
+							record.setStatus("收款已结算");
+							record.setSrcType("STL-D");
+							recordList.add(record);
+						}
+						detail.setRecordListD(recordList);
+					}
+					List<FinStlBills> recordListC = finStlBillsList.stream().filter(e -> "C".equals(e.getDc()) && "1".equals(e.getWhetherManual())).collect(Collectors.toList());
+					if (!recordListC.isEmpty()) {
+						List<Record> recordList = new ArrayList<>();
+						for (FinStlBills item : recordListC) {
+							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());
+							record.setStatus("付款已结算");
+							record.setSrcType("STL-C");
+							recordList.add(record);
+						}
+						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.setRecordInvoiceList(new ArrayList<>());
 				detail.setRecordRateList(new ArrayList<>());
-				detail.setRecordClearanceList(new ArrayList<>());
+			}
+			List<FinInvoicesItems> finInvoicesItemsList = finInvoicesItemsService.list(new LambdaQueryWrapper<FinInvoicesItems>()
+				.eq(FinInvoicesItems::getTenantId, AuthUtil.getTenantId())
+				.eq(FinInvoicesItems::getIsDeleted, 0)
+				.eq(FinInvoicesItems::getBillNo, agent.getBusinessNo()));
+			if (!finInvoicesItemsList.isEmpty()) {
+				List<Long> ids = finInvoicesItemsList.stream().map(FinInvoicesItems::getPid).collect(Collectors.toList());
+				List<FinInvoices> finInvoicesList = finInvoicesService.list(new LambdaQueryWrapper<FinInvoices>()
+					.eq(FinInvoices::getTenantId, AuthUtil.getTenantId())
+					.eq(FinInvoices::getIsDeleted, 0)
+					.in(FinInvoices::getId, ids));
+				if (!finInvoicesList.isEmpty()) {
+					List<Record> recordList = new ArrayList<>();
+					for (FinInvoices item : finInvoicesList) {
+						Record record = new Record();
+						record.setPid(agent.getId());
+						record.setSrcId(item.getId());
+						record.setAmount(item.getAmountCny());
+						record.setInvoiceHeader(item.getInvCorpCnName());
+						record.setInvoiceContent("");
+						record.setTaxRate(item.getTaxRate());
+						record.setDate(item.getBillDate());
+						record.setBillNo(item.getBillNo());
+						record.setRemarks(item.getRemarks());
+						record.setStatus("开票已确认");
+						record.setSrcType("FP");
+						recordList.add(record);
+					}
+					detail.setRecordInvoiceList(recordList);
+				}
+			} else {
+				detail.setRecordInvoiceList(new ArrayList<>());
 			}
 			List<FilesCenter> filesCenterList = filesCenterService.list(new LambdaQueryWrapper<FilesCenter>()
 				.eq(FilesCenter::getTenantId, AuthUtil.getTenantId())
@@ -207,7 +303,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			}
 		}
 		List<Agent> count = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
-			.eq(Agent::getCreateDept, deptUtils.getDeptPid()+"")
+			.eq(Agent::getCreateDept, deptUtils.getDeptPid() + "")
 			.eq(Agent::getTenantId, AuthUtil.getTenantId())
 			.eq(Agent::getIsDeleted, 0)
 			.eq(Agent::getContractNo, agent.getContractNo()
@@ -245,11 +341,11 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			}
 		} else {
 			List<Long> ids = count.stream().map(Agent::getId).distinct().collect(Collectors.toList());
-				if (ObjectUtils.isNotNull(agent.getContractNo())) {
-					if (!count.isEmpty() && !ids.contains(agent.getId())) {
-						throw new RuntimeException("提单号不允许重复");
-					}
+			if (ObjectUtils.isNotNull(agent.getContractNo())) {
+				if (!count.isEmpty() && !ids.contains(agent.getId())) {
+					throw new RuntimeException("提单号不允许重复");
 				}
+			}
 			agent.setUpdateUser(AuthUtil.getUserId());
 			agent.setUpdateTime(new Date());
 			agent.setUpdateUserName(AuthUtil.getUserName());
@@ -273,10 +369,32 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				}
 			}
 			agentItemsService.saveOrUpdateBatch(agent.getAgentItemsList());
+			BigDecimal goodsValue = agent.getAgentItemsList().stream().map(AgentItems::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+			agent.setGoodsValue(goodsValue);
+			if (ObjectUtils.isNull(agent.getSumAmount())) {
+				agent.setSumAmount(goodsValue);
+			}
+			baseMapper.updateById(agent);
 		}
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		if (ObjectUtils.isNotNull(agent.getFeeCenterListC()) && !agent.getFeeCenterListC().isEmpty()) {
 			for (FeeCenter item : agent.getFeeCenterListC()) {
+				item.setBusinessType(agent.getBusinessType());
+				item.setBillNo(agent.getBusinessNo());
+				item.setBillDate(agent.getBusinessDate());
+				item.setCorpId(agent.getDomesticConsigneeId());
+				item.setCorpCnName(agent.getDomesticConsigneeCname());
+				item.setBillCorpId(agent.getCorpId());
+				item.setBillCorpCnName(agent.getCorpName());
+				item.setMblno(agent.getContractNo());
+				item.setPolId(agent.getPolId());
+				item.setPolCode(agent.getPolCode());
+				item.setPolCnName(agent.getPolCnName());
+				item.setPolEnName(agent.getPolEnName());
+				item.setPodId(agent.getPodId());
+				item.setPodCode(agent.getPodCode());
+				item.setPodCnName(agent.getPodCnName());
+				item.setPodEnName(agent.getPodEnName());
 				if (item.getId() == null) {
 					item.setPid(agent.getId());
 					item.setCreateTime(new Date());
@@ -296,6 +414,22 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		}
 		if (ObjectUtils.isNotNull(agent.getFeeCenterListD()) && !agent.getFeeCenterListD().isEmpty()) {
 			for (FeeCenter item : agent.getFeeCenterListD()) {
+				item.setBusinessType(agent.getBusinessType());
+				item.setBillNo(agent.getBusinessNo());
+				item.setBillDate(agent.getBusinessDate());
+				item.setCorpId(agent.getDomesticConsigneeId());
+				item.setCorpCnName(agent.getDomesticConsigneeCname());
+				item.setBillCorpId(agent.getCorpId());
+				item.setBillCorpCnName(agent.getCorpName());
+				item.setMblno(agent.getContractNo());
+				item.setPolId(agent.getPolId());
+				item.setPolCode(agent.getPolCode());
+				item.setPolCnName(agent.getPolCnName());
+				item.setPolEnName(agent.getPolEnName());
+				item.setPodId(agent.getPodId());
+				item.setPodCode(agent.getPodCode());
+				item.setPodCnName(agent.getPodCnName());
+				item.setPodEnName(agent.getPodEnName());
 				if (item.getId() == null) {
 					item.setPid(agent.getId());
 					item.setCreateTime(new Date());
@@ -320,6 +454,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			for (FilesCenter item : agent.getFilesCenterList()) {
 				if (item.getId() == null) {
 					item.setBusinessType("MYDL");
+					item.setSerialNo(1);
+					item.setSort(1);
 					item.setBillNo(agent.getBusinessNo());
 					item.setPid(agent.getId());
 					item.setCreateTime(new Date());
@@ -647,6 +783,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			}
 		}
 		Agent detail = baseMapper.selectById(agent.getId());
+		detail.setExchangeRate(agent.getExchangeRate());
+		detail.setDownPayment("1");
 		List<BFees> feesList = bFeesService.list(new LambdaQueryWrapper<BFees>()
 			.eq(BFees::getTenantId, AuthUtil.getTenantId())
 			.eq(BFees::getIsDeleted, 0)
@@ -655,6 +793,14 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (feesList.isEmpty()) {
 			throw new RuntimeException("请先维护费用信息");
 		}
+		if (feeCenterService.count(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getPid, agent.getId())
+			.eq(FeeCenter::getDc, "D")
+			.eq(FeeCenter::getFeeCode, "SFK")) > 0) {
+			throw new RuntimeException("首付款已生成,生成失败");
+		}
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		FeeCenter feeCenterSFK = assemblyDataSK("MYDL", detail, "SFK", 1L, 1, deptId, deptName, feesList);
 		if (feeCenterSFK != null) {
@@ -698,6 +844,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			}
 		}
 		Agent detail = baseMapper.selectById(agent.getId());
+		detail.setBalancePayment("1");
+		detail.setExchangeRate(agent.getExchangeRate());
 		List<BFees> feesList = bFeesService.list(new LambdaQueryWrapper<BFees>()
 			.eq(BFees::getTenantId, AuthUtil.getTenantId())
 			.eq(BFees::getIsDeleted, 0)
@@ -706,6 +854,20 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (feesList.isEmpty()) {
 			throw new RuntimeException("请先维护费用信息");
 		}
+		List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getDc, "D")
+			.eq(FeeCenter::getPid, agent.getId())
+			.eq(FeeCenter::getFeeCode, "WK"));
+		if (!feeCenters.isEmpty()) {
+			BigDecimal amountWk = feeCenters.stream().map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal amount = detail.getGoodsValue().subtract(detail.getPrepaidAmount());
+			if (amount.compareTo(amountWk) == 0) {
+				throw new RuntimeException("尾款剩余生成金额为零,生成失败");
+			}
+		}
+
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		FeeCenter feeCenterSFK = assemblyDataWK("MYDL", detail, "WK", 1L, 1, deptId, deptName, feesList);
 		if (feeCenterSFK != null) {
@@ -756,29 +918,49 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (businessType == null) {
 			throw new RuntimeException("未找到可用业务类型");
 		}
-		List<FeeCenter> feeCenterList = agent.getFeeCenterListD();
+		String feeType = "";
+		String feeTypeName = "";
+		if ("SK".equals(agent.getPaidApplication())) {
+			feeType = "1";
+			feeTypeName = "首付款";
+		} else if ("WK".equals(agent.getPaidApplication())) {
+			feeType = "2";
+			feeTypeName = "尾款";
+		}
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getPid, agent.getId())
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getDc, "D")
+			.eq(FeeCenter::getFeeType, feeType));
 		if (feeCenterList.isEmpty()) {
-			throw new RuntimeException("请选择收款数据");
+			throw new RuntimeException("未找到" + feeTypeName + "费用明细");
 		}
 		Date date = new Date();
 		LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 		int year = localDate.getYear();
 		int month = localDate.getMonthValue();
 		int day = localDate.getDayOfMonth();
-		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(agent.getPrepaidAmount()) != 0) {
-				throw new RuntimeException("结算金额与首付款金额不一致,确认收款失败");
+		if ("SK".equals(agent.getPaidApplication())) {
+			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(agent.getPrepaidAmount()) != 0) {
+					throw new RuntimeException("结算金额与首付款金额不一致,确认收款失败");
+				}
+				agent.setFirstPaidInPayment(firstPaidInPayment);
+				agent.setFirstPaidInPaymentDate(date);
+			}
+		} else if ("WK".equals(agent.getPaidApplication())) {
+			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 (agent.getFinalPaymentReceived().add(finalPaymentReceived).compareTo(agent.getFinalPaymentReceivable()) > 0) {
+					throw new RuntimeException("实收金额大于应收金额");
+				}
+				agent.setFinalPaymentReceived(agent.getFinalPaymentReceived().add(finalPaymentReceived));
+				agent.setFinalPaymentReceivedDate(date);
 			}
-			agent.setFirstPaidInPayment(firstPaidInPayment);
-			agent.setFirstPaidInPaymentDate(date);
-		}
-		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) {
-			agent.setFinalPaymentReceived(agent.getFinalPaymentReceived().add(firstPaidInPayment));
-			agent.setFinalPaymentReceivedDate(date);
 		}
 		BigDecimal advanceChargeAmount = feeCenterList.stream().filter(e -> "YFK".equals(e.getFeeCode())).map(FeeCenter::getAmountLoc)
 			.reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -915,6 +1097,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		}
 		finStlBills.setBillNo((String) clientBillNo.getData());
 		finStlBills.setBillDate(date);
+		finStlBills.setWhetherManual("0");
 		finStlBills.setCreateTime(date);
 		finStlBills.setCreateUser(AuthUtil.getUserId());
 		finStlBills.setCreateUserName(AuthUtil.getUserName());
@@ -984,11 +1167,14 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			processType = "贸易代理首款付费申请";
 			checkType = "FFSQ-SK";
 			fidStatus = "first_status";
+			declare.setApplyForPayment("1");
+
 		} else if ("FFSQ-WK".equals(agent.getPaidApplication())) {
 			actId = 1124;
 			processType = "贸易代理尾款付费申请";
 			checkType = "FFSQ-WK";
 			fidStatus = "final_status";
+			declare.setApplyForPaymentBalance("1");
 		}
 		//获取审批级次
 		List<LosAuditPathsLevels> auditPathsLevels = null;
@@ -1047,10 +1233,51 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					throw new SecurityException("发送消息失败");
 				}
 			}
+			String feeType = "";
 			if ("FFSQ-SK".equals(agent.getPaidApplication())) {
 				declare.setFirstStatus("审核通过");
+				feeType = "1";
 			} else if ("FFSQ-WK".equals(agent.getPaidApplication())) {
 				declare.setFinalStatus("审核通过");
+				feeType = "2";
+			}
+			List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getPid, agent.getId())
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.eq(FeeCenter::getFeeType, feeType));
+			List<FeeCenter> feeCenterList = new ArrayList<>();
+			for (FeeCenter item : feeCenters) {
+				FeeCenter feeCenter = new FeeCenter();
+				BeanUtil.copyProperties(item, feeCenter);
+				feeCenter.setDc("C");
+				feeCenter.setId(null);
+				feeCenter.setCreateTime(new Date());
+				feeCenter.setCreateUser(AuthUtil.getUserId());
+				feeCenter.setCreateUserName(AuthUtil.getUserName());
+				feeCenter.setFeeType(feeType);
+				feeCenter.setAccBillId(null);
+				feeCenter.setAccBillNo(null);
+				feeCenter.setAccDate(null);
+				feeCenter.setAccAmount(new BigDecimal("0"));
+				feeCenter.setAccStatus(0);
+				feeCenter.setAccById(null);
+				feeCenter.setAccByName(null);
+				feeCenter.setUnsettledAmount(item.getAmount());
+				feeCenter.setStlTtlAmount(new BigDecimal("0.00"));
+				feeCenter.setStlOrgAmount(new BigDecimal("0.00"));
+				feeCenter.setStlCurCode(null);
+				feeCenter.setStlAmount(new BigDecimal("0.00"));
+				feeCenter.setStlAmountLoc(new BigDecimal("0.00"));
+				feeCenter.setStlStatus(0);
+				feeCenter.setStlById(null);
+				feeCenter.setStlByName(null);
+				feeCenter.setUnsettledAmount(new BigDecimal("0.00"));
+				feeCenter.setStlTtlAmount(new BigDecimal("0.00"));
+				feeCenterList.add(feeCenter);
+			}
+			if (!feeCenterList.isEmpty()) {
+				feeCenterService.saveBatch(feeCenterList);
 			}
 		} else {
 			if ("FFSQ-SK".equals(agent.getPaidApplication())) {
@@ -1125,27 +1352,149 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		if (businessType == null) {
 			throw new RuntimeException("未找到可用业务类型");
 		}
-		List<FeeCenter> feeCenterListD = agent.getFeeCenterListC();
-		List<FeeCenter> feeCenterList = agent.getFeeCenterListC();
+		String feeType = "";
+		String feeTypeName = "";
+		if ("SK".equals(agent.getPaidApplication())) {
+			feeType = "1";
+			feeTypeName = "首付款";
+		} else if ("WK".equals(agent.getPaidApplication())) {
+			feeType = "2";
+			feeTypeName = "尾款";
+		}
+		List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getPid, agent.getId())
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getFeeType, feeType));
+		List<FeeCenter> feeCenterListD = feeCenters.stream().filter(e -> "D".equals(e.getDc())).collect(Collectors.toList());
+		if (feeCenterListD.isEmpty()) {
+			throw new RuntimeException("未找到" + feeTypeName + "应收费用明细");
+		}
+		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());
 		if (feeCenterList.isEmpty()) {
-			throw new RuntimeException("请选择收款数据");
+			throw new RuntimeException("未找到" + feeTypeName + "应付费用明细");
+		}
+		BigDecimal amountC = feeCenterList.stream().map(FeeCenter::getStlTtlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+		if (new BigDecimal("0").compareTo(amountD) != 0 && amount.compareTo(amountD) == 0) {
+			BigDecimal amountSub = amountC.subtract(amountD);
+			if (amountSub.compareTo(new BigDecimal("0")) > 0) {
+				AdvanceCharge advanceCharge = advanceChargeService.getOne(new LambdaQueryWrapper<AdvanceCharge>()
+					.eq(AdvanceCharge::getTenantId, AuthUtil.getTenantId())
+					.eq(AdvanceCharge::getIsDeleted, 0)
+					.eq(AdvanceCharge::getCorpId, agent.getDomesticConsigneeId()));
+				if (advanceCharge != null) {
+					advanceCharge.setAdvancePaymentBalance(advanceCharge.getAdvancePaymentBalance().add(amountSub));
+					advanceCharge.setInOverpayment(advanceCharge.getInOverpayment().add(amountSub));
+				} else {
+					advanceCharge = new AdvanceCharge();
+					advanceCharge.setAdvancePaymentBalance(amountSub);
+					advanceCharge.setInOverpayment(amountSub);
+					advanceCharge.setCorpId(agent.getCorpId());
+					advanceCharge.setCorpName(agent.getCorpName());
+					advanceCharge.setCreateUser(AuthUtil.getUserId());
+					advanceCharge.setCreateUserName(AuthUtil.getUserName());
+					advanceCharge.setCreateTime(new Date());
+					advanceCharge.setCreateDept(deptId);
+					advanceCharge.setCreateDeptName(deptName);
+				}
+				advanceChargeService.saveOrUpdate(advanceCharge);
+				AdvanceChargeItem advanceChargeItem = new AdvanceChargeItem();
+				advanceChargeItem.setCreateUser(AuthUtil.getUserId());
+				advanceChargeItem.setCreateUserName(AuthUtil.getUserName());
+				advanceChargeItem.setCreateTime(new Date());
+				advanceChargeItem.setCreateDept(deptId);
+				advanceChargeItem.setCreateDeptName(deptName);
+				advanceChargeItem.setPid(advanceCharge.getId());
+				advanceChargeItem.setSrcId(agent.getId());
+				advanceChargeItem.setSrcPid(agent.getId());
+				advanceChargeItem.setOrderNo(agent.getBusinessNo());
+				advanceChargeItem.setOverpayment(amountSub);
+				advanceChargeItem.setOverpaymentType(0);
+				advanceChargeItem.setSrcOrderNo(agent.getBusinessNo());
+				advanceChargeItem.setBillNo(agent.getBusinessNo());
+				advanceChargeItem.setIdentifier(0);
+				advanceChargeItem.setRemarks(feeTypeName);
+				advanceChargeItemService.save(advanceChargeItem);
+			} else if (amountSub.compareTo(new BigDecimal("0")) < 0) {
+				FeeCenter feeCenter = new FeeCenter();
+				feeCenter.setFeeType(feeType);
+				feeCenter.setCreateTime(new Date());
+				feeCenter.setCreateUser(AuthUtil.getUserId());
+				feeCenter.setCreateUserName(AuthUtil.getUserName());
+				if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+					feeCenter.setCreateDept(deptId + "");
+					feeCenter.setBranchId(deptId + "");
+					feeCenter.setCreateDeptName(deptName);
+				}
+				feeCenter.setBusinessType(agent.getBusinessType());
+				feeCenter.setPid(agent.getId());
+				feeCenter.setLineNo(feeCenterListD.size() + 1L);
+				feeCenter.setBillNo(agent.getBusinessNo());
+				feeCenter.setBillDate(agent.getBusinessDate());
+				feeCenter.setCorpId(agent.getDomesticConsigneeId());
+				feeCenter.setCorpCnName(agent.getDomesticConsigneeCname());
+				feeCenter.setBillCorpId(agent.getCorpId());
+				feeCenter.setBillCorpCnName(agent.getCorpName());
+				feeCenter.setMblno(agent.getContractNo());
+				feeCenter.setPolId(agent.getPolId());
+				feeCenter.setPolCode(agent.getPolCode());
+				feeCenter.setPolCnName(agent.getPolCnName());
+				feeCenter.setPolEnName(agent.getPolEnName());
+				feeCenter.setPodId(agent.getPodId());
+				feeCenter.setPodCode(agent.getPodCode());
+				feeCenter.setPodCnName(agent.getPodCnName());
+				feeCenter.setPodEnName(agent.getPodEnName());
+				BFees feesSFK = bFeesService.getOne(new LambdaQueryWrapper<BFees>()
+					.eq(BFees::getTenantId, AuthUtil.getTenantId())
+					.eq(BFees::getIsDeleted, 0)
+					.eq(BFees::getCode, "YFK"));
+				if (feesSFK == null) {
+					throw new RuntimeException("请先维护预付款费用信息");
+				}
+				feeCenter.setFeeId(feesSFK.getId());
+				feeCenter.setFeeCode(feesSFK.getCode());
+				feeCenter.setFeeCnName(feesSFK.getCnName());
+				feeCenter.setFeeEnName(feesSFK.getEnName());
+				feeCenter.setDc("D");
+				feeCenter.setCurCode(feesSFK.getCurNo());
+				feeCenter.setSort(feeCenterListD.size() + 1);
+				feeCenter.setElementsId(feesSFK.getAccElementId());
+				feeCenter.setElementsCode(feesSFK.getElementsCode());
+				feeCenter.setElementsCnName(feesSFK.getAccElementName());
+				feeCenter.setElementsEnName(feesSFK.getElementsEnName());
+				feeCenter.setUnitNo("JOB");
+				feeCenter.setQuantity(new BigDecimal("1"));
+				feeCenter.setPrice(amountSub.abs());
+				feeCenter.setAmount(amountSub.abs());
+				feeCenterService.save(feeCenter);
+			} else {
+				System.out.println("无差额");
+			}
 		}
 		Date date = new Date();
 		LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
 		int year = localDate.getYear();
 		int month = localDate.getMonthValue();
 		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) {
-			agent.setFirstActualPayment(firstActualPayment);
-			agent.setFirstActualPaymentDate(date);
-		}
-		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) {
-			agent.setFinalPaymentInFull(agent.getFinalPaymentInFull().add(finalPaymentInFull));
-			agent.setFinalPaymentInFullDate(date);
+		if ("SK".equals(agent.getPaidApplication())) {
+			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) {
+				agent.setFirstActualPayment(firstActualPayment);
+				agent.setFirstActualPaymentDate(date);
+			}
+		} else {
+			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 (agent.getFinalPaymentInFull().add(finalPaymentInFull).compareTo(agent.getFinalPaymentPayable()) > 0) {
+					throw new RuntimeException("实付金额大于应付金额");
+				}
+				agent.setFinalPaymentInFull(agent.getFinalPaymentInFull().add(finalPaymentInFull));
+				agent.setFinalPaymentInFullDate(date);
+			}
 		}
 		List<FinAccBills> finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
 			.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
@@ -1352,6 +1701,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		}
 		finStlBills.setBillNo((String) clientBillNo.getData());
 		finStlBills.setBillDate(date);
+		finStlBills.setWhetherManual("0");
 		finStlBills.setCreateTime(date);
 		finStlBills.setCreateUser(AuthUtil.getUserId());
 		finStlBills.setCreateUserName(AuthUtil.getUserName());
@@ -1437,10 +1787,11 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			throw new RuntimeException("未找到可用业务类型");
 		}
 		List<FeeCenter> feeCenterList = new ArrayList<>();
-		if (!agent.getFeeCenterListD().isEmpty()) {
+		List<FeeCenter> feeCenterList1 = new ArrayList<>();
+		if (ObjectUtils.isNotNull(agent.getFeeCenterListD()) && !agent.getFeeCenterListD().isEmpty()) {
 			feeCenterList.addAll(agent.getFeeCenterListD());
 		}
-		if (!agent.getFeeCenterListC().isEmpty()) {
+		if (ObjectUtils.isNotNull(agent.getFeeCenterListC()) && !agent.getFeeCenterListC().isEmpty()) {
 			feeCenterList.addAll(agent.getFeeCenterListC());
 		}
 		if (feeCenterList.isEmpty()) {
@@ -1529,9 +1880,14 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			item.setAccByName(AuthUtil.getUserName());
 			item.setUnsettledAmount(item.getAmount());
 			item.setStlTtlAmount(new BigDecimal("0.00"));
-			feeCenterList.add(item);
+			feeCenterList1.add(item);
+		}
+		feeCenterService.saveOrUpdateBatch(feeCenterList1);
+		if ("D".equals(feeCenterList1.get(0).getDc())) {
+			agent.setFeeCenterListD(feeCenterList1);
+		} else {
+			agent.setFeeCenterListC(feeCenterList1);
 		}
-		feeCenterService.saveOrUpdateBatch(feeCenterList);
 		return agent;
 	}
 
@@ -1541,10 +1897,10 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 	public Agent revokeBill(Agent agent) {
 		List<FeeCenter> feeCenterList = new ArrayList<>();
 		List<FeeCenter> feeCenters = new ArrayList<>();
-		if (!agent.getFeeCenterListD().isEmpty()) {
+		if (ObjectUtils.isNotNull(agent.getFeeCenterListD()) && !agent.getFeeCenterListD().isEmpty()) {
 			feeCenters.addAll(agent.getFeeCenterListD());
 		}
-		if (!agent.getFeeCenterListC().isEmpty()) {
+		if (ObjectUtils.isNotNull(agent.getFeeCenterListC()) && !agent.getFeeCenterListC().isEmpty()) {
 			feeCenters.addAll(agent.getFeeCenterListC());
 		}
 		if (feeCenters.isEmpty()) {
@@ -1602,6 +1958,11 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			feeCenterList.add(feeCenterItem);
 		}
 		feeCenterService.saveOrUpdateBatch(feeCenterList);
+		if ("D".equals(feeCenterList.get(0).getDc())) {
+			agent.setFeeCenterListD(feeCenterList);
+		} else {
+			agent.setFeeCenterListC(feeCenterList);
+		}
 		return agent;
 	}
 
@@ -1611,21 +1972,45 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			throw new RuntimeException("缺少必要参数");
 		}
 		Agent declare = baseMapper.selectById(agent.getId());
-		if ("SK".equals(agent.getPaidApplication())) {
+		if ("FFSQ-SK".equals(agent.getPaidApplication())) {
 			if ("审核通过".equals(declare.getFirstStatus())) {
 				throw new SecurityException("审核已通过,撤销失败");
 			}
 			declare.setFirstStatus("录入");
-		} else if ("WK".equals(agent.getPaidApplication())) {
+		} else if ("FFSQ-WK".equals(agent.getPaidApplication())) {
 			if ("审核通过".equals(declare.getFinalStatus())) {
 				throw new SecurityException("审核已通过,撤销失败");
 			}
 			declare.setFinalStatus("录入");
 		}
-
-		R financeProcess = auditProecessService.deteleByBillIdAndType(agent.getId(), agent.getPaidApplication());
-		if (!financeProcess.isSuccess()) {
-			throw new SecurityException("操作失败,请联系管理员");
+		String status = sysClient.getParamServiceByDept("whether.apply.for.payment", AuthUtil.getTenantId(), AuthUtil.getDeptId());
+		if (ObjectUtils.isNotNull(status) && !"0".equals(status)) {
+			R financeProcess = auditProecessService.deteleByBillIdAndType(agent.getId(), agent.getPaidApplication());
+			if (!financeProcess.isSuccess()) {
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+			if ("FFSQ-SK".equals(agent.getPaidApplication())) {
+				declare.setApplyForPayment("0");
+			} else if ("FFSQ-WK".equals(agent.getPaidApplication())) {
+				declare.setApplyForPaymentBalance("0");
+			}
+		} else {
+			String feeType = "";
+			if ("FFSQ-SK".equals(agent.getPaidApplication())) {
+				feeType = "1";
+			} else if ("FFSQ-WK".equals(agent.getPaidApplication())) {
+				feeType = "2";
+			}
+			List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getPid, agent.getId())
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.eq(FeeCenter::getDc, "C")
+				.eq(FeeCenter::getFeeType, feeType));
+			if (!feeCenters.isEmpty()) {
+				List<Long> ids = feeCenters.stream().map(FeeCenter::getId).collect(Collectors.toList());
+				feeCenterService.removeByIds(ids);
+			}
 		}
 		baseMapper.updateById(declare);
 		return declare;
@@ -1751,6 +2136,38 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		return declare;
 	}
 
+	@Override
+	public R confirmReceived(Agent agent) {
+		if (agent.getId() == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		String feeType = "";
+		String feeTypeName = "";
+		if ("SK".equals(agent.getPaidApplication())) {
+			feeType = "1";
+			feeTypeName = "首付款";
+		} else if ("WK".equals(agent.getPaidApplication())) {
+			feeType = "2";
+			feeTypeName = "尾款";
+		}
+		List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getPid, agent.getId())
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getFeeType, feeType));
+		List<FeeCenter> feeCenterListD = feeCenters.stream().filter(e -> "D".equals(e.getDc())).collect(Collectors.toList());
+		if (feeCenterListD.isEmpty()) {
+			throw new RuntimeException("未找到" + feeTypeName + "应收费用明细");
+		}
+		BigDecimal amountD = feeCenterListD.stream().map(FeeCenter::getStlTtlAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal amount = feeCenterListD.stream().map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+		if (amount.compareTo(amountD) != 0) {
+			return R.data(feeTypeName + "实收未全部到账是否继续确认付款");
+		} else {
+			return R.success("操作成功");
+		}
+	}
+
 	private FeeCenter assemblyDataSK(String businessType, Agent detail, String type, long lineNo, int sort, long deptId, String deptName, List<BFees> feesList) {
 		FeeCenter feeCenter = new FeeCenter();
 		feeCenter.setFeeType("1");

+ 47 - 0
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/RecordServiceImpl.java

@@ -16,13 +16,24 @@
  */
 package org.springblade.los.trade.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import io.seata.spring.annotation.GlobalTransactional;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.core.tool.api.R;
+import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.trade.entity.Record;
 import org.springblade.los.trade.vo.RecordVO;
 import org.springblade.los.trade.mapper.RecordMapper;
 import org.springblade.los.trade.service.IRecordService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springblade.system.entity.Dept;
+import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
 
 /**
  * 贸易代理-记录表 服务实现类
@@ -31,11 +42,47 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
  * @since 2024-07-12
  */
 @Service
+@AllArgsConstructor
 public class RecordServiceImpl extends ServiceImpl<RecordMapper, Record> implements IRecordService {
 
+	private final ISysClient sysClient;
+
+	private final IDeptUtils deptUtils;
+
 	@Override
 	public IPage<RecordVO> selectRecordPage(IPage<RecordVO> page, RecordVO record) {
 		return page.setRecords(baseMapper.selectRecordPage(page, record));
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
+	public R submit(Record record) {
+		Long deptId = 0L;
+		String deptName = "";
+		//获取部门ids对应中文名
+		if (ObjectUtils.isNotNull(deptUtils.getDeptPid())) {
+			deptId = deptUtils.getDeptPid();
+			R<Dept> res = sysClient.getDept(deptUtils.getDeptPid());
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
+				deptName = res.getData().getDeptName();
+			}
+		}
+		if (record.getId() == null) {
+			record.setCreateTime(new Date());
+			record.setCreateUser(AuthUtil.getUserId());
+			record.setCreateUserName(AuthUtil.getUserName());
+			if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+				record.setCreateDept(deptId);
+				record.setCreateDeptName(deptName);
+			}
+		} else {
+			record.setUpdateUser(AuthUtil.getUserId());
+			record.setUpdateTime(new Date());
+			record.setUpdateUserName(AuthUtil.getUserName());
+		}
+		this.saveOrUpdate(record);
+		return R.data(record);
+	}
+
 }