From dc5e5c07549b493e21c11dc7929c32ea9fd732b0 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 08 十月 2026 17:08:26 +0800
Subject: [PATCH] 协同办公系统模块优化

---
 src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java |  391 +++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 250 insertions(+), 141 deletions(-)

diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
index ea88016..938414b 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -5,29 +5,40 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.ruoyi.approve.enums.ApproveType;
+import com.ruoyi.approve.mapper.ApproveFlowDefinitionMapper;
+import com.ruoyi.approve.mapper.ApproveFlowNodeDefinitionMapper;
 import com.ruoyi.approve.mapper.ApproveNodeMapper;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
+import com.ruoyi.approve.pojo.ApproveFlowDefinition;
+import com.ruoyi.approve.pojo.ApproveFlowNodeDefinition;
 import com.ruoyi.approve.pojo.ApproveNode;
 import com.ruoyi.approve.pojo.ApproveProcess;
 import com.ruoyi.approve.service.IApproveNodeService;
 import com.ruoyi.approve.service.IApproveProcessService;
 import com.ruoyi.approve.utils.DailyRedisCounter;
 import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
+import com.ruoyi.approve.vo.ApproveNodeVO;
 import com.ruoyi.approve.vo.ApproveProcessVO;
+import com.ruoyi.common.enums.FileNameType;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.other.service.impl.TempFileServiceImpl;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.project.system.mapper.SysUserMapper;
-import lombok.AllArgsConstructor;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.pojo.CommonFile;
+import com.ruoyi.sales.pojo.SalesLedger;
 import lombok.RequiredArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Lazy;
-import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
+import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -36,7 +47,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 @Service
@@ -44,174 +57,270 @@
 public class ApproveProcessServiceImpl extends ServiceImpl<ApproveProcessMapper, ApproveProcess> implements IApproveProcessService {
     private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd");
 
-    private final StringRedisTemplate redisTemplate;
-
     private final DailyRedisCounter dailyRedisCounter;
-
     private final SysDeptMapper sysDeptMapper;
-    private final ApproveNodeServiceImpl approveNodeService;
+    private final IApproveNodeService approveNodeService;
     private final SysUserMapper sysUserMapper;
     private final ApproveProcessMapper approveProcessMapper;
+    private final ApproveNodeMapper approveNodeMapper;
+    private final TempFileServiceImpl tempFileService;
+    private final CommonFileMapper commonFileMapper;
+    private final SalesLedgerMapper salesLedgerMapper;
+    private final ApproveFlowDefinitionMapper flowDefinitionMapper;
+    private final ApproveFlowNodeDefinitionMapper flowNodeDefinitionMapper;
+    private final ObjectMapper objectMapper;
 
     @Override
-    public void addApprove(ApproveProcessVO approveProcessVO) throws ParseException {
-        SysUser sysUser = sysUserMapper.selectUserById(approveProcessVO.getApproveUser());
-        SysDept sysDept = sysDeptMapper.selectDeptById(approveProcessVO.getApproveDeptId());
-        String[] split = approveProcessVO.getApproveUserIds().split(",");
-        List<Long> longList = Arrays.stream(split)
-                .map(Long::valueOf)  // 灏嗘瘡涓� String 杞崲涓� Long
-                .collect(Collectors.toList());
-        List<SysUser> sysUsers = sysUserMapper.selectUserByIds(longList);
-        if(CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("瀹℃牳鐢ㄦ埛涓嶅瓨鍦�");
-        if(sysDept == null) throw new RuntimeException("閮ㄩ棬涓嶅瓨鍦�");
-        if(sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
-        String today = LocalDate.now().format(DATE_FORMAT);
-        Long approveId = dailyRedisCounter.incrementAndGetByDb();
-        String formattedCount = String.format("%03d", approveId);
-        //娴佺▼ ID
-        String approveID = today + formattedCount;
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-        ApproveProcess approveProcess = new ApproveProcess();
-        approveProcess.setApproveId(approveID);
-        approveProcess.setApproveUser(approveProcessVO.getApproveUser());
-        approveProcess.setApproveUserName(sysUser.getNickName());
-        approveProcess.setApproveDeptId(approveProcessVO.getApproveDeptId());
-        approveProcess.setApproveDeptName(sysDept.getDeptName());
-        approveProcess.setApproveUserNames(sysUsers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
-        approveProcess.setApproveTime(StringUtils.isEmpty(approveProcessVO.getApproveTime()) ? null : dateFormat.parse(approveProcessVO.getApproveTime()));
-        approveProcess.setApproveReason(approveProcessVO.getApproveReason());
-        approveProcess.setApproveOverTime(null);
-        approveProcess.setApproveStatus(0);
-        approveProcess.setApproveDelete(0);
-        approveProcess.setCreateTime(LocalDateTime.now());
-        approveProcess.setTenantId(approveProcessVO.getApproveDeptId());
-        approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds());
-        approveProcess.setApproveUserCurrentId(longList.get(0));
-        approveProcess.setApproveUserCurrentName(sysUsers
-                .stream()
-                .filter(SysUser -> SysUser.getUserId().equals(longList.get(0)))
-                .collect(Collectors.toList())
-                .get(0)
-                .getNickName());
-        // 璁剧疆鐘舵�佷负閲嶆柊鎻愪氦
-        if(approveProcessVO.getId() != null){
-            ApproveProcess approveProcess1 = approveProcessMapper.selectById(approveProcessVO.getId());
-            approveProcess1.setApproveStatus(4);
-            approveProcessMapper.updateById(approveProcess1);
+    public void addApprove(ApproveProcessVO request) throws Exception {
+        if (request == null || request.getApproveType() == null) throw new RuntimeException("瀹℃壒绫诲瀷涓嶈兘涓虹┖");
+        ApproveType type = ApproveType.fromCode(request.getApproveType());
+        Long tenantId = tenantId();
+        SysUser applicant = SecurityUtils.getLoginUser().getUser();
+        Long deptId = resolveDeptId(request.getApproveDeptId());
+        SysDept dept = sysDeptMapper.selectDeptById(deptId);
+        if (dept == null) throw new RuntimeException("鐢宠閮ㄩ棬涓嶅瓨鍦�");
+
+        List<ApproveNodeVO> nodes = resolveNodes(request, tenantId);
+        List<SysUser> approvers = validateApprovers(nodes, tenantId);
+        prepareBusinessData(request, type, tenantId);
+
+        String approveCode = LocalDate.now().format(DATE_FORMAT)
+                + String.format("%03d", dailyRedisCounter.incrementAndGetByDb());
+        ApproveProcess process = new ApproveProcess();
+        process.setApproveId(approveCode);
+        process.setApproveUser(applicant.getUserId());
+        process.setApproveUserName(applicant.getNickName());
+        process.setApproveDeptId(deptId);
+        process.setApproveDeptName(dept.getDeptName());
+        process.setApproveUserIds(nodes.stream().map(item -> String.valueOf(item.getUserId())).collect(Collectors.joining(",")));
+        process.setApproveUserNames(approvers.stream().map(SysUser::getNickName).collect(Collectors.joining(",")));
+        process.setApproveTime(parseDate(request.getApproveTime()));
+        process.setApproveReason(request.getApproveReason());
+        process.setApproveStatus(0);
+        process.setApproveDelete(0);
+        process.setApproveType(type.getCode());
+        process.setTenantId(tenantId);
+        process.setBusinessId(request.getBusinessId());
+        process.setBusinessNo(request.getBusinessNo());
+        process.setBusinessTitle(request.getBusinessTitle());
+        process.setAmount(request.getAmount());
+        process.setBusinessData(request.getBusinessData());
+        process.setFlowDefinitionId(request.getFlowDefinitionId());
+        process.setCreateTime(LocalDateTime.now());
+        process.setUpdateTime(LocalDateTime.now());
+        approveProcessMapper.insert(process);
+        approveNodeService.initApproveNodes(nodes, approveCode, tenantId);
+        tempFileService.migrateTempFilesToFormal(process.getId(), request.getTempFileIds(), FileNameType.ApproveProcess.getValue());
+    }
+
+    private void prepareBusinessData(ApproveProcessVO request, ApproveType type, Long tenantId) throws JsonProcessingException {
+        if (type == ApproveType.SALES_CONTRACT) {
+            if (request.getBusinessId() == null) throw new RuntimeException("璇烽�夋嫨閿�鍞悎鍚�");
+            SalesLedger ledger = salesLedgerMapper.selectById(request.getBusinessId());
+            if (ledger == null || !tenantId.equals(ledger.getTenantId())) throw new RuntimeException("閿�鍞悎鍚屼笉瀛樺湪鎴栦笉灞炰簬褰撳墠绉熸埛");
+            Long duplicate = approveProcessMapper.selectCount(new LambdaQueryWrapper<ApproveProcess>()
+                    .eq(ApproveProcess::getTenantId, tenantId)
+                    .eq(ApproveProcess::getApproveType, ApproveType.SALES_CONTRACT.getCode())
+                    .eq(ApproveProcess::getBusinessId, ledger.getId())
+                    .in(ApproveProcess::getApproveStatus, Arrays.asList(0, 1))
+                    .eq(ApproveProcess::getApproveDelete, 0));
+            if (duplicate != null && duplicate > 0) throw new RuntimeException("璇ラ攢鍞悎鍚屽凡鏈夊緟瀹℃祦绋�");
+            Map<String, Object> snapshot = new LinkedHashMap<>();
+            snapshot.put("salesLedgerId", ledger.getId());
+            snapshot.put("salesContractNo", ledger.getSalesContractNo());
+            snapshot.put("customerContractNo", ledger.getCustomerContractNo());
+            snapshot.put("customerName", ledger.getCustomerName());
+            snapshot.put("projectName", ledger.getProjectName());
+            snapshot.put("salesman", ledger.getSalesman());
+            snapshot.put("contractAmount", ledger.getContractAmount());
+            snapshot.put("executionDate", ledger.getExecutionDate());
+            snapshot.put("paymentMethod", ledger.getPaymentMethod());
+            snapshot.put("remarks", ledger.getRemarks());
+            request.setBusinessNo(ledger.getSalesContractNo());
+            request.setBusinessTitle(StringUtils.hasText(request.getBusinessTitle())
+                    ? request.getBusinessTitle() : "閿�鍞悎鍚屽鎵�-" + ledger.getSalesContractNo());
+            request.setAmount(ledger.getContractAmount());
+            request.setBusinessData(objectMapper.writeValueAsString(snapshot));
+        } else if (type == ApproveType.PURCHASE_PLAN || type == ApproveType.FREE_COLLABORATION) {
+            if (!StringUtils.hasText(request.getBusinessTitle())) throw new RuntimeException("瀹℃壒鏍囬涓嶈兘涓虹┖");
+            if (type == ApproveType.PURCHASE_PLAN && request.getAmount() == null) throw new RuntimeException("閲囪喘棰勭畻閲戦涓嶈兘涓虹┖");
+            if (!StringUtils.hasText(request.getBusinessNo())) {
+                String prefix = type == ApproveType.PURCHASE_PLAN ? "CG" : "XT";
+                request.setBusinessNo(prefix + LocalDate.now().format(DATE_FORMAT)
+                        + String.format("%03d", dailyRedisCounter.incrementAndGetByDb()));
+            }
         }
-        save(approveProcess);
-        //鍒濆鍖栧鎵硅妭鐐�
-        approveNodeService.initApproveNodes(approveProcessVO.getApproveUserIds(),approveID,approveProcessVO.getApproveDeptId());
+    }
+
+    private List<ApproveNodeVO> resolveNodes(ApproveProcessVO request, Long tenantId) {
+        if (!CollectionUtils.isEmpty(request.getNodes())) return request.getNodes();
+        if (request.getFlowDefinitionId() != null) {
+            ApproveFlowDefinition definition = flowDefinitionMapper.selectOne(new LambdaQueryWrapper<ApproveFlowDefinition>()
+                    .eq(ApproveFlowDefinition::getId, request.getFlowDefinitionId())
+                    .eq(ApproveFlowDefinition::getTenantId, tenantId)
+                    .eq(ApproveFlowDefinition::getApproveType, request.getApproveType())
+                    .eq(ApproveFlowDefinition::getEnabled, 1)
+                    .eq(ApproveFlowDefinition::getDeleteFlag, 0));
+            if (definition == null) throw new RuntimeException("瀹℃壒娴佺▼瀹氫箟涓嶅瓨鍦ㄦ垨宸插仠鐢�");
+            List<ApproveFlowNodeDefinition> definitions = flowNodeDefinitionMapper.selectList(
+                    new LambdaQueryWrapper<ApproveFlowNodeDefinition>()
+                            .eq(ApproveFlowNodeDefinition::getFlowDefinitionId, definition.getId())
+                            .eq(ApproveFlowNodeDefinition::getTenantId, tenantId)
+                            .eq(ApproveFlowNodeDefinition::getDeleteFlag, 0)
+                            .orderByAsc(ApproveFlowNodeDefinition::getNodeOrder));
+            List<ApproveNodeVO> result = new ArrayList<>();
+            for (ApproveFlowNodeDefinition item : definitions) {
+                if (!"USER".equals(item.getApproverType()) || !StringUtils.hasText(item.getApproverValue())) {
+                    throw new RuntimeException("褰撳墠棰勮娴佺▼鍖呭惈灏氭湭鎸囧畾鐨勫鎵逛汉");
+                }
+                ApproveNodeVO node = new ApproveNodeVO();
+                node.setUserId(Long.valueOf(item.getApproverValue().split(",")[0].trim()));
+                node.setNodeName(item.getNodeName());
+                node.setConditionField(item.getConditionField());
+                node.setConditionOperator(item.getConditionOperator());
+                node.setConditionValue(item.getConditionValue());
+                result.add(node);
+            }
+            if (!result.isEmpty()) return result;
+        }
+        if (!StringUtils.hasText(request.getApproveUserIds())) throw new RuntimeException("璇烽�夋嫨瀹℃壒浜�");
+        List<ApproveNodeVO> result = new ArrayList<>();
+        for (String id : request.getApproveUserIds().split(",")) {
+            ApproveNodeVO node = new ApproveNodeVO();
+            node.setUserId(Long.valueOf(id.trim()));
+            node.setConditionOperator("ALWAYS");
+            result.add(node);
+        }
+        return result;
+    }
+
+    private List<SysUser> validateApprovers(List<ApproveNodeVO> nodes, Long tenantId) {
+        List<SysUser> users = new ArrayList<>();
+        for (ApproveNodeVO node : nodes) {
+            SysUser user = sysUserMapper.selectUserById(node.getUserId());
+            if (user == null || !tenantId.equals(user.getTenantId())) throw new RuntimeException("瀹℃壒浜轰笉瀛樺湪鎴栦笉灞炰簬褰撳墠绉熸埛");
+            users.add(user);
+        }
+        return users;
     }
 
     @Override
     public List<SysDept> selectDeptListByDeptIds(Long[] deptIds) {
-        List<SysDept> sysDeptList =new ArrayList<SysDept>();
+        List<SysDept> departments = new ArrayList<>();
+        if (deptIds == null) return departments;
         for (Long deptId : deptIds) {
-            SysDept sysDept = sysDeptMapper.selectDeptById(deptId);
-            sysDeptList.add(sysDept);
+            SysDept dept = sysDeptMapper.selectDeptById(deptId);
+            if (dept != null) departments.add(dept);
         }
-        return sysDeptList;
+        return departments;
     }
 
     @Override
-    public IPage<ApproveProcess> listAll(Page page,ApproveProcess approveProcess) {
-        IPage<ApproveProcess> approveProcessIPage = approveProcessMapper.listPage(page,approveProcess);
-        return approveProcessIPage;
+    public IPage<ApproveProcess> listAll(Page page, ApproveProcess request) {
+        request.setTenantId(tenantId());
+        IPage<ApproveProcess> result = approveProcessMapper.listPage(page, request);
+        result.getRecords().forEach(record -> record.setCommonFileList(commonFileMapper.selectList(
+                new LambdaQueryWrapper<CommonFile>()
+                        .eq(CommonFile::getCommonId, record.getId())
+                        .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue()))));
+        return result;
     }
 
     @Override
-    public void delApprove(Long[] ids) {
-        for (Long id : ids) {
-            UpdateWrapper<ApproveProcess> queryWrapper = new UpdateWrapper<>();
-            queryWrapper.lambda().set(ApproveProcess::getApproveDelete, 1)
-                    .eq(ApproveProcess::getApproveId, id);
-            update(queryWrapper);
-            // 鍒犻櫎鍏宠仈鐨勫鎵硅妭鐐�
-            approveNodeService.delApproveNodeByApproveId(id);
+    public void delApprove(String[] ids) {
+        if (ids == null) return;
+        for (String code : ids) {
+            ApproveProcess process = findOwnedByCode(code);
+            if (!SecurityUtils.getUserId().equals(process.getApproveUser())) throw new RuntimeException("鍙兘鍒犻櫎鏈汉鐢宠");
+            if (!(Integer.valueOf(0).equals(process.getApproveStatus()) || Integer.valueOf(3).equals(process.getApproveStatus()))) {
+                throw new RuntimeException("瀹℃牳涓殑娴佺▼涓嶈兘鍒犻櫎");
+            }
+            UpdateWrapper<ApproveProcess> wrapper = new UpdateWrapper<>();
+            wrapper.lambda().set(ApproveProcess::getApproveDelete, 1)
+                    .set(ApproveProcess::getUpdateTime, LocalDateTime.now())
+                    .eq(ApproveProcess::getApproveId, code)
+                    .eq(ApproveProcess::getTenantId, tenantId());
+            update(wrapper);
+            approveNodeService.delApproveNodeByApproveId(code);
         }
-
-
     }
 
     @Override
     public ApproveProcess getApproveById(String id) {
-        LambdaQueryWrapper<ApproveProcess> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(ApproveProcess::getApproveId, id);
-        queryWrapper.eq(ApproveProcess::getApproveDelete, 0);
-        queryWrapper.eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId());
-        queryWrapper.last("limit 1");
-        ApproveProcess one = getOne(queryWrapper);
-        return one;
-    }
-
-    private final ApproveNodeMapper approveNodeMapper;
-
-    @Override
-    public void updateApproveProcessStatus(ApproveNode approveNode,Integer status) {
-        LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        approveProcessLambdaQueryWrapper.eq(ApproveProcess::getApproveId, approveNode.getApproveProcessId())
-                .eq(ApproveProcess::getApproveDelete, 0)
-                .eq(ApproveProcess::getTenantId, SecurityUtils.getLoginUser().getTenantId())
-                .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::getTenantId, SecurityUtils.getLoginUser().getTenantId())
-                .last("limit 1");
-        ApproveNode approveNode1 = approveNodeMapper.selectOne(approveNodeLambdaQueryWrapper);
-        approveProcess.setApproveStatus(status);
-        if(approveNode1 != null){
-            approveProcess.setApproveUserCurrentId(approveNode.getApproveNodeUserId());
-            approveProcess.setApproveUserCurrentName(approveNode1.getApproveNodeUser());
-        }
-        updateById(approveProcess);
+        ApproveProcess process = findOwnedByCode(id);
+        process.setCommonFileList(commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>()
+                .eq(CommonFile::getCommonId, process.getId())
+                .eq(CommonFile::getType, FileNameType.ApproveProcess.getValue())));
+        return process;
     }
 
     @Override
-    public void updateByApproveId(ApproveGetAndUpdateVo approveGetAndUpdateVo) {
-        ApproveProcess approve = approveProcessMapper.selectById(approveGetAndUpdateVo.getId());
-        approve.setApproveUserIds(approveGetAndUpdateVo.getApproveUserIds());
-        approve.setApproveReason(approveGetAndUpdateVo.getApproveReason());
-        SysUser sysUser = sysUserMapper.selectUserById(approveGetAndUpdateVo.getApproveUser());
-        String[] split = approveGetAndUpdateVo.getApproveUserIds().split(",");
-        if(split.length == 0){
-            throw new RuntimeException("璇烽�夋嫨瀹℃壒浜�");
+    public void updateByApproveId(ApproveGetAndUpdateVo request) throws IOException {
+        ApproveProcess process = approveProcessMapper.selectOne(new LambdaQueryWrapper<ApproveProcess>()
+                .eq(ApproveProcess::getId, request.getId())
+                .eq(ApproveProcess::getTenantId, tenantId())
+                .eq(ApproveProcess::getApproveDelete, 0));
+        if (process == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�");
+        if (!SecurityUtils.getUserId().equals(process.getApproveUser())) throw new RuntimeException("鍙兘缂栬緫鏈汉鐢宠");
+        if (!(Integer.valueOf(0).equals(process.getApproveStatus()) || Integer.valueOf(3).equals(process.getApproveStatus()))) {
+            throw new RuntimeException("褰撳墠瀹℃壒鐘舵�佷笉鍏佽缂栬緫");
         }
-        List<SysUser> sysUsers = sysUserMapper.selectUserByIds(Arrays.asList(split).stream().map(Long::parseLong).collect(Collectors.toList()));
-        if(CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("璇烽�夋嫨瀹℃壒浜�");
-        if(sysUser == null) throw new RuntimeException("鐢宠浜轰笉瀛樺湪");
-        approve.setApproveUserName(sysUser.getNickName());
-        approve.setApproveUser(sysUser.getUserId());
-        //瀹℃牳涓笉鍙互缂栬緫瀹℃牳浜�
-        if(approve.getApproveStatus() != 1){
-            approve.setApproveUserCurrentId(Long.parseLong(split[0]));
-            approve.setApproveUserCurrentName(sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[0]))).collect(Collectors.toList()).get(0).getNickName());
-        }
-        updateById(approve);
-        //淇敼瀹℃壒浜�
-        LambdaQueryWrapper<ApproveNode> approveNodeLambdaQueryWrapper = new LambdaQueryWrapper<>();
-        approveNodeLambdaQueryWrapper.eq(ApproveNode::getApproveProcessId, approve.getApproveId())
-                .eq(ApproveNode::getDeleteFlag, 0)
-                .eq(ApproveNode::getTenantId, SecurityUtils.getLoginUser().getTenantId())
-                .orderByAsc(ApproveNode::getApproveNodeOrder);
-        List<ApproveNode> list = approveNodeMapper.selectList(approveNodeLambdaQueryWrapper);
-        int i = 0;
-        for (ApproveNode approveNode : list) {
-            int finalI = i;
-            List<SysUser> collect = sysUsers.stream().filter(user -> user.getUserId().equals(Long.parseLong(split[finalI]))).collect(Collectors.toList());
-            if(CollectionUtils.isEmpty(collect)){
-                throw new RuntimeException("璇烽�夋嫨姝g‘鐨勫鎵逛汉");
+        process.setApproveReason(request.getApproveReason());
+        process.setBusinessTitle(request.getBusinessTitle());
+        process.setAmount(request.getAmount());
+        process.setBusinessData(request.getBusinessData());
+        process.setUpdateTime(LocalDateTime.now());
+        process.setApproveStatus(0);
+        process.setApproveOverTime(null);
+        approveProcessMapper.updateById(process);
+
+        List<ApproveNodeVO> nodes = request.getNodes();
+        if (CollectionUtils.isEmpty(nodes) && StringUtils.hasText(request.getApproveUserIds())) {
+            nodes = new ArrayList<>();
+            for (String id : request.getApproveUserIds().split(",")) {
+                ApproveNodeVO node = new ApproveNodeVO();
+                node.setUserId(Long.valueOf(id.trim()));
+                node.setConditionOperator("ALWAYS");
+                nodes.add(node);
             }
-            approveNode.setApproveNodeUserId(collect.get(0).getUserId());
-            approveNode.setApproveNodeUser(collect.get(0).getNickName());
-            approveNodeMapper.updateById(approveNode);
-            i++;
         }
+        if (!CollectionUtils.isEmpty(nodes)) {
+            validateApprovers(nodes, tenantId());
+            UpdateWrapper<ApproveNode> oldNodes = new UpdateWrapper<>();
+            oldNodes.lambda().set(ApproveNode::getDeleteFlag, 1)
+                    .set(ApproveNode::getIsCurrent, 0)
+                    .eq(ApproveNode::getApproveProcessId, process.getApproveId())
+                    .eq(ApproveNode::getTenantId, tenantId());
+            approveNodeMapper.update(null, oldNodes);
+            approveNodeService.initApproveNodes(nodes, process.getApproveId(), tenantId());
+        }
+        tempFileService.migrateTempFilesToFormal(process.getId(), request.getTempFileIds(), FileNameType.ApproveProcess.getValue());
     }
 
+    private ApproveProcess findOwnedByCode(String code) {
+        ApproveProcess process = approveProcessMapper.selectOne(new LambdaQueryWrapper<ApproveProcess>()
+                .eq(ApproveProcess::getApproveId, code)
+                .eq(ApproveProcess::getApproveDelete, 0)
+                .eq(ApproveProcess::getTenantId, tenantId())
+                .last("limit 1"));
+        if (process == null) throw new RuntimeException("瀹℃壒涓嶅瓨鍦�");
+        return process;
+    }
 
+    private Long resolveDeptId(Long requested) {
+        Long[] allowed = SecurityUtils.getDeptId();
+        if (requested == null) return SecurityUtils.getLoginUser().getCurrentDeptId();
+        if (allowed != null && Arrays.asList(allowed).contains(requested)) return requested;
+        Long current = SecurityUtils.getLoginUser().getCurrentDeptId();
+        if (requested.equals(current)) return requested;
+        throw new RuntimeException("鏃犳潈浣跨敤璇ョ敵璇烽儴闂�");
+    }
+
+    private Date parseDate(String value) throws ParseException {
+        return StringUtils.hasText(value) ? new SimpleDateFormat("yyyy-MM-dd").parse(value) : new Date();
+    }
+
+    private Long tenantId() {
+        return SecurityUtils.getLoginUser().getTenantId();
+    }
 }

--
Gitblit v1.9.3