From f350465db70d6f9db9494483ee0cec7793a9007b Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 19 八月 2026 17:47:57 +0800
Subject: [PATCH] feat(approve): 实现审批流程或签会签功能并优化数据库配置
---
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java | 599 +++++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 412 insertions(+), 187 deletions(-)
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
index 9acc594..28eff5e 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -6,14 +6,17 @@
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.approve.bean.vo.ApproveProcessConfigNodeVo;
import com.ruoyi.approve.mapper.ApproveNodeMapper;
import com.ruoyi.approve.mapper.ApproveProcessMapper;
import com.ruoyi.approve.pojo.ApproveNode;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.approve.service.IApproveNodeService;
-import com.ruoyi.approve.vo.ApproveProcessVO;
+import com.ruoyi.collaborativeApproval.mapper.SealApplicationManagementMapper;
+import com.ruoyi.collaborativeApproval.pojo.SealApplicationManagement;
import com.ruoyi.common.enums.FileNameType;
-import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
+import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceRepair;
@@ -24,64 +27,59 @@
import com.ruoyi.project.system.service.ISysNoticeService;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
-import com.ruoyi.purchase.service.impl.PurchaseLedgerServiceImpl;
-import com.ruoyi.sales.mapper.*;
+import com.ruoyi.quality.mapper.QualityInspectMapper;
+import com.ruoyi.quality.mapper.QualityInspectParamMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardMapper;
+import com.ruoyi.quality.mapper.QualityTestStandardParamMapper;
+import com.ruoyi.quality.pojo.QualityInspect;
+import com.ruoyi.quality.pojo.QualityInspectParam;
+import com.ruoyi.quality.pojo.QualityTestStandard;
+import com.ruoyi.quality.pojo.QualityTestStandardParam;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.mapper.SalesQuotationMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.io.IOException;
import java.time.LocalDateTime;
-import java.util.Arrays;
+import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
@Service
-//@RequiredArgsConstructor
+@RequiredArgsConstructor
public class ApproveNodeServiceImpl extends ServiceImpl<ApproveNodeMapper, ApproveNode> implements IApproveNodeService {
- @Autowired
- private ApproveNodeMapper approveNodeMapper;
- @Autowired
- private ApproveProcessMapper approveProcessMapper;
- @Autowired
- private SysUserMapper sysUserMapper;
-
- @Autowired
- private TempFileServiceImpl tempFileService;
- @Autowired
- private ISysNoticeService sysNoticeService;
-
- @Autowired
- private CommonFileMapper fileMapper;
- @Autowired
- private DeviceRepairMapper deviceRepairMapper;
-
- @Autowired
- private PurchaseLedgerMapper purchaseLedgerMapper;
-
- @Autowired
- private SalesQuotationMapper salesQuotationMapper;
-
- @Autowired
- private ShippingInfoMapper shippingInfoMapper;
-
- @Autowired
- private CommonFileServiceImpl commonFileService;
- @Autowired
- private StockUtils stockUtils;
- @Autowired
- private SalesLedgerProductMapper salesLedgerProductMapper;
-
- @Autowired
- private PurchaseLedgerServiceImpl purchaseLedgerServiceImpl;
+ private final ApproveNodeMapper approveNodeMapper;
+ private final ApproveProcessMapper approveProcessMapper;
+ private final SysUserMapper sysUserMapper;
+ private final TempFileServiceImpl tempFileService;
+ private final ISysNoticeService sysNoticeService;
+ private final CommonFileMapper fileMapper;
+ private final DeviceRepairMapper deviceRepairMapper;
+ private final PurchaseLedgerMapper purchaseLedgerMapper;
+ private final SalesQuotationMapper salesQuotationMapper;
+ private final ShippingInfoMapper shippingInfoMapper;
+ private final CommonFileServiceImpl commonFileService;
+ private final StockUtils stockUtils;
+ private final SalesLedgerProductMapper salesLedgerProductMapper;
+ private final QualityInspectMapper qualityInspectMapper;
+ private final QualityTestStandardMapper qualityTestStandardMapper;
+ private final QualityTestStandardParamMapper qualityTestStandardParamMapper;
+ private final QualityInspectParamMapper qualityInspectParamMapper;
+ private final SealApplicationManagementMapper sealApplicationManagementMapper;
public ApproveProcess getApproveById(String id) {
@@ -95,26 +93,70 @@
}
@Override
- public void initApproveNodes(String approveUserIds,String approveID,Long tenantId) {
+ public void initApproveNodes(String approveUserIds, String approveID, Long tenantId) {
+ if (approveUserIds == null || approveUserIds.isEmpty()) {
+ return;
+ }
+ List<ApproveProcessConfigNodeVo> config = new ArrayList<>();
+ String[] ids = approveUserIds.split(",");
+ for (int i = 0; i < ids.length; i++) {
+ if (ids[i] == null || ids[i].trim().isEmpty()) {
+ continue;
+ }
+ ApproveProcessConfigNodeVo vo = new ApproveProcessConfigNodeVo();
+ vo.setNodeOrder(i + 1);
+ vo.setApproverId(Long.parseLong(ids[i].trim()));
+ vo.setApproveMode("or");
+ config.add(vo);
+ }
+ initApproveNodes(config, approveID, tenantId);
+ }
+
+ @Override
+ public void initApproveNodes(List<ApproveProcessConfigNodeVo> config, String approveID, Long tenantId) {
Long userId = SecurityUtils.getLoginUser().getUser().getUserId();
- String[] names = approveUserIds.split(",");
- for (int i = 0; i < names.length; i++) {
- SysUser sysUser = sysUserMapper.selectUserById(Long.parseLong(names[i]));
- if (sysUser == null) continue;
- ApproveNode approveNode = new ApproveNode();
- approveNode.setApproveProcessId(approveID);
- approveNode.setApproveNodeOrder(i +1);
- approveNode.setApproveNodeUser(sysUser.getNickName());
- approveNode.setApproveNodeUserId(sysUser.getUserId());
- approveNode.setApproveNodeTime(new Date());
- approveNode.setApproveNodeStatus(0);
- approveNode.setTenantId(tenantId);
- approveNode.setDeleteFlag(0);
- approveNode.setCreateUser(userId);
- approveNode.setUpdateUser(userId);
- approveNode.setCreateTime(LocalDateTime.now());
- approveNode.setUpdateTime(LocalDateTime.now());
- approveNodeMapper.insert(approveNode);
+ // 鎸夎妭鐐归『搴忓垎缁勶紝淇濊瘉鍚屼竴鑺傜偣鐨勫瀹℃壒浜哄啓鍏ョ浉鍚� approveNodeOrder
+ Map<Integer, List<ApproveProcessConfigNodeVo>> groups = new LinkedHashMap<>();
+ for (ApproveProcessConfigNodeVo vo : config) {
+ if (vo.getApproverId() == null) {
+ continue;
+ }
+ int order = vo.getNodeOrder() == null ? groups.size() + 1 : vo.getNodeOrder();
+ groups.computeIfAbsent(order, k -> new ArrayList<>()).add(vo);
+ }
+ for (Map.Entry<Integer, List<ApproveProcessConfigNodeVo>> entry : groups.entrySet()) {
+ Integer order = entry.getKey();
+ String mode = entry.getValue().get(0).getApproveMode();
+ if (mode == null || mode.isEmpty()) {
+ mode = "or";
+ }
+ List<Long> seenIds = new ArrayList<>();
+ for (ApproveProcessConfigNodeVo vo : entry.getValue()) {
+ Long approverId = vo.getApproverId();
+ if (seenIds.contains(approverId)) {
+ continue;
+ }
+ seenIds.add(approverId);
+ SysUser sysUser = sysUserMapper.selectUserById(approverId);
+ if (sysUser == null) {
+ continue;
+ }
+ ApproveNode approveNode = new ApproveNode();
+ approveNode.setApproveProcessId(approveID);
+ approveNode.setApproveNodeOrder(order);
+ approveNode.setApproveMode(mode);
+ approveNode.setApproveNodeUser(sysUser.getNickName());
+ approveNode.setApproveNodeUserId(sysUser.getUserId());
+ approveNode.setApproveNodeTime(new Date());
+ approveNode.setApproveNodeStatus(0);
+ approveNode.setTenantId(tenantId);
+ approveNode.setDeleteFlag(0);
+ approveNode.setCreateUser(userId);
+ approveNode.setUpdateUser(userId);
+ approveNode.setCreateTime(LocalDateTime.now());
+ approveNode.setUpdateTime(LocalDateTime.now());
+ approveNodeMapper.insert(approveNode);
+ }
}
}
@@ -123,90 +165,56 @@
LambdaQueryWrapper<ApproveNode> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ApproveNode::getApproveProcessId, id);
queryWrapper.eq(ApproveNode::getDeleteFlag, 0);
-// queryWrapper.eq(ApproveNode::getApproveNodeStatus, 0);
List<ApproveNode> list = list(queryWrapper);
- // 鎸夌収 approveNodeOrder 瀛楁鍗囧簭鎺掑簭
- list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder));
- LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
- approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, id)
- .eq(ApproveProcess::getApproveDelete, 0)
-// .eq(ApproveProcess::getApproveStatus, 0)
- .last("limit 1");
- ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper);
- if(approveProcess != null && approveProcess.getApproveStatus() == 3){
+ // 鎸� approveNodeOrder 鍗囧簭銆佸悓鑺傜偣鎸� id 鍗囧簭锛屼繚璇佸悓鑺傜偣澶氬鎵逛汉椤哄簭绋冲畾
+ list.sort(Comparator.comparingInt(ApproveNode::getApproveNodeOrder).thenComparingLong(ApproveNode::getId));
+ bindNodeUrl(list);
+ ApproveProcess approveProcess = getApproveById(id);
+ if (approveProcess == null || approveProcess.getApproveStatus() == 2
+ || approveProcess.getApproveStatus() == 3 || approveProcess.getApproveStatus() == 4) {
+ // 娴佺▼宸插畬鎴�/椹冲洖/閲嶆柊鎻愪氦锛屽叏閮ㄥ彧璇�
return list;
}
+ Integer currentOrder = pendingOrder(id);
+ Long loginUserId = SecurityUtils.getLoginUser().getUser().getUserId();
+ boolean admin = SecurityUtils.isAdmin(loginUserId);
+ boolean ishenSet = false;
for (ApproveNode approveNode : list) {
- List<CommonFile> commonFiles = fileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
- .eq(CommonFile::getCommonId, approveNode.getId())
- .eq(CommonFile::getType, FileNameType.ApproveNode.getValue()));
- if(!CollectionUtils.isEmpty(commonFiles)){
- approveNode.setUrl(commonFiles.get(0).getUrl());
+ // 绠$悊鍛樹笉鍙楀鎵逛汉闄愬埗锛氫唬瀹″綋鍓嶈妭鐐归涓緟瀹¤褰曪紙鏁磋妭鐐逛唬瀹$敱 updateApproveNode 瀹屾垚锛�
+ if (approveNode.getApproveNodeOrder().equals(currentOrder)
+ && approveNode.getApproveNodeStatus() == 0
+ && (admin || approveNode.getApproveNodeUserId().equals(loginUserId))
+ && !ishenSet) {
+ approveNode.setIsShen(true);
+ ishenSet = true;
}
- if(approveNode.getApproveNodeStatus() == 1){
- continue;
- }
- approveNode.setIsShen(true);
- break;
}
return list;
}
- public void updateApproveProcessStatus(ApproveNode approveNode,Integer status) throws IOException {
- LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
- approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())
- .eq(ApproveProcess::getApproveDelete, 0)
- .eq(ApproveProcess::getApproveStatus, 0)
- .last("limit 1");
- ApproveProcess approveProcess = approveProcessMapper.selectOne(approveProcessLambdaQueryWrapper);
- if(approveProcess == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�");
- LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
- approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approveNode.getApproveProcessId())
- .eq(ApproveNode::getApproveNodeOrder, approveNode.getApproveNodeOrder() + 1)
- .eq(ApproveNode::getDeleteFlag, 0)
- .eq(ApproveNode::getApproveNodeStatus, 0)
- .last("limit 1");
- ApproveNode approveNode1 = approveNodeMapper.selectOne(approveNodeLambdaQueryWrapper);
- approveProcess.setApproveStatus(status);
- if(approveNode1 != null){
- approveProcess.setApproveUserCurrentId(approveNode1.getApproveNodeUserId());
- approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser());
- }
- if(approveProcess.getApproveStatus().equals(2) || approveProcess.getApproveStatus().equals(3) || approveProcess.getApproveStatus().equals(4)){
- approveProcess.setApproveOverTime(new Date());
- }
- approveProcessMapper.updateById(approveProcess);
-
- DeviceRepair deviceRepair = deviceRepairMapper.selectById(approveProcess.getDeviceRepairId());
- if(ObjectUtils.isNotNull(deviceRepair)) {
- if(approveProcess.getApproveStatus().equals(2)){
- // 鍚屾剰
- deviceRepair.setStatus(1);
- }else if(approveProcess.getApproveStatus().equals(3)){
- // 鎷掔粷
- deviceRepair.setStatus(2);
- }
- deviceRepairMapper.updateById(deviceRepair);
- }
-
- //閲囪喘瀹℃牳
- if(approveProcess.getApproveType().equals(5)){
+ /**
+ * 涓氬姟鍥炶皟锛氭寜瀹℃壒绫诲瀷鏇存柊瀵瑰簲涓氬姟鍗曟嵁鐘舵��
+ * status: 1=瀹℃牳涓�(浼氱閮ㄥ垎閫氳繃), 2=瀹℃牳瀹屾垚(鍚屾剰), 3=瀹℃牳鏈�氳繃(鎷掔粷)
+ */
+ private void applyBusinessStatus(ApproveProcess approveProcess, Integer status) {
+ // 閲囪喘瀹℃壒
+ if (approveProcess.getApproveType().equals(5)) {
PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectOne(new LambdaQueryWrapper<PurchaseLedger>()
.eq(PurchaseLedger::getPurchaseContractNumber, approveProcess.getApproveReason())
.last("limit 1"));
- if(purchaseLedger != null) {
+ if (purchaseLedger != null) {
if (status.equals(2)) {
- // 鍚屾剰
+ // 鍚屾剰锛氱敓鎴愯川妫�/鍏ュ簱
purchaseLedger.setApprovalStatus(3);
List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>()
.lambda().eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()).eq(SalesLedgerProduct::getType, 2));
for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) {
- // 璐ㄦ
if (salesLedgerProduct.getIsChecked()) {
- purchaseLedgerServiceImpl.addQualityInspect(purchaseLedger, salesLedgerProduct);
- }else {
- //鐩存帴鍏ュ簱
- stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId());
+ addQualityInspect(purchaseLedger, salesLedgerProduct);
+ } else {
+ // 鐩存帴鍏ュ簱
+ stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(),
+ StockInQualifiedRecordTypeEnum.PURCHASE_STOCK_IN.getCode(), purchaseLedger.getId(), "-", "-", "-");
}
}
} else if (status.equals(3)) {
@@ -220,78 +228,265 @@
}
}
// 閿�鍞姤浠风姸鎬佷慨鏀�
- if(approveProcess.getApproveType().equals(6)){
+ if (approveProcess.getApproveType().equals(6)) {
SalesQuotation salesQuote = salesQuotationMapper.selectOne(new LambdaQueryWrapper<SalesQuotation>()
.eq(SalesQuotation::getQuotationNo, approveProcess.getApproveReason())
.last("limit 1"));
- // 鍚屾剰
- if(status.equals(2) && salesQuote != null){
- salesQuote.setStatus("閫氳繃");
- }else if(status.equals(3) && salesQuote != null){
- salesQuote.setStatus("鎷掔粷");
- }else if(status.equals(1) && salesQuote != null){
- salesQuote.setStatus("瀹℃牳涓�");
- }
- salesQuotationMapper.updateById(salesQuote);
- }
- // 鍑哄簱瀹℃壒淇敼
- if(approveProcess.getApproveType().equals(7)){
- String[] split = approveProcess.getApproveReason().split(":");
- ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
- .eq(ShippingInfo::getShippingNo, split[1])
- .orderByDesc(ShippingInfo::getCreateTime)
- .last("limit 1"));
- if(shippingInfo != null){
- if(status.equals(2)){
- shippingInfo.setStatus("瀹℃牳閫氳繃");
- }else if(status.equals(3)){
- shippingInfo.setStatus("瀹℃牳鎷掔粷");
- }else if(status.equals(1)){
- shippingInfo.setStatus("瀹℃牳涓�");
+ if (salesQuote != null) {
+ if (status.equals(2)) {
+ salesQuote.setStatus("閫氳繃");
+ } else if (status.equals(3)) {
+ salesQuote.setStatus("鎷掔粷");
+ } else if (status.equals(1)) {
+ salesQuote.setStatus("瀹℃牳涓�");
}
- shippingInfoMapper.updateById(shippingInfo);
+ salesQuotationMapper.updateById(salesQuote);
}
-
}
- // 缁戝畾闄勪欢
- if(!CollectionUtils.isEmpty(approveNode.getTempFileIds()) && approveNode.getApproveNodeStatus() == 1){
- tempFileService.migrateTempFilesToFormal(approveNode.getId(), approveNode.getTempFileIds(), FileNameType.ApproveNode.getValue());
+ // 鍑哄簱瀹℃壒鐘舵�佷慨鏀�
+ if (approveProcess.getApproveType().equals(7)) {
+ String[] split = approveProcess.getApproveReason().split(":");
+ if (split.length > 1) {
+ ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>()
+ .eq(ShippingInfo::getShippingNo, split[1])
+ .orderByDesc(ShippingInfo::getCreateTime)
+ .last("limit 1"));
+ if (shippingInfo != null) {
+ if (status.equals(2)) {
+ shippingInfo.setStatus("瀹℃牳閫氳繃");
+ } else if (status.equals(3)) {
+ shippingInfo.setStatus("瀹℃牳鎷掔粷");
+ } else if (status.equals(1)) {
+ shippingInfo.setStatus("瀹℃牳涓�");
+ }
+ shippingInfoMapper.updateById(shippingInfo);
+ }
+ }
+ }
+ // 鐢ㄥ嵃瀹℃壒鐘舵�佷慨鏀�
+ if (approveProcess.getApproveType().equals(9)) {
+ SealApplicationManagement seal = sealApplicationManagementMapper.selectOne(new LambdaQueryWrapper<SealApplicationManagement>()
+ .eq(SealApplicationManagement::getApproveProcessId, approveProcess.getId())
+ .last("limit 1"));
+ if (seal != null) {
+ if (status.equals(2)) {
+ seal.setStatus("approved");
+ } else if (status.equals(3)) {
+ seal.setStatus("rejected");
+ } else if (status.equals(1)) {
+ seal.setStatus("pending");
+ }
+ sealApplicationManagementMapper.updateById(seal);
+ }
+ }
+ }
+
+ /**
+ * 褰撳墠寰呭鎵硅妭鐐瑰簭鍙凤細鎵�鏈夋湭瀹℃壒鑺傜偣涓渶灏忕殑 approveNodeOrder
+ */
+ private Integer pendingOrder(String approveId) {
+ return list(new LambdaQueryWrapper<ApproveNode>()
+ .eq(ApproveNode::getApproveProcessId, approveId)
+ .eq(ApproveNode::getDeleteFlag, 0)
+ .eq(ApproveNode::getApproveNodeStatus, 0))
+ .stream()
+ .map(ApproveNode::getApproveNodeOrder)
+ .min(Integer::compareTo)
+ .orElse(null);
+ }
+
+ /**
+ * 鏌ヨ鎸囧畾娴佺▼鎸囧畾鑺傜偣鐨勫叏閮ㄥ鎵硅妭鐐癸紙鍚岃妭鐐瑰瀹℃壒浜猴紝鎸� id 鍗囧簭锛�
+ */
+ private List<ApproveNode> nodesByOrder(String approveId, Integer order) {
+ return list(new LambdaQueryWrapper<ApproveNode>()
+ .eq(ApproveNode::getApproveProcessId, approveId)
+ .eq(ApproveNode::getApproveNodeOrder, order)
+ .eq(ApproveNode::getDeleteFlag, 0)
+ .orderByAsc(ApproveNode::getId));
+ }
+
+ /**
+ * 璁剧疆娴佺▼褰撳墠鑺傜偣寰呭浜猴紙澶氬�奸�楀彿鍒嗛殧锛屽吋瀹规棫鐨勫崟鍊煎瓧娈碉級
+ */
+ private void setCurrentApprovers(ApproveProcess approveProcess, List<ApproveNode> nodes) {
+ if (nodes == null || nodes.isEmpty()) {
+ approveProcess.setApproveUserCurrentIds(null);
+ approveProcess.setApproveUserCurrentNames(null);
+ approveProcess.setApproveUserCurrentId(null);
+ approveProcess.setApproveUserCurrentName(null);
+ return;
+ }
+ approveProcess.setApproveUserCurrentIds(nodes.stream().map(ApproveNode::getApproveNodeUserId)
+ .map(String::valueOf).collect(Collectors.joining(",")));
+ approveProcess.setApproveUserCurrentNames(nodes.stream().map(ApproveNode::getApproveNodeUser)
+ .collect(Collectors.joining(",")));
+ approveProcess.setApproveUserCurrentId(nodes.get(0).getApproveNodeUserId());
+ approveProcess.setApproveUserCurrentName(nodes.get(0).getApproveNodeUser());
+ }
+
+ /**
+ * 閫氱煡褰撳墠鑺傜偣鍏ㄩ儴寰呭浜�
+ */
+ private void notifyApproveUsers(List<Long> userIds, ApproveProcess approveProcess) {
+ if (userIds == null || userIds.isEmpty()) {
+ return;
+ }
+ List<Long> ids = userIds.stream().distinct().collect(Collectors.toList());
+ if (approveProcess.getApproveType() == 8) {
+ sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
+ approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
+ ids,
+ "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
+ } else {
+ sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
+ approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
+ ids,
+ "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
+ }
+ }
+
+ /**
+ * 濉厖瀹℃壒鑺傜偣闄勪欢 url
+ */
+ private void bindNodeUrl(List<ApproveNode> nodes) {
+ if (CollectionUtils.isEmpty(nodes)) {
+ return;
+ }
+ for (ApproveNode approveNode : nodes) {
+ List<CommonFile> commonFiles = fileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
+ .eq(CommonFile::getCommonId, approveNode.getId())
+ .eq(CommonFile::getType, FileNameType.ApproveNode.getValue()));
+ if (!CollectionUtils.isEmpty(commonFiles)) {
+ approveNode.setUrl(commonFiles.get(0).getUrl());
+ }
+ }
+ }
+
+ /**
+ * 涓存椂闄勪欢杩佺Щ涓烘寮忛檮浠�
+ */
+ private void bindNodeFiles(ApproveNode approveNode, List<String> tempFileIds) throws IOException {
+ if (!CollectionUtils.isEmpty(tempFileIds) && approveNode.getApproveNodeStatus() != null
+ && approveNode.getApproveNodeStatus() == 1) {
+ tempFileService.migrateTempFilesToFormal(approveNode.getId(), tempFileIds, FileNameType.ApproveNode.getValue());
}
}
@Override
public void updateApproveNode(ApproveNode approveNode) throws IOException {
- // 瀹℃壒鑺傜偣鐘舵��:1鍚屾剰锛�2鎷掔粷锛�0灏氭湭瀹℃牳
- switch (approveNode.getApproveNodeStatus()){
- case 1:
- updateApproveProcessStatus(approveNode, Boolean.TRUE.equals(approveNode.getIsLast()) ? 2 : 1);
- /*娑堟伅閫氱煡*/
- Integer nodeOrder = approveNode.getApproveNodeOrder();
- ApproveProcess approveProcess = approveProcessMapper.selectList(Wrappers.<ApproveProcess>lambdaQuery()
- .eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())).get(0);
- if (approveProcess.getApproveUserIds().split(",").length > nodeOrder){
- String id = approveProcess.getApproveUserIds().split(",")[nodeOrder];
- if (approveProcess.getApproveType()==8){
- sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
- approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
- Arrays.asList(Long.valueOf(id)),
- "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
- }else {
- sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
- approveProcess.getApproveId() + "娴佺▼缂栧彿鐨勫鎵归渶瑕佹偍瀹℃牳!!!!!",
- Arrays.asList(Long.valueOf(id)),
- "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
- }
- }
- break;
- case 2:
- updateApproveProcessStatus(approveNode, 3);
- break;
- default:
- break;
+ ApproveNode db = approveNodeMapper.selectById(approveNode.getId());
+ if (db == null || db.getDeleteFlag() != null && db.getDeleteFlag() == 1) {
+ throw new RuntimeException("瀹℃壒鑺傜偣涓嶅瓨鍦�");
}
- approveNode.setApproveNodeTime(new Date());
- approveNodeMapper.updateById(approveNode);
+ if (db.getApproveNodeStatus() != null && db.getApproveNodeStatus() != 0) {
+ throw new RuntimeException("璇ヨ妭鐐瑰凡瀹℃壒锛岃鍕块噸澶嶆搷浣�");
+ }
+ Long loginUserId = SecurityUtils.getLoginUser().getUser().getUserId();
+ boolean admin = SecurityUtils.isAdmin(loginUserId);
+ // 绠$悊鍛樹笉鍙楀鎵逛汉闄愬埗
+ if (!admin && !db.getApproveNodeUserId().equals(loginUserId)) {
+ throw new RuntimeException("鏃犳潈瀹℃壒璇ヨ妭鐐�");
+ }
+ ApproveProcess approveProcess = getApproveById(db.getApproveProcessId());
+ if (approveProcess == null) {
+ throw new RuntimeException("瀹℃壒娴佺▼涓嶅瓨鍦�");
+ }
+ if (approveProcess.getApproveStatus() == null
+ || (approveProcess.getApproveStatus() != 0 && approveProcess.getApproveStatus() != 1)) {
+ throw new RuntimeException("褰撳墠娴佺▼鐘舵�佷笉鍏佽瀹℃壒");
+ }
+ Integer curOrder = pendingOrder(db.getApproveProcessId());
+ if (!db.getApproveNodeOrder().equals(curOrder)) {
+ throw new RuntimeException("灏氭湭杞埌璇ヨ妭鐐瑰鎵�");
+ }
+
+ db.setApproveNodeStatus(approveNode.getApproveNodeStatus());
+ db.setApproveNodeReason(approveNode.getApproveNodeReason());
+ db.setApproveNodeRemark(approveNode.getApproveNodeRemark());
+ db.setApproveNodeTime(new Date());
+ db.setUpdateUser(loginUserId);
+ approveNodeMapper.updateById(db);
+
+ // 鎷掔粷锛氫竴绁ㄥ惁鍐筹紝绔嬪嵆椹冲洖鏁翠釜娴佺▼
+ if (db.getApproveNodeStatus() != null && db.getApproveNodeStatus() == 2) {
+ approveProcess.setApproveStatus(3);
+ approveProcess.setApproveOverTime(new Date());
+ approveProcessMapper.updateById(approveProcess);
+ applyBusinessStatus(approveProcess, 3);
+ bindNodeFiles(db, approveNode.getTempFileIds());
+ return;
+ }
+
+ String mode = db.getApproveMode();
+ if (mode == null || mode.isEmpty()) {
+ mode = "or";
+ }
+ List<ApproveNode> sameOrder = nodesByOrder(db.getApproveProcessId(), db.getApproveNodeOrder());
+ // 绠$悊鍛樹唬瀹★細褰撳墠鑺傜偣鍏朵綑寰呭璁板綍涓�骞堕�氳繃
+ if (admin) {
+ for (ApproveNode n : sameOrder) {
+ if (n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0) {
+ n.setApproveNodeStatus(1);
+ n.setApproveNodeRemark("绠$悊鍛樹唬瀹¢�氳繃");
+ n.setApproveNodeTime(new Date());
+ approveNodeMapper.updateById(n);
+ }
+ }
+ }
+ boolean released;
+ if ("and".equals(mode)) {
+ // 浼氱锛氳妭鐐瑰唴鎵�鏈変汉鍧囧悓鎰忔墠鏀捐
+ released = sameOrder.stream().allMatch(n -> n.getApproveNodeStatus() != null && n.getApproveNodeStatus() == 1);
+ } else {
+ // 鎴栫锛氳妭鐐瑰唴浠讳竴鍚屾剰鍗虫斁琛�
+ released = sameOrder.stream().anyMatch(n -> n.getApproveNodeStatus() != null && n.getApproveNodeStatus() == 1);
+ }
+
+ // 浼氱鏈斁琛岋細鑺傜偣鍐呬粛鏈夊緟瀹′汉锛屾祦绋嬩繚鎸佸鏍镐腑
+ if (!released) {
+ List<ApproveNode> pending = sameOrder.stream()
+ .filter(n -> n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0)
+ .collect(Collectors.toList());
+ approveProcess.setApproveStatus(1);
+ setCurrentApprovers(approveProcess, pending);
+ approveProcessMapper.updateById(approveProcess);
+ applyBusinessStatus(approveProcess, 1);
+ bindNodeFiles(db, approveNode.getTempFileIds());
+ return;
+ }
+
+ // 鎴栫鏀捐锛氬悓鑺傜偣鍏朵綑鏈鎵硅褰曟爣璁颁负鑷姩鍚屾剰
+ if (!"and".equals(mode)) {
+ for (ApproveNode n : sameOrder) {
+ if (n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0) {
+ n.setApproveNodeStatus(1);
+ n.setApproveNodeRemark("鎴栫锛氬叾浠栧鎵逛汉宸查�氳繃");
+ n.setApproveNodeTime(new Date());
+ approveNodeMapper.updateById(n);
+ }
+ }
+ }
+
+ List<ApproveNode> next = nodesByOrder(db.getApproveProcessId(), db.getApproveNodeOrder() + 1).stream()
+ .filter(n -> n.getApproveNodeStatus() == null || n.getApproveNodeStatus() == 0)
+ .collect(Collectors.toList());
+ if (next.isEmpty()) {
+ // 鏈�鍚庤妭鐐规斁琛岋細娴佺▼瀹屾垚
+ approveProcess.setApproveStatus(2);
+ approveProcess.setApproveOverTime(new Date());
+ setCurrentApprovers(approveProcess, new ArrayList<>());
+ approveProcessMapper.updateById(approveProcess);
+ applyBusinessStatus(approveProcess, 2);
+ } else {
+ // 娴佽浆涓嬩竴鑺傜偣
+ approveProcess.setApproveStatus(1);
+ setCurrentApprovers(approveProcess, next);
+ approveProcessMapper.updateById(approveProcess);
+ applyBusinessStatus(approveProcess, 1);
+ notifyApproveUsers(next.stream().map(ApproveNode::getApproveNodeUserId).collect(Collectors.toList()), approveProcess);
+ }
+ bindNodeFiles(db, approveNode.getTempFileIds());
}
@Override
@@ -327,8 +522,38 @@
return "鍙戣揣瀹℃壒";
case 8:
return "鍗遍櫓浣滀笟瀹℃壒";
+ case 9:
+ return "鐢ㄥ嵃瀹℃壒";
}
return null;
}
+ private void addQualityInspect(PurchaseLedger purchaseLedger, SalesLedgerProduct saleProduct) {
+ QualityInspect qualityInspect = new QualityInspect();
+ qualityInspect.setInspectType(0);
+ qualityInspect.setSupplier(purchaseLedger.getSupplierName());
+ qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
+ qualityInspect.setProductId(saleProduct.getProductId());
+ qualityInspect.setProductName(saleProduct.getProductCategory());
+ qualityInspect.setModel(saleProduct.getSpecificationModel());
+ qualityInspect.setProductModelId(saleProduct.getProductModelId());
+ qualityInspect.setUnit(saleProduct.getUnit());
+ qualityInspect.setQuantity(saleProduct.getQuantity());
+ qualityInspectMapper.insert(qualityInspect);
+ List<QualityTestStandard> qualityTestStandard = qualityTestStandardMapper.getQualityTestStandardByProductId(saleProduct.getProductId(), 0,null);
+ if (qualityTestStandard.size()>0){
+ qualityInspect.setTestStandardId(qualityTestStandard.get(0).getId());
+ qualityInspectMapper.updateById(qualityInspect);
+ qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
+ .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandard.get(0).getId()))
+ .forEach(qualityTestStandardParam -> {
+ QualityInspectParam param = new QualityInspectParam();
+ com.ruoyi.common.utils.bean.BeanUtils.copyProperties(qualityTestStandardParam, param);
+ param.setId(null);
+ param.setInspectId(qualityInspect.getId());
+ qualityInspectParamMapper.insert(param);
+ });
+ }
+ }
+
}
--
Gitblit v1.9.3