Browse Source

2024年1月26日16:15:50

纪新园 1 năm trước cách đây
mục cha
commit
7251468666

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

@@ -347,7 +347,7 @@
             and acc.amount_cr_loc > acc.stl_amount_cr_loc + fee.applied_amount
         </if>
         <if test='acc.type != null and acc.type != "" and acc.type == "4"'>
-            and fee.amount > fee.uninvoiced_amount + fee.applied_invoice_amount
+            and fee.amount > fee.uninvoiced_amount + fee.applied_invoice_amount - fee.applied_invoice_amount_stl
             and acc.invoice_status != 3
         </if>
         <if test='acc.type != null and acc.type != "" and acc.type == "5"'>

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

@@ -55,7 +55,6 @@ import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
-import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -276,6 +275,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
 			//明细状态修改  已开发票
 			List<FinAccBills> finAccBillsList = new ArrayList<>();
+			List<FeeCenter> feeCenterList = new ArrayList<>();
 			for (FinInvoicesItems item : finInvoices.getFinInvoicesItemsList()) {
 				item.setBillDate(finInvoices.getBillDate());
 				item.setUpdateUser(AuthUtil.getUserId());
@@ -325,6 +325,39 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					finAccBills.setUninvoicedAmountUsd(finAccBills.getUninvoicedAmountUsd().add(item.getCurrentAmount()));
 				}
 				finAccBillsList.add(finAccBills);
+				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.in(FeeCenter::getAccBillId, finAccBills.getId())
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0));
+				BigDecimal currentStlAmount = item.getCurrentAmount();
+				for (FeeCenter feeCenter : feeCenters) {
+					feeCenter.setInvoiceBillId(detail.getId() + "");
+					feeCenter.setInvoiceBillNo(detail.getBillNo());
+					feeCenter.setInvoiceNo(detail.getInvoiceNo());
+					feeCenter.setInvoiceDate(feeCenter.getBillDate());
+					feeCenter.setInvoiceStatus(9);
+					feeCenter.setInvoiceCurCode(detail.getCurCode());
+					feeCenter.setInvoiceExrate(detail.getExrate());
+					if ("CNY".equals(detail.getCurCode())) {
+						feeCenter.setInvoiceAmount(detail.getAmountCny());
+					} else {
+						feeCenter.setInvoiceAmount(detail.getAmountUsd());
+					}
+					feeCenter.setInvoiceAmountLoc(detail.getAmountLoc());
+					feeCenter.setInvoiceById(detail.getCreateUser());
+					feeCenter.setInvoiceByName(detail.getCreateUserName());
+					if (feeCenter.getAmount().subtract(feeCenter.getUninvoicedAmount()).compareTo(currentStlAmount) > 0) {
+						feeCenter.setUninvoicedAmount(feeCenter.getUninvoicedAmount().add(currentStlAmount));
+						currentStlAmount = new BigDecimal("0.00");
+					} else if (feeCenter.getAmount().subtract(feeCenter.getStlTtlAmount()).compareTo(currentStlAmount) == 0) {
+						feeCenter.setUninvoicedAmount(feeCenter.getAmount());
+						currentStlAmount = new BigDecimal("0.00");
+					} else {
+						feeCenter.setUninvoicedAmount(feeCenter.getAmount());
+						currentStlAmount = currentStlAmount.subtract(feeCenter.getAmount());
+					}
+					feeCenterList.add(feeCenter);
+				}
 			}
 			finInvoicesItemsService.saveOrUpdateBatch(finInvoices.getFinInvoicesItemsList());
 			List<Long> ids = finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getApplySrcId).collect(Collectors.toList());
@@ -350,16 +383,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					finInvoicesItemsService.saveOrUpdateBatch(finInvoicesItemsList);
 				}
 			}
-			//通过明细里账单id查询具体账单数据
-			List<Long> accIds = finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getAccBillId)
-				.filter(Objects::nonNull).collect(Collectors.toList());
-			//通过账单id查询具体费用中心数据
-			List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-				.in(FeeCenter::getAccBillId, accIds)
-				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
-				.eq(FeeCenter::getIsDeleted, 0));
-			List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 1);
-			feeCenterService.saveOrUpdateBatch(feeCenterListNew);
+			feeCenterService.saveOrUpdateBatch(feeCenterList);
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
 		}
 		BigDecimal invoiceAmount = new BigDecimal("0.00");
@@ -418,72 +442,6 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		return item;
 	}
 
-	private List<FeeCenter> reconciliationFeeCenter(FinInvoices detail, List<FeeCenter> feeCenterList, int count) {
-		BigDecimal currentStlAmount = detail.getAmountLoc();
-		for (FeeCenter item : feeCenterList) {
-			item.setInvoiceAmountLoc(item.getInvoiceAmountLoc() == null ? new BigDecimal("0.00") : item.getInvoiceAmountLoc());
-			if (count == 1) {
-				item.setInvoiceBillId(detail.getId() + "");
-				item.setInvoiceBillNo(detail.getBillNo());
-				item.setInvoiceNo(detail.getInvoiceNo());
-				item.setInvoiceDate(item.getBillDate());
-				item.setInvoiceStatus(9);
-				item.setInvoiceCurCode(detail.getCurCode());
-				item.setInvoiceExrate(detail.getExrate());
-				if ("CNY".equals(detail.getCurCode())) {
-					item.setInvoiceAmount(detail.getAmountCny());
-				} else {
-					item.setInvoiceAmount(detail.getAmountUsd());
-				}
-				item.setInvoiceAmountLoc(detail.getAmountLoc());
-				item.setInvoiceById(detail.getCreateUser());
-				item.setInvoiceByName(detail.getCreateUserName());
-				if (item.getAmount().subtract(item.getUninvoicedAmount()).compareTo(currentStlAmount) > 0) {
-					item.setUninvoicedAmount(item.getUninvoicedAmount().add(currentStlAmount));
-					currentStlAmount = new BigDecimal("0.00");
-				} else if (item.getAmount().subtract(item.getStlTtlAmount()).compareTo(currentStlAmount) == 0) {
-					item.setUninvoicedAmount(item.getAmount());
-					currentStlAmount = new BigDecimal("0.00");
-				} else {
-					item.setUninvoicedAmount(item.getAmount());
-					currentStlAmount = currentStlAmount.subtract(item.getAmount());
-				}
-			} else if (count == 2) {
-				item.setInvoiceBillId(detail.getId() + "");
-				item.setInvoiceBillNo(detail.getBillNo());
-				item.setInvoiceNo(detail.getInvoiceNo());
-				item.setInvoiceDate(item.getBillDate());
-				item.setInvoiceStatus(2);
-				item.setInvoiceCurCode(detail.getCurCode());
-				item.setInvoiceExrate(detail.getExrate());
-				if ("CNY".equals(detail.getCurCode())) {
-					item.setInvoiceAmount(detail.getAmountCny());
-				} else {
-					item.setInvoiceAmount(detail.getAmountUsd());
-				}
-				item.setInvoiceAmountLoc(detail.getAmountLoc());
-				item.setUninvoicedAmount(item.getUninvoicedAmount().add(new BigDecimal("0.00").subtract(detail.getAmountLoc())));
-				item.setInvoiceById(detail.getCreateUser());
-				item.setInvoiceByName(detail.getCreateUserName());
-				if (item.getAmount().subtract(item.getUninvoicedAmount()).compareTo(currentStlAmount) > 0) {
-					item.setUninvoicedAmount(item.getUninvoicedAmount().subtract(currentStlAmount));
-					currentStlAmount = new BigDecimal("0.00");
-				} else if (item.getAmount().subtract(item.getStlTtlAmount()).compareTo(currentStlAmount) == 0) {
-					item.setUninvoicedAmount(item.getUninvoicedAmount().subtract(currentStlAmount));
-					currentStlAmount = new BigDecimal("0.00");
-				} else {
-					item.setUninvoicedAmount(item.getUninvoicedAmount().subtract(currentStlAmount));
-					currentStlAmount = currentStlAmount.subtract(item.getAmount());
-				}
-			} else if (count == 3) {
-				item.setAppliedInvoiceAmount(item.getAppliedInvoiceAmount().add(detail.getAmountLoc()));
-			} else if (count == 4) {
-				item.setAppliedInvoiceAmount(item.getAppliedInvoiceAmount().subtract(detail.getAmountLoc()));
-			}
-		}
-		return feeCenterList;
-	}
-
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
@@ -497,6 +455,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 		}
 		if (ObjectUtils.isNotNull(finInvoices.getFinInvoicesItemsList())) {
 			List<FinAccBills> finAccBillsList = new ArrayList<>();
+			List<FeeCenter> feeCenterList = new ArrayList<>();
 			for (FinInvoicesItems item : finInvoices.getFinInvoicesItemsList()) {
 				item.setBillDate(null);
 				item.setUpdateUser(AuthUtil.getUserId());
@@ -538,6 +497,40 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					finAccBills.setUninvoicedAmountUsd(finAccBills.getUninvoicedAmountUsd().subtract(item.getCurrentAmount()));
 				}
 				finAccBillsList.add(finAccBills);
+				List<FeeCenter> feeCenters = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
+					.in(FeeCenter::getAccBillId, finAccBills.getId())
+					.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
+					.eq(FeeCenter::getIsDeleted, 0));
+				BigDecimal currentStlAmount = detail.getAmountLoc();
+				for (FeeCenter feeCenter : feeCenters) {
+					feeCenter.setInvoiceBillId(detail.getId() + "");
+					feeCenter.setInvoiceBillNo(detail.getBillNo());
+					feeCenter.setInvoiceNo(detail.getInvoiceNo());
+					feeCenter.setInvoiceDate(feeCenter.getBillDate());
+					feeCenter.setInvoiceStatus(2);
+					feeCenter.setInvoiceCurCode(detail.getCurCode());
+					feeCenter.setInvoiceExrate(detail.getExrate());
+					if ("CNY".equals(detail.getCurCode())) {
+						feeCenter.setInvoiceAmount(detail.getAmountCny());
+					} else {
+						feeCenter.setInvoiceAmount(detail.getAmountUsd());
+					}
+					feeCenter.setInvoiceAmountLoc(detail.getAmountLoc());
+					feeCenter.setUninvoicedAmount(feeCenter.getUninvoicedAmount().add(new BigDecimal("0.00").subtract(detail.getAmountLoc())));
+					feeCenter.setInvoiceById(detail.getCreateUser());
+					feeCenter.setInvoiceByName(detail.getCreateUserName());
+					if (feeCenter.getAmount().subtract(feeCenter.getUninvoicedAmount()).compareTo(currentStlAmount) > 0) {
+						feeCenter.setUninvoicedAmount(feeCenter.getUninvoicedAmount().subtract(currentStlAmount));
+						currentStlAmount = new BigDecimal("0.00");
+					} else if (feeCenter.getAmount().subtract(feeCenter.getStlTtlAmount()).compareTo(currentStlAmount) == 0) {
+						feeCenter.setUninvoicedAmount(feeCenter.getUninvoicedAmount().subtract(currentStlAmount));
+						currentStlAmount = new BigDecimal("0.00");
+					} else {
+						feeCenter.setUninvoicedAmount(feeCenter.getUninvoicedAmount().subtract(currentStlAmount));
+						currentStlAmount = currentStlAmount.subtract(item.getAmount());
+					}
+					feeCenterList.add(feeCenter);
+				}
 			}
 			finInvoicesItemsService.saveOrUpdateBatch(finInvoices.getFinInvoicesItemsList());
 			List<Long> ids = finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getApplySrcId).collect(Collectors.toList());
@@ -556,14 +549,7 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 					finInvoicesItemsService.saveOrUpdateBatch(finInvoicesItemsList);
 				}
 			}
-			List<Long> accIds = finInvoices.getFinInvoicesItemsList().stream().map(FinInvoicesItems::getAccBillId)
-				.filter(Objects::nonNull).collect(Collectors.toList());
-			List<FeeCenter> feeCenterList = feeCenterService.list(new LambdaQueryWrapper<FeeCenter>()
-				.in(FeeCenter::getAccBillId, accIds)
-				.eq(FeeCenter::getTenantId, AuthUtil.getTenantId())
-				.eq(FeeCenter::getIsDeleted, 0));
-			List<FeeCenter> feeCenterListNew = reconciliationFeeCenter(detail, feeCenterList, 2);
-			feeCenterService.saveOrUpdateBatch(feeCenterListNew);
+			feeCenterService.saveOrUpdateBatch(feeCenterList);
 			finAccBillsService.saveOrUpdateBatch(finAccBillsList);
 		}
 		detail.setStatus(0);
@@ -814,7 +800,11 @@ public class FinInvoicesServiceImpl extends ServiceImpl<FinInvoicesMapper, FinIn
 				item.setUpdateUser(AuthUtil.getUserId());
 				item.setUpdateUserName(AuthUtil.getUserName());
 				if ("USD".equals(item.getCurCode())) {
-					amount = amount.add(item.getCurrentAmount().multiply(finInvoices.getExrate()));
+					if (0 == finInvoices.getIsExchangeToCny()) {
+						amount = amount.add(item.getCurrentAmount().multiply(item.getExrate()));
+					} else {
+						amount = amount.add(item.getCurrentAmount().multiply(finInvoices.getExrate()));
+					}
 				} else {
 					amount = amount.add(item.getCurrentAmount());
 				}