From 03ffc2598a261d1dc19e77b559268bb84032a389 Mon Sep 17 00:00:00 2001
From: liyong <18434998025@163.com>
Date: 星期二, 21 四月 2026 08:51:45 +0800
Subject: [PATCH] feat(approve): 新增销售审批功能并优化审批流程
---
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 140 +++++++++++++++++++++++++++++++++++++---------
1 files changed, 112 insertions(+), 28 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 e2c11cf..fd21bb8 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,6 +9,9 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.account.service.AccountIncomeService;
+import com.ruoyi.approve.pojo.ApproveProcess;
+import com.ruoyi.approve.service.IApproveProcessService;
+import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.basic.dto.CustomerPrivatePoolDto;
import com.ruoyi.basic.mapper.CustomerMapper;
import com.ruoyi.basic.mapper.CustomerPrivatePoolMapper;
@@ -85,34 +88,64 @@
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 final AccountIncomeService accountIncomeService;
- private final SalesLedgerMapper salesLedgerMapper;
- private final CustomerMapper customerMapper;
- private final SalesLedgerProductMapper salesLedgerProductMapper;
- private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl;
- private final CommonFileMapper commonFileMapper;
- private final TempFileMapper tempFileMapper;
- private final ReceiptPaymentMapper receiptPaymentMapper;
- private final ShippingInfoServiceImpl shippingInfoServiceImpl;
- private final CommonFileServiceImpl commonFileService;
- private final ShippingInfoMapper shippingInfoMapper;
- private final InvoiceLedgerMapper invoiceLedgerMapper;
- private final SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
- private final SalesLedgerWorkMapper salesLedgerWorkMapper;
- private final SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
- private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
- private final InvoiceRegistrationMapper invoiceRegistrationMapper;
- private final ProductOrderMapper productOrderMapper;
- private final ProcessRouteMapper processRouteMapper;
- private final ProductProcessRouteMapper productProcessRouteMapper;
- private final ProcessRouteItemMapper processRouteItemMapper;
- private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
- private final ProductWorkOrderMapper productWorkOrderMapper;
- private final ProductionProductMainMapper productionProductMainMapper;
- private final ProductionProductOutputMapper productionProductOutputMapper;
- private final ProductionProductInputMapper productionProductInputMapper;
- private final QualityInspectMapper qualityInspectMapper;
- private final RedisTemplate<String, String> redisTemplate;
+ @Autowired
+ private AccountIncomeService accountIncomeService;
+ @Autowired
+ private SalesLedgerMapper salesLedgerMapper;
+ @Autowired
+ private CustomerMapper customerMapper;
+ @Autowired
+ private SalesLedgerProductMapper salesLedgerProductMapper;
+ @Autowired
+ private SalesLedgerProductServiceImpl salesLedgerProductServiceImpl;
+ @Autowired
+ private CommonFileMapper commonFileMapper;
+ @Autowired
+ private TempFileMapper tempFileMapper;
+ @Autowired
+ private ReceiptPaymentMapper receiptPaymentMapper;
+ @Autowired
+ private ShippingInfoServiceImpl shippingInfoServiceImpl;
+ @Autowired
+ private CommonFileServiceImpl commonFileService;
+ @Autowired
+ private ShippingInfoMapper shippingInfoMapper;
+ @Autowired
+ private InvoiceLedgerMapper invoiceLedgerMapper;
+ @Autowired
+ private SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
+ @Autowired
+ private SalesLedgerWorkMapper salesLedgerWorkMapper;
+ @Autowired
+ private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
+ @Autowired
+ private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
+ @Autowired
+ private InvoiceRegistrationMapper invoiceRegistrationMapper;
+ @Autowired
+ private ProductOrderMapper productOrderMapper;
+ @Autowired
+ private ProcessRouteMapper processRouteMapper;
+ @Autowired
+ private ProductProcessRouteMapper productProcessRouteMapper;
+ @Autowired
+ private ProcessRouteItemMapper processRouteItemMapper;
+ @Autowired
+ private ProductProcessRouteItemMapper productProcessRouteItemMapper;
+ @Autowired
+ private ProductWorkOrderMapper productWorkOrderMapper;
+ @Autowired
+ private ProductionProductMainMapper productionProductMainMapper;
+ @Autowired
+ private ProductionProductOutputMapper productionProductOutputMapper;
+ @Autowired
+ private ProductionProductInputMapper productionProductInputMapper;
+ @Autowired
+ private QualityInspectMapper qualityInspectMapper;
+ @Autowired
+ private RedisTemplate<String, String> redisTemplate;
+ @Autowired
+ private IApproveProcessService approveProcessService;
@Autowired
private SysDeptMapper sysDeptMapper;
@Value("${file.upload-dir}")
@@ -502,6 +535,32 @@
return salesLedgerDtoIPage;
}
+ @Override
+ public SalesLedgerDto getSalesByCode(SalesLedgerDto salesLedgerDto) {
+ // 1. 鏌ヨ涓昏〃
+ SalesLedger salesLedger = salesLedgerMapper.selectOne(new LambdaQueryWrapper<SalesLedger>()
+ .eq(SalesLedger::getSalesContractNo, salesLedgerDto.getSalesContractNo())
+ .last("LIMIT 1"));
+ if (salesLedger == null) {
+ throw new BaseException("閿�鍞彴璐︿笉瀛樺湪");
+ }
+
+ // 2. 鏌ヨ瀛愯〃
+ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
+ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId())
+ .eq(SalesLedgerProduct::getType, 1);
+ List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
+
+ // 4. 杞崲 DTO
+ SalesLedgerDto resultDto = new SalesLedgerDto();
+ BeanUtils.copyProperties(salesLedger, resultDto);
+ if (!products.isEmpty()) {
+ resultDto.setHasChildren(true);
+ resultDto.setProductData(products);
+ }
+ return resultDto;
+ }
+
/**
* 涓嬪垝绾垮懡鍚嶈浆椹煎嘲鍛藉悕
*/
@@ -614,9 +673,21 @@
salesLedger.setSalesContractNo(contractNo);
salesLedgerMapper.insert(salesLedger);
} else {
+ ApproveProcess one = approveProcessService.getOne(new LambdaQueryWrapper<ApproveProcess>()
+ .eq(ApproveProcess::getApproveType, 9)
+ .eq(ApproveProcess::getApproveReason, salesLedger.getSalesContractNo())
+ .eq(ApproveProcess::getApproveDelete, 0)
+ .last("limit 1"));
+ if (one != null) {
+ approveProcessService.delByIds(Collections.singletonList(one.getId()));
+ }
salesLedgerMapper.updateById(salesLedger);
}
+ LoginUser loginUser = SecurityUtils.getLoginUser();
+ addApproveByPurchase(loginUser, salesLedger);
+ salesLedger.setApprovalStatus(1);
+ this.updateById(salesLedger);
// 4. 澶勭悊瀛愯〃鏁版嵁
List<SalesLedgerProduct> productList = salesLedgerDto.getProductData();
if (productList != null && !productList.isEmpty()) {
@@ -637,9 +708,22 @@
return 1;
} catch (IOException e) {
throw new BaseException("鏂囦欢杩佺Щ澶辫触: " + e.getMessage());
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
}
+ public void addApproveByPurchase(LoginUser loginUser, SalesLedger salesLedger) throws Exception {
+ ApproveProcessVO approveProcessVO = new ApproveProcessVO();
+ approveProcessVO.setApproveType(9);
+ approveProcessVO.setApproveDeptId(loginUser.getDeptIds()[0]);
+ approveProcessVO.setApproveReason(salesLedger.getSalesContractNo());
+ approveProcessVO.setApproveUserIds(salesLedger.getApproveUserIds());
+ approveProcessVO.setApproveUser(loginUser.getUserId());
+ approveProcessVO.setApproveTime(LocalDate.now().toString());
+ approveProcessService.addApprove(approveProcessVO);
+ }
+
/**
* 灏嗕复鏃舵枃浠惰縼绉诲埌姝e紡鐩綍
*
--
Gitblit v1.9.3