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/purchase/service/impl/PurchaseLedgerServiceImpl.java | 225 +++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 214 insertions(+), 11 deletions(-)
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index f0d1129..553b2fa 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.alibaba.fastjson2.JSON;
import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
import com.ruoyi.approve.mapper.ApprovalTemplateMapper;
import com.ruoyi.approve.pojo.ApprovalInstance;
@@ -15,9 +16,11 @@
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.basic.enums.ApplicationTypeEnum;
import com.ruoyi.basic.enums.RecordTypeEnum;
+import com.ruoyi.basic.mapper.OilDepotMapper;
import com.ruoyi.basic.mapper.ProductMapper;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.mapper.SupplierManageMapper;
+import com.ruoyi.basic.pojo.OilDepot;
import com.ruoyi.basic.pojo.Product;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.basic.pojo.SupplierManage;
@@ -34,6 +37,10 @@
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
+import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRecord;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRecordService;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
@@ -93,6 +100,16 @@
@RequiredArgsConstructor
public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService {
+ /**
+ * 鏄庣粏绫诲瀷锛氶噰璐紙sales_ledger_product.type锛夈�備粎閲囪喘鏄庣粏鎵嶅洖鍐欏浠跺簱瀛�
+ */
+ private static final Integer LEDGER_TYPE_PURCHASE = 2;
+
+ /**
+ * 澶囦欢娴佹按鏉ユ簮锛氶噰璐叆搴撱�傝 spare_parts_record.source_type
+ */
+ private static final Integer SPARE_PARTS_SOURCE_PURCHASE = 1;
+
private final PurchaseLedgerMapper purchaseLedgerMapper;
private final SalesLedgerMapper salesLedgerMapper;
private final SalesLedgerProductMapper salesLedgerProductMapper;
@@ -117,6 +134,9 @@
private final StockInRecordService stockInRecordService;
private final StockUtils stockUtils;
private final ApprovalTemplateMapper approvalTemplateMapper;
+ private final OilDepotMapper oilDepotMapper;
+ private final SparePartsMapper sparePartsMapper;
+ private final SparePartsRecordService sparePartsRecordService;
@Override
public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -170,6 +190,14 @@
purchaseLedger.setSupplierName(supplierManage.getSupplierName());
purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
+ // 閲囪喘娌瑰簱锛氭牴鎹补搴搃d鍥炲~娌瑰簱鍚嶇О
+ if (purchaseLedgerDto.getOilDepotId() != null) {
+ OilDepot oilDepot = oilDepotMapper.selectById(purchaseLedgerDto.getOilDepotId());
+ if (oilDepot != null) {
+ purchaseLedger.setOilDepotName(oilDepot.getDepotName());
+ }
+ }
+
purchaseLedger.setApprovalStatus(1);
// 瀹為檯鍚堝悓閲戦濮嬬粓绛変簬鍚堝悓閲戦
purchaseLedger.setNetContractAmount(purchaseLedger.getContractAmount());
@@ -178,6 +206,8 @@
purchaseLedger.setPurchaseContractNumber(generatePurchaseContractNo(purchaseLedger.getEntryDate()));
}
this.saveOrUpdate(purchaseLedger);
+ // 鍥炲啓涓婚敭锛屼緵璋冪敤鏂癸紙濡傞噰璐敵璇疯浆璁㈠崟锛夎幏鍙栨柊鐢熸垚鐨勯噰璐彴璐d
+ purchaseLedgerDto.setId(purchaseLedger.getId());
// 4. 澶勭悊瀛愯〃鏁版嵁
List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
@@ -194,7 +224,7 @@
.last("limit 1")
);
if(Objects.isNull(oldApprovalInstance)){
- addApproveByPurchase(loginUser, purchaseLedger);
+ addApproveByPurchase(loginUser, purchaseLedger, productList);
}
// 5. 杩佺Щ涓存椂鏂囦欢鍒版寮忕洰褰�
fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.PURCHASE_LEDGER, purchaseLedger.getId(), purchaseLedgerDto.getStorageBlobDTOS());
@@ -695,6 +725,13 @@
salesLedgerProductMapper.insert(salesLedgerProduct);
}
}
+ // 閲囪喘鏄庣粏鍥炲啓澶囦欢锛氬厛鎸夊彴璐﹀洖婊氫笂涓�娆$殑娴佹按锛屽啀鎸夊綋鍓嶆槑缁嗘暣浣撻噸寤恒��
+ // 缂栬緫鏃舵槑缁嗚鍙兘琚Щ闄わ紝鍙鏂板琛屼細婕忔帀绉婚櫎鐨勯偅浜涳紱鏁翠綋閲嶅缓澶╃劧涓庡綋鍓嶆槑缁嗗榻愩��
+ // 娉ㄦ剰杩欐蹇呴』鍦� insertList 涔嬪锛屽惁鍒欍�屽彧鍒犳槑缁嗐�佷笉鏂板銆嶇殑缂栬緫涓嶄細瑙﹀彂鍥炴粴
+ if (LEDGER_TYPE_PURCHASE.equals(ledgerType)) {
+ rollbackSparePartsInbound(salesLedgerId);
+ recordSparePartsInbound(products, purchaseLedger);
+ }
// 璁$畻鎬诲惈绋庨噾棰�
BigDecimal totalTaxInclusiveAmount = products.stream()
@@ -709,6 +746,90 @@
}
}
+ /**
+ * 鎸夐噰璐彴璐﹀洖婊氬浠讹細鎶婅鍙拌处浜х敓鐨勫叆搴撴祦姘撮�愬浠跺噺鍥炲簱瀛橈紝鐒跺悗鍒犻櫎杩欎簺娴佹按銆�
+ *
+ * <p>澶囦欢鍏堢敱閲囪喘鍏ヨ处銆佸悗缁缁翠慨/淇濆吇棰嗙敤鍑鸿处锛岃嫢鍏ヨ处閲忓凡缁忚棰嗙敤鎺夛紝鍑忓洖浼氬嚭鐜拌礋搴撳瓨锛�
+ * 姝ゆ椂鐩存帴鎷︿綇涓嶈鍒狅紝閬垮厤鎶婂浠惰处鍋氳姳銆傚垹闄ゅ彴璐︿笌缂栬緫閲嶅缓閮借蛋杩欓噷锛屽彛寰勭粺涓�銆�</p>
+ */
+ private void rollbackSparePartsInbound(Long ledgerId) {
+ List<SparePartsRecord> records = sparePartsRecordService.list(new LambdaQueryWrapper<SparePartsRecord>()
+ .eq(SparePartsRecord::getSourceType, SPARE_PARTS_SOURCE_PURCHASE)
+ .eq(SparePartsRecord::getSourceId, ledgerId));
+ if (CollectionUtils.isEmpty(records)) {
+ return;
+ }
+ Map<Long, BigDecimal> rollbackBySparePartsId = new HashMap<>();
+ for (SparePartsRecord record : records) {
+ BigDecimal quantity = record.getQuantity() == null ? BigDecimal.ZERO : record.getQuantity();
+ rollbackBySparePartsId.merge(record.getSparePartsId(), quantity, BigDecimal::add);
+ }
+ for (Map.Entry<Long, BigDecimal> entry : rollbackBySparePartsId.entrySet()) {
+ if (entry.getKey() == null) {
+ continue;
+ }
+ SpareParts spareParts = sparePartsMapper.selectById(entry.getKey());
+ if (spareParts == null) {
+ continue;
+ }
+ BigDecimal current = spareParts.getQuantity() == null ? BigDecimal.ZERO : spareParts.getQuantity();
+ if (current.compareTo(entry.getValue()) < 0) {
+ throw new BaseException("澶囦欢銆�" + spareParts.getName() + "銆嶅綋鍓嶅簱瀛� " + current
+ + "锛屼笉瓒充互鍥炴粴鏈閲囪喘鍏ュ簱鐨� " + entry.getValue() + "锛岃鍏堝鐞嗛鐢ㄨ褰�");
+ }
+ spareParts.setQuantity(current.subtract(entry.getValue()));
+ sparePartsMapper.updateById(spareParts);
+ }
+ sparePartsRecordService.removeByIds(records.stream()
+ .map(SparePartsRecord::getId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toList()));
+ }
+
+ /**
+ * 閲囪喘鍙拌处鏄庣粏鎸夎鏍煎尮閰嶅浠讹細绱姞澶囦欢搴撳瓨骞惰涓�鏉″叆搴撴祦姘淬��
+ * 鏈淮鎶よ鏍肩殑澶囦欢涓嶅弬涓庯紝闈欓粯璺宠繃銆�
+ *
+ * <p>璋冪敤鍓嶅繀椤诲厛 {@link #rollbackSparePartsInbound(Long)}锛屼袱鑰呮垚瀵瑰嚭鐜帮細
+ * 鍥炴粴鏃ф祦姘� + 鎸夊綋鍓嶆槑缁嗛噸寤猴紝鎵嶈兘淇濊瘉缂栬緫鍙拌处鍚庡浠舵暟閲忎笌鏄庣粏涓�鑷淬��</p>
+ */
+ private void recordSparePartsInbound(List<SalesLedgerProduct> products, PurchaseLedger purchaseLedger) {
+ List<Long> modelIds = products.stream()
+ .map(SalesLedgerProduct::getProductModelId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ if (modelIds.isEmpty()) {
+ return;
+ }
+ List<SpareParts> sparePartsList = sparePartsMapper.selectList(new LambdaQueryWrapper<SpareParts>()
+ .in(SpareParts::getProductModelId, modelIds));
+ if (CollectionUtils.isEmpty(sparePartsList)) {
+ return;
+ }
+ Map<Long, SpareParts> sparePartsByModelId = sparePartsList.stream()
+ .collect(Collectors.toMap(SpareParts::getProductModelId, s -> s, (a, b) -> a));
+ for (SalesLedgerProduct product : products) {
+ SpareParts spareParts = sparePartsByModelId.get(product.getProductModelId());
+ if (spareParts == null || product.getQuantity() == null
+ || product.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+ continue;
+ }
+ BigDecimal quantity = product.getQuantity();
+ spareParts.setQuantity((spareParts.getQuantity() == null ? BigDecimal.ZERO : spareParts.getQuantity()).add(quantity));
+ sparePartsMapper.updateById(spareParts);
+
+ SparePartsRecord record = new SparePartsRecord();
+ record.setSparePartsId(spareParts.getId());
+ record.setDirection(1);
+ record.setQuantity(quantity);
+ record.setSourceType(1);
+ record.setSourceId(purchaseLedger.getId());
+ record.setSourceNo(purchaseLedger.getPurchaseContractNumber());
+ sparePartsRecordService.save(record);
+ }
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public int deletePurchaseLedgerByIds(Long[] ids) {
@@ -720,6 +841,9 @@
if (purchaseLedger.getApprovalStatus().equals(3)) {
throw new BaseException(purchaseLedger.getPurchaseContractNumber()+"宸茬粡瀹℃壒閫氳繃锛屼笉鍏佽鍒犻櫎");
}
+ // 鍙拌处鍒犻櫎瑕佹妸璇ュ彴璐﹂噰璐叆搴撴椂绱姞鍒板浠朵笂鐨勬暟閲忓噺鍥炲幓锛屽苟鍒犳帀瀵瑰簲娴佹按锛�
+ // 鍚﹀垯澶囦欢搴撳瓨铏氶珮銆佹祦姘存畫鐣欍�傚浠跺凡棰嗙敤瀵艰嚧鍑忓洖涓鸿礋鏃朵細鍦ㄨ繖閲屾嫤浣�
+ rollbackSparePartsInbound(id);
}
// 鎵归噺鍒犻櫎鍏宠仈鐨勯噰璐叆搴撹褰�
LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>();
@@ -1016,7 +1140,12 @@
salesLedgerProductMapper.insert(salesLedgerProduct);
}
// 閲囪喘瀹℃牳
- addApproveByPurchase(loginUser,salesLedger);
+ List<SalesLedgerProduct> snapshotProducts = salesLedgerProductMapper.selectList(
+ new LambdaQueryWrapper<SalesLedgerProduct>()
+ .eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId())
+ .eq(SalesLedgerProduct::getType, 2)
+ );
+ addApproveByPurchase(loginUser, salesLedger, snapshotProducts);
}
return AjaxResult.success("瀵煎叆鎴愬姛");
@@ -1028,21 +1157,91 @@
@Override
public PurchaseLedgerDto getPurchaseByCode(PurchaseLedgerDto purchaseLedgerDto) {
- // 1. 鏌ヨ涓昏〃
- PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
- .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedgerDto.getPurchaseContractNumber())
- .last("LIMIT 1"));
- if (purchaseLedger == null) {
- throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+ PurchaseLedger purchaseLedger = null;
+ ApprovalInstance approvalSnapshotInstance = null;
+
+ // 1. 浼樺厛鎸夊綋鍓嶅鎵瑰疄渚嬫煡璇㈠揩鐓�
+ if (purchaseLedgerDto.getApprovalInstanceId() != null) {
+ approvalSnapshotInstance = approvalInstanceService.getById(purchaseLedgerDto.getApprovalInstanceId());
+ if (approvalSnapshotInstance != null && approvalSnapshotInstance.getBusinessId() != null) {
+ purchaseLedger = purchaseLedgerMapper.selectById(approvalSnapshotInstance.getBusinessId());
+ }
}
- // 2. 鏌ヨ瀛愯〃
+ // 2. 娌′紶瀹℃壒瀹炰緥ID鏃讹紝閫�鍥炲埌鎸夐噰璐悎鍚屽彿鏌ヨ
+ if (purchaseLedger == null) {
+ purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
+ .eq(PurchaseLedger::getPurchaseContractNumber, purchaseLedgerDto.getPurchaseContractNumber())
+ .last("LIMIT 1"));
+ if (purchaseLedger == null) {
+ throw new BaseException("閲囪喘鍙拌处涓嶅瓨鍦�");
+ }
+ }
+
+ // 3. 鏌ヨ褰撳墠閲囪喘鍗曞搴旂殑瀹℃壒蹇収
+ if (approvalSnapshotInstance == null) {
+ approvalSnapshotInstance = approvalInstanceService.getOne(new LambdaQueryWrapper<ApprovalInstance>()
+ .eq(ApprovalInstance::getBusinessId, purchaseLedger.getId())
+ .eq(ApprovalInstance::getBusinessType, 5L)
+ .eq(ApprovalInstance::getDeleted, 0)
+ .orderByDesc(ApprovalInstance::getId)
+ .last("LIMIT 1"));
+ }
+
+ if (approvalSnapshotInstance != null && StringUtils.hasText(approvalSnapshotInstance.getFormConfig())) {
+ try {
+ PurchaseLedgerDto snapshot = JSON.parseObject(approvalSnapshotInstance.getFormConfig(), PurchaseLedgerDto.class);
+ if (snapshot != null) {
+ snapshot.setId(purchaseLedger.getId());
+ if (snapshot.getPurchaseContractNumber() == null) {
+ snapshot.setPurchaseContractNumber(purchaseLedger.getPurchaseContractNumber());
+ }
+ if (snapshot.getSupplierId() == null) {
+ snapshot.setSupplierId(purchaseLedger.getSupplierId());
+ }
+ if (snapshot.getSupplierName() == null) {
+ snapshot.setSupplierName(purchaseLedger.getSupplierName());
+ }
+ if (snapshot.getSalesContractNo() == null) {
+ snapshot.setSalesContractNo(purchaseLedger.getSalesContractNo());
+ }
+ if (snapshot.getSalesContractNoId() == null) {
+ snapshot.setSalesContractNoId(purchaseLedger.getSalesLedgerId());
+ }
+ if (snapshot.getProjectName() == null) {
+ snapshot.setProjectName(purchaseLedger.getProjectName());
+ }
+ if (snapshot.getEntryDate() == null) {
+ snapshot.setEntryDate(purchaseLedger.getEntryDate());
+ }
+ if (snapshot.getExecutionDate() == null) {
+ snapshot.setExecutionDate(purchaseLedger.getExecutionDate());
+ }
+ if (snapshot.getRemarks() == null) {
+ snapshot.setRemarks(purchaseLedger.getRemarks());
+ }
+ if (snapshot.getRecorderId() == null) {
+ snapshot.setRecorderId(purchaseLedger.getRecorderId());
+ }
+ if (snapshot.getRecorderName() == null) {
+ snapshot.setRecorderName(purchaseLedger.getRecorderName());
+ }
+ snapshot.setProductData(snapshot.getProductData() == null ? Collections.emptyList() : snapshot.getProductData());
+ snapshot.setHasChildren(CollectionUtils.isNotEmpty(snapshot.getProductData()));
+ return snapshot;
+ }
+ } catch (Exception e) {
+ log.warn("瑙f瀽閲囪喘瀹℃壒蹇収澶辫触: {}", e.getMessage());
+ }
+ }
+
+ // 4. 鏌ヨ瀛愯〃
LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId())
.eq(SalesLedgerProduct::getType, 2);
List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
- // 4. 杞崲 DTO
+ // 5. 杞崲 DTO
PurchaseLedgerDto resultDto = new PurchaseLedgerDto();
BeanUtils.copyProperties(purchaseLedger, resultDto);
if (!products.isEmpty()) {
@@ -1052,7 +1251,7 @@
return resultDto;
}
- public void addApproveByPurchase(LoginUser loginUser,PurchaseLedger purchaseLedger) {
+ public void addApproveByPurchase(LoginUser loginUser, PurchaseLedger purchaseLedger, List<SalesLedgerProduct> productList) {
if (loginUser == null) {
return;
}
@@ -1077,6 +1276,10 @@
approvalInstance.setTitle(purchaseLedger.getPurchaseContractNumber()+"瀹℃壒");
approvalInstance.setApplicantName(loginUser.getNickName());
approvalInstance.setApplyTime(LocalDateTime.now());
+ PurchaseLedgerDto snapshot = new PurchaseLedgerDto();
+ BeanUtils.copyProperties(purchaseLedger, snapshot);
+ snapshot.setProductData(productList == null ? Collections.emptyList() : new ArrayList<>(productList));
+ approvalInstance.setFormConfig(JSON.toJSONString(snapshot));
approvalInstanceService.add(approvalInstance);
}
--
Gitblit v1.9.3