Przeglądaj źródła

2023年12月26日17:37:39

纪新园 2 lat temu
rodzic
commit
eaa373841c
13 zmienionych plików z 607 dodań i 110 usunięć
  1. 12 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/entity/FeeCenter.java
  2. 10 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/vo/FinAccBillsVO.java
  3. 6 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/invoices/entity/FinInvoices.java
  4. 51 0
      blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/stl/entity/FinStlBills.java
  5. 20 10
      blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/controller/BCorpsBankController.java
  6. 4 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.xml
  7. 11 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java
  8. 90 16
      blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java
  9. 107 9
      blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java
  10. 11 1
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/controller/FinStlBillsController.java
  11. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/IFinStlBillsService.java
  12. 269 74
      blade-service/blade-los/src/main/java/org/springblade/los/finance/stl/service/impl/FinStlBillsServiceImpl.java
  13. 8 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java

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

@@ -840,6 +840,18 @@ public class FeeCenter implements Serializable {
 	@TableField(exist = false)
 	private String billKey;
 
+	/**
+	 * 已申请金额
+	 */
+	@ApiModelProperty(value = "已申请金额")
+	private BigDecimal appliedAmount;
+
+	/**
+	 * 已对账金额
+	 */
+	@ApiModelProperty(value = "已对账金额")
+	private BigDecimal reconciliationAmount;
+
 
 
 }

+ 10 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/finance/fee/vo/FinAccBillsVO.java

@@ -248,4 +248,14 @@ public class FinAccBillsVO extends FinAccBills {
 	 */
 	private String accountPeriodType;
 
+	/**
+	 * 已申请金额
+	 */
+	private BigDecimal appliedAmount;
+
+	/**
+	 * 已对账金额
+	 */
+	private BigDecimal reconciliationAmount;
+
 }

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

@@ -503,6 +503,12 @@ public class FinInvoices implements Serializable {
 	@ApiModelProperty(value = "发表类型")
 	private String type;
 
+	/**
+	 * 差额
+	 */
+	@ApiModelProperty(value = "差额")
+	private BigDecimal amountSub;
+
 	//跳转对应页面的路由
 	@TableField(exist = false)
 	private String url;

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

@@ -399,6 +399,18 @@ public class FinStlBills implements Serializable {
 	 */
 	@ApiModelProperty(value = "合计本位币税后应付(CNY)")
 	private BigDecimal amountCrLocNet;
+
+	/**
+	 * 差额
+	 */
+	@ApiModelProperty(value = "差额")
+	private BigDecimal amountSub;
+
+	/**
+	 * 税后差额
+	 */
+	@ApiModelProperty(value = "税后差额")
+	private BigDecimal amountSubLoc;
 	/**
 	 * 版本
 	 */
@@ -432,6 +444,45 @@ public class FinStlBills implements Serializable {
 	 */
 	@ApiModelProperty(value = "结算单类型(D收C付)")
 	private String settlementType;
+	/**
+	 * 申请单号
+	 */
+	@ApiModelProperty(value = "申请单号")
+	private String requestNo;
+
+	/**
+	 * 银行id
+	 */
+	@ApiModelProperty(value = "银行id")
+	private Long bankId;
+
+	/**
+	 * 账户名称
+	 */
+	@ApiModelProperty(value = "账户名称")
+	private String bankAccountName;
+
+	/**
+	 * 账户银行
+	 */
+	@ApiModelProperty(value = "账户银行")
+	private String bankAccountBank;
+
+	/**
+	 * 银行账号
+	 */
+	@ApiModelProperty(value = "银行账号")
+	private String bankAccountNo;
+	/**
+	 * 收款情况
+	 */
+	@ApiModelProperty(value = "收款情况")
+	private String collectionSituation;
+	/**
+	 * 预收时间
+	 */
+	@ApiModelProperty(value = "预收时间")
+	private Date estimatedTime;
 
 	/**
 	 * 财务对账单和结算单明细

+ 20 - 10
blade-service/blade-los/src/main/java/org/springblade/los/basic/corps/controller/BCorpsBankController.java

@@ -16,23 +16,26 @@
  */
 package org.springblade.los.basic.corps.controller;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
-import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
 import lombok.AllArgsConstructor;
-import javax.validation.Valid;
-
+import org.springblade.core.boot.ctrl.BladeController;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.core.tool.utils.Func;
-import org.springframework.web.bind.annotation.*;
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.los.basic.corps.entity.BCorpsBank;
-import org.springblade.los.basic.corps.vo.BCorpsBankVO;
 import org.springblade.los.basic.corps.service.IBCorpsBankService;
-import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.los.basic.corps.vo.BCorpsBankVO;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
 
 /**
  * 客户银行 控制器
@@ -66,7 +69,14 @@ public class BCorpsBankController extends BladeController {
 	@ApiOperationSupport(order = 2)
 	@ApiOperation(value = "分页", notes = "传入bCorpsBank")
 	public R<IPage<BCorpsBank>> list(BCorpsBank bCorpsBank, Query query) {
-		IPage<BCorpsBank> pages = bCorpsBankService.page(Condition.getPage(query), Condition.getQueryWrapper(bCorpsBank));
+		LambdaQueryWrapper<BCorpsBank> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(BCorpsBank::getTenantId, AuthUtil.getTenantId())
+			.eq(BCorpsBank::getIsDeleted, 0)
+			.eq(BCorpsBank::getPid, bCorpsBank.getPid())
+			.eq(ObjectUtils.isNotNull(bCorpsBank.getAccountNo()), BCorpsBank::getAccountNo, bCorpsBank.getAccountNo())
+			.eq(ObjectUtils.isNotNull(bCorpsBank.getAccountBank()), BCorpsBank::getAccountBank, bCorpsBank.getAccountBank())
+			.eq(ObjectUtils.isNotNull(bCorpsBank.getAccountName()), BCorpsBank::getAccountName, bCorpsBank.getAccountName());
+		IPage<BCorpsBank> pages = bCorpsBankService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}
 
@@ -111,7 +121,7 @@ public class BCorpsBankController extends BladeController {
 		return R.status(bCorpsBankService.saveOrUpdate(bCorpsBank));
 	}
 
-	
+
 	/**
 	 * 删除 客户银行
 	 */
@@ -122,5 +132,5 @@ public class BCorpsBankController extends BladeController {
 		return R.status(bCorpsBankService.removeByIds(Func.toLongList(ids)));
 	}
 
-	
+
 }

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

@@ -309,6 +309,10 @@
         ( sum( fee.uninvoiced_amount ), sum( fee.uninvoiced_amount ), 0.00 ) AS uninvoicedAmount,
         IF
         ( sum( fee.unsettled_amount ), sum( fee.unsettled_amount ), 0.00 ) AS unsettledAmount,
+        IF
+        ( sum( fee.applied_amount ), sum( fee.applied_amount ), 0.00 ) AS appliedAmount,
+        IF
+        ( sum( fee.reconciliation_amount ), sum( fee.reconciliation_amount ), 0.00 ) AS reconciliationAmount,
         fee.is_signfor as isSignfor,
         fee.signfor_id as signforId,
         fee.signfor_name as signforName,

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

@@ -642,6 +642,12 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			.eq(Bills::getIsDeleted, 0)
 			.in(Bills::getId, ids));
 		for (Bills item : billsList) {
+			if (baseMapper.selectCount(new LambdaQueryWrapper<Bills>()
+				.eq(Bills::getTenantId, AuthUtil.getTenantId())
+				.eq(Bills::getIsDeleted, 0)
+				.eq(Bills::getMasterId, item.getId())) > 0) {
+				throw new RuntimeException("该主单存在分单,请先撤销分单");
+			}
 			businessBillNoService.deteleBillNo(item);
 		}
 		baseMapper.deleteBatchIds(ids);
@@ -753,6 +759,10 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 			auditProecessDTO.setCorpId(declare.getCorpId());
 			auditProecessDTO.setSalesCompanyId(Long.parseLong(declare.getCreateDept()));
 			auditProecessDTO.setSalesCompanyName(declare.getCreateDeptName());
+			auditProecessDTO.setPayAmount(declare.getAmountCrLoc());
+			auditProecessDTO.setReceivableAmount(declare.getAmountDrLoc());
+			auditProecessDTO.setGrossProfit(declare.getAmountProfitLoc());
+			auditProecessDTO.setSalesCompanyName(declare.getCreateDeptName());
 			R financeProcess = auditProecessService.createFinanceProcess(auditProecessDTO);
 			if (!financeProcess.isSuccess()) {
 				throw new SecurityException("操作失败,请联系管理员");
@@ -1078,6 +1088,7 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		copyBills.setMblno("");
 		copyBills.setHblno("");
 		copyBills.setRefno("");
+		copyBills.setBookingNo("");
 		copyBills.setStatus(0);
 		copyBills.setBillStatus(0);
 		copyBills.setBillingStatus(0);

+ 90 - 16
blade-service/blade-los/src/main/java/org/springblade/los/check/service/impl/AuditProecessServiceImpl.java

@@ -39,6 +39,10 @@ import org.springblade.los.check.mapper.AuditPathsActsMapper;
 import org.springblade.los.check.mapper.AuditProecessMapper;
 import org.springblade.los.check.service.IAuditProecessService;
 import org.springblade.los.check.vo.LosAuditProecessVO;
+import org.springblade.los.finance.fee.entity.FeeCenter;
+import org.springblade.los.finance.fee.entity.FinAccBills;
+import org.springblade.los.finance.fee.service.IFeeCenterService;
+import org.springblade.los.finance.fee.service.IFinAccBillsService;
 import org.springblade.los.finance.invoices.entity.FinInvoices;
 import org.springblade.los.finance.invoices.mapper.FinInvoicesMapper;
 import org.springblade.los.finance.stl.entity.FinStlBills;
@@ -47,10 +51,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.text.SimpleDateFormat;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -75,6 +76,10 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 
 	private final IBCorpsService bCorpsService;
 
+	private final IFeeCenterService feeCenterService;
+
+	private final IFinAccBillsService finAccBillsService;
+
 
 	@Override
 	public IPage<LosAuditProecessVO> selectAuditProecessPage(IPage<LosAuditProecessVO> page, LosAuditProecessVO auditProecess) {
@@ -142,6 +147,10 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 			auditProecess.setStorage(auditProecessDTO.getStorage());
 			auditProecess.setSalesCompanyId(auditProecessDTO.getSalesCompanyId());
 			auditProecess.setSalesCompanyName(auditProecessDTO.getSalesCompanyName());
+
+			auditProecess.setPayAmount(auditProecessDTO.getPayAmount());
+			auditProecess.setReceivableAmount(auditProecessDTO.getReceivableAmount());
+			auditProecess.setGrossProfit(auditProecessDTO.getGrossProfit());
 			//除了第一级是待审,其他都N
 			if (e.getLevelId() == 1) {
 				SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
@@ -282,7 +291,6 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 			if (operate == 1) {
 				//如果是第一级, 则修改状态为审批中
 				if (auditProecess.getLevelId() == 1) {
-//					R submit = billsService.underReview(auditProecess.getSrcBillId());
 					Bills detail = billsMapper.selectById(auditProecess.getSrcBillId());
 					if (detail == null) {
 						throw new SecurityException("审批通过失败");
@@ -292,6 +300,16 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 					if (count == 0) {
 						throw new SecurityException("审批开始修改审核状态失败");
 					}
+					List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+						.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+						.eq(FeeCenter::getIsDeleted, 0)
+						.eq(FeeCenter::getPid, bills.getId()));
+					for (FeeCenter item : feeCenterList) {
+						item.setApproverId(AuthUtil.getUserId());
+						item.setApproverName(AuthUtil.getUserName());
+						item.setApproveTime(new Date());
+					}
+					feeCenterService.saveOrUpdateBatch(feeCenterList);
 				}
 
 				auditProecess.setAuditStatus("A");
@@ -355,11 +373,19 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 				}
 				detail.setStatus(4);
 				int count = billsMapper.updateById(detail);
-//				R r = billsService.passCancel(auditProecess.getSrcBillId());
 				if (count == 0) {
 					throw new SecurityException("修改订单数据失败");
 				}
-
+				List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getPid, bills.getId()));
+				for (FeeCenter item : feeCenterList) {
+					item.setApproverId(AuthUtil.getUserId());
+					item.setApproverName(AuthUtil.getUserName());
+					item.setApproveTime(new Date());
+				}
+				feeCenterService.saveOrUpdateBatch(feeCenterList);
 				sendMessage.setMessageBody("您的审核未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				R save = messageClient.save(sendMessage);
 				if (!save.isSuccess()) {
@@ -378,12 +404,54 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 					throw new SecurityException("审批通过失败");
 				}
 				detail.setStatus(3);
+				detail.setBillStatus(2);
 				int count = billsMapper.updateById(detail);
-//				R r = billsService.passCheck(auditProecess.getSrcBillId());
 				if (count == 0) {
 					throw new SecurityException("修改订单数据失败");
 				}
-
+				List<FeeCenter> feeCenterList = new ArrayList<>();
+				feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getAccStatus, 0)
+					.eq(FeeCenter::getPid, bills.getId()));
+				if ("MM".equals(bills.getBillType())) {
+					List<Bills> billsList = billsMapper.selectList(new LambdaQueryWrapper<Bills>()
+						.eq(Bills::getTenantId, AuthUtil.getTenantId())
+						.eq(Bills::getIsDeleted, 0)
+						.eq(Bills::getMasterId, bills.getId())
+						.eq(Bills::getMasterBillNo, bills.getMasterBillNo()));
+					if (billsList.size() > 0) {
+						List<Long> ids = billsList.stream().map(Bills::getId).filter(Objects::nonNull).collect(Collectors.toList());
+						if (ids.size() > 0) {
+							List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+								.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+								.eq(FeeCenter::getIsDeleted, 0)
+								.eq(FeeCenter::getAccStatus, 0)
+								.in(FeeCenter::getPid, ids));
+							feeCenterList.addAll(feeCenters);
+						}
+					}
+				}
+				for (FeeCenter item : feeCenterList) {
+					item.setApproverId(AuthUtil.getUserId());
+					item.setApproverName(AuthUtil.getUserName());
+					item.setApproveTime(new Date());
+				}
+				feeCenterService.saveOrUpdateBatch(feeCenterList);
+				if (feeCenterList.size() != 0) {
+					FinAccBills finAccBills = new FinAccBills();
+					finAccBills.setFeeCenterList(feeCenterList);
+					finAccBills.setBusinessTypeCode("HYZD");
+					finAccBills.setBillNoFormat("HYZD");
+					finAccBills.setAccountType("");
+					finAccBills.setCorpArgreementNo(bills.getCorpArgreementNo());
+					finAccBills.setRefno(bills.getRefno());
+					finAccBills.setBookingNo(bills.getBookingNo());
+					finAccBills.setPolNamePrint(bills.getPolNamePrint());
+					finAccBills.setPodNamePrint(bills.getPodNamePrint());
+					finAccBillsService.generateBill(finAccBills);
+				}
 				sendMessage.setMessageBody("您的审核已通过" + ",业务单号:" + proecessTemp.getBillNo() + ",请继续操作");
 				R save = messageClient.save(sendMessage);
 				if (!save.isSuccess()) {
@@ -403,10 +471,16 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 				if (count == 0) {
 					throw new SecurityException("修改订单数据失败");
 				}
-				/*R r = billsService.passCancel(auditProecess.getSrcBillId());
-				if (!r.isSuccess()) {
-					throw new SecurityException("修改订单数据失败");
-				}*/
+				List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getPid, bills.getId()));
+				for (FeeCenter item : feeCenterList) {
+					item.setApproverId(AuthUtil.getUserId());
+					item.setApproverName(AuthUtil.getUserName());
+					item.setApproveTime(new Date());
+				}
+				feeCenterService.saveOrUpdateBatch(feeCenterList);
 				sendMessage.setMessageBody("您的审核未通过" + ",业务单号:" + proecessTemp.getBillNo() + ",驳回原因:" + auditProecess.getAuditMsg());
 				R save = messageClient.save(sendMessage);
 				if (!save.isSuccess()) {
@@ -527,7 +601,7 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
 					);
-				}else if ("付费申请".equals(auditProecess.getProcessType())){
+				} else if ("付费申请".equals(auditProecess.getProcessType())) {
 					message.setMessageBody("您有新的付费申请,申请单号:" + "" + proecessTemp.getBillNo() + ","
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
@@ -717,13 +791,13 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, L
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
 					);
 					message.setUrl("/iosBasicData/SeafreightExportF/bills/index");
-				}else if ("付费申请".equals(auditProecess.getProcessType())){
+				} else if ("付费申请".equals(auditProecess.getProcessType())) {
 					message.setMessageBody("您有新的付费申请,申请单号:" + "" + proecessTemp.getBillNo() + ","
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())
 					);
 					message.setUrl("/iosBasicData/PaymentApplication/index");
-				}else if ("发票申请".equals(auditProecess.getProcessType())){
+				} else if ("发票申请".equals(auditProecess.getProcessType())) {
 					message.setMessageBody("您有新的发票申请,申请单号:" + "" + proecessTemp.getBillNo() + ","
 						+ "单据日期:" + billsDate + ",请审核。"
 						+ "提交人:" + proecessTemp.getSendName() + "  " + "提交时间" + simpleDateFormat.format(proecessTemp.getSendTime())

+ 107 - 9
blade-service/blade-los/src/main/java/org/springblade/los/finance/invoices/service/impl/FinInvoicesServiceImpl.java

@@ -18,9 +18,9 @@ package org.springblade.los.finance.invoices.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -31,9 +31,6 @@ import org.springblade.los.billno.entity.BusinessBillNo;
 import org.springblade.los.billno.service.IBusinessBillNoService;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.mapper.BillsMapper;
-import org.springblade.los.check.dto.LosAuditProecessDTO;
-import org.springblade.los.check.entity.LosAuditPathsActs;
-import org.springblade.los.check.entity.LosAuditPathsLevels;
 import org.springblade.los.check.service.IAuditPathsActsService;
 import org.springblade.los.check.service.IAuditPathsLevelsService;
 import org.springblade.los.check.service.IAuditProecessService;
@@ -49,6 +46,7 @@ import org.springblade.los.finance.invoices.service.IFinInvoicesService;
 import org.springblade.los.finance.invoices.vo.FinInvoicesVO;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
@@ -97,6 +95,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R submit(FinInvoices finInvoices) {
 		String deptId = "";
 		String deptName = "";
@@ -195,6 +195,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 			finInvoices.setAmountTax(amountTax);
 			finInvoices.setAmountLoc(amountCny.add(bCurrencyService.converterCny("USD", amountUsd)));
+			finInvoices.setAmountSub(finInvoices.getAmountLoc());
 		}
 		this.saveOrUpdate(finInvoices);
 		return R.data(finInvoices);
@@ -215,6 +216,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R confirmfinInvoices(FinInvoices finInvoices) {
 		if (finInvoices.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -253,7 +256,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				.eq(FeeCenter::getIsDeleted, 0));
 			List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 1);
 			feeCenterService.saveOrUpdateBatch(feeCenterListNew);
-			List<Bills> billsList = new ArrayList<>();
+			/*List<Bills> billsList = new ArrayList<>();
 			List<Long> ids = feeCenterListNew.stream().map(FeeCenter::getPid).filter(Objects::nonNull).collect(Collectors.toList());
 			BigDecimal idsD = feeCenterListNew.stream().filter(e -> "D".equals(e.getDc())).map(FeeCenter::getUninvoicedAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
 			BigDecimal idsC = feeCenterListNew.stream().filter(e -> "C".equals(e.getDc())).map(FeeCenter::getUninvoicedAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -293,7 +296,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				} else {
 					billsMapper.updateById(item);
 				}
-			}
+			}*/
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
 		}
 		detail.setStatus(1);
@@ -363,7 +366,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				item.setUninvoicedAmount(item.getUninvoicedAmount().add(detail.getAmountLoc()));
 				item.setInvoiceById(detail.getCreateUser());
 				item.setInvoiceByName(detail.getCreateUserName());
-			} else {
+			} else if (count == 2) {
 				item.setInvoiceBillId(detail.getId() + "");
 				item.setInvoiceBillNo(detail.getBillNo());
 				item.setInvoiceNo(detail.getInvoiceNo());
@@ -380,12 +383,18 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				item.setUninvoicedAmount(item.getUninvoicedAmount().add(new BigDecimal("0.00").subtract(detail.getAmountLoc())));
 				item.setInvoiceById(detail.getCreateUser());
 				item.setInvoiceByName(detail.getCreateUserName());
+			} else if (count == 3) {
+				item.setAppliedAmount(item.getAppliedAmount().add(detail.getAmountLoc()));
+			} else if (count == 4) {
+				item.setAppliedAmount(item.getAppliedAmount().subtract(detail.getAmountLoc()));
 			}
 		}
 		return feeCenterList;
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeFinInvoices(FinInvoices finInvoices) {
 		if (finInvoices.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -422,7 +431,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 			List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 2);
 			feeCenterService.saveOrUpdateBatch(feeCenterListNew);
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
-			List<Bills> billsList = new ArrayList<>();
+			/*List<Bills> billsList = new ArrayList<>();
 			List<Long> ids = feeCenterListNew.stream().map(FeeCenter::getPid).filter(Objects::nonNull).collect(Collectors.toList());
 			BigDecimal idsD = feeCenterListNew.stream().filter(e -> "D".equals(e.getDc())).map(FeeCenter::getInvoiceAmountLoc).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
 			BigDecimal idsC = feeCenterListNew.stream().filter(e -> "C".equals(e.getDc())).map(FeeCenter::getInvoiceAmountLoc).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -462,7 +471,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					.map(FinAccBills::getAmountDrLoc).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
 				Bills bills = reconciliation(item, countD, divideIdsD, countC, divideIdsC, idsD, idsC, detail.getType());
 				billsMapper.updateById(bills);
-			}
+			}*/
 		}
 		detail.setStatus(2);
 		baseMapper.updateById(detail);
@@ -470,6 +479,8 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R finInvoicesApprove(FinInvoices finInvoices) {
 		if (finInvoices.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -538,12 +549,56 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 			}
 			detail.setStatus(1);
 		}*/
+		List<FeeCenter> feeCenterList = new ArrayList<>();
+		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
+			for (FinInvoicesItems item: finInvoices.getFinInvoicesItemsList()){
+				FinAccBills finAccBills = finAccBillsService.getById(item.getAccBillId());
+				if (finAccBills == null) {
+					throw new RuntimeException("未找到账单明细,操作失败");
+				}
+				/**-----------------------费用中心数据处理--------------------------- */
+				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getAccBillId, finAccBills.getId())
+					.eq(FeeCenter::getAccStatus, 1)
+					.apply("amount != stl_ttl_amount + applied_amount")
+					.orderByDesc(FeeCenter::getCreateTime));
+				BigDecimal currentStlAmount = item.getCurrentAmount();
+				for (FeeCenter e : feeCenters) {
+					if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
+						break;
+					} else {
+						//计算字段null值处理
+						e.setAmount(ObjectUtils.isNotNull(e.getAmount()) ? e.getAmount() : new BigDecimal("0.00"));
+						e.setStlTtlAmount(ObjectUtils.isNotNull(e.getStlTtlAmount()) ? e.getStlTtlAmount() : new BigDecimal("0.00"));
+						if (e.getAmount().subtract(e.getAppliedAmount()).subtract(e.getStlTtlAmount()).compareTo(currentStlAmount) > 0) {
+							e.setAppliedAmount(e.getAppliedAmount().add(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else if (e.getAmount().subtract(e.getAppliedAmount()).subtract(e.getStlTtlAmount()).compareTo(currentStlAmount) == 0) {
+							e.setAppliedAmount(e.getAppliedAmount().add(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else {
+							e.setAppliedAmount(e.getAmount());
+							currentStlAmount = currentStlAmount.subtract(e.getAmount());
+						}
+						feeCenterList.add(e);
+					}
+				}
+				if (currentStlAmount.compareTo(new BigDecimal("0.00")) != 0) {
+					throw new RuntimeException("申请金额计算错误,操作失败");
+				}
+			}
+			feeCenterService.saveOrUpdateBatch(feeCenterList);
+		}
 		detail.setStatus(3);
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeFinInvoicesApprove(FinInvoices finInvoices) {
 		if (finInvoices.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -559,6 +614,49 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 			}
 			detail.setStatus(0);
 		}*/
+		List<FeeCenter> feeCenterList = new ArrayList<>();
+		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
+			for (FinInvoicesItems item: finInvoices.getFinInvoicesItemsList()){
+				FinAccBills finAccBills = finAccBillsService.getById(item.getAccBillId());
+				if (finAccBills == null) {
+					throw new RuntimeException("未找到账单明细,操作失败");
+				}
+				/**-----------------------费用中心数据处理--------------------------- */
+				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getAccBillId, finAccBills.getId())
+					.eq(FeeCenter::getAccStatus, 1)
+					.apply("applied_amount != 0")
+					.orderByDesc(FeeCenter::getCreateTime));
+				BigDecimal currentStlAmount = item.getCurrentAmount();
+				for (FeeCenter e : feeCenters) {
+					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"));
+						if (e.getAppliedAmount().compareTo(currentStlAmount) > 0) {
+							e.setAppliedAmount(e.getAppliedAmount().subtract(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else if (e.getAppliedAmount().compareTo(currentStlAmount) == 0) {
+							e.setAppliedAmount(e.getAppliedAmount().subtract(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else {
+							e.setAppliedAmount(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);
+		}
 		detail.setStatus(0);
 		baseMapper.updateById(detail);
 		return R.data(detail);

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

@@ -103,7 +103,7 @@ public class FinStlBillsController extends BladeController {
 			.eq(ObjectUtils.isNotNull(finStlBills.getBillDate()), FinStlBills::getBillDate, finStlBills.getBillDate())
 
 			.orderByDesc(FinStlBills::getCreateTime);
-		IPage<FinStlBills> pages = finStlBillsService.page(Condition.getPage(query),lambdaQueryWrapper);
+		IPage<FinStlBills> pages = finStlBillsService.page(Condition.getPage(query), lambdaQueryWrapper);
 		return R.data(pages);
 	}
 
@@ -285,5 +285,15 @@ public class FinStlBillsController extends BladeController {
 		return R.success("操作成功");
 	}
 
+	/**
+	 * 生成结算单
+	 */
+	@GetMapping("/generateFinStlBills")
+	@ApiOperationSupport(order = 16)
+	@RepeatSubmit
+	public R generateFinStlBills(@RequestParam("billId") String billId, @RequestParam("dc") String dc) {
+		return finStlBillsService.generateFinStlBills(billId,dc);
+	}
+
 
 }

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

@@ -95,4 +95,12 @@ public interface IFinStlBillsService extends IService<FinStlBills> {
 	R revokeSettlementApprove(FinStlBills finStlBills);
 
 	FinStlBills approveDetail(FinStlBills finStlBills);
+
+	/**
+	 * 生成结算单
+	 * @param billId
+	 * @param dc
+	 * @return
+	 */
+	R generateFinStlBills(String billId, String dc);
 }

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

@@ -25,6 +25,7 @@ import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.los.basic.business.entity.BusinessType;
 import org.springblade.los.basic.business.service.IBusinessTypeService;
 import org.springblade.los.basic.cur.service.IBCurrencyService;
@@ -42,6 +43,10 @@ import org.springblade.los.finance.fee.entity.FeeCenter;
 import org.springblade.los.finance.fee.entity.FinAccBills;
 import org.springblade.los.finance.fee.service.IFeeCenterService;
 import org.springblade.los.finance.fee.service.IFinAccBillsService;
+import org.springblade.los.finance.invoices.entity.FinInvoices;
+import org.springblade.los.finance.invoices.entity.FinInvoicesItems;
+import org.springblade.los.finance.invoices.mapper.FinInvoicesItemsMapper;
+import org.springblade.los.finance.invoices.mapper.FinInvoicesMapper;
 import org.springblade.los.finance.stl.entity.FinStlBills;
 import org.springblade.los.finance.stl.entity.FinStlBillsItems;
 import org.springblade.los.finance.stl.entity.FinStlBillsVoucherItems;
@@ -97,6 +102,10 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 
 	private final IFeeCenterService feeCenterService;
 
+	private final FinInvoicesItemsMapper finInvoicesItemsMapper;
+
+	private final FinInvoicesMapper finInvoicesMapper;
+
 	@Override
 	public IPage<FinStlBillsVO> selectFinStlBillsPage(IPage<FinStlBillsVO> page, FinStlBillsVO finStlBills) {
 		return page.setRecords(baseMapper.selectFinStlBillsPage(page, finStlBills));
@@ -246,11 +255,13 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				.filter(e -> "USD".equals(e.getCurrentStlCurCode()) && "C".equals(e.getDc())).map(FinStlBillsItems::getCurrentStlAmountNet)
 				.filter(ObjectUtils::isNotNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 			finStlBills.setAmountCrUsdNet(amountCrUSDTax);
-
 			finStlBills.setAmountDrLoc(amountDrCNY.add(bCurrencyService.converterCny("USD", amountDrUSD)));
 			finStlBills.setAmountCrLoc(amountCrCNY.add(bCurrencyService.converterCny("USD", amountCrUSD)));
+			finStlBills.setAmountSub(finStlBills.getAmountCrLoc().subtract(finStlBills.getAmountDrLoc()));
 			finStlBills.setAmountDrLocNet(amountDrCNYTax.add(bCurrencyService.converterCny("USD", amountDrUSDTax)));
 			finStlBills.setAmountCrLocNet(amountCrCNYTax.add(bCurrencyService.converterCny("USD", amountCrUSDTax)));
+			finStlBills.setAmountSubLoc(finStlBills.getAmountCrLocNet().subtract(finStlBills.getAmountDrLocNet()));
+
 		}
 		this.saveOrUpdate(finStlBills);
 		return R.data(finStlBills);
@@ -295,7 +306,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				.eq(FeeCenter::getIsDeleted, 0));
 			List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 1);
 			feeCenterService.saveOrUpdateBatch(feeCenterListNew);
-			List<Bills> billsList = new ArrayList<>();
+			/*List<Bills> billsList = new ArrayList<>();
 			List<Long> ids = finAccBillsList.stream().map(FinAccBills::getBusinessBillId).filter(Objects::nonNull).collect(Collectors.toList());
 			List<Long> idsD = finAccBillsList.stream().filter(e -> "D".equals(e.getAccountDc())).map(FinAccBills::getBusinessBillId).filter(Objects::nonNull).collect(Collectors.toList());
 			List<Long> idsC = finAccBillsList.stream().filter(e -> "C".equals(e.getAccountDc())).map(FinAccBills::getBusinessBillId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -335,7 +346,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				} else {
 					billsMapper.updateById(item);
 				}
-			}
+			}*/
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
 		}
 		detail.setStatus(3);
@@ -354,6 +365,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				item.setCheckStatus(1);
 				item.setCheckById(detail.getCreateUser());
 				item.setCheckByName(detail.getCreateUserName());
+				item.setReconciliationAmount(item.getReconciliationAmount().add(item.getAmount()));
 			} else {
 				item.setCheckBillId(0L);
 				item.setCheckBillNo("");
@@ -362,6 +374,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				item.setCheckStatus(0);
 				item.setCheckById(0L);
 				item.setCheckByName("");
+				item.setReconciliationAmount(item.getReconciliationAmount().subtract(item.getAmount()));
 			}
 		}
 		return feeCenterList;
@@ -440,7 +453,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 			List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 2);
 			feeCenterService.saveOrUpdateBatch(feeCenterListNew);
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
-			List<Bills> billsList = new ArrayList<>();
+			/*List<Bills> billsList = new ArrayList<>();
 			List<Long> ids = finAccBillsList.stream().map(FinAccBills::getBusinessBillId).filter(Objects::nonNull).collect(Collectors.toList());
 			List<Long> idsD = finAccBillsList.stream().filter(e -> "D".equals(e.getAccountDc())).map(FinAccBills::getBusinessBillId).filter(Objects::nonNull).collect(Collectors.toList());
 			List<Long> idsC = finAccBillsList.stream().filter(e -> "C".equals(e.getAccountDc())).map(FinAccBills::getBusinessBillId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -480,7 +493,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				Bills bills = reconciliation(item, countD, divideIdsD, countC, divideIdsC, idsD, idsC);
 				billsMapper.updateById(bills);
 			}
-
+*/
 		}
 		detail.setStatus(0);
 		detail.setIsChecked(2);
@@ -547,10 +560,6 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				finAccBills.setStlAmountCr(ObjectUtils.isNotNull(finAccBills.getStlAmountCr()) ? finAccBills.getStlAmountCr() : new BigDecimal("0.00"));
 				finAccBills.setStlAmountCrLoc(ObjectUtils.isNotNull(finAccBills.getStlAmountCrLoc()) ? finAccBills.getStlAmountCrLoc() : new BigDecimal("0.00"));
 				finAccBills.setStlAmountCrUsd(ObjectUtils.isNotNull(finAccBills.getStlAmountCrUsd()) ? finAccBills.getStlAmountCrUsd() : new BigDecimal("0.00"));
-				if (item.getCurrentStlAmount().compareTo(new BigDecimal("0.00")) == 0 ||
-					item.getCurrentStlAmount().compareTo(item.getUnsettledAmount()) > 0) {
-					throw new RuntimeException("本次结算金额不能为零或大于未结算金额");
-				}
 				item.setStlTtlAmount(item.getStlTtlAmount().add(item.getCurrentStlAmount().add(item.getCurrentStlDiscount())));
 				item.setUnsettledAmount(item.getAmount().subtract(item.getStlTtlAmount()));
 				/**-----------------------账单数据处理 收--------------------------- */
@@ -605,7 +614,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				finAccBills.setUpdateUserName(AuthUtil.getUserName());
 				finAccBillsList.add(finAccBills);
 				/**-----------------------业务单据状态修改--------------------------- */
-				if (ObjectUtils.isNotNull(finAccBills.getBusinessBillDivideId()) && finAccBills.getBusinessBillDivideId() != 0) {
+				/*if (ObjectUtils.isNotNull(finAccBills.getBusinessBillDivideId()) && finAccBills.getBusinessBillDivideId() != 0) {
 					Bills bills = billsMapper.selectById(finAccBills.getBusinessBillDivideId());
 					if (bills != null) {
 						bills.setBillingStatus(bills.getBillingStatus() + 1);
@@ -651,7 +660,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 						Bills billsDetail = settlement(bills, countD, countC);
 						billsMapper.updateById(billsDetail);
 					}
-				}
+				}*/
 				/**-----------------------业务单据状态修改--------------------------- */
 				/**-----------------------费用中心数据处理--------------------------- */
 				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
@@ -662,6 +671,11 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 					.apply("amount != stl_ttl_amount")
 					.orderByDesc(FeeCenter::getCreateTime));
 				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().compareTo(item.getAmount().subtract(stlTtlAmount)) > 0) {
+					throw new RuntimeException("本次结算金额不能为零或大于未结算金额");
+				}
 				for (FeeCenter e : feeCenters) {
 					if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
 						break;
@@ -767,10 +781,6 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				finAccBills.setStlAmountCr(ObjectUtils.isNotNull(finAccBills.getStlAmountCr()) ? finAccBills.getStlAmountCr() : new BigDecimal("0.00"));
 				finAccBills.setStlAmountCrLoc(ObjectUtils.isNotNull(finAccBills.getStlAmountCrLoc()) ? finAccBills.getStlAmountCrLoc() : new BigDecimal("0.00"));
 				finAccBills.setStlAmountCrUsd(ObjectUtils.isNotNull(finAccBills.getStlAmountCrUsd()) ? finAccBills.getStlAmountCrUsd() : new BigDecimal("0.00"));
-				if (item.getCurrentStlAmount().compareTo(new BigDecimal("0.00")) == 0 ||
-					item.getCurrentStlAmount().compareTo(item.getUnsettledAmount()) > 0) {
-					throw new RuntimeException("本次结算金额不能为零或大于未结算金额");
-				}
 				item.setStlTtlAmount(item.getStlTtlAmount().subtract(item.getCurrentStlAmount().subtract(item.getCurrentStlDiscount())));
 				item.setUnsettledAmount(item.getAmount().subtract(item.getStlTtlAmount()));
 				/**-----------------------账单数据处理 收--------------------------- */
@@ -840,7 +850,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				finAccBills.setUpdateUserName(AuthUtil.getUserName());
 				finAccBillsList.add(finAccBills);
 				/**-----------------------业务单据状态修改--------------------------- */
-				if (ObjectUtils.isNotNull(finAccBills.getBusinessBillDivideId()) && finAccBills.getBusinessBillDivideId() != 0) {
+				/*if (ObjectUtils.isNotNull(finAccBills.getBusinessBillDivideId()) && finAccBills.getBusinessBillDivideId() != 0) {
 					Bills bills = billsMapper.selectById(finAccBills.getBusinessBillDivideId());
 					if (bills != null) {
 						bills.setBillingStatus(bills.getBillingStatus() + 1);
@@ -886,7 +896,7 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 						Bills billsDetail = settlement(bills, countD, countC);
 						billsMapper.updateById(billsDetail);
 					}
-				}
+				}*/
 				/**-----------------------业务单据状态修改--------------------------- */
 				/**-----------------------费用中心数据处理--------------------------- */
 				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
@@ -897,6 +907,11 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 					.apply("stl_ttl_amount != 0")
 					.orderByDesc(FeeCenter::getCreateTime));
 				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().compareTo(stlTtlAmount) > 0) {
+					throw new RuntimeException("本次结算金额不能为零或大于已结算金额");
+				}
 				for (FeeCenter e : feeCenters) {
 					if (currentStlAmount.compareTo(new BigDecimal("0.00")) == 0) {
 						break;
@@ -1100,79 +1115,130 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R settlementApprove(FinStlBills finStlBills) {
 		if (finStlBills.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
 		}
 		FinStlBills detail = baseMapper.selectById(finStlBills.getId());
-		if (ObjectUtils.isNotNull(finStlBills.getFinStlBillsItemsList())) {
-			//审批数据
-			LosAuditProecessDTO auditProecessDTO = new LosAuditProecessDTO();
-			//获取审批级次
-			List<LosAuditPathsLevels> auditPathsLevels;
-			// 判断是否有审批流,如果审批流已开启就进入审批流,否则直接走申请通过
-			LosAuditPathsActs pathsActs;
-			//是否开启流程
-			LambdaQueryWrapper<LosAuditPathsActs> auditPathsActsLambdaQueryWrapper = new LambdaQueryWrapper<>();
-			auditPathsActsLambdaQueryWrapper
-				.eq(LosAuditPathsActs::getIsEnable, 1)
-				.eq(LosAuditPathsActs::getFidStatus, "status")
-				.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId())
-				.eq(LosAuditPathsActs::getSalesCompanyId, AuthUtil.getDeptId())
-				.eq(LosAuditPathsActs::getActId, 1109);
-			pathsActs = auditPathsActsService.getOne(auditPathsActsLambdaQueryWrapper);
-			//获取审批信息
-			LosAuditPathsActs losAuditPathsActs = auditPathsActsService.getOne(new LambdaQueryWrapper<LosAuditPathsActs>()
-				.eq(LosAuditPathsActs::getActId, 1109)
-				.eq(LosAuditPathsActs::getFidStatus, "status")
-				.eq(LosAuditPathsActs::getSalesCompanyId, AuthUtil.getDeptId())
-				.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId()));
-			Long pathId = losAuditPathsActs.getPathId();
-			auditPathsLevels = auditPathsLevelsService.list(new LambdaQueryWrapper<LosAuditPathsLevels>()
-				.eq(LosAuditPathsLevels::getTenantId, AuthUtil.getTenantId()).eq(LosAuditPathsLevels::getPathId, pathId));
-			auditProecessDTO.setTimes(1);
-			auditProecessDTO.setProcessType("付费申请");
+		//审批数据
+		LosAuditProecessDTO auditProecessDTO = new LosAuditProecessDTO();
+		//获取审批级次
+		List<LosAuditPathsLevels> auditPathsLevels;
+		// 判断是否有审批流,如果审批流已开启就进入审批流,否则直接走申请通过
+		LosAuditPathsActs pathsActs;
+		//是否开启流程
+		LambdaQueryWrapper<LosAuditPathsActs> auditPathsActsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		auditPathsActsLambdaQueryWrapper
+			.eq(LosAuditPathsActs::getIsEnable, 1)
+			.eq(LosAuditPathsActs::getFidStatus, "status")
+			.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId())
+			.eq(LosAuditPathsActs::getSalesCompanyId, AuthUtil.getDeptId())
+			.eq(LosAuditPathsActs::getActId, 1109);
+		pathsActs = auditPathsActsService.getOne(auditPathsActsLambdaQueryWrapper);
+		//获取审批信息
+		LosAuditPathsActs losAuditPathsActs = auditPathsActsService.getOne(new LambdaQueryWrapper<LosAuditPathsActs>()
+			.eq(LosAuditPathsActs::getActId, 1109)
+			.eq(LosAuditPathsActs::getFidStatus, "status")
+			.eq(LosAuditPathsActs::getSalesCompanyId, AuthUtil.getDeptId())
+			.eq(LosAuditPathsActs::getTenantId, AuthUtil.getTenantId()));
+		Long pathId = losAuditPathsActs.getPathId();
+		auditPathsLevels = auditPathsLevelsService.list(new LambdaQueryWrapper<LosAuditPathsLevels>()
+			.eq(LosAuditPathsLevels::getTenantId, AuthUtil.getTenantId()).eq(LosAuditPathsLevels::getPathId, pathId));
+		auditProecessDTO.setTimes(1);
+		auditProecessDTO.setProcessType("付费申请");
 
-			// 没开启审批流直接走 通过流程
-			if (pathsActs == null || pathsActs.getIsEnable() == 2) {
-				throw new SecurityException("当前租户未查询到审批流配置");
-			} else {
+		// 没开启审批流直接走 通过流程
+		if (pathsActs == null || pathsActs.getIsEnable() == 2) {
+			throw new SecurityException("当前租户未查询到审批流配置");
+		} else {
 
-				if (CollectionUtils.isEmpty(auditPathsLevels)) {
-					throw new SecurityException("开启审批失败:未查询到审批信息");
+			if (CollectionUtils.isEmpty(auditPathsLevels)) {
+				throw new SecurityException("开启审批失败:未查询到审批信息");
+			}
+			// 绑定审核类型
+			auditProecessDTO.setCheckType("HYCK-FFSQ");
+			// 追加跳转路由url
+			auditProecessDTO.setUrl(finStlBills.getUrl());
+			auditProecessDTO.setPageStatus(finStlBills.getPageStatus());
+			auditProecessDTO.setPageLabel(finStlBills.getPageLabel());
+			auditProecessDTO.setOrderRemark(detail.getRemarks());
+			auditProecessDTO.setPathsLevelsList(auditPathsLevels);
+			auditProecessDTO.setActId(1);
+			auditProecessDTO.setSrcBillId(detail.getId());
+			auditProecessDTO.setBillId(detail.getId());
+			auditProecessDTO.setBillNo(detail.getBillNo());
+			auditProecessDTO.setSendUserId(AuthUtil.getUserId());
+			auditProecessDTO.setSendName(AuthUtil.getUserName());
+			auditProecessDTO.setSendTime(new Date());
+			auditProecessDTO.setBillTime(detail.getCreateTime());
+			auditProecessDTO.setTenantId(AuthUtil.getTenantId());
+			auditProecessDTO.setCorpId(detail.getCorpId());
+			auditProecessDTO.setSalesCompanyId(Long.parseLong(detail.getCreateDept()));
+			auditProecessDTO.setSalesCompanyName(detail.getCreateDeptName());
+			R financeProcess = auditProecessService.createFinanceProcess(auditProecessDTO);
+			if (!financeProcess.isSuccess()) {
+				throw new SecurityException("操作失败,请联系管理员");
+			}
+		}
+		detail.setStatus(1);
+		if (ObjectUtils.isNotNull(finStlBills.getFinStlBillsItemsList())) {
+			List<FeeCenter> feeCenterList = new ArrayList<>();
+			for (FinStlBillsItems item : finStlBills.getFinStlBillsItemsList()) {
+				FinAccBills finAccBills = finAccBillsService.getById(item.getAccBillId());
+				if (finAccBills == null) {
+					throw new RuntimeException("未找到账单明细,操作失败");
+				}
+				//计算字段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"));
+				item.setCurrentStlAmount(ObjectUtils.isNotNull(item.getCurrentStlAmount()) ? item.getCurrentStlAmount() : new BigDecimal("0.00"));
+				item.setCurrentStlDiscount(ObjectUtils.isNotNull(item.getCurrentStlDiscount()) ? item.getCurrentStlDiscount() : new BigDecimal("0.00"));
+				/**-----------------------费用中心数据处理--------------------------- */
+				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getAccBillId, finAccBills.getId())
+					.eq(FeeCenter::getAccStatus, 1)
+					.apply("amount != stl_ttl_amount + applied_amount")
+					.orderByDesc(FeeCenter::getCreateTime));
+				BigDecimal currentStlAmount = item.getCurrentStlAmount();
+				for (FeeCenter e : feeCenters) {
+					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"));
+						if (e.getAmount().subtract(e.getAppliedAmount()).subtract(e.getStlTtlAmount()).compareTo(currentStlAmount) > 0) {
+							e.setAppliedAmount(e.getAppliedAmount().add(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else if (e.getAmount().subtract(e.getAppliedAmount()).subtract(e.getStlTtlAmount()).compareTo(currentStlAmount) == 0) {
+							e.setAppliedAmount(e.getAppliedAmount().add(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else {
+							e.setAppliedAmount(e.getAmount());
+							currentStlAmount = currentStlAmount.subtract(e.getAmount());
+						}
+						feeCenterList.add(e);
+					}
 				}
-				// 绑定审核类型
-				auditProecessDTO.setCheckType("HYCK-FFSQ");
-				// 追加跳转路由url
-				auditProecessDTO.setUrl(finStlBills.getUrl());
-				auditProecessDTO.setPageStatus(finStlBills.getPageStatus());
-				auditProecessDTO.setPageLabel(finStlBills.getPageLabel());
-				auditProecessDTO.setOrderRemark(detail.getRemarks());
-				auditProecessDTO.setPathsLevelsList(auditPathsLevels);
-				auditProecessDTO.setActId(1);
-				auditProecessDTO.setSrcBillId(detail.getId());
-				auditProecessDTO.setBillId(detail.getId());
-				auditProecessDTO.setBillNo(detail.getBillNo());
-				auditProecessDTO.setSendUserId(AuthUtil.getUserId());
-				auditProecessDTO.setSendName(AuthUtil.getUserName());
-				auditProecessDTO.setSendTime(new Date());
-				auditProecessDTO.setBillTime(detail.getCreateTime());
-				auditProecessDTO.setTenantId(AuthUtil.getTenantId());
-				auditProecessDTO.setCorpId(detail.getCorpId());
-				auditProecessDTO.setSalesCompanyId(Long.parseLong(detail.getCreateDept()));
-				auditProecessDTO.setSalesCompanyName(detail.getCreateDeptName());
-				R financeProcess = auditProecessService.createFinanceProcess(auditProecessDTO);
-				if (!financeProcess.isSuccess()) {
-					throw new SecurityException("操作失败,请联系管理员");
+				if (currentStlAmount.compareTo(new BigDecimal("0.00")) != 0) {
+					throw new RuntimeException("结算金额计算错误,操作失败");
 				}
+				/**-----------------------费用中心数据处理--------------------------- */
 			}
-			detail.setStatus(1);
+			feeCenterService.saveOrUpdateBatch(feeCenterList);
 		}
 		baseMapper.updateById(detail);
 		return R.data(detail);
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeSettlementApprove(FinStlBills finStlBills) {
 		if (finStlBills.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -1187,6 +1253,54 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 				throw new SecurityException("操作失败,请联系管理员");
 			}
 			detail.setStatus(0);
+			List<FeeCenter> feeCenterList = new ArrayList<>();
+			for (FinStlBillsItems item : finStlBills.getFinStlBillsItemsList()) {
+				FinAccBills finAccBills = finAccBillsService.getById(item.getAccBillId());
+				if (finAccBills == null) {
+					throw new RuntimeException("未找到账单明细,操作失败");
+				}
+				//计算字段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"));
+				item.setCurrentStlAmount(ObjectUtils.isNotNull(item.getCurrentStlAmount()) ? item.getCurrentStlAmount() : new BigDecimal("0.00"));
+				item.setCurrentStlDiscount(ObjectUtils.isNotNull(item.getCurrentStlDiscount()) ? item.getCurrentStlDiscount() : new BigDecimal("0.00"));
+				/**-----------------------费用中心数据处理--------------------------- */
+				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0)
+					.eq(FeeCenter::getAccBillId, finAccBills.getId())
+					.eq(FeeCenter::getAccStatus, 1)
+					.apply("applied_amount != 0")
+					.orderByDesc(FeeCenter::getCreateTime));
+				BigDecimal currentStlAmount = item.getCurrentStlAmount();
+				for (FeeCenter e : feeCenters) {
+					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"));
+
+						if (e.getAppliedAmount().compareTo(currentStlAmount) > 0) {
+							e.setAppliedAmount(e.getAppliedAmount().subtract(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else if (e.getAppliedAmount().compareTo(currentStlAmount) == 0) {
+							e.setAppliedAmount(e.getAppliedAmount().subtract(currentStlAmount));
+							currentStlAmount = new BigDecimal("0.00");
+						} else {
+							e.setAppliedAmount(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);
 		}
 		baseMapper.updateById(detail);
 		return R.data(detail);
@@ -1213,4 +1327,85 @@ public class FinStlBillsServiceImpl extends ServiceImpl<FinStlBillsMapper, FinSt
 		}
 		return detail;
 	}
+
+	@Override
+	public R generateFinStlBills(String billId, String dc) {
+		if (ObjectUtils.isNull(billId) || ObjectUtils.isNull(dc)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		List<FinStlBillsItems> finStlBillsItemsList = new ArrayList<>();
+		FinStlBills finStlBills = new FinStlBills();
+		finStlBills.setBusinessType("STL");
+		finStlBills.setBillDate(new Date());
+		if ("D".equals(dc)) {
+			List<FinInvoices> finInvoices = finInvoicesMapper.selectList(new LambdaQueryWrapper<FinInvoices>()
+				.eq(FinInvoices::getTenantId, AuthUtil.getTenantId())
+				.eq(FinInvoices::getIsDeleted, 0)
+				.apply("find_in_set(id,'" + billId + "')"));
+			if (finInvoices.size() > 0) {
+				finStlBills.setCorpId(finInvoices.get(0).getCorpId());
+				finStlBills.setCorpCnName(finInvoices.get(0).getCorpCnName());
+				finStlBills.setCorpEnName(finInvoices.get(0).getCorpEnName());
+				finStlBills.setBusinessTypes(finInvoices.get(0).getBusinessTypes());
+				finStlBills.setDc(dc);
+				finStlBills.setRequestNo(finInvoices.stream().map(FinInvoices::getBillNo).filter(Objects::nonNull).distinct()
+					.collect(Collectors.joining(",")));
+			}
+
+			List<FinInvoicesItems> finInvoicesItems = finInvoicesItemsMapper.selectList(new LambdaQueryWrapper<FinInvoicesItems>()
+				.eq(FinInvoicesItems::getTenantId, AuthUtil.getTenantId())
+				.eq(FinInvoicesItems::getIsDeleted, 0)
+				.apply("find_in_set(pid,'" + billId + "')"));
+			if (finInvoicesItems.size() > 0) {
+				for (FinInvoicesItems item : finInvoicesItems) {
+					FinStlBillsItems finStlBillsItems = new FinStlBillsItems();
+					BeanUtil.copyProperties(item, finStlBillsItems);
+					finStlBillsItems.setId(null);
+					finStlBillsItems.setCurrentStlCurCode(item.getCurrentCurCode());
+					finStlBillsItems.setCurrentStlExrate(item.getCurrentExrate());
+					finStlBillsItems.setCurrentStlTaxRate(item.getCurrentTaxRate());
+					finStlBillsItems.setCurrentStlSurRate(item.getCurrentSurRate());
+					finStlBillsItems.setCurrentStlDiscount(item.getAmountDiscount());
+					finStlBillsItems.setCurrentStlAmountTax(item.getCurrentAmountTax());
+					finStlBillsItems.setCurrentStlAmountNet(item.getCurrentAmountNet());
+					finStlBillsItems.setCurrentStlAmount(item.getCurrentAmount());
+					finStlBillsItems.setCurrentStlAmountLoc(item.getCurrentAmountLoc());
+					finStlBillsItems.setCurrentInvoiceAmount(item.getCurrentAmount());
+					finStlBillsItems.setCurrentInvoiceAmountLoc(item.getCurrentAmountLoc());
+					finStlBillsItems.setInvoiceBillId(item.getId());
+					finStlBillsItems.setInvoiceNo(item.getBillNo());
+					finStlBillsItemsList.add(finStlBillsItems);
+				}
+				finStlBills.setFinStlBillsItemsList(finStlBillsItemsList);
+			}
+		} else if ("C".equals(dc)) {
+			List<FinStlBills> finStlBills1 = baseMapper.selectList(new LambdaQueryWrapper<FinStlBills>()
+				.eq(FinStlBills::getTenantId, AuthUtil.getTenantId())
+				.eq(FinStlBills::getIsDeleted, 0)
+				.apply("find_in_set(id,'" + billId + "')"));
+			if (finStlBills1.size() > 0) {
+				finStlBills.setCorpId(finStlBills1.get(0).getCorpId());
+				finStlBills.setCorpCnName(finStlBills1.get(0).getCorpCnName());
+				finStlBills.setCorpEnName(finStlBills1.get(0).getCorpEnName());
+				finStlBills.setBusinessTypes(finStlBills1.get(0).getBusinessTypes());
+				finStlBills.setDc(dc);
+				finStlBills.setRequestNo(finStlBills1.stream().map(FinStlBills::getBillNo).filter(Objects::nonNull).distinct()
+					.collect(Collectors.joining(",")));
+			}
+			List<FinStlBillsItems> finInvoicesItems = finStlBillsItemsService.list(new LambdaQueryWrapper<FinStlBillsItems>()
+				.eq(FinStlBillsItems::getTenantId, AuthUtil.getTenantId())
+				.eq(FinStlBillsItems::getIsDeleted, 0)
+				.apply("find_in_set(pid,'" + billId + "')"));
+			if (finInvoicesItems.size() > 0) {
+				for (FinStlBillsItems item : finInvoicesItems) {
+					FinStlBillsItems finStlBillsItems = new FinStlBillsItems();
+					BeanUtil.copyProperties(item, finStlBillsItems);
+					finStlBillsItems.setId(null);
+					finStlBillsItemsList.add(finStlBillsItems);
+				}
+				finStlBills.setFinStlBillsItemsList(finStlBillsItemsList);
+			}
+		}
+		return R.data(finStlBills);
+	}
 }

+ 8 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.seata.spring.annotation.GlobalTransactional;
 import lombok.AllArgsConstructor;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
@@ -43,6 +44,7 @@ import org.springblade.los.finance.vouchers.service.IFinVouchersService;
 import org.springblade.los.finance.vouchers.vo.FinVouchersVO;
 import org.springblade.system.feign.ISysClient;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import java.math.BigDecimal;
@@ -97,6 +99,8 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R submit(FinVouchers finVouchers) {
 		String deptId = "";
 		String deptName = "";
@@ -205,6 +209,8 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R confirmFinVouchers(FinVouchers finVouchers) {
 		if (finVouchers.getId() == null) {
 			throw new RuntimeException("缺少必要参数");
@@ -276,6 +282,8 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeFinVouchers(FinVouchers finVouchers) {
 		if (finVouchers.getId() == null) {
 			throw new RuntimeException("缺少必要参数");