Browse Source

贸易代理 2024年8月12日17:45:05

纪新园 1 year ago
parent
commit
c1ca885ade
16 changed files with 828 additions and 214 deletions
  1. 7 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/commodity/entity/BCommodity.java
  2. 1 1
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Bills.java
  3. 11 1
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/entity/Agent.java
  4. 15 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/entity/AgentView.java
  5. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/entity/Record.java
  6. 5 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/report/AgentFeeItemsReport.java
  7. 22 1
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/report/AgentFeeReport.java
  8. 46 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/report/AgentRecordReport.java
  9. 1 1
      blade-service/blade-los/src/main/java/org/springblade/los/Util/MagicValues.java
  10. 39 1
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/TradeBillsController.java
  11. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java
  12. 281 11
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  13. 2 0
      blade-service/blade-los/src/main/java/org/springblade/los/trade/controller/AgentViewController.java
  14. 350 161
      blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/AgentServiceImpl.java
  15. 1 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java
  16. 37 37
      blade-service/blade-sales-part/src/main/resources/log/logback-dev.xml

+ 7 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/basic/commodity/entity/BCommodity.java

@@ -24,6 +24,7 @@ import lombok.Data;
 
 import javax.validation.constraints.NotEmpty;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -139,5 +140,11 @@ public class BCommodity implements Serializable {
 	@ApiModelProperty(value = "租户")
 	private String tenantId;
 
+	/**
+	 * 税率
+	 */
+	@ApiModelProperty(value = "税率")
+	private BigDecimal taxRate;
+
 
 }

+ 1 - 1
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Bills.java

@@ -1458,7 +1458,7 @@ public class Bills implements Serializable {
 	private String mshipperCntyCode;
 
 	/**
-	 * MB/L 发货人国家名称
+	 * MB/L 发货人国家名称(贸易方式)
 	 */
 	@ApiModelProperty(value = "MB/L 发货人国家名称")
 	@TableField("m_shipper_cnty_name")

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

@@ -259,6 +259,11 @@ public class Agent implements Serializable {
 	@ApiModelProperty(value = "所属公司")
 	private String affiliatedCompanyName;
 	/**
+	 * 客户来源类别
+	 */
+	@ApiModelProperty(value = "客户来源类别")
+	private String sourceType;
+	/**
 	 * 业务员id
 	 */
 	@ApiModelProperty(value = "业务员id")
@@ -490,6 +495,11 @@ public class Agent implements Serializable {
 	 */
 	@ApiModelProperty(value = "申报单号")
 	private String declarationNumber;
+	/**
+	 * 贸易方式
+	 */
+	@ApiModelProperty(value = "贸易方式")
+	private String tradeMode;
 
 	/**
 	 * 收费
@@ -623,7 +633,7 @@ public class Agent implements Serializable {
 	@TableField(exist = false)
 	private BigDecimal amount;
 	/**
-	 *  USD
+	 * USD
 	 */
 	@TableField(exist = false)
 	private BigDecimal amountUsd;

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

@@ -375,6 +375,21 @@ public class AgentView implements Serializable {
 	 */
 	@ApiModelProperty(value = "国内收货人中文")
 	private String domesticConsigneeCname;
+	/**
+	 * 贸易方式
+	 */
+	@ApiModelProperty(value = "贸易方式")
+	private String tradeMode;
+	/**
+	 * 利润
+	 */
+	@ApiModelProperty(value = "利润")
+	private BigDecimal profit;
+	/**
+	 * 客户来源类别
+	 */
+	@ApiModelProperty(value = "客户来源类别")
+	private String sourceType;
 
 
 }

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

@@ -16,6 +16,7 @@
  */
 package org.springblade.los.trade.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
@@ -159,6 +160,11 @@ public class Record implements Serializable {
 	@ApiModelProperty(value = "报关单号")
 	private String customsDeclarationNo;
 	/**
+	 * 合同号
+	 */
+	@TableField(exist = false)
+	private String contractNo;
+	/**
 	 * 状态
 	 */
 	@ApiModelProperty(value = "状态")

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/report/AgentFeeItemsReport.java

@@ -94,4 +94,9 @@ public class AgentFeeItemsReport implements Serializable {
 	 */
 	private BigDecimal realityAmount;
 
+	/**
+	 * 到港时间
+	 */
+	private String eta;
+
 }

+ 22 - 1
blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/report/AgentFeeReport.java

@@ -81,6 +81,10 @@ public class AgentFeeReport implements Serializable {
 	 */
 	private BigDecimal surplusAmount;
 
+	private String text;
+
+	private String paymentMethod;
+
 	/**
 	 * 明细
 	 */
@@ -91,7 +95,24 @@ public class AgentFeeReport implements Serializable {
 	/**
 	 * 收款记录
 	 */
-	private List<Map<String,Object>> mapList;
+	private List<AgentRecordReport> reportList;
+
+	/**
+	 * 邮电费
+	 */
+	private BigDecimal reportPostElectricFee;
+	/**
+	 * 手续费
+	 */
+	private BigDecimal reportServiceCharge;
+	/**
+	 * 总计金额
+	 */
+	private BigDecimal reportSumAmount;
+	/**
+	 * 优惠相差
+	 */
+	private BigDecimal discountAmountSub;
 
 
 }

+ 46 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/trade/report/AgentRecordReport.java

@@ -0,0 +1,46 @@
+/*
+ *      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.report;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 贸易代理表实体类
+ *
+ * @author BladeX
+ * @since 2024-07-12
+ */
+@Data
+public class AgentRecordReport implements Serializable {
+
+	/**
+	 * 时间
+	 */
+	private String date;
+	/**
+	 * 汇率
+	 */
+	private BigDecimal exchangeRate;
+	/**
+	 * 金额
+	 */
+	private BigDecimal discountAmount;
+
+}

+ 1 - 1
blade-service/blade-los/src/main/java/org/springblade/los/Util/MagicValues.java

@@ -30,7 +30,7 @@ public class MagicValues {
 
 	public static final String ORDER_ALLOCATION = "配单";
 
-	public static final String THE_FIRST_ONE = "款";
+	public static final String THE_FIRST_ONE = "款";
 	public static final String BALANCE_PAYMENT = "尾款";
 	public static final String MASTER_BILLS = "MASTER 提单";
 	public static final String BILLS_DETAIL = "提单详情";

+ 39 - 1
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/TradeBillsController.java

@@ -134,6 +134,28 @@ public class TradeBillsController extends BladeController {
 		return R.data(pages);
 	}
 
+	/**
+	 * 分页 业务-海运进出口
+	 */
+	@GetMapping("/listTradeV1")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入bills")
+	public R<IPage<Bills>> listTradeV1(Bills bills, Query query) {
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(Bills::getIsDeleted, 0)
+			.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.like(ObjectUtils.isNotNull(bills.getMblno()), Bills::getMblno, bills.getMblno());
+		lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
+		lambdaQueryWrapper.eq(Bills::getBusinessType, "SI")
+			.eq(Bills::getSeaType, "I")
+			.eq(ObjectUtils.isNotNull(bills.getBillStatus()), Bills::getBillStatus, bills.getBillStatus())
+			.apply("id != " + bills.getId())
+			.apply("status != 3");
+		lambdaQueryWrapper.orderByDesc(Bills::getCreateTime);
+		IPage<Bills> pages = billsService.page(Condition.getPage(query), lambdaQueryWrapper);
+		return R.data(pages);
+	}
+
 
 	/**
 	 * 新增或修改 业务-海运进出口(全部)
@@ -163,10 +185,26 @@ public class TradeBillsController extends BladeController {
 	 * 同步增值税或关税
 	 */
 	@GetMapping("/synchronization")
-	public R synchronization(@RequestParam("id") Long id, @RequestParam("type")String type) {
+	public R synchronization(@RequestParam("id") Long id, @RequestParam("type") String type) {
 		return billsService.synchronization(id, type);
 	}
 
 
+	/**
+	 * 转押
+	 */
+	@GetMapping("/transferOfPledge")
+	public R transferOfPledge(@RequestParam("id") Long id, @RequestParam("billId") Long billId) {
+		return billsService.transferOfPledge(id, billId);
+	}
+
+	/**
+	 * 转押
+	 */
+	@GetMapping("/revokeTransferOfPledge")
+	public R revokeTransferOfPledge(@RequestParam("id") Long id) {
+		return billsService.revokeTransferOfPledge(id);
+	}
+
 }
 

+ 4 - 0
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/IBillsService.java

@@ -154,4 +154,8 @@ public interface IBillsService extends IService<Bills> {
 	Bills detailTradeByMblno(Bills bills);
 
 	R synchronization(Long id, String type);
+
+	R transferOfPledge(Long id, Long billId);
+
+	R revokeTransferOfPledge(Long id);
 }

+ 281 - 11
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java

@@ -2452,18 +2452,18 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		StringBuilder boxTypeSum = new StringBuilder();
 
 		if (ObjectUtils.isNotNull(bills.getPreContainersList())) {
-			bills.setQuantity(bills.getPreContainersList().stream().map(PreContainers::getNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add));
-			bills.setGrossWeight(bills.getPreContainersList().stream().map(PreContainers::getGrossWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add));
-			bills.setNetWeight(bills.getPreContainersList().stream().map(PreContainers::getNetWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add));
-			bills.setMeasurement(bills.getPreContainersList().stream().map(PreContainers::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO,BigDecimal::add));
+			bills.setQuantity(bills.getPreContainersList().stream().map(PreContainers::getNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			bills.setGrossWeight(bills.getPreContainersList().stream().map(PreContainers::getGrossWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			bills.setNetWeight(bills.getPreContainersList().stream().map(PreContainers::getNetWeight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			bills.setMeasurement(bills.getPreContainersList().stream().map(PreContainers::getMeasurement).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 			for (PreContainers item : bills.getPreContainersList()) {
 				if (!agentItemsList.isEmpty() && ObjectUtils.isNotNull(item.getInspectionDate())) {
 					for (AgentItems items : agentItemsList) {
 						if (item.getBoxNo().equals(items.getBoxNo())) {
 							String clearanceSpeedOfProgress = "已查验/查验时间:" + sdf.format(item.getInspectionDate()) + ";";
-							if(ObjectUtils.isNotNull(items.getClearanceSpeedOfProgress())){
+							if (ObjectUtils.isNotNull(items.getClearanceSpeedOfProgress())) {
 								items.setClearanceSpeedOfProgress(items.getClearanceSpeedOfProgress() + clearanceSpeedOfProgress);
-							}else{
+							} else {
 								items.setClearanceSpeedOfProgress(clearanceSpeedOfProgress);
 							}
 						}
@@ -2509,9 +2509,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		if (ObjectUtils.isNotNull(bills.getCyReturnTime())) {
 			for (AgentItems items : agentItemsList) {
 				String clearanceSpeedOfProgress = "已放行/放行日期:" + sdf.format(bills.getCyReturnTime()) + ";";
-				if (ObjectUtils.isNotNull(items.getClearanceSpeedOfProgress())){
+				if (ObjectUtils.isNotNull(items.getClearanceSpeedOfProgress())) {
 					items.setClearanceSpeedOfProgress(items.getClearanceSpeedOfProgress() + clearanceSpeedOfProgress);
-				}else{
+				} else {
 					items.setClearanceSpeedOfProgress(clearanceSpeedOfProgress);
 				}
 			}
@@ -2523,9 +2523,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 					for (AgentItems items : agentItemsList) {
 						if (item.getBoxNo().equals(items.getBoxNo())) {
 							String clearanceSpeedOfProgress = "已派车/派车时间:" + sdf.format(item.getDispatchVehiclesDate()) + ";";
-							if (ObjectUtils.isNotNull(items.getClearanceSpeedOfProgress())){
+							if (ObjectUtils.isNotNull(items.getClearanceSpeedOfProgress())) {
 								items.setClearanceSpeedOfProgress(items.getClearanceSpeedOfProgress() + clearanceSpeedOfProgress);
-							}else{
+							} else {
 								items.setClearanceSpeedOfProgress(clearanceSpeedOfProgress);
 							}
 						}
@@ -2716,7 +2716,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			throw new RuntimeException("未找到对应贸易代理单据");
 		}
 		List<FeeCenter> feeCenterList = feeCenterService.list(lambdaQueryWrapper);
-		for (FeeCenter item: feeCenterList){
+		for (FeeCenter item : feeCenterList) {
 			if ("1".equals(type)) {
 				item.setWhetherSynchronizationZzs("1");
 			} else {
@@ -2779,4 +2779,274 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		return R.success("操作成功");
 	}
 
+	@Override
+	public R transferOfPledge(Long id, Long billId) {
+		if (id == null || billId == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		String deptId = "";
+		String deptName = "";
+		String branchId = deptUtils.getDeptPid() + "";
+		//获取部门ids对应中文名
+		if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+			deptId = AuthUtil.getDeptId();
+			R<List<String>> res = sysClient.getDeptNames(AuthUtil.getDeptId());
+			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
+				deptName = String.join(",", res.getData());
+			}
+		}
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getFeeCode, "YXF")
+			.eq(FeeCenter::getPid, id));
+		if (feeCenterList.isEmpty()) {
+			throw new RuntimeException("请先维护压箱费");
+		}
+		Bills bills = baseMapper.selectById(billId);
+		List<Long> ids = feeCenterList.stream().map(FeeCenter::getAccBillId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+		List<FinAccBills> finAccBillsList = new ArrayList<>();
+		if (!ids.isEmpty()) {
+			finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
+				.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
+				.eq(FinAccBills::getIsDeleted, 0)
+				.in(FinAccBills::getId, ids));
+		}
+		BigDecimal amountD = feeCenterList.stream().filter(e -> e.getDc().equals("D")).map(FeeCenter::getAmount)
+			.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal amountC = feeCenterList.stream().filter(e -> e.getDc().equals("C")).map(FeeCenter::getAmount)
+			.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		if (amountD.compareTo(amountC) != 0) {
+			throw new RuntimeException("应收押箱费与应付押箱费金额不相等");
+		}
+		List<FeeCenter> feeCenters = new ArrayList<>();
+		List<FinAccBills> finAccBills = new ArrayList<>();
+		List<FeeCenter> feeCenterArrayList = new ArrayList<>();
+		for (FeeCenter item : feeCenterList) {
+			FeeCenter feeCenter = new FeeCenter();
+			BeanUtil.copyProperties(item, feeCenter);
+			feeCenter.setSrcItemId(item.getId());
+			feeCenter.setPid(bills.getId());
+			feeCenter.setId(null);
+			feeCenter.setCreateTime(new Date());
+			feeCenter.setCreateUser(AuthUtil.getUserId());
+			feeCenter.setCreateUserName(AuthUtil.getUserName());
+			if (ObjectUtils.isNotNull(AuthUtil.getDeptId())) {
+				feeCenter.setCreateDept(deptId);
+				feeCenter.setBranchId(branchId);
+				feeCenter.setCreateDeptName(deptName);
+			}
+			feeCenter.setUpdateUser(null);
+			feeCenter.setUpdateTime(null);
+			feeCenter.setUpdateUserName(null);
+			feeCenter.setBillNo(bills.getBillNo());
+			feeCenter.setBusinessType(bills.getBusinessType());
+			feeCenter.setBillType(bills.getBillType());
+			feeCenter.setBillDate(bills.getBillDate());
+			feeCenter.setSrcType(bills.getSrcType());
+			feeCenter.setSrcId(bills.getSrcId());
+			feeCenter.setSrcCnName(bills.getSrcCnName());
+			feeCenter.setSrcEnName(bills.getSrcEnName());
+			feeCenter.setBillCorpId(bills.getCorpId());
+			feeCenter.setBillCorpCnName(bills.getCorpCnName());
+			feeCenter.setBillCorpEnName(bills.getCorpEnName());
+			feeCenter.setLineId(bills.getLineId());
+			feeCenter.setLineCnName(bills.getLineCnName());
+			feeCenter.setLineEnName(bills.getLineEnName());
+			feeCenter.setVesselId(bills.getVesselId());
+			feeCenter.setVesselEnName(bills.getVesselEnName());
+			feeCenter.setVesselCnName(bills.getVesselCnName());
+			feeCenter.setVoyageNo(bills.getVoyageNo());
+			feeCenter.setMblno(bills.getMblno());
+			feeCenter.setEtd(bills.getEtd());
+			feeCenter.setEta(bills.getEta());
+			feeCenter.setPolId(bills.getPolId());
+			feeCenter.setPolCode(bills.getPolCode());
+			feeCenter.setPolCnName(bills.getPolCnName());
+			feeCenter.setPolEnName(bills.getPolEnName());
+			feeCenter.setPodId(bills.getPodId());
+			feeCenter.setPodCode(bills.getPodCode());
+			feeCenter.setPodCnName(bills.getPodCnName());
+			feeCenter.setPodEnName(bills.getPodEnName());
+			feeCenter.setPaymode(bills.getMpaymode());
+			feeCenter.setPayplace(bills.getMpayplace());
+			feeCenter.setRefno(bills.getRefno());
+			feeCenter.setBookingNo(bills.getBookingNo());
+			feeCenter.setCntrNo(bills.getQuantityCntrTypesDescr());
+			if ("D".equals(item.getDc())) {
+				item.setUnsettledAmount(new BigDecimal("0.00"));
+				item.setStlTtlAmount(item.getAmount());
+				if (!finAccBillsList.isEmpty()) {
+					FinAccBills accBills = finAccBillsList.stream().filter(e -> e.getId().equals(item.getAccBillId())).findFirst().orElse(null);
+					if (accBills != null) {
+						accBills.setStlAmountDr(ObjectUtils.isNotNull(accBills.getStlAmountDr()) ? accBills.getStlAmountDr() : new BigDecimal("0.00"));
+						accBills.setStlAmountDrLoc(ObjectUtils.isNotNull(accBills.getStlAmountDrLoc()) ? accBills.getStlAmountDrLoc() : new BigDecimal("0.00"));
+						accBills.setStlAmountDrUsd(ObjectUtils.isNotNull(accBills.getStlAmountDrUsd()) ? accBills.getStlAmountDrUsd() : new BigDecimal("0.00"));
+						accBills.setStlAmountCr(ObjectUtils.isNotNull(accBills.getStlAmountCr()) ? accBills.getStlAmountCr() : new BigDecimal("0.00"));
+						accBills.setStlAmountCrLoc(ObjectUtils.isNotNull(accBills.getStlAmountCrLoc()) ? accBills.getStlAmountCrLoc() : new BigDecimal("0.00"));
+						accBills.setStlAmountCrUsd(ObjectUtils.isNotNull(accBills.getStlAmountCrUsd()) ? accBills.getStlAmountCrUsd() : new BigDecimal("0.00"));
+						if ("CNY".equals(item.getCurCode())) {
+							accBills.setStlAmountDr(accBills.getStlAmountDr());
+							accBills.setStlAmountDrLoc(accBills.getStlAmountDrLoc());
+						} else {
+							accBills.setStlAmountDrUsd(accBills.getStlAmountDrUsd());
+							BigDecimal cny = bCurrencyService.converterCny(item.getCurCode(), accBills.getStlAmountDrUsd(), "D", "2");
+							accBills.setStlAmountDrLoc(accBills.getStlAmountDrLoc().add(cny));
+						}
+						accBills.setIsCleared(9);
+						accBills.setStlDate(new Date());
+						accBills.setUpdateUser(AuthUtil.getUserId());
+						accBills.setUpdateTime(new Date());
+						accBills.setUpdateUserName(AuthUtil.getUserName());
+						finAccBills.add(accBills);
+					}
+				}
+				feeCenter.setAccountDate(null);
+				feeCenter.setAccBillId(null);
+				feeCenter.setAccBillNo("");
+				feeCenter.setAccDate(null);
+				feeCenter.setAccStatus(0);
+				feeCenter.setAccById(0L);
+				feeCenter.setAccByName("");
+				feeCenter.setStlBillId(0L);
+				feeCenter.setStlBillNo("");
+				feeCenter.setStlDate(null);
+				feeCenter.setStlOrgAmount(new BigDecimal("0.00"));
+				feeCenter.setStlCurCode("");
+				feeCenter.setStlExrate(new BigDecimal("0.00"));
+				feeCenter.setStlExrateLoc(new BigDecimal("0.00"));
+				feeCenter.setStlAmount(new BigDecimal("0.00"));
+				feeCenter.setStlAmountLoc(new BigDecimal("0.00"));
+				feeCenter.setStlStatus(0);
+				feeCenter.setStlById(0L);
+				feeCenter.setStlByName("");
+				feeCenter.setStlTtlAmount(new BigDecimal("0.00"));
+				feeCenter.setUnsettledAmount(item.getAmount());
+				feeCenter.setAuditStatus("0");
+			} else {
+				if (1 != item.getStlStatus()) {
+					throw new RuntimeException("费用未结算,操作失败");
+				}
+				if (1 == item.getStatus()) {
+					throw new RuntimeException("已转押,操作失败");
+				}
+				feeCenter.setAccStatus(1);
+				feeCenter.setStlStatus(1);
+				feeCenter.setStlTtlAmount(item.getAmount());
+				feeCenter.setUnsettledAmount(new BigDecimal("0.00"));
+				feeCenter.setAuditStatus("0");
+				feeCenter.setRemarks("转押数据,不生成账单,金额已结算");
+			}
+			item.setRemarks("押箱转入提单号:" + bills.getMblno());
+			item.setStatus(1);
+			feeCenterArrayList.add(item);
+			feeCenters.add(feeCenter);
+		}
+		if (!feeCenters.isEmpty()) {
+			feeCenterService.saveBatch(feeCenters);
+		}
+		if (!feeCenterArrayList.isEmpty()) {
+			feeCenterService.updateBatchById(feeCenterArrayList);
+		}
+		if (!finAccBills.isEmpty()) {
+			finAccBillsService.updateBatchById(finAccBills);
+		}
+		return R.success("操作成功");
+	}
+
+
+	@Override
+	public R revokeTransferOfPledge(Long id) {
+		if (id == null) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+			.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+			.eq(FeeCenter::getIsDeleted, 0)
+			.eq(FeeCenter::getFeeCode, "YXF")
+			.eq(FeeCenter::getPid, id));
+		List<Long> ids = feeCenterList.stream().map(FeeCenter::getAccBillId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+		List<Long> idList = feeCenterList.stream().map(FeeCenter::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+		if (!idList.isEmpty()) {
+			List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getIsDeleted, 0)
+				.in(FeeCenter::getSrcItemId, ids));
+			if (!feeCenters.isEmpty()) {
+				List<Long> idss = feeCenters.stream().map(FeeCenter::getId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+				for (FeeCenter item : feeCenters) {
+					if (1 == item.getAccStatus()) {
+						throw new RuntimeException("费用:" + item.getFeeCnName() + "已生成账单,撤销失败");
+					}
+					if (1 == item.getStlStatus()) {
+						throw new RuntimeException("费用:" + item.getFeeCnName() + "已结算,撤销失败");
+					}
+				}
+				feeCenterService.removeByIds(idss);
+			}
+		}
+		List<FinAccBills> finAccBills = new ArrayList<>();
+		List<FinAccBills> finAccBillsList = new ArrayList<>();
+		if (!ids.isEmpty()) {
+			finAccBillsList = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
+				.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
+				.eq(FinAccBills::getIsDeleted, 0)
+				.in(FinAccBills::getId, ids));
+		}
+		List<FeeCenter> feeCenterArrayList = new ArrayList<>();
+		for (FeeCenter item : feeCenterList) {
+			if (0 == item.getStatus()) {
+				throw new RuntimeException("已撤销,操作失败");
+			}
+			if ("D".equals(item.getDc())){
+				if (!finAccBillsList.isEmpty()) {
+					FinAccBills accBills = finAccBillsList.stream().filter(e -> e.getId().equals(item.getAccBillId())).findFirst().orElse(null);
+					if (accBills != null) {
+						accBills.setStlAmountDr(ObjectUtils.isNotNull(accBills.getStlAmountDr()) ? accBills.getStlAmountDr() : new BigDecimal("0.00"));
+						accBills.setStlAmountDrLoc(ObjectUtils.isNotNull(accBills.getStlAmountDrLoc()) ? accBills.getStlAmountDrLoc() : new BigDecimal("0.00"));
+						accBills.setStlAmountDrUsd(ObjectUtils.isNotNull(accBills.getStlAmountDrUsd()) ? accBills.getStlAmountDrUsd() : new BigDecimal("0.00"));
+						accBills.setStlAmountCr(ObjectUtils.isNotNull(accBills.getStlAmountCr()) ? accBills.getStlAmountCr() : new BigDecimal("0.00"));
+						accBills.setStlAmountCrLoc(ObjectUtils.isNotNull(accBills.getStlAmountCrLoc()) ? accBills.getStlAmountCrLoc() : new BigDecimal("0.00"));
+						accBills.setStlAmountCrUsd(ObjectUtils.isNotNull(accBills.getStlAmountCrUsd()) ? accBills.getStlAmountCrUsd() : new BigDecimal("0.00"));
+						if ("D".equals(item.getDc())) {
+							if ("CNY".equals(item.getCurCode())) {
+								accBills.setStlAmountDr(new BigDecimal("0.00"));
+								accBills.setStlAmountDrLoc(new BigDecimal("0.00"));
+							} else {
+								accBills.setStlAmountDrUsd(new BigDecimal("0.00"));
+								accBills.setStlAmountDrLoc(new BigDecimal("0.00"));
+							}
+						} else if ("C".equals(item.getDc())) {
+							if ("CNY".equals(item.getCurCode())) {
+								accBills.setStlAmountCr(new BigDecimal("0.00"));
+								accBills.setStlAmountCrLoc(new BigDecimal("0.00"));
+							} else {
+								accBills.setStlAmountCrUsd(new BigDecimal("0.00"));
+								accBills.setStlAmountCrLoc(new BigDecimal("0.00"));
+							}
+							accBills.setIsCleared(0);
+							accBills.setStlDate(null);
+							accBills.setUpdateUser(AuthUtil.getUserId());
+							accBills.setUpdateTime(new Date());
+							accBills.setUpdateUserName(AuthUtil.getUserName());
+							finAccBills.add(accBills);
+						}
+					}
+				}
+				item.setUnsettledAmount(item.getAmount());
+				item.setStlTtlAmount(new BigDecimal("0.00"));
+				item.setStlStatus(0);
+			}
+			item.setStatus(0);
+			feeCenterArrayList.add(item);
+		}
+		if (!feeCenterArrayList.isEmpty()) {
+			feeCenterService.updateBatchById(feeCenterArrayList);
+		}
+		if (!finAccBills.isEmpty()) {
+			finAccBillsService.updateBatchById(finAccBills);
+		}
+		return R.success("操作成功");
+	}
+
 }

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

@@ -110,6 +110,7 @@ public class AgentViewController extends BladeController {
 			lambdaQueryWrapper.gt(AgentView::getActualReachHarbor, agentView.getActualReachHarborList().get(0));
 			lambdaQueryWrapper.lt(AgentView::getActualReachHarbor, agentView.getActualReachHarborList().get(1));
 		}
+		lambdaQueryWrapper.orderByDesc(AgentView::getItemId);
 		lambdaQueryWrapper.orderByDesc(AgentView::getBusinessDate);
 		IPage<AgentView> pages = agentViewService.page(Condition.getPage(query), lambdaQueryWrapper);
 		if (!pages.getRecords().isEmpty()) {
@@ -134,6 +135,7 @@ public class AgentViewController extends BladeController {
 						item.setFinalPaymentReceivedDate(null);
 						item.setFinalPaymentInFull(null);
 						item.setFinalPaymentInFullDate(null);
+						item.setProfit(null);
 					}
 				}
 				pageList.add(item);

+ 350 - 161
blade-service/blade-los/src/main/java/org/springblade/los/trade/service/impl/AgentServiceImpl.java

@@ -202,6 +202,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 							record.setAmount(item.getActualAmount());
 							record.setDate(item.getBusinessDate());
 							record.setBillNo(item.getBillNoJoin());
+							record.setBillNo(item.getContractNo());
 							record.setRemarks(item.getRemarks());
 							record.setCustomsDeclarationNo(item.getDeclarationNumber());
 							if ("D".equals(item.getDc())) {
@@ -409,7 +410,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					.eq(AgentItems::getIsDeleted, 0)
 					.apply("find_in_set(bill_no,'" + billNo + "')")
 				);
-				List<AgentItems> agentItems =agentItemsList.stream()
+				List<AgentItems> agentItems = agentItemsList.stream()
 					.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(
 						Comparator.comparing(AgentItems::getId))), ArrayList::new));
 				for (AgentItems item : agent.getAgentItemsList()) {
@@ -489,6 +490,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				BigDecimal amount = serviceChargeAmount.multiply(agent.getActualAmount()).setScale(2, RoundingMode.HALF_UP);
 				if (amount.compareTo(new BigDecimal("1000")) > 0) {
 					agent.setServiceCharge(new BigDecimal("1000"));
+				} else if (amount.compareTo(new BigDecimal("50")) < 0) {
+					agent.setServiceCharge(new BigDecimal("50"));
 				} else {
 					agent.setServiceCharge(amount);
 				}
@@ -540,6 +543,13 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				} else {
 					item.setStlPid(agent.getId());
 					item.setStlExrate(agent.getExchangeRate());
+					if (item.getStlExrate().compareTo(item.getDiscountExrate()) < 0) {
+						throw new RuntimeException("优惠汇率不能大于结算汇率");
+					}
+					if ("SFK,WK".contains(item.getFeeCode())) {
+						item.setAmount(agent.getExchangeRate().multiply(item.getAmountLoc()).setScale(2, RoundingMode.HALF_UP));
+						item.setPrice(item.getAmount());
+					}
 					if ("YDF".equals(item.getFeeCode())) {
 						item.setAmount(agent.getPostElectricFee().divide(new BigDecimal(ydfCount), 2, RoundingMode.HALF_UP));
 						item.setPrice(item.getAmount());
@@ -584,10 +594,16 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 						} else {
 							serviceChargeAmount = new BigDecimal("1").divide(new BigDecimal("1000"), serviceCharge.length(), RoundingMode.HALF_UP);
 						}
-						BigDecimal amount = feeCenter.getAmountLoc().multiply(item.getDiscountExrate()).multiply(serviceChargeAmount);
-						BigDecimal amountSum = item.getAmount().subtract(amount);
-						item.setProfit(amountSum);
-						profit = profit.add(amountSum);
+						if (ObjectUtils.isNotNull(item.getDiscountExrate())) {
+							BigDecimal amount = feeCenter.getAmountLoc().multiply(item.getDiscountExrate()).multiply(serviceChargeAmount);
+							BigDecimal amountSum = item.getAmount().subtract(amount);
+							item.setProfit(amountSum);
+							profit = profit.add(amountSum);
+						} else {
+							item.setProfit(new BigDecimal("0.00"));
+							profit = profit.add(new BigDecimal("0.00"));
+						}
+
 					}
 				}
 			}
@@ -601,11 +617,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					.distinct().collect(Collectors.joining(","));
 				if (ObjectUtils.isNotNull(billNo)) {
 					List<String> billNoList = Arrays.stream(billNo.split(",")).collect(Collectors.toList());
-					if (ObjectUtils.isNull(agent.getBillNoJoin())) {
-						agent.setBillNoJoin(billNoList.stream().distinct().collect(Collectors.joining(",")));
-					} else {
-						agent.setBillNoJoin(agent.getBillNoJoin() + "," + billNoList.stream().distinct().collect(Collectors.joining(",")));
-					}
+					agent.setBillNoJoin(billNoList.stream().distinct().collect(Collectors.joining(",")));
 				}
 				String contractNo = agent.getFeeCenterListD().stream().map(FeeCenter::getBillNo).filter(Objects::nonNull)
 					.distinct().collect(Collectors.joining(","));
@@ -615,7 +627,10 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				}
 				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()));
+//				agent.setActualAmount(agent.getExchangeRate().multiply(agent.getPaymentInUsd()));
+				agent.setActualAmount(agent.getExchangeRate().multiply(agent.getPaymentInUsd())
+					.subtract(agent.getFeeCenterListD().stream().filter(e -> "YFK".contains(e.getFeeCode()))
+						.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)));
 				ydfCount = agent.getFeeCenterListD().stream().filter(e -> "YDF".equals(e.getFeeCode())).count();
 				sxfCount = agent.getFeeCenterListD().stream().filter(e -> "SXF".equals(e.getFeeCode())).count();
 			}
@@ -639,6 +654,12 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				} else {
 					item.setStlPid(agent.getId());
 					item.setStlExrate(agent.getExchangeRate());
+					item.setExrate(agent.getExchangeRate());
+					item.setDiscountExrate(agent.getExchangeRate());
+					if ("SFK,WK".contains(item.getFeeCode())) {
+						item.setAmount(agent.getExchangeRate().multiply(item.getAmountLoc()).setScale(2, RoundingMode.HALF_UP));
+						item.setPrice(agent.getExchangeRate().multiply(item.getAmountLoc()).setScale(2, RoundingMode.HALF_UP));
+					}
 					if ("YDF".equals(item.getFeeCode())) {
 						item.setAmount(agent.getPostElectricFee().divide(new BigDecimal(ydfCount), 2, RoundingMode.HALF_UP));
 						item.setPrice(item.getAmount());
@@ -1462,6 +1483,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			stlBillsItems.setAccBillNo(data.getBillNo());
 			stlBillsItems.setAccDate(data.getBillDate());
 			stlBillsItems.setDc(data.getAccountDc());
+			stlBillsItems.setItemType("STL");
 			stlBillsItems.setQuantity(new BigDecimal("1"));
 			stlBillsItems.setUnitNo(item.getUnitNo());
 			stlBillsItems.setPrice(data.getAmountDr());
@@ -1552,19 +1574,31 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		}
 		finStlBills.setCollectionSituation("");
 		finStlBillsService.save(finStlBills);
+		if (!finAccBills.isEmpty()) {
+			finAccBillsService.saveOrUpdateBatch(finAccBills);
+		}
 		for (FinStlBillsItems item : stlBillsItemsList) {
 			item.setPid(finStlBills.getId());
+			FinAccBills accBills = finAccBills.stream().filter(e -> e.getBillNo().equals(item.getAccBillNo())).findFirst().orElse(null);
+			if (accBills != null) {
+				item.setAccBillId(accBills.getId());
+			} else {
+				throw new RuntimeException("生成账单失败");
+			}
 		}
 		finStlBillsItemsService.saveBatch(stlBillsItemsList);
 		for (FeeCenter item : feeCenters) {
 			item.setStlBillId(finStlBills.getId());
 			item.setStlBillNo(finStlBills.getBillNo());
 			item.setStlDate(finStlBills.getBillDate());
+			FinAccBills accBills = finAccBills.stream().filter(e -> e.getBillNo().equals(item.getAccBillNo())).findFirst().orElse(null);
+			if (accBills != null) {
+				item.setAccBillId(accBills.getId());
+			} else {
+				throw new RuntimeException("生成账单失败");
+			}
 		}
 		feeCenterService.saveOrUpdateBatch(feeCenters);
-		if (!finAccBills.isEmpty()) {
-			finAccBillsService.saveOrUpdateBatch(finAccBills);
-		}
 		updateById(agent);
 		this.updateBatchById(agentList);
 		return agent;
@@ -1777,6 +1811,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				advanceCharge.setCreateDeptName(deptName);
 				advanceCharge.setAdvancePaymentBalance(new BigDecimal("0.00"));
 				advanceCharge.setInOverpayment(new BigDecimal("0.00"));
+				advanceCharge.setOutOverpaymen(new BigDecimal("0.00"));
 			}
 			AdvanceChargeItem advanceChargeItem = new AdvanceChargeItem();
 			advanceChargeItem.setCreateUser(AuthUtil.getUserId());
@@ -1819,7 +1854,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				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.setPrepaidAmountStl(item.getPrepaidAmount());
+					item.setFirstActualPayment(item.getPrepaidAmount());
 					item.setFirstActualPaymentDate(date);
 					item.setOrderStatus("部分付汇");
 					item.setWhetherReceivedBalancePayment("部分付汇");
@@ -1831,6 +1867,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				if (item.getFinalPaymentInFull().add(amountWk).compareTo(item.getGoodsValue().subtract(item.getPrepaidAmount())) > 0) {
 					throw new RuntimeException("实付金额大于应付金额");
 				}
+				item.setGoodsValueStl(item.getGoodsValueStl().add(amountWk));
 				item.setFinalPaymentInFull(item.getFinalPaymentInFull().add(amountWk));
 				item.setFinalPaymentInFullDate(date);
 				item.setOrderStatus("已付汇");
@@ -2017,6 +2054,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			stlBillsItems.setAccBillNo(data.getBillNo());
 			stlBillsItems.setAccDate(data.getBillDate());
 			stlBillsItems.setDc(data.getAccountDc());
+			stlBillsItems.setItemType("STL");
 			stlBillsItems.setQuantity(new BigDecimal("1"));
 			stlBillsItems.setUnitNo(item.getUnitNo());
 			stlBillsItems.setPrice(data.getAmountDr());
@@ -2107,19 +2145,32 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		}
 		finStlBills.setCollectionSituation("");
 		finStlBillsService.save(finStlBills);
+		if (!finAccBills.isEmpty()) {
+			finAccBillsService.saveOrUpdateBatch(finAccBills);
+		}
 		for (FinStlBillsItems item : stlBillsItemsList) {
 			item.setPid(finStlBills.getId());
+			FinAccBills accBills = finAccBills.stream().filter(e -> e.getBillNo().equals(item.getAccBillNo())).findFirst().orElse(null);
+			if (accBills != null) {
+				item.setAccBillId(accBills.getId());
+			} else {
+				throw new RuntimeException("生成账单失败");
+			}
 		}
 		finStlBillsItemsService.saveBatch(stlBillsItemsList);
 		for (FeeCenter item : feeCenters1) {
 			item.setStlBillId(finStlBills.getId());
 			item.setStlBillNo(finStlBills.getBillNo());
 			item.setStlDate(finStlBills.getBillDate());
+			FinAccBills accBills = finAccBills.stream().filter(e -> e.getBillNo().equals(item.getAccBillNo())).findFirst().orElse(null);
+			if (accBills != null) {
+				item.setAccBillId(accBills.getId());
+			} else {
+				throw new RuntimeException("生成账单失败");
+			}
 		}
 		feeCenterService.saveOrUpdateBatch(feeCenters1);
-		if (!finAccBills.isEmpty()) {
-			finAccBillsService.saveOrUpdateBatch(finAccBills);
-		}
+
 		this.updateBatchById(agentList);
 		agent.setOrderStatus("已确认");
 		updateById(agent);
@@ -2217,9 +2268,11 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			bills.setHconsigneeCnName(agent.getDomesticConsigneeCname());
 			bills.setMnotifyCntyCode(agent.getCountryOfOrigin());
 			bills.setMnotifyCntyName(agent.getTypeOfShipping());
+			bills.setSrcType(agent.getSourceType());
 			bills.setSrcId(agent.getSalesmanId());
 			bills.setSrcCnName(agent.getSalesmanName());
 			bills.setMblno(item.getBillNo());
+			bills.setMshipperCntyName(agent.getTradeMode());
 			List<AgentItems> itemsList = agentItemsList.stream().filter(e -> e.getBillNo().equals(item.getBillNo())).collect(Collectors.toList());
 			if (!itemsList.isEmpty()) {
 				bills.setQuantity(agentItemsList.stream().map(AgentItems::getQuantity).filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
@@ -2777,9 +2830,9 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			feeCenterService.saveBatch(feeCenterList);
 			String type;
 			if ("FFSQ-SK".equals(agent.getPaidApplication())) {
-				type = "FFSQ-SK";
+				type = "SFK";
 			} else if ("FFSQ-WK".equals(agent.getPaidApplication())) {
-				type = "FFSQ-WK";
+				type = "WK";
 			} else {
 				type = "";
 			}
@@ -2882,6 +2935,9 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		stlAgent.setBusinessType("MYDL-STL");
 		stlAgent.setDc(feeCenterList.get(0).getDc());
 		stlAgent.setBusinessDate(date);
+		stlAgent.setAffiliatedCompanyId(agent.getAffiliatedCompanyId());
+		stlAgent.setAffiliatedCompanyName(agent.getAffiliatedCompanyName());
+		stlAgent.setAdvanceRatio(agent.getAdvanceRatio());
 		if ("D".equals(stlAgent.getDc())) {
 			stlAgent.setDomesticConsigneeId(agent.getDomesticConsigneeId());
 			stlAgent.setDomesticConsigneeCname(agent.getDomesticConsigneeCname());
@@ -2908,31 +2964,40 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		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 + "日实收汇率");
+		if (ObjectUtils.isNull(stlAgent.getExchangeRate())) {
+			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.setExchangeRate(bCurExrate.getExrateReceipts());
+		}
+		if ("D".equals(stlAgent.getDc())) {
+			stlAgent.setActualAmount(stlAgent.getExchangeRate().multiply(stlAgent.getPaymentInUsd())
+				.subtract(feeCenterList.stream().filter(e -> "YFK".contains(e.getFeeCode()))
+					.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add)));
 		} else {
-			if (bCurExrate == null) {
-				throw new RuntimeException("未找到" + year + "年-" + month + "月-" + day + "日实付汇率");
-			}
-			stlAgent.setExchangeRate(bCurExrate.getExratePayment());
+			stlAgent.setActualAmount(stlAgent.getExchangeRate().multiply(stlAgent.getPaymentInUsd()));
 		}
-		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);
@@ -2946,6 +3011,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			BigDecimal amount = serviceChargeAmount.multiply(stlAgent.getActualAmount());
 			if (amount.compareTo(new BigDecimal("1000")) > 0) {
 				stlAgent.setServiceCharge(new BigDecimal("1000"));
+			} else if (amount.compareTo(new BigDecimal("50")) < 0) {
+				stlAgent.setServiceCharge(new BigDecimal("50"));
 			} else {
 				stlAgent.setServiceCharge(amount);
 			}
@@ -2976,6 +3043,20 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			if ("5".equals(item.getAuditStatus())) {
 				throw new RuntimeException("费用:" + item.getFeeCnName() + "已申请");
 			}
+			if ("D".equals(stlAgent.getDc())) {
+				item.setExrate(stlAgent.getExchangeRate());
+				item.setStlExrate(stlAgent.getExchangeRate());
+				item.setDiscountExrate(stlAgent.getExchangeRate());
+			} else {
+				item.setStlExrate(stlAgent.getExchangeRate());
+				item.setDiscountExrate(stlAgent.getExchangeRate());
+			}
+			if ("SFK,WK".contains(item.getFeeCode())) {
+				item.setAmount(stlAgent.getExchangeRate().multiply(item.getAmountLoc()).setScale(2, RoundingMode.HALF_UP));
+				item.setStlExrate(stlAgent.getExchangeRate());
+				item.setPrice(item.getAmount());
+				item.setProfit(item.getAmount().subtract(item.getDiscountExrate().multiply(item.getAmountLoc()).setScale(2, RoundingMode.HALF_UP)));
+			}
 			if ("YDF".equals(item.getFeeCode())) {
 				item.setAmount(stlAgent.getPostElectricFee().divide(new BigDecimal(ydfCount), 2, RoundingMode.HALF_UP));
 				item.setPrice(item.getAmount());
@@ -2983,6 +3064,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 			if ("SXF".equals(item.getFeeCode())) {
 				item.setAmount(stlAgent.getServiceCharge().divide(new BigDecimal(sxfCount), 2, RoundingMode.HALF_UP));
 				item.setPrice(item.getAmount());
+				item.setStlExrate(stlAgent.getExchangeRate());
 			}
 			item.setAuditStatus("5");
 			item.setStlPid(stlAgent.getId());
@@ -3048,10 +3130,12 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 					sendMessage.setUrl(agent.getUrl());
 					sendMessage.setPageLabel(agent.getPageLabel());
 					sendMessage.setPageStatus(agent.getPageStatus());
-					if ("YSQR-SK".equals(agent.getPaidApplication())) {
-						sendMessage.setMessageBody("您有新的贸易代理货款收费确认" + ",业务单号:" + stlAgent.getBusinessNo());
-					} else if ("YSQR-WK".equals(agent.getPaidApplication())) {
-						sendMessage.setMessageBody("您有新的贸易代理货款付费确认" + ",业务单号:" + stlAgent.getBusinessNo());
+					if ("D".equals(stlAgent.getDc())) {
+						sendMessage.setMessageBody("您有新的贸易代理货款收费确认,结算单位:" + stlAgent.getDomesticConsigneeCname() + ",合同号:" + stlAgent.getContractNo()
+							+ ",提单号:" + (ObjectUtils.isNull(stlAgent.getBillNoJoin()) ? "" : stlAgent.getBillNoJoin()) + ",金额:" + stlAgent.getGoodsValue());
+					} else if ("C".equals(stlAgent.getDc())) {
+						sendMessage.setMessageBody("您有新的贸易代理货款付费确认,结算单位:" + stlAgent.getAbroadConsignorCname() + ",合同号:" + stlAgent.getContractNo()
+							+ ",提单号:" + (ObjectUtils.isNull(stlAgent.getBillNoJoin()) ? "" : stlAgent.getBillNoJoin()) + ",金额:" + stlAgent.getGoodsValue());
 					}
 					messageList.add(sendMessage);
 				}
@@ -3314,137 +3398,240 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				List<FeeCenter> feeCenterListC = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
 					.in(FeeCenter::getPid, ids)
 					.eq(FeeCenter::getDc, "C")
+					.apply("stl_pid is not null")
 					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 					.eq(FeeCenter::getIsDeleted, 0));
 				if (feeCenterList.isEmpty()) {
 					throw new RuntimeException("请先维护首款费用信息");
 				}
-				List<Long> stlPidC = feeCenterListC.stream().map(FeeCenter::getStlPid).filter(Objects::nonNull).collect(Collectors.toList());
-				List<Agent> agentList = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
-					.eq(Agent::getTenantId, AuthUtil.getTenantId())
-					.eq(Agent::getIsDeleted, 0)
-					.in(Agent::getId, stlPidC));
+				List<AgentRecordReport> reportList = new ArrayList<>();
 				List<FeeCenter> feeCentersSk = feeCenterList.stream().filter(e -> ObjectUtils.isNotNull(e.getFeeType()) &&
-					"1".equals(e.getFeeType()) && "SFK".equals(e.getFeeCode()))
+						"1".equals(e.getFeeType()) && "SFK".equals(e.getFeeCode()))
 					.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(
-					Comparator.comparing(FeeCenter::getBillNo))), ArrayList::new));
-				for (FeeCenter item : feeCentersSk) {
-					AgentFeeItemsReport agentFeeItemsReport = new AgentFeeItemsReport();
-					agentFeeItemsReport.setContractNo(item.getBillNo());
-					agentFeeItemsReport.setOrderNo(item.getOrderNo());
-					agentFeeItemsReport.setFactoryNumber(item.getFactoryNumber());
-					agentFeeItemsReport.setBillNo(item.getMblno());
-					agentFeeItemsReport.setBoxNo(item.getCntrNo());
-					agentFeeItemsReport.setGoodsName(item.getGoodsName());
-					agentFeeItemsReport.setAmountUsd(item.getAmountLoc());
-					agentFeeItemsReport.setExchangeRate(item.getExrate());
-					agentFeeItemsReport.setAmount(item.getAmount());
-					FeeCenter feeCenter = feeCenterListC.stream().filter(e-> e.getFeeCode().equals(item.getFeeCode()))
+						Comparator.comparing(FeeCenter::getBillNo))), ArrayList::new));
+				if (!feeCentersSk.isEmpty()) {
+					List<Long> agentIdList = feeCentersSk.stream().map(FeeCenter::getPid).filter(Objects::nonNull).collect(Collectors.toList());
+					List<AgentItems> agentItemsList = agentItemsService.list(new LambdaQueryWrapper<AgentItems>()
+						.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
+						.eq(AgentItems::getIsDeleted, 0)
+						.in(AgentItems::getPid, agentIdList));
+					for (FeeCenter item : feeCentersSk) {
+						AgentFeeItemsReport agentFeeItemsReport = new AgentFeeItemsReport();
+						agentFeeItemsReport.setContractNo(item.getBillNo());
+						agentFeeItemsReport.setOrderNo(item.getOrderNo());
+						agentFeeItemsReport.setFactoryNumber(item.getFactoryNumber());
+						agentFeeItemsReport.setBillNo(item.getMblno());
+						agentFeeItemsReport.setBoxNo(item.getCntrNo());
+						agentFeeItemsReport.setGoodsName(item.getGoodsName());
+						if (!agentItemsList.isEmpty()) {
+							List<AgentItems> agentItems = agentItemsList.stream().filter(e -> e.getPid().equals(item.getPid())).collect(Collectors.toList());
+							if (!agentItems.isEmpty()) {
+								agentFeeItemsReport.setAmountUsd(agentItems.stream().map(AgentItems::getAmount)
+									.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+								if (ObjectUtils.isNotNull(agentItems.get(0).getEstimateReachHarbor())) {
+									agentFeeItemsReport.setEta(dateFormat.format(agentItems.get(0).getEstimateReachHarbor()));
+								}
+							}
+						}
+						agentFeeItemsReport.setSkAmountUsd(item.getAmountLoc());
+						agentFeeItemsReport.setExchangeRate(item.getExrate());
+						agentFeeItemsReport.setAmount(item.getAmountLoc().multiply(item.getExrate()).setScale(2, RoundingMode.HALF_UP));
+						FeeCenter feeCenter = feeCenterListC.stream().filter(e -> e.getFeeCode().equals(item.getFeeCode())
+								&& ObjectUtils.isNotNull(e.getFeeType()) && "1".equals(e.getFeeType()) && "SFK".equals(e.getFeeCode()))
 							.findFirst().orElse(null);
-					if (feeCenter != null){
-						agentFeeItemsReport.setRealityExchangeRate(feeCenter.getStlExrate());
-						agentFeeItemsReport.setRealityAmount(item.getAmountLoc().multiply(feeCenter.getStlExrate()));
-					}else{
-						agentFeeItemsReport.setRealityExchangeRate(null);
-						agentFeeItemsReport.setRealityAmount(null);
+						if (feeCenter != null) {
+							AgentRecordReport report = new AgentRecordReport();
+							if (ObjectUtils.isNotNull(feeCenter.getStlDate())) {
+								report.setDate(dateFormat.format(feeCenter.getStlDate()));
+							}
+							report.setExchangeRate(feeCenter.getDiscountExrate());
+							report.setDiscountAmount(item.getAmountLoc().multiply(feeCenter.getDiscountExrate()).setScale(2, RoundingMode.HALF_UP));
+							reportList.add(report);
+							agentFeeItemsReport.setRealityExchangeRate(feeCenter.getStlExrate());
+							agentFeeItemsReport.setRealityAmount(item.getAmountLoc().multiply(feeCenter.getStlExrate()).setScale(2, RoundingMode.HALF_UP));
+						} else {
+							agentFeeItemsReport.setRealityExchangeRate(null);
+							agentFeeItemsReport.setRealityAmount(null);
+						}
+						agentFeeItemsReportList.add(agentFeeItemsReport);
 					}
-					agentFeeItemsReportList.add(agentFeeItemsReport);
+					agentFeeReport.setRealityPostElectricFee(feeCenterListC.stream().filter(e -> e.getFeeCode().equals("YDF")
+							&& ObjectUtils.isNotNull(e.getFeeType()) && "1".equals(e.getFeeType()))
+						.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+					agentFeeReport.setRealityServiceCharge(feeCenterListC.stream().filter(e -> e.getFeeCode().equals("SXF")
+							&& ObjectUtils.isNotNull(e.getFeeType()) && "1".equals(e.getFeeType()))
+						.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+					BigDecimal realityAmount = agentFeeItemsReportList.stream().map(AgentFeeItemsReport::getRealityAmount)
+						.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+					agentFeeReport.setRealitySumAmount(realityAmount.add(agentFeeReport.getRealityPostElectricFee()).add(agentFeeReport.getRealityServiceCharge()));
 				}
 				List<FeeCenter> feeCentersWk = feeCenterList.stream().filter(e -> ObjectUtils.isNotNull(e.getFeeType()) &&
 						"2".equals(e.getFeeType()) && "WK".equals(e.getFeeCode()))
 					.collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(
-						Comparator.comparing(FeeCenter::getBillNo))), ArrayList::new));
-				for (FeeCenter item : feeCentersWk) {
-					AgentFeeItemsReport agentFeeItemsReport = new AgentFeeItemsReport();
-					agentFeeItemsReport.setContractNo(item.getBillNo());
-					agentFeeItemsReport.setOrderNo(item.getOrderNo());
-					agentFeeItemsReport.setFactoryNumber(item.getFactoryNumber());
-					agentFeeItemsReport.setBillNo(item.getMblno());
-					agentFeeItemsReport.setBoxNo(item.getCntrNo());
-					agentFeeItemsReport.setGoodsName(item.getGoodsName());
-					agentFeeItemsReport.setAmountUsd(item.getAmountLoc());
-					agentFeeItemsReport.setExchangeRate(item.getExrate());
-					agentFeeItemsReport.setAmount(item.getAmount());
-					FeeCenter feeCenter = feeCenterListC.stream().filter(e-> e.getFeeCode().equals(item.getFeeCode()))
-						.findFirst().orElse(null);
-					if (feeCenter != null){
-						agentFeeItemsReport.setRealityExchangeRate(feeCenter.getStlExrate());
-						agentFeeItemsReport.setRealityAmount(item.getAmountLoc().multiply(feeCenter.getStlExrate()));
-					}else{
-						agentFeeItemsReport.setRealityExchangeRate(null);
-						agentFeeItemsReport.setRealityAmount(null);
-					}
-					agentFeeItemsReportList.add(agentFeeItemsReport);
-				}
+						Comparator.comparing(FeeCenter::getMblno))), ArrayList::new));
+				if (!feeCentersWk.isEmpty()) {
+					List<Long> agentIdList = feeCentersWk.stream().map(FeeCenter::getPid).filter(Objects::nonNull).collect(Collectors.toList());
+					List<Agent> agents = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
+						.eq(Agent::getTenantId, AuthUtil.getTenantId())
+						.eq(Agent::getIsDeleted, 0)
+						.eq(Agent::getBusinessType, "MYDL")
+						.in(Agent::getId, agentIdList));
+					String billNo = feeCentersWk.stream().map(FeeCenter::getMblno).filter(Objects::nonNull).collect(Collectors.joining(","));
+					List<AgentItems> agentItemsList = agentItemsService.list(new LambdaQueryWrapper<AgentItems>()
+						.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
+						.eq(AgentItems::getIsDeleted, 0)
+						.apply("find_in_set(bill_no,'" + billNo + "')"));
+					for (FeeCenter item : feeCentersWk) {
+						AgentFeeItemsReport agentFeeItemsReport = new AgentFeeItemsReport();
+						agentFeeItemsReport.setContractNo(item.getBillNo());
+						agentFeeItemsReport.setOrderNo(item.getOrderNo());
+						agentFeeItemsReport.setFactoryNumber(item.getFactoryNumber());
+						agentFeeItemsReport.setBillNo(item.getMblno());
+						agentFeeItemsReport.setBoxNo(item.getCntrNo());
+						agentFeeItemsReport.setGoodsName(item.getGoodsName());
+						if (!agentItemsList.isEmpty()) {
+							List<AgentItems> agentItems = agentItemsList.stream().filter(e -> e.getBillNo().equals(item.getMblno())).collect(Collectors.toList());
+							if (!agentItems.isEmpty()) {
+								agentFeeItemsReport.setAmountUsd(agentItems.stream().map(AgentItems::getAmount)
+									.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+								if (ObjectUtils.isNotNull(agentItems.get(0).getEstimateReachHarbor())) {
+									agentFeeItemsReport.setEta(dateFormat.format(agentItems.get(0).getEstimateReachHarbor()));
+								}
+							}
+						}
+						if (!agents.isEmpty()) {
+							Agent agent1 = agents.stream().filter(e -> e.getId().equals(item.getPid())).findFirst().orElse(null);
+							if (agent1 != null) {
+								agentFeeItemsReport.setSkAmountUsd(agent1.getPrepaidAmount());
 
-				agentFeeReport.setDept(dept);
-				map.put(MagicValues.DATA, agentFeeReport);
-			} else {
-				map.put(MagicValues.DATA, new AgentFeeReport());
-			}
-		} else if (MagicValues.BUSINESS.equals(reportCode) && MagicValues.BALANCE_PAYMENT.equals(groupCode) && MagicValues.MYDL_STL.equals(type)) {
-			Agent agent = baseMapper.selectById(billId);
-			DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd");
-			if (agent != null) {
-				R<Dept> res = sysClient.getDept(agent.getAffiliatedCompanyId());
-				Dept dept;
-				if (res.isSuccess() && res.getData() != null) {
-					dept = res.getData();
-					String status = sysClient.getParamServiceNew("is.update.default");
-					if ("1".equals(status)) {
-						R<User> resUser = userClient.userInfoById(AuthUtil.getUserId());
-						if (resUser.isSuccess() && resUser.getData() != null) {
-							dept.setEmail(resUser.getData().getEmail());
-							dept.setTel(resUser.getData().getPhone());
-							dept.setContacts(resUser.getData().getRealName());
+							}
 						}
+						agentFeeItemsReport.setWkAmountUsd(item.getAmountLoc());
+						agentFeeItemsReport.setExchangeRate(item.getExrate());
+						agentFeeItemsReport.setAmount(agentFeeItemsReport.getWkAmountUsd().multiply(item.getExrate()).setScale(2, RoundingMode.HALF_UP));
+						FeeCenter feeCenter = feeCenterListC.stream().filter(e -> e.getFeeCode().equals(item.getFeeCode())
+								&& ObjectUtils.isNotNull(e.getFeeType()) && "2".equals(e.getFeeType()) && "WK".equals(e.getFeeCode()))
+							.findFirst().orElse(null);
+						if (feeCenter != null) {
+							AgentRecordReport report = new AgentRecordReport();
+							if (ObjectUtils.isNotNull(feeCenter.getStlDate())) {
+								report.setDate(dateFormat.format(feeCenter.getStlDate()));
+							}
+							report.setExchangeRate(feeCenter.getDiscountExrate());
+							report.setDiscountAmount(item.getAmountLoc().multiply(feeCenter.getDiscountExrate()).setScale(2, RoundingMode.HALF_UP));
+							reportList.add(report);
+							agentFeeItemsReport.setRealityExchangeRate(feeCenter.getStlExrate());
+							agentFeeItemsReport.setRealityAmount(item.getAmountLoc().multiply(feeCenter.getStlExrate()).setScale(2, RoundingMode.HALF_UP));
+						} else {
+							agentFeeItemsReport.setRealityExchangeRate(null);
+							agentFeeItemsReport.setRealityAmount(null);
+						}
+						agentFeeItemsReportList.add(agentFeeItemsReport);
+					}
+					if (ObjectUtils.isNotNull(agentFeeReport.getRealityPostElectricFee())) {
+						agentFeeReport.setRealityPostElectricFee(agentFeeReport.getRealityPostElectricFee().add(
+							feeCenterListC.stream().filter(e -> e.getFeeCode().equals("YDF")
+									&& ObjectUtils.isNotNull(e.getFeeType()) && "2".equals(e.getFeeType()))
+								.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+						));
+					} else {
+						agentFeeReport.setRealityPostElectricFee(feeCenterListC.stream().filter(e -> e.getFeeCode().equals("YDF")
+								&& ObjectUtils.isNotNull(e.getFeeType()) && "2".equals(e.getFeeType()))
+							.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+					}
+					if (ObjectUtils.isNotNull(agentFeeReport.getRealityServiceCharge())) {
+						agentFeeReport.setRealityServiceCharge(agentFeeReport.getRealityServiceCharge().add(
+							feeCenterListC.stream().filter(e -> e.getFeeCode().equals("SXF")
+									&& ObjectUtils.isNotNull(e.getFeeType()) && "2".equals(e.getFeeType()))
+								.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+						));
+					} else {
+						agentFeeReport.setRealityServiceCharge(feeCenterListC.stream().filter(e -> e.getFeeCode().equals("SXF")
+								&& ObjectUtils.isNotNull(e.getFeeType()) && "2".equals(e.getFeeType()))
+							.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+					}
+					if (ObjectUtils.isNotNull(agentFeeReport.getRealitySumAmount())) {
+						BigDecimal realityAmount = agentFeeItemsReportList.stream().map(AgentFeeItemsReport::getRealityAmount)
+							.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						agentFeeReport.setRealitySumAmount(realityAmount.add(agentFeeReport.getRealityPostElectricFee())
+							.add(agentFeeReport.getRealityServiceCharge()).add(agentFeeReport.getRealitySumAmount()));
+					} else {
+						BigDecimal realityAmount = agentFeeItemsReportList.stream().map(AgentFeeItemsReport::getRealityAmount)
+							.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						agentFeeReport.setRealitySumAmount(realityAmount.add(agentFeeReport.getRealityPostElectricFee()).add(agentFeeReport.getRealityServiceCharge()));
 					}
+				}
+				agentFeeReport.setPostElectricFee(agent.getPostElectricFee());
+				agentFeeReport.setServiceCharge(agent.getServiceCharge());
+				agentFeeReport.setSumAmount(agent.getActualAmount());
+				/*agentFeeReport.setRealityPostElectricFee(feeCenterListC.stream().filter(e -> e.getFeeCode().equals("YDF"))
+					.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+				agentFeeReport.setRealityServiceCharge(feeCenterListC.stream().filter(e -> e.getFeeCode().equals("SXF"))
+					.map(FeeCenter::getAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));*/
+				agentFeeReport.setRemainingAmount(feeCenterList.stream().filter(e -> e.getFeeCode().equals("YFK")).map(FeeCenter::getAmount).filter(Objects::nonNull)
+					.reduce(BigDecimal.ZERO, BigDecimal::add));
+				agentFeeReport.setRepairAmount(agentFeeReport.getRealitySumAmount().subtract(agentFeeReport.getSumAmount())
+					.subtract(agentFeeReport.getRemainingAmount()));
+				if (new BigDecimal("0.00").compareTo(agentFeeReport.getRepairAmount()) > 0) {
+					agentFeeReport.setSurplusAmount(agentFeeReport.getRepairAmount().abs());
+					agentFeeReport.setRepairAmount(agentFeeReport.getRepairAmount().abs());
+					agentFeeReport.setText("需退金额:");
 				} else {
-					throw new RuntimeException("获取报表表头数据失败");
+					agentFeeReport.setText("需补金额:");
 				}
-				List<AgentItems> agentItemsList = agentItemsService.list(new LambdaQueryWrapper<AgentItems>()
-					.eq(AgentItems::getTenantId, AuthUtil.getTenantId())
-					.eq(AgentItems::getIsDeleted, 0)
-					.eq(AgentItems::getPid, agent.getId()));
-				List<Agent> agentList = new ArrayList<>();
-				List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-					.eq(FeeCenter::getPid, agent.getId())
-					.eq(FeeCenter::getFeeType, "2")
-					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
-					.eq(FeeCenter::getIsDeleted, 0));
-				if (!feeCenterList.isEmpty()) {
-					List<Long> stlPids = feeCenterList.stream().map(FeeCenter::getStlPid)
-						.filter(Objects::nonNull).distinct().collect(Collectors.toList());
-					if (!stlPids.isEmpty()) {
-						agentList = baseMapper.selectList(new LambdaQueryWrapper<Agent>()
-							.eq(Agent::getTenantId, AuthUtil.getTenantId())
-							.eq(Agent::getIsDeleted, 0)
-							.eq(Agent::getBusinessType, "MYDL-STL")
-							.in(Agent::getId, stlPids));
+				agentFeeReport.setDate(dateFormat.format(agent.getBusinessDate()));
+				agentFeeReport.setPaymentMethod(agent.getAdvanceRatio());
+
+				agentFeeReport.setReportPostElectricFee(agentFeeReport.getRealityPostElectricFee());
+				BigDecimal discountAmount = reportList.stream().map(AgentRecordReport::getDiscountAmount)
+					.filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+				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(discountAmount);
+					if (amount.compareTo(new BigDecimal("1000")) > 0) {
+						agentFeeReport.setReportServiceCharge(new BigDecimal("1000"));
+					} else if (amount.compareTo(new BigDecimal("50")) < 0) {
+						agentFeeReport.setReportServiceCharge(new BigDecimal("50"));
+					} else {
+						agentFeeReport.setReportServiceCharge(amount);
 					}
 				} else {
-					throw new RuntimeException("请先维护尾款费用信息");
+					agentFeeReport.setReportServiceCharge(new BigDecimal("0.00"));
 				}
-				AgentFeeReport agentFeeReport = new AgentFeeReport();
-				List<Map<String, Object>> mapList = new ArrayList<>();
-				List<Long> stlPids = feeCenterList.stream().filter(e -> "WK".equals(e.getFeeCode())
-						&& "D".equals(e.getDc())).map(FeeCenter::getStlPid)
-					.filter(Objects::nonNull).distinct().collect(Collectors.toList());
-				if (!agentList.isEmpty()) {
-					List<Agent> agentList1 = agentList.stream().filter(e -> stlPids.contains(e.getId())).collect(Collectors.toList());
-					for (Agent item : agentList1) {
-						Map<String, Object> map1 = new HashMap<>();
-						map1.put("time", dateFormat.format(item.getBusinessDate()));
-						BigDecimal remainingAmount = feeCenterList.stream().filter(e -> "YFK".equals(e.getFeeCode())
-								&& "D".equals(e.getDc()) && "2".equals(e.getFeeType()) && item.getId().equals(e.getStlPid()))
-							.map(FeeCenter::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-						map1.put("amount", item.getActualAmount().add(item.getPostElectricFee())
-							.add(item.getServiceCharge()).subtract(remainingAmount));
-						mapList.add(map1);
+				agentFeeReport.setReportSumAmount(discountAmount.add(agentFeeReport.getReportPostElectricFee())
+					.add(agentFeeReport.getReportServiceCharge()));
+				agentFeeReport.setDiscountAmountSub(agentFeeReport.getRealitySumAmount().subtract(agentFeeReport.getReportSumAmount()));
+				agentFeeReport.setDept(dept);
+				agentFeeReport.setReportList(reportList);
+				List<AgentFeeItemsReport> agentFeeItemsReports = new ArrayList<>();
+				for (AgentFeeItemsReport item : agentFeeItemsReportList) {
+					if (!agentFeeItemsReports.isEmpty()) {
+						String billNo = agentFeeItemsReports.stream().map(AgentFeeItemsReport::getContractNo)
+							.filter(Objects::nonNull).collect(Collectors.joining(","));
+
+						if (billNo.contains(item.getContractNo())) {
+							if (ObjectUtils.isNotNull(item.getBillNo())) {
+								item.setSkAmountUsd(null);
+							} else {
+								item.setSkAmountUsd(null);
+								item.setWkAmountUsd(null);
+								item.setExchangeRate(null);
+								item.setAmount(null);
+								item.setSkAmount(null);
+								item.setWkAmount(null);
+								item.setRealityExchangeRate(null);
+								item.setRealityAmount(null);
+							}
+							agentFeeItemsReports.add(item);
+						} else {
+							agentFeeItemsReports.add(item);
+						}
+					} else {
+						agentFeeItemsReports.add(item);
 					}
-					agentFeeReport.setMapList(mapList.isEmpty() ? new ArrayList<>() : mapList);
 				}
-				agentFeeReport.setDept(dept);
+				agentFeeReport.setSkItemsReports(agentFeeItemsReports);
 				map.put(MagicValues.DATA, agentFeeReport);
 			} else {
 				map.put(MagicValues.DATA, new AgentFeeReport());
@@ -3661,7 +3848,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				if (ObjectUtils.isNotNull(items.getPaymentRecord())) {
 					String[] arr = items.getPaymentRecord().split(",");
 					String[] newArr = new String[arr.length];
-					for (int i = 0; i <= arr.length; i++) {
+					for (int i = 0; i < arr.length; i++) {
 						if (new BigDecimal("0").compareTo(firstPaidInPayment) != 0) {
 							if (arr[i].contains("应收首付款")) {
 								arr[i] = "【应收首付款】";
@@ -3782,7 +3969,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		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()) && 0 == e.getStlStatus()).collect(Collectors.toList());
+		List<FeeCenter> feeCenterList = feeCenters.stream().filter(e -> "C".equals(e.getDc()) && 1 == e.getStlStatus()).collect(Collectors.toList());
 		if (feeCenterList.isEmpty()) {
 			throw new RuntimeException("未找到应付费用明细");
 		}
@@ -3844,6 +4031,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				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.setPrepaidAmountStl(new BigDecimal("0.00"));
 					item.setFirstActualPayment(new BigDecimal("0.00"));
 					item.setFirstActualPaymentDate(null);
 					item.setOrderStatus("未付汇");
@@ -3854,6 +4042,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				BigDecimal amountWk = feeCenterList.stream().filter(e -> "WK".equals(e.getFeeCode()) && item.getContractNo().equals(e.getBillNo()))
 					.map(FeeCenter::getAmountLoc).reduce(BigDecimal.ZERO, BigDecimal::add);
 				item.setFinalPaymentInFull(item.getFinalPaymentInFull().subtract(amountWk));
+				item.setGoodsValueStl(item.getGoodsValueStl().subtract(amountWk));
 				item.setFinalPaymentInFullDate(null);
 				if (item.getFinalPaymentInFull().add(amountWk).compareTo(item.getFinalPaymentPayable()) == 0) {
 					item.setOrderStatus("未付汇");
@@ -3873,7 +4062,7 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 				if (ObjectUtils.isNotNull(items.getPaymentRecord())) {
 					String[] arr = items.getPaymentRecord().split(",");
 					String[] newArr = new String[arr.length];
-					for (int i = 0; i <= arr.length; i++) {
+					for (int i = 0; i < arr.length; i++) {
 						if (new BigDecimal("0").compareTo(firstActualPayment) != 0) {
 							if (arr[i].contains("应付首付款")) {
 								arr[i] = "【应付首付款】";
@@ -4179,8 +4368,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		feeCenter.setLineNo(lineNo);
 		feeCenter.setBillNo(detail.getContractNo());
 		feeCenter.setBillDate(detail.getBusinessDate());
-		feeCenter.setCorpId(detail.getDomesticConsigneeId());
-		feeCenter.setCorpCnName(detail.getDomesticConsigneeCname());
+		feeCenter.setCorpId(detail.getAbroadConsignorId());
+		feeCenter.setCorpCnName(detail.getAbroadConsignorCname());
 		feeCenter.setBillCorpId(detail.getCorpId());
 		feeCenter.setBillCorpCnName(detail.getCorpName());
 		feeCenter.setPolId(detail.getPolId());
@@ -4288,8 +4477,8 @@ public class AgentServiceImpl extends ServiceImpl<AgentMapper, Agent> implements
 		feeCenter.setLineNo(lineNo);
 		feeCenter.setBillNo(detail.getContractNo());
 		feeCenter.setBillDate(detail.getBusinessDate());
-		feeCenter.setCorpId(detail.getDomesticConsigneeId());
-		feeCenter.setCorpCnName(detail.getDomesticConsigneeCname());
+		feeCenter.setCorpId(detail.getAbroadConsignorId());
+		feeCenter.setCorpCnName(detail.getAbroadConsignorCname());
 		feeCenter.setBillCorpId(detail.getCorpId());
 		feeCenter.setBillCorpCnName(detail.getCorpName());
 		feeCenter.setPolId(detail.getPolId());

+ 1 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java

@@ -213,6 +213,7 @@ public class GoodsDescController extends BladeController {
 		}
 		goodsDesc.setCname(goodsDesc.getCname().trim());
 		goodsDesc.setSpecificationAndModel(goodsDesc.getSpecificationAndModel().trim());
+		goodsDesc.setSpecificationAndModel(goodsDesc.getCode().trim());
 		goodsDesc.setBrandItem(goodsDesc.getBrandItem().trim());
 		goodsDesc.setGoodsSize(goodsDesc.getGoodsSize().trim());
 		PjGoodsDesc goodsDesc1 = goodsDescService.saveMessage(goodsDesc);

+ 37 - 37
blade-service/blade-sales-part/src/main/resources/log/logback-dev.xml

@@ -58,56 +58,56 @@
     </if>
 
     <!-- 日志输出级别 -->
-    <root level="ERROR">
+    <root level="info">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="${STDOUT_APPENDER}"/>
     </root>
 
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="druid.sql" level="ERROR"/>
+    <logger name="net.sf.ehcache" level="info"/>
+    <logger name="druid.sql" level="info"/>
 
 
     <!-- MyBatis log configure -->
-    <logger name="com.apache.ibatis" level="ERROR"/>
-    <logger name="org.mybatis.spring" level="ERROR"/>
-    <logger name="java.sql.Connection" level="ERROR"/>
-    <logger name="java.sql.Statement" level="ERROR"/>
-    <logger name="java.sql.PreparedStatement" level="ERROR"/>
+    <logger name="com.apache.ibatis" level="info"/>
+    <logger name="org.mybatis.spring" level="info"/>
+    <logger name="java.sql.Connection" level="info"/>
+    <logger name="java.sql.Statement" level="info"/>
+    <logger name="java.sql.PreparedStatement" level="info"/>
 
     <!-- 减少部分debug日志 -->
-    <logger name="druid.sql" level="ERROR"/>
-    <logger name="org.apache.shiro" level="ERROR"/>
-    <logger name="org.mybatis.spring" level="ERROR"/>
-    <logger name="org.springframework" level="ERROR"/>
-    <logger name="org.springframework.context" level="ERROR"/>
-    <logger name="org.springframework.beans" level="ERROR"/>
-    <logger name="com.baomidou.mybatisplus" level="ERROR"/>
-    <logger name="org.apache.ibatis.io" level="ERROR"/>
-    <logger name="org.apache.velocity" level="ERROR"/>
-    <logger name="org.eclipse.jetty" level="ERROR"/>
-    <logger name="io.undertow" level="ERROR"/>
-    <logger name="org.xnio.nio" level="ERROR"/>
-    <logger name="org.thymeleaf" level="ERROR"/>
-    <logger name="springfox.documentation" level="ERROR"/>
-    <logger name="org.hibernate.validator" level="ERROR"/>
-    <logger name="com.netflix.loadbalancer" level="ERROR"/>
-    <logger name="com.netflix.hystrix" level="ERROR"/>
-    <logger name="com.netflix.zuul" level="ERROR"/>
-    <logger name="de.codecentric" level="ERROR"/>
-    <!-- cache ERROR -->
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="org.springframework.cache" level="ERROR"/>
+    <logger name="druid.sql" level="info"/>
+    <logger name="org.apache.shiro" level="info"/>
+    <logger name="org.mybatis.spring" level="info"/>
+    <logger name="org.springframework" level="info"/>
+    <logger name="org.springframework.context" level="info"/>
+    <logger name="org.springframework.beans" level="info"/>
+    <logger name="com.baomidou.mybatisplus" level="info"/>
+    <logger name="org.apache.ibatis.io" level="info"/>
+    <logger name="org.apache.velocity" level="info"/>
+    <logger name="org.eclipse.jetty" level="info"/>
+    <logger name="io.undertow" level="info"/>
+    <logger name="org.xnio.nio" level="info"/>
+    <logger name="org.thymeleaf" level="info"/>
+    <logger name="springfox.documentation" level="info"/>
+    <logger name="org.hibernate.validator" level="info"/>
+    <logger name="com.netflix.loadbalancer" level="info"/>
+    <logger name="com.netflix.hystrix" level="info"/>
+    <logger name="com.netflix.zuul" level="info"/>
+    <logger name="de.codecentric" level="info"/>
+    <!-- cache info -->
+    <logger name="net.sf.ehcache" level="info"/>
+    <logger name="org.springframework.cache" level="info"/>
     <!-- cloud -->
-    <logger name="org.apache.http" level="ERROR"/>
-    <logger name="com.netflix.discovery" level="ERROR"/>
-    <logger name="com.netflix.eureka" level="ERROR"/>
+    <logger name="org.apache.http" level="info"/>
+    <logger name="com.netflix.discovery" level="info"/>
+    <logger name="com.netflix.eureka" level="info"/>
     <!-- 业务日志 -->
-    <Logger name="org.springblade" level="ERROR"/>
-    <Logger name="org.springblade.core.tenant" level="ERROR"/>
-    <Logger name="org.springblade.core.version" level="ERROR"/>
+    <Logger name="org.springblade" level="info"/>
+    <Logger name="org.springblade.core.tenant" level="info"/>
+    <Logger name="org.springblade.core.version" level="info"/>
 
     <!-- 减少nacos日志 -->
-    <logger name="com.alibaba.nacos" level="ERROR"/>
+    <logger name="com.alibaba.nacos" level="info"/>
 
 
 </configuration>