From 684e4306a08feeae188070f264148e6765da8dcf Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期日, 20 九月 2026 19:25:15 +0800
Subject: [PATCH] feat(account): 更新往来付款回款流水表及接口
---
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 169 insertions(+), 4 deletions(-)
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 00e913f..07ab3af 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -12,15 +12,26 @@
import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper;
import com.ruoyi.account.pojo.sales.AccountInvoiceApplication;
import com.ruoyi.account.pojo.sales.AccountSalesCollection;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
+import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
+import com.ruoyi.approve.pojo.ApprovalInstance;
+import com.ruoyi.approve.pojo.ApprovalTemplate;
+import com.ruoyi.approve.service.ApprovalInstanceService;
import com.ruoyi.basic.enums.ApplicationTypeEnum;
import com.ruoyi.basic.enums.RecordTypeEnum;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.mapper.OilDepotMapper;
+import com.ruoyi.basic.mapper.TankInfoMapper;
import com.ruoyi.basic.pojo.Customer;
+import com.ruoyi.basic.pojo.OilDepot;
+import com.ruoyi.basic.pojo.TankInfo;
import com.ruoyi.basic.utils.FileUtil;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.SaleEnum;
+import com.ruoyi.common.enums.SalesQuotationStatusEnum;
+import com.ruoyi.common.enums.TypeEnums;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.EnumUtil;
@@ -89,6 +100,10 @@
private static final String LOCK_PREFIX = "contract_no_lock:";
private static final long LOCK_WAIT_TIMEOUT = 10; // 閿佺瓑寰呰秴鏃舵椂闂达紙绉掞級
private static final long LOCK_EXPIRE_TIME = 30; // 閿佽嚜鍔ㄨ繃鏈熸椂闂达紙绉掞級
+ /** 閿�鍞被鍨嬶細鍗栨补锛堣蛋浜у搧鏄庣粏锛� */
+ private static final String LEDGER_TYPE_OIL = "鍗栨补";
+ /** 閿�鍞被鍨嬶細浠e偍锛堝崠瀛樺偍浣嶇疆锛岃蛋娌瑰簱+鍌ㄧ綈+鎵嬪伐鍚堝悓閲戦锛� */
+ private static final String LEDGER_TYPE_DEPOSIT = "浠e偍";
private final SalesLedgerMapper salesLedgerMapper;
private final CustomerMapper customerMapper;
private final SalesLedgerProductMapper salesLedgerProductMapper;
@@ -106,6 +121,10 @@
private final FileUtil fileUtil;
private final AccountInvoiceApplicationMapper accountInvoiceApplicationMapper;
private final AccountSalesCollectionMapper accountSalesCollectionMapper;
+ private final ApprovalTemplateMapper approvalTemplateMapper;
+ private final ApprovalInstanceService approvalInstanceService;
+ private final OilDepotMapper oilDepotMapper;
+ private final TankInfoMapper tankInfoMapper;
@Autowired
private SysDeptMapper sysDeptMapper;
@@ -123,7 +142,9 @@
@Override
public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
- return salesLedgerMapper.selectSalesLedgerList(salesLedgerDto);
+ List<SalesLedger> list = salesLedgerMapper.selectSalesLedgerList(salesLedgerDto);
+ fillTrustFund(list);
+ return list;
}
public List<SalesLedgerProduct> getSalesLedgerProductListByRelateId(Long relateId, SaleEnum type) {
@@ -303,7 +324,37 @@
@Override
public IPage<SalesLedgerVo> selectSalesLedgerListPage(Page page, SalesLedgerDto salesLedgerDto) {
- return salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+ IPage<SalesLedgerVo> result = salesLedgerMapper.selectSalesLedgerListPage(page, salesLedgerDto);
+ fillTrustFund(result.getRecords());
+ return result;
+ }
+
+ /**
+ * 鍥炲~瀹㈡埛鐨勪俊鎵樺熀閲戯紝骞跺垽鏂湰绗斿悎鍚岄噾棰濇槸鍚﹀凡瓒呭嚭銆�
+ * 瓒呭嚭涓庡惁鐢卞悗绔畻濂借繑鍥烇紝鍓嶇鍙礋璐f爣绾�
+ */
+ private void fillTrustFund(List<? extends SalesLedger> records) {
+ if (CollectionUtils.isEmpty(records)) {
+ return;
+ }
+ List<Long> customerIds = records.stream()
+ .map(SalesLedger::getCustomerId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ if (customerIds.isEmpty()) {
+ return;
+ }
+ Map<Long, BigDecimal> trustFundMap = customerMapper.selectBatchIds(customerIds).stream()
+ .filter(item -> item.getTrustFund() != null)
+ .collect(Collectors.toMap(Customer::getId, Customer::getTrustFund, (existing, replacement) -> existing));
+
+ records.forEach(ledger -> {
+ BigDecimal trustFund = trustFundMap.get(ledger.getCustomerId());
+ ledger.setTrustFund(trustFund);
+ ledger.setExceedsTrustFund(trustFund != null && ledger.getContractAmount() != null
+ && ledger.getContractAmount().compareTo(trustFund) > 0);
+ });
}
@Override
@@ -536,6 +587,19 @@
// 鍒犻櫎闄勪欢琛�
commonFileService.deleteByBusinessIds(idList, FileNameType.SALE.getValue());
+ // 鍒犻櫎鍙拌处瀵瑰簲鐨勫鎵瑰疄渚嬶紙鍚屼竴鍙拌处鍙兘鍙嶅鎻愪氦/閲嶅锛屼細鏈夊鏉★級
+ List<ApprovalInstance> approvalInstances = approvalInstanceService.list(
+ new LambdaQueryWrapper<ApprovalInstance>()
+ .in(ApprovalInstance::getBusinessId, idList)
+ .eq(ApprovalInstance::getBusinessType, TypeEnums.SALES_LEDGER_APPROVAL.getCode())
+ .eq(ApprovalInstance::getDeleted, 0));
+ if (CollectionUtils.isNotEmpty(approvalInstances)) {
+ approvalInstanceService.delete(approvalInstances.stream()
+ .map(ApprovalInstance::getId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList()));
+ }
+
// 鍒犻櫎鐢熶骇绠℃帶鏁版嵁
//鏌ヨ鐢熶骇鎶ュ伐id
ArrayList<Long> mainIdList = productionProductMainService.listMain(idList);
@@ -561,10 +625,13 @@
SalesLedger salesLedger = convertToEntity(salesLedgerDto);
salesLedger.setCustomerName(customer.getCustomerName());
salesLedger.setTenantId(customer.getTenantId());
+ applyLedgerType(salesLedger, salesLedgerDto);
// 褰曞叆浜猴細濡傛灉鏈紶鍒欎娇鐢ㄥ綋鍓嶇櫥褰曠敤鎴�
if (StringUtils.isEmpty(salesLedger.getEntryPerson())) {
salesLedger.setEntryPerson(String.valueOf(SecurityUtils.getUserId()));
}
+ // 鏂板鍜屼慨鏀归兘瑕侀噸鏂拌蛋瀹℃壒
+ salesLedger.setApprovalStatus(SalesQuotationStatusEnum.PENDING.getCode());
// 3. 鏂板鎴栨洿鏂颁富琛�
if (salesLedger.getId() == null) {
String contractNo = salesLedger.getSalesContractNo();
@@ -574,12 +641,19 @@
salesLedger.setSalesContractNo(contractNo);
salesLedgerMapper.insert(salesLedger);
} else {
+ // 鏀瑰崟浼氶噸鏂拌蛋涓�閬嶅鎵癸細鍏堜綔搴熸鍓嶆湭缁撴潫鐨勫鎵瑰疄渚嬶紝浜嬪姟鎻愪氦鍓嶈繕浼氶噸鏂板彂璧�
+ approvalInstanceService.lambdaUpdate()
+ .set(ApprovalInstance::getStatus, "REJECTED")
+ .eq(ApprovalInstance::getBusinessId, salesLedger.getId())
+ .eq(ApprovalInstance::getBusinessType, TypeEnums.SALES_LEDGER_APPROVAL.getCode())
+ .update();
salesLedgerMapper.updateById(salesLedger);
}
- // 4. 澶勭悊瀛愯〃鏁版嵁
- List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
+ // 4. 澶勭悊瀛愯〃鏁版嵁銆備唬鍌ㄦ病鏈変骇鍝佹槑缁嗭紝鍚堝悓閲戦浠ユ墜宸ュ~鍐欑殑涓哄噯锛屼笉鑳借瀛愯〃姹囨�昏鐩�
+ List<SalesLedgerProduct> productList = LEDGER_TYPE_OIL.equals(salesLedger.getLedgerType())
+ ? salesLedgerDto.getProductData() : null;
if (productList != null && !productList.isEmpty()) {
handleSalesLedgerProducts(salesLedger.getId(), productList, EnumUtil.fromCode(SaleEnum.class, salesLedgerDto.getType()));
updateMainContractAmount(
@@ -605,9 +679,100 @@
// 6. 淇濆瓨閿�鍞彴璐﹂檮浠�
fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.SALES_LEDGER, salesLedger.getId(), salesLedgerDto.getStorageBlobDTOs());
+ // 7. 鍙戣捣瀹℃壒銆傚悎鍚岄噾棰濊鍙栬惤搴撳悗鐨勫�硷紙鍗栨补鐨勯噾棰濈敱绗� 4 姝ョ殑浜у搧鏄庣粏姹囨�诲啓鍥烇級
+ SalesLedger savedLedger = salesLedgerMapper.selectById(salesLedger.getId());
+ startSalesLedgerApproval(savedLedger, customer.getTrustFund());
+
return 1;
}
+ /**
+ * 鏍¢獙閿�鍞被鍨嬪苟琛ラ綈浠e偍鐨勬补搴�/鍌ㄧ綈淇℃伅銆�
+ * 鍗栨补锛氬悎鍚岄噾棰濆彧鑳界敱浜у搧鏄庣粏姹囨�讳骇鐢燂紱浠e偍锛氭病鏈夋槑缁嗭紝蹇呴』閫夋补搴撱�佸偍缃愬苟鎵嬪伐濉悎鍚岄噾棰�
+ */
+ private void applyLedgerType(SalesLedger salesLedger, SalesLedgerDto salesLedgerDto) {
+ String ledgerType = salesLedgerDto.getLedgerType();
+ if (StringUtils.isEmpty(ledgerType)) {
+ throw new BaseException("閿�鍞被鍨嬩笉鑳戒负绌�");
+ }
+ if (LEDGER_TYPE_OIL.equals(ledgerType)) {
+ salesLedger.setOilDepotId(null);
+ salesLedger.setOilDepotName(null);
+ salesLedger.setTankId(null);
+ salesLedger.setTankNo(null);
+ // updateById 浼氳烦杩� null锛屽淇敼鏄┖鎿嶄綔锛涙柊澧炴椂涓庢敼閫犲墠涓�鑷达紙鏈氨涓� null锛�
+ salesLedger.setContractAmount(null);
+ return;
+ }
+ if (!LEDGER_TYPE_DEPOSIT.equals(ledgerType)) {
+ throw new BaseException("閿�鍞被鍨嬩笉鍚堟硶:" + ledgerType);
+ }
+ if (salesLedgerDto.getOilDepotId() == null) {
+ throw new BaseException("浠e偍蹇呴』閫夋嫨娌瑰簱");
+ }
+ if (salesLedgerDto.getTankId() == null) {
+ throw new BaseException("浠e偍蹇呴』閫夋嫨鍌ㄧ綈");
+ }
+ if (salesLedgerDto.getContractAmount() == null
+ || salesLedgerDto.getContractAmount().compareTo(BigDecimal.ZERO) <= 0) {
+ throw new BaseException("浠e偍蹇呴』濉啓鍚堝悓閲戦");
+ }
+ OilDepot oilDepot = oilDepotMapper.selectById(salesLedgerDto.getOilDepotId());
+ if (oilDepot == null) {
+ throw new BaseException("娌瑰簱涓嶅瓨鍦�:" + salesLedgerDto.getOilDepotId());
+ }
+ TankInfo tankInfo = tankInfoMapper.selectById(salesLedgerDto.getTankId());
+ if (tankInfo == null) {
+ throw new BaseException("鍌ㄧ綈涓嶅瓨鍦�:" + salesLedgerDto.getTankId());
+ }
+ // 鍚嶇О浠ュ熀纭�鏁版嵁涓哄噯锛屼笉閲囦俊鍓嶇浼犲��
+ salesLedger.setOilDepotName(oilDepot.getDepotName());
+ salesLedger.setTankNo(tankInfo.getTankNo());
+ }
+
+ /**
+ * 鍙戣捣閿�鍞彴璐﹀鎵癸紝璧扮郴缁熷凡鏈夌殑 OA 瀹℃壒娴佺▼銆�
+ * 鍚堝悓閲戦瓒呭嚭瀹㈡埛淇℃墭鍩洪噾鏃讹紝瀹℃壒鏍囬甯︿笂鎻愰啋瀛楃溂
+ */
+ private void startSalesLedgerApproval(SalesLedger ledger, BigDecimal trustFund) {
+ if (ledger == null) {
+ return;
+ }
+ ApprovalTemplate approvalTemplate = approvalTemplateMapper.selectOne(
+ new LambdaQueryWrapper<ApprovalTemplate>()
+ .eq(ApprovalTemplate::getBusinessType, TypeEnums.SALES_LEDGER_APPROVAL.getCode())
+ .eq(ApprovalTemplate::getDeleted, 0)
+ .orderByDesc(ApprovalTemplate::getId)
+ .last("LIMIT 1")
+ );
+ if (approvalTemplate == null) {
+ throw new RuntimeException("璇峰厛閰嶇疆閿�鍞彴璐﹀鎵规ā鏉�");
+ }
+ boolean exceedsTrustFund = trustFund != null && ledger.getContractAmount() != null
+ && ledger.getContractAmount().compareTo(trustFund) > 0;
+ String title = ledger.getSalesContractNo() + "瀹℃壒";
+ if (exceedsTrustFund) {
+ title += "锛堝悎鍚岄噾棰濊秴鍑哄鎴蜂俊鎵樺熀閲戯紝璇烽噸鐐瑰鏍革級";
+ }
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ ApprovalInstanceDto approvalInstance = new ApprovalInstanceDto();
+ approvalInstance.setTemplateId(approvalTemplate.getId());
+ approvalInstance.setTemplateName(approvalTemplate.getTemplateName());
+ approvalInstance.setBusinessId(ledger.getId());
+ approvalInstance.setBusinessType(TypeEnums.SALES_LEDGER_APPROVAL.getCode());
+ approvalInstance.setCurrentLevel(1);
+ approvalInstance.setTitle(title);
+ approvalInstance.setApplicantId(loginUser.getUserId());
+ approvalInstance.setApplicantName(loginUser.getNickName());
+ approvalInstance.setApplyTime(LocalDateTime.now());
+ try {
+ approvalInstanceService.add(approvalInstance);
+ } catch (Exception e) {
+ log.error("SalesLedgerServiceImpl approve error for salesContractNo: {}", ledger.getSalesContractNo(), e);
+ throw new RuntimeException("瀹℃壒澶辫触: " + e.getMessage(), e);
+ }
+ }
+
@Override
public void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, SaleEnum type) {
// 鎸塈D鍒嗙粍锛屽尯鍒嗘柊澧炲拰鏇存柊鐨勮褰�
--
Gitblit v1.9.3