Browse Source

1.销项发票-增加发票申请生成销项发票接口
2.销项发票-增加撤销发票申请生成销项发票接口
3.调试发票申请,销项发票新流程
4.结算中心-增加付费申请生成结算中心接口
5.结算中心-增加撤销付费申请生成结算中心接口
6.结算中心-增加销项发票生成结算中心接口
7.结算中心-增加撤销销项发票生成结算中心接口
8.付费申请保存接口bug修改
9.海运出口保存更新配箱明细商品信息
10.费用中心,账单中心增加字段

纪新园 4 months ago
parent
commit
19d2da4312

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

@@ -1024,5 +1024,23 @@ public class FeeCenter implements Serializable {
 	@TableField(updateStrategy = FieldStrategy.IGNORED)
 	private String quantityCntrDescr;
 
+	/**
+	 * 代收、付客户 id
+	 */
+	@ApiModelProperty(value = "代收、付客户 id")
+	private Long generationCorpId;
+
+	/**
+	 * 代收、付客户中文名称
+	 */
+	@ApiModelProperty(value = "代收、付客户中文名称")
+	private String generationCorpCnName;
+
+	/**
+	 * 代收、付客户英文名称
+	 */
+	@ApiModelProperty(value = "代收、付客户英文名称")
+	private String generationCorpEnName;
+
 }
 

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

@@ -807,5 +807,33 @@ public class FinAccBills implements Serializable {
 	@ApiModelProperty(value = "teu箱数")
 	private Integer teu;
 
+	/**
+	 * 代收、付客户 id
+	 */
+	@ApiModelProperty(value = "代收、付客户 id")
+	private Long generationCorpId;
+
+	/**
+	 * 代收、付客户中文名称
+	 */
+	@ApiModelProperty(value = "代收、付客户中文名称")
+	private String generationCorpCnName;
+
+	/**
+	 * 代收、付客户英文名称
+	 */
+	@ApiModelProperty(value = "代收、付客户英文名称")
+	private String generationCorpEnName;
+	/**
+	 * 币种
+	 */
+	@ApiModelProperty(value = "币种")
+	private String curCode;
+	/**
+	 * 汇率,外币转为本币的汇率
+	 */
+	@ApiModelProperty(value = "汇率,外币转为本币的汇率")
+	private BigDecimal exrate;
+
 
 }

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

@@ -1,5 +1,6 @@
 package org.springblade.los.finance.fee.entity;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.math.BigDecimal;
@@ -22,6 +23,11 @@ public class ListAccBillVO extends FinAccBills {
 	private String corpCnName;
 
 	/**
+	 * 开票单位
+	 */
+	private String invCorpCnName;
+
+	/**
 	 * 是否已签收(0 否 1是)
 	 */
 	private Integer isSignfor;
@@ -199,4 +205,9 @@ public class ListAccBillVO extends FinAccBills {
 	 */
 	private String vagueH;
 
+	/**
+	 * 是否 DK, 0 否, 1 是
+	 */
+	private Integer isDk;
+
 }

+ 0 - 12
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/entity/FinInvoices.java

@@ -114,8 +114,6 @@ public class FinInvoices implements Serializable {
 	 * 单据日期
 	 */
 	@ApiModelProperty(value = "单据日期")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
-	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date billDate;
 	/**
 	 * 发票号码
@@ -126,8 +124,6 @@ public class FinInvoices implements Serializable {
 	 * 开票日期
 	 */
 	@ApiModelProperty(value = "开票日期")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
-	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date invoiceDate;
 	/**
 	 * 开票日期开始
@@ -243,8 +239,6 @@ public class FinInvoices implements Serializable {
 	 * 开船日
 	 */
 	@ApiModelProperty(value = "开船日")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
-	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date etd;
 	/**
 	 * 装货港
@@ -335,15 +329,11 @@ public class FinInvoices implements Serializable {
 	 * 财务开始日期
 	 */
 	@ApiModelProperty(value = "财务开始日期")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
-	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date accountDateFrom;
 	/**
 	 * 财务结束日期
 	 */
 	@ApiModelProperty(value = "财务结束日期")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
-	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date accountDateTo;
 	/**
 	 * 申请人 Id
@@ -389,8 +379,6 @@ public class FinInvoices implements Serializable {
 	 * 导出日期
 	 */
 	@ApiModelProperty(value = "导出日期")
-	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
-	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date exportDate;
 	/**
 	 * 导出人 Id

+ 9 - 2
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.xml

@@ -988,8 +988,15 @@
         <if test="acc.auditStatus != null and acc.auditStatus !=''">
             and fee.audit_status = #{acc.auditStatus}
         </if>
-        <if test="acc.corpCnName != null and acc.corpCnName != ''">
-            and fee.corp_id = #{acc.corpCnName}
+        <if test='acc.isDk != null and acc.isDk == "1"'>
+            <if test="acc.invCorpCnName != null and acc.invCorpCnName != ''">
+                and fee.corp_id = #{acc.invCorpCnName}
+            </if>
+        </if>
+        <if test='acc.isDk == null or acc.isDk == "0"'>
+            <if test="acc.corpCnName != null and acc.corpCnName != ''">
+                and fee.corp_id = #{acc.corpCnName}
+            </if>
         </if>
         <if test="acc.isSignfor != null">
             and fee.is_signfor = #{acc.isSignfor}

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

@@ -617,6 +617,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 						item.setHblno(bills.getBookingNo());
 					}
 				}
+				if ("MH,DD".contains(bills.getBillType())) {
+					item.setCommodityDescr(bills.getCommodityDescr());
+				}
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -4764,7 +4767,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 			String formatted = now.format(formatter);
 			Message sendMessage = new Message();
-			sendMessage.setParameter(bills.getId() + "");
+			sendMessage.setParameter(copyBills.getId() + "");
 			sendMessage.setUserName(AuthUtil.getUserName());
 			sendMessage.setUserId(null);
 			sendMessage.setToUserId(res.getData().getId());
@@ -4776,7 +4779,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			sendMessage.setUrl("/iosBasicData/SeafreightExportF/bills/index");
 			sendMessage.setPageLabel("海运出口");
 			sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-			sendMessage.setMessageBody("您有新的预定舱,请及时待处理!单号:" + bills.getBillNo() + "时间:" + formatted);
+			sendMessage.setMessageBody("您有新的预定舱生成海运出口,请及时待处理!单号:" + copyBills.getBillNo() + "时间:" + formatted);
 			R save = messageClient.save(sendMessage);
 			if (!save.isSuccess()) {
 				throw new SecurityException("发送消息失败");
@@ -5037,33 +5040,36 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 
 	@Override
 	public R sendMessageBooking(Bills bills) {
-		if (ObjectUtils.isNotNull(bills.getCustomerServiceId())) {
-			R<User> res = userClient.userInfoById(bills.getCustomerServiceId());
-			if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
-				LocalDateTime now = LocalDateTime.now();
-				DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-				String formatted = now.format(formatter);
-				Message sendMessage = new Message();
-				sendMessage.setParameter(bills.getId() + "");
-				sendMessage.setUserName(AuthUtil.getUserName());
-				sendMessage.setUserId(null);
-				sendMessage.setToUserId(res.getData().getId());
-				sendMessage.setToUserName(res.getData().getName());
-				sendMessage.setMessageType(1);
-				sendMessage.setTenantId(AuthUtil.getTenantId());
-				sendMessage.setCreateUser(null);
-				sendMessage.setCreateTime(new Date());
-				sendMessage.setUrl("/iosBasicData/SeafreightExportF/bills/index");
-				sendMessage.setPageLabel("海运出口");
-				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-				sendMessage.setMessageBody("您有新的预定舱,请及时待处理!单号:" + bills.getBillNo() + "时间:" + formatted);
-				R save = messageClient.save(sendMessage);
-				if (!save.isSuccess()) {
-					throw new SecurityException("发送消息失败");
+		Bills detail = baseMapper.selectById(bills.getId());
+		if (detail != null){
+			if (ObjectUtils.isNotNull(detail.getCustomerServiceId())) {
+				R<User> res = userClient.userInfoById(detail.getCustomerServiceId());
+				if (res.isSuccess() && ObjectUtils.isNotNull(res.getData())) {
+					LocalDateTime now = LocalDateTime.now();
+					DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+					String formatted = now.format(formatter);
+					Message sendMessage = new Message();
+					sendMessage.setParameter(detail.getId() + "");
+					sendMessage.setUserName(AuthUtil.getUserName());
+					sendMessage.setUserId(null);
+					sendMessage.setToUserId(res.getData().getId());
+					sendMessage.setToUserName(res.getData().getName());
+					sendMessage.setMessageType(1);
+					sendMessage.setTenantId(AuthUtil.getTenantId());
+					sendMessage.setCreateUser(null);
+					sendMessage.setCreateTime(new Date());
+					sendMessage.setUrl("/iosBasicData/SeafreightExportF/bills/index");
+					sendMessage.setPageLabel("海运出口");
+					sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+					sendMessage.setMessageBody("您有新的预定舱,请及时待处理!单号:" + detail.getBillNo() + "时间:" + formatted);
+					R save = messageClient.save(sendMessage);
+					if (!save.isSuccess()) {
+						throw new SecurityException("发送消息失败");
+					}
 				}
+			} else {
+				throw new RuntimeException("请选择负责人");
 			}
-		} else {
-			throw new RuntimeException("请选择负责人");
 		}
 		return R.data("操作成功");
 	}

+ 32 - 2
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/controller/FinInvoicesController.java

@@ -39,6 +39,8 @@ import org.springblade.los.finance.stl.entity.FinStlBills;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * 业务-发票主表 控制器
@@ -333,8 +335,18 @@ public class FinInvoicesController extends BladeController {
 	 */
 	@GetMapping("/generateFinInvoicesV1")
 	@RepeatSubmit
-	public R generateFinInvoicesV1(@RequestParam("billId") String billId) {
-		return finInvoicesService.generateFinInvoicesV1(billId);
+	public R generateFinInvoicesV1(@RequestParam("billId") String billId, @RequestParam("invoiceDate")Date invoiceDate,
+								   @RequestParam("exrate")BigDecimal exrate) {
+		return finInvoicesService.generateFinInvoicesV1(billId,invoiceDate,exrate);
+	}
+
+	/**
+	 * 撤销生成销项发票单 1.0
+	 */
+	@GetMapping("/revokeGenerateFinInvoicesV1")
+	@RepeatSubmit
+	public R revokeGenerateFinInvoicesV1(@RequestParam("billId") String billId) {
+		return finInvoicesService.revokeGenerateFinInvoicesV1(billId);
 	}
 
 	/**
@@ -355,5 +367,23 @@ public class FinInvoicesController extends BladeController {
 		return finInvoicesService.feeItemsDelete(finInvoices);
 	}
 
+	/**
+	 * 生成结算单 - 销项发票
+	 */
+	@GetMapping("/generateFinStlBillsV1")
+	@RepeatSubmit
+	public R generateFinStlBillsV1(@RequestParam("billId") String billId,@RequestParam("date") Date date) {
+		return finInvoicesService.generateFinStlBillsV1(billId, date);
+	}
+
+	/**
+	 * 撤销生成结算单 - 销项发票
+	 */
+	@GetMapping("/revokeGenerateFinStlBillsV1")
+	@RepeatSubmit
+	public R revokeGenerateFinStlBillsV1(@RequestParam("billId") String billId) {
+		return finInvoicesService.revokeGenerateFinStlBillsV1(billId);
+	}
+
 
 }

+ 9 - 1
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/IFinInvoicesService.java

@@ -22,6 +22,8 @@ import org.springblade.core.tool.api.R;
 import org.springblade.los.finance.invoices.entity.FinInvoices;
 import org.springblade.los.finance.invoices.vo.FinInvoicesVO;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -124,5 +126,11 @@ public interface IFinInvoicesService extends IService<FinInvoices> {
 
 	R revokeFinInvoicesV1(FinInvoices finInvoices);
 
-	R generateFinInvoicesV1(String billId);
+	R generateFinInvoicesV1(String billId, Date invoiceDate, BigDecimal exrate);
+
+	R revokeGenerateFinInvoicesV1(String billId);
+
+	R generateFinStlBillsV1(String billId, Date date);
+
+	R revokeGenerateFinStlBillsV1(String billId);
 }

File diff suppressed because it is too large
+ 804 - 71
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java


+ 19 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/controller/FinStlBillsController.java

@@ -38,6 +38,7 @@ import org.springblade.los.finance.stl.vo.FinStlBillsVO;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
+import java.util.Date;
 
 /**
  * 业务-财务对账单和结算 控制器
@@ -386,6 +387,24 @@ public class FinStlBillsController extends BladeController {
 	}
 
 	/**
+	 * 生成结算单 - 付费申请
+	 */
+	@GetMapping("/generateFinStlBillsV1")
+	@RepeatSubmit
+	public R generateFinStlBillsV1(@RequestParam("billId") String billId,@RequestParam("date") Date date) {
+		return finStlBillsService.generateFinStlBillsV1(billId, date);
+	}
+
+	/**
+	 * 撤销生成结算单 - 付费申请
+	 */
+	@GetMapping("/revokeGenerateFinStlBillsV1")
+	@RepeatSubmit
+	public R revokeGenerateFinStlBillsV1(@RequestParam("billId") String billId) {
+		return finStlBillsService.revokeGenerateFinStlBillsV1(billId);
+	}
+
+	/**
 	 * 详情
 	 */
 	@GetMapping("/getByDetail")

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

@@ -22,6 +22,7 @@ import org.springblade.core.tool.api.R;
 import org.springblade.los.finance.stl.entity.FinStlBills;
 import org.springblade.los.finance.stl.vo.FinStlBillsVO;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -121,4 +122,8 @@ public interface IFinStlBillsService extends IService<FinStlBills> {
 	R settlementApproveV1(FinStlBills finStlBills);
 
 	R revokeSettlementApproveV1(FinStlBills finStlBills);
+
+	R generateFinStlBillsV1(String billId, Date date);
+
+	R revokeGenerateFinStlBillsV1(String billId);
 }

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

@@ -215,7 +215,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				.eq(FinStlBills::getIsDeleted, 0)
 				.eq(FinStlBills::getBillNo, finStlBills.getBillNo())
 			);
-			if (!finStlBillsList.isEmpty()){
+			if (!finStlBillsList.isEmpty()) {
 				throw new RuntimeException("订单编号重复,请重新保存");
 			}
 			finStlBills.setCreateTime(new Date());
@@ -231,9 +231,10 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				.eq(FinStlBills::getBranchId, finStlBills.getBranchId())
 				.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
 				.eq(FinStlBills::getIsDeleted, 0)
+				.ne(FinStlBills::getId, finStlBills.getId())
 				.eq(FinStlBills::getBillNo, finStlBills.getBillNo())
 			);
-			if (!finStlBillsList.isEmpty()){
+			if (!finStlBillsList.isEmpty()) {
 				throw new RuntimeException("订单编号重复,请重新创建单据");
 			}
 			finStlBills.setUpdateUser(AuthUtil.getUserId());
@@ -1301,7 +1302,6 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 					throw new RuntimeException("未找到账单明细,操作失败");
 				}
 				boolean status = Boolean.FALSE;
-
 				//计算字段null值处理
 				item.setStlTtlAmount(ObjectUtils.isNotNull(item.getStlTtlAmount()) ? item.getStlTtlAmount() : new BigDecimal("0.00"));
 				item.setUnsettledAmount(ObjectUtils.isNotNull(item.getUnsettledAmount()) ? item.getUnsettledAmount() : new BigDecimal("0.00"));
@@ -2238,26 +2238,28 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			throw new RuntimeException("缺少必要参数");
 		}
 		List<FinAccBills> finAccBillsListAll = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
-				.select(FinAccBills::getId,FinAccBills::getBranchId,FinAccBills::getBranchName,
-					FinAccBills::getApprovedDate,FinAccBills::getVoucherDate,FinAccBills::getInvoiceDate,FinAccBills::getStlDate,
-					FinAccBills::getEta,FinAccBills::getEtd,FinAccBills::getAccountDate,FinAccBills::getBillDate,
-					FinAccBills::getReconciliationAmount, FinAccBills::getAccountDc,
-					FinAccBills::getAmountDr, FinAccBills::getAmountCr, FinAccBills::getReconciliationAmountUsd,
-					FinAccBills::getAmountDrUsd, FinAccBills::getAmountCrUsd,FinAccBills::getAppliedAmount,
-					FinAccBills::getAppliedAmountStl, FinAccBills::getAmountDrLoc, FinAccBills::getStlAmountDrLoc,
-					FinAccBills::getAmountCrLoc, FinAccBills::getStlAmountCrLoc, FinAccBills::getAppliedAmountUsd,
-					FinAccBills::getAppliedAmountStlUsd)
+			.select(FinAccBills::getId, FinAccBills::getBranchId, FinAccBills::getBranchName,
+				FinAccBills::getApprovedDate, FinAccBills::getVoucherDate, FinAccBills::getInvoiceDate, FinAccBills::getStlDate,
+				FinAccBills::getEta, FinAccBills::getEtd, FinAccBills::getAccountDate, FinAccBills::getBillDate,
+				FinAccBills::getReconciliationAmount, FinAccBills::getAccountDc,
+				FinAccBills::getAmountDr, FinAccBills::getAmountCr, FinAccBills::getReconciliationAmountUsd,
+				FinAccBills::getAmountDrUsd, FinAccBills::getAmountCrUsd, FinAccBills::getAppliedAmount,
+				FinAccBills::getAppliedAmountStl, FinAccBills::getAmountDrLoc, FinAccBills::getStlAmountDrLoc,
+				FinAccBills::getAmountCrLoc, FinAccBills::getStlAmountCrLoc, FinAccBills::getAppliedAmountUsd,
+				FinAccBills::getStlAmountDr, FinAccBills::getStlAmountDrUsd, FinAccBills::getStlAmountCr,
+				FinAccBills::getStlAmountCrUsd, FinAccBills::getAppliedAmountStlUsd)
 			.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
 			.eq(FinAccBills::getIsDeleted, 0)
 			.in(FinAccBills::getId, finStlBills.getFinAccBillsVOList().stream().map(FinAccBillsVO::getId).collect(Collectors.toList())));
 		if (finAccBillsListAll.isEmpty()) {
 			throw new RuntimeException("未查到账单数据");
 		}
+		FinStlBills stlBills = baseMapper.selectById(finStlBills.getId());
+		String exrateType = currencyUtils.standardCurrency(stlBills.getBranchId());
+		List<FinStlBillsItems> finStlBillsItemsList = new ArrayList<>();
 		if ("1".equals(finStlBills.getType())) {
-			FinStlBills reconciliation = baseMapper.selectById(finStlBills.getId());
-			List<FinStlBillsItems> finStlBillsItemsList = new ArrayList<>();
 			for (FinAccBillsVO item : finStlBills.getFinAccBillsVOList()) {
-				FinStlBillsItems stlBillsItems = this.assignmentProcess(item, reconciliation);
+				FinStlBillsItems stlBillsItems = this.assignmentProcess(item, stlBills);
 				stlBillsItems.setPType("DZ");
 				stlBillsItems.setCurrentStlAmountNet(item.getReconciliationCurrentAmount());
 				stlBillsItems.setCurrentStlAmount(item.getReconciliationCurrentAmount());
@@ -2268,12 +2270,12 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			if (!finStlBillsItemsList.isEmpty()) {
 				finStlBillsItemsService.saveBatch(finStlBillsItemsList);
 				List<FeeCenter> feeCenterListAll = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-						.select(FeeCenter::getBranchId,FeeCenter::getBranchName,FeeCenter::getStlPid,
-							FeeCenter::getQuantityCntrDescr,FeeCenter::getApproveTime, FeeCenter::getApplyTime,
-							FeeCenter::getSignforDate,FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
-							FeeCenter::getStlDate,FeeCenter::getCheckDate, FeeCenter::getAccDate,
-							FeeCenter::getId,FeeCenter::getAccBillId, FeeCenter::getVersion,
-							FeeCenter::getAmount, FeeCenter::getReconciliationAmount)
+					.select(FeeCenter::getBranchId, FeeCenter::getBranchName, FeeCenter::getStlPid,
+						FeeCenter::getQuantityCntrDescr, FeeCenter::getApproveTime, FeeCenter::getApplyTime,
+						FeeCenter::getSignforDate, FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
+						FeeCenter::getStlDate, FeeCenter::getCheckDate, FeeCenter::getAccDate,
+						FeeCenter::getId, FeeCenter::getAccBillId, FeeCenter::getVersion,
+						FeeCenter::getAmount, FeeCenter::getReconciliationAmount)
 					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 					.eq(FeeCenter::getAccStatus, 1)
 					.in(FeeCenter::getAccBillId, finAccBillsListAll.stream().map(FinAccBills::getId).collect(Collectors.toList()))
@@ -2282,7 +2284,6 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				if (feeCenterListAll.isEmpty()) {
 					throw new RuntimeException("未查到来源单据费用明细数据");
 				}
-				String exrateType = currencyUtils.standardCurrency(reconciliation.getBranchId());
 				List<FinAccBills> finAccBillsList = new ArrayList<>();
 				List<FeeCenter> feeCenterList = new ArrayList<>();
 				//对账明细状态修改  已对账
@@ -2343,13 +2344,13 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 							.collect(Collectors.toList());
 						BigDecimal currentStlAmount = item.getCurrentStlAmount();
 						for (FeeCenter feeCenter : feeCenters) {
-							feeCenter.setCheckBillId(reconciliation.getId());
-							feeCenter.setCheckBillNo(reconciliation.getBillNo());
-							feeCenter.setCheckDate(reconciliation.getBillDate());
+							feeCenter.setCheckBillId(stlBills.getId());
+							feeCenter.setCheckBillNo(stlBills.getBillNo());
+							feeCenter.setCheckDate(stlBills.getBillDate());
 							feeCenter.setCheckAmount(item.getAmount());
 							feeCenter.setCheckStatus(1);
-							feeCenter.setCheckById(reconciliation.getCreateUser());
-							feeCenter.setCheckByName(reconciliation.getCreateUserName());
+							feeCenter.setCheckById(stlBills.getCreateUser());
+							feeCenter.setCheckByName(stlBills.getCreateUserName());
 							int version = StringUtil.isBlank(feeCenter.getVersion()) ? 1 : Integer.parseInt(feeCenter.getVersion());
 							feeCenter.setVersion(String.valueOf(version + 1));
 							if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
@@ -2376,14 +2377,10 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				}
 				feeCenterService.updateBatchById(feeCenterList);
 				finAccBillsService.updateBatchById(finAccBillsList);
-				this.countFeeItems(reconciliation, finStlBillsItemsList, exrateType);
-				baseMapper.updateById(reconciliation);
 			}
 		} else if ("2".equals(finStlBills.getType())) {
-			FinStlBills stlBillsSQ = baseMapper.selectById(finStlBills.getId());
-			List<FinStlBillsItems> finStlBillsItemsList = new ArrayList<>();
 			for (FinAccBillsVO item : finStlBills.getFinAccBillsVOList()) {
-				FinStlBillsItems stlBillsItems = this.assignmentProcess(item, stlBillsSQ);
+				FinStlBillsItems stlBillsItems = this.assignmentProcess(item, stlBills);
 				stlBillsItems.setPType("FFSQ");
 				stlBillsItems.setCurrentStlAmountNet(item.getAppliedCurrentStlAmount());
 				stlBillsItems.setCurrentStlAmount(item.getAppliedCurrentStlAmount());
@@ -2394,12 +2391,12 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			if (!finStlBillsItemsList.isEmpty()) {
 				finStlBillsItemsService.saveBatch(finStlBillsItemsList);
 				List<FeeCenter> feeCenterListAll = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-						.select(FeeCenter::getBranchId,FeeCenter::getBranchName,FeeCenter::getStlPid,
-							FeeCenter::getQuantityCntrDescr,FeeCenter::getApproveTime, FeeCenter::getApplyTime,
-							FeeCenter::getSignforDate,FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
-							FeeCenter::getStlDate,FeeCenter::getCheckDate, FeeCenter::getAccDate,
-							FeeCenter::getId,FeeCenter::getAccBillId, FeeCenter::getVersion, FeeCenter::getAmount,
-							FeeCenter::getUnsettledAmount, FeeCenter::getStlTtlAmount, FeeCenter::getAppliedAmount)
+					.select(FeeCenter::getBranchId, FeeCenter::getBranchName, FeeCenter::getStlPid,
+						FeeCenter::getQuantityCntrDescr, FeeCenter::getApproveTime, FeeCenter::getApplyTime,
+						FeeCenter::getSignforDate, FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
+						FeeCenter::getStlDate, FeeCenter::getCheckDate, FeeCenter::getAccDate,
+						FeeCenter::getId, FeeCenter::getAccBillId, FeeCenter::getVersion, FeeCenter::getAmount,
+						FeeCenter::getUnsettledAmount, FeeCenter::getStlTtlAmount, FeeCenter::getAppliedAmount)
 					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
 					.eq(FeeCenter::getAccStatus, 1)
 					.in(FeeCenter::getAccBillId, finAccBillsListAll.stream().map(FinAccBills::getId).collect(Collectors.toList()))
@@ -2409,7 +2406,6 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				if (feeCenterListAll.isEmpty()) {
 					throw new RuntimeException("未查到来源单据费用明细数据");
 				}
-				String exrateType = currencyUtils.standardCurrency(stlBillsSQ.getBranchId());
 				List<FinAccBills> finAccBillsList = new ArrayList<>();
 				List<FeeCenter> feeCenterList = new ArrayList<>();
 				for (FinStlBillsItems item : finStlBillsItemsList) {
@@ -2482,14 +2478,163 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				}
 				feeCenterService.saveOrUpdateBatch(feeCenterList);
 				finAccBillsService.saveOrUpdateBatch(finAccBillsList);
-				this.countFeeItems(stlBillsSQ, finStlBillsItemsList, exrateType);
-				baseMapper.updateById(stlBillsSQ);
 			}
 		} else if ("3".equals(finStlBills.getType())) {
-			//todo 结算中心待开发
+			for (FinAccBillsVO item : finStlBills.getFinAccBillsVOList()) {
+				FinStlBillsItems stlBillsItems = this.assignmentProcess(item, stlBills);
+				stlBillsItems.setPType("STL");
+				if ("D".equals(item.getAccountDc())) {
+					stlBillsItems.setCurrentStlAmountNet(item.getAppliedInvoiceCurrentStlAmount());
+					stlBillsItems.setCurrentStlAmount(item.getAppliedInvoiceCurrentStlAmount());
+					stlBillsItems.setCurrentStlAmountLoc(item.getAppliedInvoiceCurrentStlAmount().multiply(item.getExrate()).setScale(2, RoundingMode.HALF_UP));
+				} else {
+					stlBillsItems.setCurrentStlAmountNet(item.getAppliedCurrentStlAmount());
+					stlBillsItems.setCurrentStlAmount(item.getAppliedCurrentStlAmount());
+					stlBillsItems.setCurrentStlAmountLoc(item.getAppliedCurrentStlAmount().multiply(item.getExrate()).setScale(2, RoundingMode.HALF_UP));
+				}
+				stlBillsItems.setItemType("STL");
+				stlBillsItems.setStlTtlAmount(stlBillsItems.getStlTtlAmount().add(stlBillsItems.getCurrentStlAmount().add(stlBillsItems.getCurrentStlDiscount())));
+				stlBillsItems.setUnsettledAmount(stlBillsItems.getAmount().subtract(stlBillsItems.getStlTtlAmount()));
+				finStlBillsItemsList.add(stlBillsItems);
+			}
+			if (!finStlBillsItemsList.isEmpty()) {
+				finStlBillsItemsService.saveBatch(finStlBillsItemsList);
+				List<FeeCenter> feeCenterListAll = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.select(FeeCenter::getBranchId, FeeCenter::getBranchName, FeeCenter::getStlPid,
+						FeeCenter::getQuantityCntrDescr, FeeCenter::getApproveTime, FeeCenter::getApplyTime,
+						FeeCenter::getSignforDate, FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
+						FeeCenter::getStlDate, FeeCenter::getCheckDate, FeeCenter::getAccDate,
+						FeeCenter::getId, FeeCenter::getAccBillId, FeeCenter::getVersion, FeeCenter::getAmount,
+						FeeCenter::getUnsettledAmount, FeeCenter::getStlTtlAmount, FeeCenter::getAppliedAmount)
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getAccStatus, 1)
+					.in(FeeCenter::getAccBillId, finAccBillsListAll.stream().map(FinAccBills::getId).collect(Collectors.toList()))
+					.apply("IF( amount < 0, amount < stl_ttl_amount, amount > stl_ttl_amount )")
+					.eq(FeeCenter::getIsDeleted, 0));
+				if (feeCenterListAll.isEmpty()) {
+					throw new RuntimeException("未查到来源单据费用明细数据");
+				}
+				List<FinAccBills> finAccBillsList = new ArrayList<>();
+				List<FeeCenter> feeCenterList = new ArrayList<>();
+				for (FinStlBillsItems item : finStlBillsItemsList) {
+					FinAccBills finAccBills = finAccBillsListAll.stream().filter(e -> e.getId().equals(item.getAccBillId()))
+						.findFirst().orElse(null);
+					if (finAccBills == null) {
+						throw new RuntimeException("未找到账单明细,操作失败");
+					}
+					boolean status = Boolean.FALSE;
+					//计算字段null值处理
+					if ("D".equals(item.getDc())) {
+						if (exrateType.equals(item.getCurCode())) {
+							finAccBills.setStlAmountDr(finAccBills.getStlAmountDr().add(item.getCurrentStlAmount()));
+							finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().add(item.getCurrentStlAmount()));
+						} else {
+							finAccBills.setStlAmountDrUsd(finAccBills.getStlAmountDrUsd().add(item.getCurrentStlAmount()));
+							BigDecimal cny = item.getCurrentStlAmount().multiply(item.getCurrentStlExrate());
+							finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().add(cny));
+						}
+						if (finAccBills.getAmountDr().abs().compareTo(finAccBills.getStlAmountDr().abs()) == 0 &&
+							finAccBills.getAmountDrUsd().abs().compareTo(finAccBills.getStlAmountDrUsd().abs()) == 0) {
+							status = true;
+						}
+						if (finAccBills.getStlAmountDr().abs().compareTo(finAccBills.getAmountDr().abs()) > 0 ||
+							finAccBills.getStlAmountDrUsd().abs().compareTo(finAccBills.getAmountDrUsd().abs()) > 0
+						) {
+							throw new RuntimeException("结算金额大于账单金额,操作失败");
+						}
+					} else if ("C".equals(item.getDc())) {
+						if (exrateType.equals(item.getCurCode())) {
+							finAccBills.setStlAmountCr(finAccBills.getStlAmountCr().add(item.getCurrentStlAmount()));
+							finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().add(item.getCurrentStlAmount()));
+						} else {
+							finAccBills.setStlAmountCrUsd(finAccBills.getStlAmountCrUsd().add(item.getCurrentStlAmount()));
+							BigDecimal cny = item.getCurrentStlAmount().multiply(item.getCurrentStlExrate());
+							finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().add(cny));
+						}
+						if (finAccBills.getAmountCr().abs().compareTo(finAccBills.getStlAmountCr().abs()) == 0 &&
+							finAccBills.getAmountCrUsd().abs().compareTo(finAccBills.getStlAmountCrUsd().abs()) == 0) {
+							status = true;
+						}
+						if (finAccBills.getStlAmountCr().abs().compareTo(finAccBills.getAmountCr().abs()) > 0 ||
+							finAccBills.getStlAmountCrUsd().abs().compareTo(finAccBills.getAmountCrUsd().abs()) > 0
+						) {
+							throw new RuntimeException("结算金额大于账单金额,操作失败");
+						}
+					}
+					if (status) {
+						finAccBills.setIsCleared(9);
+					} else {
+						finAccBills.setIsCleared(3);
+					}
+					finAccBills.setStlBillId(stlBills.getId());
+					finAccBills.setStlBillNo(stlBills.getBillNo());
+					finAccBills.setStlDate(new Date());
+					finAccBills.setUpdateUser(AuthUtil.getUserId());
+					finAccBills.setUpdateTime(new Date());
+					finAccBills.setUpdateUserName(AuthUtil.getUserName());
+					finAccBillsList.add(finAccBills);
+					List<FeeCenter> feeCenters = feeCenterListAll.stream().filter(e -> e.getAccBillId().equals(finAccBills.getId()))
+						.collect(Collectors.toList());
+					BigDecimal currentStlAmount = item.getCurrentStlAmount();
+					BigDecimal stlTtlAmount = feeCenters.stream().map(FeeCenter::getStlTtlAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+					if (item.getCurrentStlAmount().compareTo(new BigDecimal("0.00")) == 0 ||
+						item.getCurrentStlAmount().abs().compareTo(item.getAmount().abs().subtract(stlTtlAmount).abs()) > 0) {
+						throw new RuntimeException("本次结算金额不能为零或大于未结算金额");
+					}
+					for (FeeCenter e : feeCenters) {
+						int version = StringUtil.isBlank(e.getVersion()) ? 1 : Integer.parseInt(e.getVersion());
+						e.setVersion(String.valueOf(version + 1));
+						e.setTaxInvoiceNumber(item.getTaxInvoiceNumber());
+						e.setTaxInvoiceDate(item.getTaxInvoiceDate());
+						e.setDeductionTime(item.getDeductionTime());
+						if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
+							break;
+						} else {
+							//计算字段null值处理
+							e.setAmount(ObjectUtils.isNotNull(e.getAmount()) ? e.getAmount() : new BigDecimal("0.00"));
+							e.setUnsettledAmount(ObjectUtils.isNotNull(e.getUnsettledAmount()) ? e.getUnsettledAmount() : new BigDecimal("0.00"));
+							e.setStlTtlAmount(ObjectUtils.isNotNull(e.getStlTtlAmount()) ? e.getStlTtlAmount() : new BigDecimal("0.00"));
+
+							e.setStlBillId(stlBills.getId());
+							e.setStlBillNo(stlBills.getBillNo());
+							e.setStlDate(stlBills.getBillDate());
+							e.setStlOrgAmount(item.getCurrentStlAmount().multiply(item.getExrate()));
+							e.setStlCurCode(item.getCurrentStlCurCode());
+							e.setStlExrate(item.getExrate());
+							e.setStlExrateLoc(item.getCurrentStlExrate());
+							e.setStlAmount(item.getCurrentStlAmount());
+							e.setStlAmountLoc(item.getCurrentStlAmountLoc());
+							e.setStlStatus(1);
+							e.setStlById(stlBills.getCreateUser());
+							e.setStlByName(stlBills.getCreateUserName());
+							if (e.getAmount().abs().subtract(e.getStlTtlAmount().abs()).compareTo(currentStlAmount.abs()) > 0) {
+								e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()).subtract(currentStlAmount));
+								e.setStlTtlAmount(e.getAmount().subtract(e.getUnsettledAmount()));
+								currentStlAmount = new BigDecimal("0.00");
+							} else if (e.getAmount().abs().subtract(e.getStlTtlAmount().abs()).compareTo(currentStlAmount.abs()) == 0) {
+								e.setUnsettledAmount(new BigDecimal("0.00"));
+								e.setStlTtlAmount(e.getAmount().subtract(e.getUnsettledAmount()));
+								currentStlAmount = new BigDecimal("0.00");
+							} else {
+								e.setUnsettledAmount(new BigDecimal("0.00"));
+								currentStlAmount = currentStlAmount.subtract((e.getAmount().subtract(e.getStlTtlAmount())));
+								e.setStlTtlAmount(e.getAmount().subtract(e.getUnsettledAmount()));
+							}
+							feeCenterList.add(e);
+						}
+					}
+					if (currentStlAmount.compareTo(new BigDecimal("0.00")) != 0) {
+						throw new RuntimeException("结算金额计算错误,操作失败");
+					}
+				}
+				feeCenterService.saveOrUpdateBatch(feeCenterList);
+				finAccBillsService.saveOrUpdateBatch(finAccBillsList);
+			}
 		} else {
 			throw new RuntimeException("类型错误");
 		}
+		this.countFeeItems(stlBills, finStlBillsItemsList, exrateType);
+		baseMapper.updateById(stlBills);
 		return R.data(finStlBills);
 	}
 
@@ -2698,6 +2843,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				throw new RuntimeException("已确认,请先撤销后再删除");
 			}
 			String exrateType = currencyUtils.standardCurrency(stlBills.getBranchId());
+			List<BCurExrate> curExrateList = currencyUtils.obtainRate(new Date(), "2", stlBills.getBranchId());
 			List<FinStlBillsItems> finStlBillsItemsList = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
 				.in(FinStlBillsItems::getId, idsList)
 				.eq(FinStlBillsItems::getPid, stlBills.getId())
@@ -2721,6 +2867,8 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				lambdaQueryWrapper.apply("reconciliation_amount != 0");
 			} else if ("2".equals(finStlBills.getType())) {
 				lambdaQueryWrapper.apply("applied_amount != 0");
+			} else if ("3".equals(finStlBills.getType())) {
+				lambdaQueryWrapper.apply("stl_ttl_amount != 0");
 			} else {
 				lambdaQueryWrapper.apply("applied_amount != 0");
 			}
@@ -2857,17 +3005,126 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 					}
 				}
 			} else if ("3".equals(finStlBills.getType())) {
-				//todo 结算中心待开发
+				for (FinStlBillsItems item : finStlBillsItemsList) {
+					FinAccBills finAccBills = finAccBillsListAll.stream().filter(e -> e.getId().equals(item.getAccBillId()))
+						.findFirst().orElse(null);
+					if (finAccBills == null) {
+						throw new RuntimeException("未找到账单明细,操作失败");
+					}
+					boolean status = Boolean.FALSE;
+					//计算字段null值处理
+					if ("D".equals(item.getDc())) {
+						if (exrateType.equals(item.getCurCode())) {
+							finAccBills.setStlAmountDr(finAccBills.getStlAmountDr().subtract(item.getCurrentStlAmount()));
+							finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().subtract(item.getCurrentStlAmount()));
+						} else {
+							finAccBills.setStlAmountDrUsd(finAccBills.getStlAmountDrUsd().subtract(item.getCurrentStlAmount()));
+							BigDecimal cny = currencyUtils.converter(item.getDc(), curExrateList, item.getCurrentStlAmount(), item.getCurCode(), "2");
+							finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().subtract(cny));
+						}
+						if (finAccBills.getAmountDr().compareTo(new BigDecimal("0.00")) == 0 &&
+							finAccBills.getAmountDrUsd().compareTo(new BigDecimal("0.00")) == 0) {
+							finAccBills.setIsCleared(0);
+						} else if (finAccBills.getAmountDr().abs().compareTo(new BigDecimal("0.00")) < 0 ||
+							finAccBills.getAmountDrUsd().abs().compareTo(new BigDecimal("0.00")) < 0) {
+							throw new RuntimeException("撤销金额大于账单金额,操作失败");
+						} else {
+							if (finAccBills.getAmountDr().abs().compareTo(finAccBills.getStlAmountDr().abs()) == 0 &&
+								finAccBills.getAmountDrUsd().abs().compareTo(finAccBills.getStlAmountDrUsd().abs()) == 0) {
+								status = true;
+							}
+							if (status) {
+								finAccBills.setIsCleared(9);
+							} else {
+								finAccBills.setIsCleared(3);
+							}
+						}
+
+					} else if ("C".equals(item.getDc())) {
+						if (exrateType.equals(item.getCurCode())) {
+							finAccBills.setStlAmountCr(finAccBills.getStlAmountCr().subtract(item.getCurrentStlAmount()));
+							finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().subtract(item.getCurrentStlAmount()));
+						} else {
+							finAccBills.setStlAmountCrUsd(finAccBills.getStlAmountCrUsd().subtract(item.getCurrentStlAmount()));
+							BigDecimal cny = currencyUtils.converter(item.getDc(), curExrateList, item.getCurrentStlAmount(), item.getCurCode(), "2");
+							finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().subtract(cny));
+						}
+						if (finAccBills.getAmountCr().compareTo(new BigDecimal("0.00")) == 0 &&
+							finAccBills.getAmountCrUsd().compareTo(new BigDecimal("0.00")) == 0) {
+							finAccBills.setIsCleared(0);
+						} else if (finAccBills.getAmountCr().abs().compareTo(new BigDecimal("0.00")) < 0 ||
+							finAccBills.getAmountCrUsd().abs().compareTo(new BigDecimal("0.00")) < 0) {
+							throw new RuntimeException("撤销金额大于账单金额,操作失败");
+						} else {
+							if (finAccBills.getAmountCr().abs().compareTo(finAccBills.getStlAmountCr()) == 0 &&
+								finAccBills.getAmountCrUsd().abs().compareTo(finAccBills.getStlAmountCrUsd()) == 0) {
+								status = true;
+							}
+							if (status) {
+								finAccBills.setIsCleared(9);
+							} else {
+								finAccBills.setIsCleared(3);
+							}
+						}
+					}
+					finAccBills.setStlBillId(0L);
+					finAccBills.setStlBillNo("");
+					finAccBills.setStlDate(null);
+					finAccBills.setUpdateUser(AuthUtil.getUserId());
+					finAccBills.setUpdateTime(new Date());
+					finAccBills.setUpdateUserName(AuthUtil.getUserName());
+					finAccBillsList.add(finAccBills);
+					List<FeeCenter> feeCenters = feeCenterListAll.stream().filter(e -> e.getAccBillId().equals(finAccBills.getId()))
+						.collect(Collectors.toList());
+					BigDecimal currentStlAmount = item.getCurrentStlAmount();
+					for (FeeCenter e : feeCenters) {
+						int version = StringUtil.isBlank(e.getVersion()) ? 1 : Integer.parseInt(e.getVersion());
+						e.setVersion(String.valueOf(version + 1));
+						if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
+							break;
+						} else {
+							//计算字段null值处理
+							e.setAmount(ObjectUtils.isNotNull(e.getAmount()) ? e.getAmount() : new BigDecimal("0.00"));
+							e.setUnsettledAmount(ObjectUtils.isNotNull(e.getUnsettledAmount()) ? e.getUnsettledAmount() : new BigDecimal("0.00"));
+							e.setStlTtlAmount(ObjectUtils.isNotNull(e.getStlTtlAmount()) ? e.getStlTtlAmount() : new BigDecimal("0.00"));
+							e.setStlBillId(0L);
+							e.setStlBillNo("");
+							e.setStlDate(null);
+							e.setStlOrgAmount(new BigDecimal("0.00"));
+							e.setStlCurCode("");
+							e.setStlExrate(new BigDecimal("0.00"));
+							e.setStlExrateLoc(new BigDecimal("0.00"));
+							e.setStlAmount(new BigDecimal("0.00"));
+							e.setStlAmountLoc(new BigDecimal("0.00"));
+							e.setStlStatus(0);
+							e.setStlById(0L);
+							e.setStlByName("");
+							if (e.getStlTtlAmount().abs().compareTo(currentStlAmount.abs()) > 0) {
+								e.setStlTtlAmount(e.getStlTtlAmount().subtract(currentStlAmount));
+								e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()));
+								currentStlAmount = new BigDecimal("0.00");
+							} else if (e.getStlTtlAmount().abs().compareTo(currentStlAmount.abs()) == 0) {
+								e.setStlTtlAmount(new BigDecimal("0.00"));
+								e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()));
+								currentStlAmount = new BigDecimal("0.00");
+							} else {
+								e.setStlTtlAmount(new BigDecimal("0.00"));
+								e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()));
+								currentStlAmount = currentStlAmount.subtract(e.getAmount());
+							}
+							feeCenterList.add(e);
+						}
+					}
+					if (currentStlAmount.compareTo(new BigDecimal("0.00")) != 0) {
+						throw new RuntimeException("撤销金额计算错误,操作失败");
+					}
+				}
 			}
 			feeCenterService.saveOrUpdateBatch(feeCenterList);
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
 			finStlBillsItemsService.removeByIds(idsList);
 			this.revokeFeeItems(stlBills, finStlBillsItemsList, exrateType);
 			baseMapper.updateById(stlBills);
-		} else if ("4".equals(finStlBills.getType())) {
-			//todo 发票申请待开发
-		} else if ("5".equals(finStlBills.getType())) {
-			//todo 5销项发票待开发
 		} else {
 			throw new RuntimeException("类型错误");
 		}
@@ -3099,4 +3356,445 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		return R.data(detail);
 	}
 
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R generateFinStlBillsV1(String billId, Date date) {
+		if (ObjectUtils.isNull(billId) || ObjectUtils.isNull(date)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		List<Long> idList = Func.toLongList(billId);
+		List<FinStlBillsItems> finStlBillsItemsList = new ArrayList<>();
+		List<FinStlBills> finStlBillsList = baseMapper.selectList(new LambdaQueryWrapper<FinStlBills>()
+			.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
+			.eq(FinStlBills::getIsDeleted, 0)
+			.eq(FinStlBills::getStatus, "3")
+			.in(FinStlBills::getId, idList));
+		if (finStlBillsList.isEmpty()) {
+			throw new RuntimeException("未查到付费申请");
+		}
+		FinStlBills finStlBills = new FinStlBills();
+		BeanUtil.copyProperties(finStlBillsList.get(0), finStlBills);
+		finStlBills.setId(null);
+		finStlBills.setStatus(0);
+		finStlBills.setBillStatus("0");
+		finStlBills.setBusinessType("STL");
+		finStlBills.setBillDate(date);
+		finStlBills.setDc("C");
+		finStlBills.setMblno(finStlBillsList.stream().map(FinStlBills::getMblno).filter(Objects::nonNull).distinct()
+			.collect(Collectors.joining(",")));
+		finStlBills.setHblno(finStlBillsList.stream().map(FinStlBills::getHblno).filter(Objects::nonNull).distinct()
+			.collect(Collectors.joining(",")));
+		finStlBills.setBusinessNo(finStlBillsList.stream().map(FinStlBills::getBusinessNo).filter(Objects::nonNull).distinct()
+			.collect(Collectors.joining(",")));
+		finStlBills.setRequestNo(finStlBillsList.stream().map(FinStlBills::getBillNo).filter(Objects::nonNull).distinct()
+			.collect(Collectors.joining(",")));
+		BusinessType businessType = bBusinessTypeService.getOne(new LambdaQueryWrapper<BusinessType>()
+			.eq(BusinessType::getTenantId, AuthUtil.getTenantId())
+			.eq(BusinessType::getIsDeleted, 0)
+			.eq(BusinessType::getStatus, 0)
+			.eq(BusinessType::getCode, "STL"));
+		if (businessType == null) {
+			throw new RuntimeException("未找到可用业务类型");
+		}
+		BusinessBillNo businessBillNo = new BusinessBillNo();
+		businessBillNo.setBusinessTypeId(businessType.getId());
+		businessBillNo.setCode("STL");
+		businessBillNo.setBranchId(finStlBills.getBranchId());
+		R<String> clientBillNo = businessBillNoService.getBillNoLos(businessBillNo);
+		if (!clientBillNo.isSuccess()) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			return R.fail(500, "生成订单编号失败");
+		}
+		finStlBills.setBillNo((String) clientBillNo.getData());
+		finStlBills.setCreateTime(new Date());
+		finStlBills.setCreateUser(AuthUtil.getUserId());
+		finStlBills.setCreateUserName(AuthUtil.getUserName());
+		finStlBills.setUpdateUser(null);
+		finStlBills.setUpdateTime(null);
+		finStlBills.setUpdateUserName(null);
+		baseMapper.insert(finStlBills);
+		List<FinStlBillsItems> finInvoicesItems = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
+			.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
+			.eq(FinStlBillsItems::getIsDeleted, 0)
+			.eq(FinStlBillsItems::getSrcIdStatus, "0")
+			.in(FinStlBillsItems::getPid, idList));
+		if (!finInvoicesItems.isEmpty()) {
+			for (FinStlBillsItems item : finInvoicesItems) {
+				FinStlBillsItems finStlBillsItems = new FinStlBillsItems();
+				BeanUtil.copyProperties(item, finStlBillsItems);
+				finStlBillsItems.setId(null);
+				finStlBillsItems.setSrcIdInvoices(item.getId());
+				finStlBillsItems.setSrcIdStatus("1");
+				finStlBillsItems.setPid(finStlBills.getId());
+				finStlBillsItems.setUpdateUser(null);
+				finStlBillsItems.setUpdateTime(null);
+				finStlBillsItems.setUpdateUserName(null);
+				finStlBillsItemsList.add(finStlBillsItems);
+				item.setUpdateUser(AuthUtil.getUserId());
+				item.setUpdateTime(new Date());
+				item.setUpdateUserName(AuthUtil.getUserName());
+				item.setSrcIdInvoices(1L);
+			}
+			finStlBillsItemsService.saveBatch(finStlBillsItemsList);
+			finStlBillsItemsService.updateBatchById(finInvoicesItems);
+		}
+		for (FinStlBills item : finStlBillsList) {
+			item.setBillStatus("1");
+			item.setUpdateUser(AuthUtil.getUserId());
+			item.setUpdateTime(new Date());
+			item.setUpdateUserName(AuthUtil.getUserName());
+		}
+		this.updateBatchById(finStlBillsList);
+		if (!finStlBillsItemsList.isEmpty()) {
+			List<FinAccBills> finAccBillsListAll = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
+				.select(FinAccBills::getId, FinAccBills::getBranchId, FinAccBills::getBranchName,
+					FinAccBills::getApprovedDate, FinAccBills::getVoucherDate, FinAccBills::getInvoiceDate, FinAccBills::getStlDate,
+					FinAccBills::getEta, FinAccBills::getEtd, FinAccBills::getAccountDate, FinAccBills::getBillDate,
+					FinAccBills::getReconciliationAmount, FinAccBills::getAccountDc,
+					FinAccBills::getAmountDr, FinAccBills::getAmountCr, FinAccBills::getReconciliationAmountUsd,
+					FinAccBills::getAmountDrUsd, FinAccBills::getAmountCrUsd, FinAccBills::getAppliedAmount,
+					FinAccBills::getAppliedAmountStl, FinAccBills::getAmountDrLoc, FinAccBills::getStlAmountDrLoc,
+					FinAccBills::getAmountCrLoc, FinAccBills::getStlAmountCrLoc, FinAccBills::getAppliedAmountUsd,
+					FinAccBills::getStlAmountDr, FinAccBills::getStlAmountDrUsd, FinAccBills::getStlAmountCr,
+					FinAccBills::getStlAmountCrUsd, FinAccBills::getAppliedAmountStlUsd)
+				.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
+				.eq(FinAccBills::getIsDeleted, 0)
+				.in(FinAccBills::getId, finStlBillsItemsList.stream().map(FinStlBillsItems::getAccBillId).collect(Collectors.toList())));
+			if (finAccBillsListAll.isEmpty()) {
+				throw new RuntimeException("未查到账单数据");
+			}
+			String exrateType = currencyUtils.standardCurrency(finStlBills.getBranchId());
+			List<FeeCenter> feeCenterListAll = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+				.select(FeeCenter::getBranchId, FeeCenter::getBranchName, FeeCenter::getStlPid,
+					FeeCenter::getQuantityCntrDescr, FeeCenter::getApproveTime, FeeCenter::getApplyTime,
+					FeeCenter::getSignforDate, FeeCenter::getInvoiceDate, FeeCenter::getVoucherDate,
+					FeeCenter::getStlDate, FeeCenter::getCheckDate, FeeCenter::getAccDate,
+					FeeCenter::getId, FeeCenter::getAccBillId, FeeCenter::getVersion, FeeCenter::getAmount,
+					FeeCenter::getUnsettledAmount, FeeCenter::getStlTtlAmount, FeeCenter::getAppliedAmount)
+				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getAccStatus, 1)
+				.in(FeeCenter::getAccBillId, finAccBillsListAll.stream().map(FinAccBills::getId).collect(Collectors.toList()))
+				.apply("IF( amount < 0, amount < stl_ttl_amount, amount > stl_ttl_amount )")
+				.eq(FeeCenter::getIsDeleted, 0));
+			if (feeCenterListAll.isEmpty()) {
+				throw new RuntimeException("未查到来源单据费用明细数据");
+			}
+			List<FinAccBills> finAccBillsList = new ArrayList<>();
+			List<FeeCenter> feeCenterList = new ArrayList<>();
+			for (FinStlBillsItems item : finStlBillsItemsList) {
+				FinAccBills finAccBills = finAccBillsListAll.stream().filter(e -> e.getId().equals(item.getAccBillId()))
+					.findFirst().orElse(null);
+				if (finAccBills == null) {
+					throw new RuntimeException("未找到账单明细,操作失败");
+				}
+				boolean status = Boolean.FALSE;
+				//计算字段null值处理
+				if ("D".equals(item.getDc())) {
+					if (exrateType.equals(item.getCurCode())) {
+						finAccBills.setStlAmountDr(finAccBills.getStlAmountDr().add(item.getCurrentStlAmount()));
+						finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().add(item.getCurrentStlAmount()));
+						finAccBills.setAppliedAmountStl(finAccBills.getAppliedAmountStl().add(item.getCurrentStlAmount()));
+					} else {
+						finAccBills.setStlAmountDrUsd(finAccBills.getStlAmountDrUsd().add(item.getCurrentStlAmount()));
+						BigDecimal cny = item.getCurrentStlAmount().multiply(item.getCurrentStlExrate());
+						finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().add(cny));
+						finAccBills.setAppliedAmountStlUsd(finAccBills.getAppliedAmountStl().add(item.getCurrentStlAmount()));
+					}
+					if (finAccBills.getAmountDr().abs().compareTo(finAccBills.getStlAmountDr().abs()) == 0 &&
+						finAccBills.getAmountDrUsd().abs().compareTo(finAccBills.getStlAmountDrUsd().abs()) == 0) {
+						status = true;
+					}
+					if (finAccBills.getStlAmountDr().abs().compareTo(finAccBills.getAmountDr().abs()) > 0 ||
+						finAccBills.getStlAmountDrUsd().abs().compareTo(finAccBills.getAmountDrUsd().abs()) > 0
+					) {
+						throw new RuntimeException("结算金额大于账单金额,操作失败");
+					}
+				} else if ("C".equals(item.getDc())) {
+					if (exrateType.equals(item.getCurCode())) {
+						finAccBills.setStlAmountCr(finAccBills.getStlAmountCr().add(item.getCurrentStlAmount()));
+						finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().add(item.getCurrentStlAmount()));
+						finAccBills.setAppliedAmountStl(finAccBills.getAppliedAmountStl().add(item.getCurrentStlAmount()));
+					} else {
+						finAccBills.setStlAmountCrUsd(finAccBills.getStlAmountCrUsd().add(item.getCurrentStlAmount()));
+						BigDecimal cny = item.getCurrentStlAmount().multiply(item.getCurrentStlExrate());
+						finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().add(cny));
+						finAccBills.setAppliedAmountStlUsd(finAccBills.getAppliedAmountStlUsd().add(item.getCurrentStlAmount()));
+					}
+					if (finAccBills.getAmountCr().abs().compareTo(finAccBills.getStlAmountCr().abs()) == 0 &&
+						finAccBills.getAmountCrUsd().abs().compareTo(finAccBills.getStlAmountCrUsd().abs()) == 0) {
+						status = true;
+					}
+					if (finAccBills.getStlAmountCr().abs().compareTo(finAccBills.getAmountCr().abs()) > 0 ||
+						finAccBills.getStlAmountCrUsd().abs().compareTo(finAccBills.getAmountCrUsd().abs()) > 0
+					) {
+						throw new RuntimeException("结算金额大于账单金额,操作失败");
+					}
+				}
+				if (status) {
+					finAccBills.setIsCleared(9);
+				} else {
+					finAccBills.setIsCleared(3);
+				}
+				finAccBills.setStlBillId(finStlBills.getId());
+				finAccBills.setStlBillNo(finStlBills.getBillNo());
+				finAccBills.setStlDate(new Date());
+				finAccBills.setUpdateUser(AuthUtil.getUserId());
+				finAccBills.setUpdateTime(new Date());
+				finAccBills.setUpdateUserName(AuthUtil.getUserName());
+				finAccBillsList.add(finAccBills);
+				List<FeeCenter> feeCenters = feeCenterListAll.stream().filter(e -> e.getAccBillId().equals(finAccBills.getId()))
+					.collect(Collectors.toList());
+				BigDecimal currentStlAmount = item.getCurrentStlAmount();
+				BigDecimal stlTtlAmount = feeCenters.stream().map(FeeCenter::getStlTtlAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+				if (item.getCurrentStlAmount().compareTo(new BigDecimal("0.00")) == 0 ||
+					item.getCurrentStlAmount().abs().compareTo(item.getAmount().abs().subtract(stlTtlAmount).abs()) > 0) {
+					throw new RuntimeException("本次结算金额不能为零或大于未结算金额");
+				}
+				for (FeeCenter e : feeCenters) {
+					int version = StringUtil.isBlank(e.getVersion()) ? 1 : Integer.parseInt(e.getVersion());
+					e.setVersion(String.valueOf(version + 1));
+					e.setTaxInvoiceNumber(item.getTaxInvoiceNumber());
+					e.setTaxInvoiceDate(item.getTaxInvoiceDate());
+					e.setDeductionTime(item.getDeductionTime());
+					if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
+						break;
+					} else {
+						//计算字段null值处理
+						e.setAmount(ObjectUtils.isNotNull(e.getAmount()) ? e.getAmount() : new BigDecimal("0.00"));
+						e.setUnsettledAmount(ObjectUtils.isNotNull(e.getUnsettledAmount()) ? e.getUnsettledAmount() : new BigDecimal("0.00"));
+						e.setStlTtlAmount(ObjectUtils.isNotNull(e.getStlTtlAmount()) ? e.getStlTtlAmount() : new BigDecimal("0.00"));
+						e.setStlBillId(finStlBills.getId());
+						e.setStlBillNo(finStlBills.getBillNo());
+						e.setStlDate(finStlBills.getBillDate());
+						e.setStlOrgAmount(item.getCurrentStlAmount().multiply(item.getExrate()));
+						e.setStlCurCode(item.getCurrentStlCurCode());
+						e.setStlExrate(item.getExrate());
+						e.setStlExrateLoc(item.getCurrentStlExrate());
+						e.setStlAmount(item.getCurrentStlAmount());
+						e.setStlAmountLoc(item.getCurrentStlAmountLoc());
+						e.setStlStatus(1);
+						e.setStlById(finStlBills.getCreateUser());
+						e.setStlByName(finStlBills.getCreateUserName());
+						if (e.getAmount().abs().subtract(e.getStlTtlAmount().abs()).compareTo(currentStlAmount.abs()) > 0) {
+							e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()).subtract(currentStlAmount));
+							e.setStlTtlAmount(e.getAmount().subtract(e.getUnsettledAmount()));
+							e.setAppliedAmountStl(e.getAppliedAmountStl().add(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else if (e.getAmount().abs().subtract(e.getStlTtlAmount().abs()).compareTo(currentStlAmount.abs()) == 0) {
+							e.setUnsettledAmount(new BigDecimal("0.00"));
+							e.setStlTtlAmount(e.getAmount().subtract(e.getUnsettledAmount()));
+							e.setAppliedAmountStl(e.getAppliedAmountStl().add(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else {
+							e.setUnsettledAmount(new BigDecimal("0.00"));
+							e.setAppliedAmountStl(e.getAppliedAmountStl().add((e.getAmount().subtract(e.getStlTtlAmount()))));
+							currentStlAmount = currentStlAmount.subtract((e.getAmount().subtract(e.getStlTtlAmount())));
+							e.setStlTtlAmount(e.getAmount().subtract(e.getUnsettledAmount()));
+							e.setAppliedAmountStl(e.getAmount().subtract(e.getUnsettledAmount()).subtract(e.getAppliedAmountStl()));
+						}
+						feeCenterList.add(e);
+					}
+				}
+				if (currentStlAmount.compareTo(new BigDecimal("0.00")) != 0) {
+					throw new RuntimeException("结算金额计算错误,操作失败");
+				}
+			}
+			feeCenterService.saveOrUpdateBatch(feeCenterList);
+			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
+			this.countFeeItems(finStlBills, finStlBillsItemsList, exrateType);
+			baseMapper.updateById(finStlBills);
+		}
+		return R.data(finStlBills);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public R revokeGenerateFinStlBillsV1(String billId) {
+		if (ObjectUtils.isNull(billId)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		FinStlBills finStlBills = baseMapper.selectById(billId);
+		if (3 == finStlBills.getStatus()) {
+			throw new RuntimeException("已结算,撤销失败");
+		}
+		finStlBills.setRequestNo("");
+		List<FinStlBillsItems> finStlBillsItemsList = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
+			.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
+			.eq(FinStlBillsItems::getIsDeleted, 0)
+			.eq(FinStlBillsItems::getPid, billId));
+		finStlBillsItemsService.removeByIds(finStlBillsItemsList.stream().map(FinStlBillsItems::getId).collect(Collectors.toList()));
+		List<Long> ids = finStlBillsItemsList.stream().map(FinStlBillsItems::getSrcIdInvoices).collect(Collectors.toList());
+		if (!ids.isEmpty()) {
+			List<FinStlBillsItems> finStlBillsItems = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
+				.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
+				.eq(FinStlBillsItems::getIsDeleted, 0)
+				.in(FinStlBillsItems::getId, ids));
+			if (!finStlBillsItems.isEmpty()) {
+				for (FinStlBillsItems item : finStlBillsItems) {
+					item.setSrcIdStatus("0");
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setUpdateUserName(AuthUtil.getUserName());
+					item.setUpdateTime(new Date());
+				}
+				List<FinStlBills> finStlBillsList = baseMapper.selectList(new LambdaQueryWrapper<FinStlBills>()
+					.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
+					.eq(FinStlBills::getIsDeleted, 0)
+					.in(FinStlBills::getId, finStlBillsItems.stream().map(FinStlBillsItems::getPid).distinct().collect(Collectors.toList())));
+				for (FinStlBills item : finStlBillsList) {
+					item.setBillStatus("0");
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setUpdateUserName(AuthUtil.getUserName());
+					item.setUpdateTime(new Date());
+				}
+				this.updateBatchById(finStlBillsList);
+				finStlBillsItemsService.updateBatchById(finStlBillsItems);
+			}
+		}
+		if (!finStlBillsItemsList.isEmpty()) {
+			String exrateType = currencyUtils.standardCurrency(finStlBills.getBranchId());
+			List<BCurExrate> curExrateList = currencyUtils.obtainRate(new Date(), "2", finStlBills.getBranchId());
+			List<FinAccBills> finAccBillsListAll = finAccBillsService.list(new LambdaQueryWrapper<FinAccBills>()
+				.eq(FinAccBills::getTenantId, AuthUtil.getTenantId())
+				.eq(FinAccBills::getIsDeleted, 0)
+				.in(FinAccBills::getId, finStlBillsItemsList.stream().map(FinStlBillsItems::getAccBillId).collect(Collectors.toList())));
+			if (finAccBillsListAll.isEmpty()) {
+				throw new RuntimeException("未查到账单数据");
+			}
+			LambdaQueryWrapper<FeeCenter> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+				.eq(FeeCenter::getAccStatus, 1)
+				.eq(FeeCenter::getIsDeleted, 0)
+				.apply("stl_ttl_amount != 0");
+			List<FeeCenter> feeCenterListAll = feeCenterService.list(lambdaQueryWrapper);
+			if (feeCenterListAll.isEmpty()) {
+				throw new RuntimeException("未查到来源单据费用明细数据");
+			}
+			List<FinAccBills> finAccBillsList = new ArrayList<>();
+			List<FeeCenter> feeCenterList = new ArrayList<>();
+			for (FinStlBillsItems item : finStlBillsItemsList) {
+				FinAccBills finAccBills = finAccBillsListAll.stream().filter(e -> e.getId().equals(item.getAccBillId()))
+					.findFirst().orElse(null);
+				if (finAccBills == null) {
+					throw new RuntimeException("未找到账单明细,操作失败");
+				}
+				boolean status = Boolean.FALSE;
+				//计算字段null值处理
+				if ("D".equals(item.getDc())) {
+					if (exrateType.equals(item.getCurCode())) {
+						finAccBills.setStlAmountDr(finAccBills.getStlAmountDr().subtract(item.getCurrentStlAmount()));
+						finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().subtract(item.getCurrentStlAmount()));
+					} else {
+						finAccBills.setStlAmountDrUsd(finAccBills.getStlAmountDrUsd().subtract(item.getCurrentStlAmount()));
+						BigDecimal cny = currencyUtils.converter(item.getDc(), curExrateList, item.getCurrentStlAmount(), item.getCurCode(), "2");
+						finAccBills.setStlAmountDrLoc(finAccBills.getStlAmountDrLoc().subtract(cny));
+					}
+					if (finAccBills.getAmountDr().compareTo(new BigDecimal("0.00")) == 0 &&
+						finAccBills.getAmountDrUsd().compareTo(new BigDecimal("0.00")) == 0) {
+						finAccBills.setIsCleared(0);
+					} else if (finAccBills.getAmountDr().abs().compareTo(new BigDecimal("0.00")) < 0 ||
+						finAccBills.getAmountDrUsd().abs().compareTo(new BigDecimal("0.00")) < 0) {
+						throw new RuntimeException("撤销金额大于账单金额,操作失败");
+					} else {
+						if (finAccBills.getAmountDr().abs().compareTo(finAccBills.getStlAmountDr().abs()) == 0 &&
+							finAccBills.getAmountDrUsd().abs().compareTo(finAccBills.getStlAmountDrUsd().abs()) == 0) {
+							status = true;
+						}
+						if (status) {
+							finAccBills.setIsCleared(9);
+						} else {
+							finAccBills.setIsCleared(3);
+						}
+					}
+				} else if ("C".equals(item.getDc())) {
+					if (exrateType.equals(item.getCurCode())) {
+						finAccBills.setStlAmountCr(finAccBills.getStlAmountCr().subtract(item.getCurrentStlAmount()));
+						finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().subtract(item.getCurrentStlAmount()));
+						finAccBills.setAppliedAmountStl(finAccBills.getAppliedAmountStl().subtract(item.getCurrentStlAmount()));
+					} else {
+						finAccBills.setStlAmountCrUsd(finAccBills.getStlAmountCrUsd().subtract(item.getCurrentStlAmount()));
+						BigDecimal cny = currencyUtils.converter(item.getDc(), curExrateList, item.getCurrentStlAmount(), item.getCurCode(), "2");
+						finAccBills.setStlAmountCrLoc(finAccBills.getStlAmountCrLoc().subtract(cny));
+						finAccBills.setAppliedAmountStlUsd(finAccBills.getAppliedAmountStlUsd().subtract(item.getCurrentStlAmount()));
+					}
+					if (finAccBills.getAmountCr().compareTo(new BigDecimal("0.00")) == 0 &&
+						finAccBills.getAmountCrUsd().compareTo(new BigDecimal("0.00")) == 0) {
+						finAccBills.setIsCleared(0);
+					} else if (finAccBills.getAmountCr().abs().compareTo(new BigDecimal("0.00")) < 0 ||
+						finAccBills.getAmountCrUsd().abs().compareTo(new BigDecimal("0.00")) < 0) {
+						throw new RuntimeException("撤销金额大于账单金额,操作失败");
+					} else {
+						if (finAccBills.getAmountCr().abs().compareTo(finAccBills.getStlAmountCr()) == 0 &&
+							finAccBills.getAmountCrUsd().abs().compareTo(finAccBills.getStlAmountCrUsd()) == 0) {
+							status = true;
+						}
+						if (status) {
+							finAccBills.setIsCleared(9);
+						} else {
+							finAccBills.setIsCleared(3);
+						}
+					}
+				}
+				finAccBills.setStlBillId(0L);
+				finAccBills.setStlBillNo("");
+				finAccBills.setStlDate(null);
+				finAccBills.setUpdateUser(AuthUtil.getUserId());
+				finAccBills.setUpdateTime(new Date());
+				finAccBills.setUpdateUserName(AuthUtil.getUserName());
+				finAccBillsList.add(finAccBills);
+				List<FeeCenter> feeCenters = feeCenterListAll.stream().filter(e -> e.getAccBillId().equals(finAccBills.getId()))
+					.collect(Collectors.toList());
+				BigDecimal currentStlAmount = item.getCurrentStlAmount();
+				for (FeeCenter e : feeCenters) {
+					int version = StringUtil.isBlank(e.getVersion()) ? 1 : Integer.parseInt(e.getVersion());
+					e.setVersion(String.valueOf(version + 1));
+					if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
+						break;
+					} else {
+						//计算字段null值处理
+						e.setAmount(ObjectUtils.isNotNull(e.getAmount()) ? e.getAmount() : new BigDecimal("0.00"));
+						e.setUnsettledAmount(ObjectUtils.isNotNull(e.getUnsettledAmount()) ? e.getUnsettledAmount() : new BigDecimal("0.00"));
+						e.setStlTtlAmount(ObjectUtils.isNotNull(e.getStlTtlAmount()) ? e.getStlTtlAmount() : new BigDecimal("0.00"));
+						e.setStlBillId(0L);
+						e.setStlBillNo("");
+						e.setStlDate(null);
+						e.setStlOrgAmount(new BigDecimal("0.00"));
+						e.setStlCurCode("");
+						e.setStlExrate(new BigDecimal("0.00"));
+						e.setStlExrateLoc(new BigDecimal("0.00"));
+						e.setStlAmount(new BigDecimal("0.00"));
+						e.setStlAmountLoc(new BigDecimal("0.00"));
+						e.setStlStatus(0);
+						e.setStlById(0L);
+						e.setStlByName("");
+						if (e.getStlTtlAmount().abs().compareTo(currentStlAmount.abs()) > 0) {
+							e.setStlTtlAmount(e.getStlTtlAmount().subtract(currentStlAmount));
+							e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()));
+							e.setAppliedAmountStl(e.getAppliedAmountStl().subtract(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else if (e.getStlTtlAmount().abs().compareTo(currentStlAmount.abs()) == 0) {
+							e.setStlTtlAmount(new BigDecimal("0.00"));
+							e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()));
+							e.setAppliedAmountStl(e.getAmount().subtract(e.getAppliedAmountStl()).subtract(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else {
+							e.setStlTtlAmount(new BigDecimal("0.00"));
+							e.setUnsettledAmount(e.getAmount().subtract(e.getStlTtlAmount()));
+							e.setAppliedAmountStl(new BigDecimal("0.00"));
+							currentStlAmount = currentStlAmount.subtract(e.getAmount());
+						}
+						feeCenterList.add(e);
+					}
+				}
+				if (currentStlAmount.compareTo(new BigDecimal("0.00")) != 0) {
+					throw new RuntimeException("撤销金额计算错误,操作失败");
+				}
+			}
+			feeCenterService.saveOrUpdateBatch(feeCenterList);
+			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
+			this.revokeFeeItems(finStlBills, finStlBillsItemsList, exrateType);
+			baseMapper.updateById(finStlBills);
+		}
+		return R.data(finStlBills);
+	}
+
 }

Some files were not shown because too many files changed in this diff