From 0ab9dfd8f122195e4e9f09bd50c59e0a47450bec Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期三, 19 三月 2025 15:50:03 +0800
Subject: [PATCH] fix: resolve merge conflicts in .gitignore

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java |  201 ++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 153 insertions(+), 48 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
index 72b02f5..14e744d 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -7,8 +7,11 @@
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONUtil;
 import com.aizuda.bpm.engine.FlowLongEngine;
+import com.aizuda.bpm.engine.TaskService;
 import com.aizuda.bpm.engine.core.FlowCreator;
+import com.aizuda.bpm.engine.core.enums.InstanceState;
 import com.aizuda.bpm.engine.core.enums.TaskType;
+import com.aizuda.bpm.engine.dao.FlwInstanceDao;
 import com.aizuda.bpm.engine.entity.*;
 import com.aizuda.bpm.engine.model.NodeModel;
 import com.aizuda.bpm.mybatisplus.mapper.*;
@@ -19,17 +22,21 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.collect.ImmutableMap;
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.BaseModel;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.core.domain.model.LoginUserApplet;
 import com.ruoyi.common.enums.StateProcessActionEnum;
+import com.ruoyi.common.enums.TaskEventType;
 import com.ruoyi.common.exception.GlobalException;
 import com.ruoyi.common.exception.state.StateErrorCode;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.uuid.IdUtils;
 import com.ruoyi.system.bo.*;
 import com.ruoyi.system.mapper.StateProcessTemplateMapper;
+import com.ruoyi.system.mapper.TContractMapper;
 import com.ruoyi.system.model.*;
 import com.ruoyi.system.service.*;
 import com.ruoyi.system.vo.ProcessDetailVO;
@@ -46,6 +53,7 @@
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
 @Service
@@ -64,6 +72,8 @@
     @Autowired
     private FlwTaskMapper flwTaskMapper;
     @Autowired
+    private TaskService taskService;
+    @Autowired
     private StateTaskCenterService stateTaskCenterService;
     @Autowired
     private StateProcessModuleService stateProcessModuleService;
@@ -74,7 +84,7 @@
     @Autowired
     private ISysUserService sysUserService;
     @Autowired
-    private TContractService contractService;
+    private TContractMapper contractMapper;
 
     /**
      * 流程模版分页
@@ -291,6 +301,83 @@
     }
 
     /**
+     * 启动流程
+     * @param processStartBO
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean startApplet(ProcessStartBO processStartBO) {
+        String userId = "1";
+        String nickName = "admin";
+        FlowCreator creator = FlowCreator.of(userId, nickName);
+        //查询流程绑定
+        StateProcessModule stateProcessModule = stateProcessModuleService.getOne(Wrappers.<StateProcessModule>lambdaQuery()
+                .eq(StateProcessModule::getCategory, processStartBO.getCategory()));
+        if (ObjectUtil.isNull(stateProcessModule) || ObjectUtil.isEmpty(stateProcessModule.getTemplateId())) {
+            throw new GlobalException("请先配置流程引擎模版!");
+        }
+        //查询模版,准备启动
+        StateProcessTemplate template = this.getById(stateProcessModule.getTemplateId());
+        StateProcessTemplate lastTemplate = this.getOne(Wrappers.<StateProcessTemplate>lambdaQuery()
+                .eq(StateProcessTemplate::getTemplateKey, template.getTemplateKey())
+                .apply("(template_key, template_version) in(" +
+                        "SELECT template_key, MAX(template_version) " +
+                        "FROM state_process_template " +
+                        "GROUP BY template_key)")
+        );
+
+        if (ObjectUtil.isNull(lastTemplate)) {
+            throw new GlobalException(StateErrorCode.PROCESS_TEMPLATE_NOT_EXISTS.getValue());
+        }
+        FlwProcess flwProcess = flowLongEngine.processService().getProcessById(lastTemplate.getWorkFlowId());
+        if (ObjectUtil.isNull(flwProcess)) {
+            throw new GlobalException(StateErrorCode.PROCESS_NOT_DEPLOY.getValue());
+        }
+        if (!Objects.equals(lastTemplate.getWorkflowVersion(), flwProcess.getProcessVersion())) {
+            throw new GlobalException(StateErrorCode.PROCESS_VERSION_ERROR.getValue());
+        }
+        //监听器参数补全
+        processStartBO.getVariable().put("category", processStartBO.getCategory());
+        // 开启流程
+        Optional<FlwInstance> flwInstanceOptional = flowLongEngine.startInstanceById(flwProcess.getId(), creator, processStartBO.getVariable());
+        if(flwInstanceOptional.isPresent()){
+            FlwInstance instance = flwInstanceOptional.get();
+            //存储任务中心信息
+            StateTaskCenter stateTaskCenter = new StateTaskCenter();
+            stateTaskCenter.setId(IdUtils.simpleUUID());
+            stateTaskCenter.setName(processStartBO.getName());
+            stateTaskCenter.setModuleName(processStartBO.getModuleName());
+            stateTaskCenter.setCategory(processStartBO.getCategory());
+            stateTaskCenter.setFlowId(instance.getId().toString());
+            stateTaskCenter.setRemark(processStartBO.getRemark());
+            stateTaskCenter.setCreateBy(nickName);
+            stateTaskCenter.setVariable(JSONUtil.toJsonStr(processStartBO.getVariable()));
+            stateTaskCenter.setProjectId(JSONObject.parseObject(JSONUtil.toJsonStr(processStartBO.getVariable())).getString("projectId"));
+            stateTaskCenterService.save(stateTaskCenter);
+
+            // action记录
+            StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+            stateProcessInstanceAction.setId(IdUtils.simpleUUID());
+            stateProcessInstanceAction.setInstanceId(instance.getId().toString());
+            stateProcessInstanceAction.setActionType(StateProcessActionEnum.START.getValue());
+            stateProcessInstanceAction.setAuditorId(creator.getCreateId());
+            stateProcessInstanceActionService.save(stateProcessInstanceAction);
+
+            // 添加拓展信息
+            StateProcessExtInstance stateProcessExtInstance = new StateProcessExtInstance();
+            stateProcessExtInstance.setId(instance.getId().toString());
+            stateProcessExtInstance.setTemplateId(lastTemplate.getId());
+            stateProcessExtInstance.setProcessId(flwProcess.getId().toString());
+
+            //保存version
+            stateProcessExtInstance.setProcessVersion(flwProcess.getProcessVersion());
+            stateProcessExtInstanceService.save(stateProcessExtInstance);
+        }
+        return true;
+    }
+
+    /**
      * 待办
      * @param processTaskListBO
      * @return
@@ -361,7 +448,7 @@
         // 查询合同信息
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
             // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
             processTaskListVO.setContract(contract);
         }
 
@@ -484,6 +571,9 @@
         if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
             stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime);
         }
+        if(Objects.isNull(processTaskListBO.getSortBy())){
+            processTaskListBO.setSortBy(2);
+        }
         if (processTaskListBO.getSortBy() == 1) {
             stateTaskQuery.orderByAsc(BaseModel::getCreateTime);
         }
@@ -500,7 +590,7 @@
         // 查询合同信息
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
             // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
             processTaskListVO.setContract(contract);
         }
 
@@ -569,40 +659,29 @@
             new PageInfo<>();
         }
 
-        List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId)
+        List<String> instanceIds = flwHisTaskList.stream().map(FlwTask::getInstanceId)
                 .map(String::valueOf).collect(Collectors.toList());
         //分页查询任务中心任务
-        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
-        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
-            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
-        }
-        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
-            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
-        }
-        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
-            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
-        }
-        if (ObjectUtil.isEmpty(instanceId)) {
-            return new PageInfo<>();
-        }
-        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
-        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
-        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
-        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
-        //转换类
-        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
-
-        // 查询合同信息
-        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
-            // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
-            processTaskListVO.setContract(contract);
-        }
-
-        pageInfo.setRecords(processTaskListVOS);
+//        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
+//            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
+//        }
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
+//            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
+//        }
+//        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
+//            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
+//        }
+//        if (ObjectUtil.isEmpty(instanceId)) {
+//            return new PageInfo<>();
+//        }
+//        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
+//        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
+        processTaskListBO.setInstanceIds(instanceIds);
+        PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO);
 
         if (ObjectUtil.isEmpty(processTaskListVOS)) {
-            return pageInfo;
+            return new PageInfo<>();
         }
         Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
         //查询原因
@@ -611,7 +690,7 @@
                 Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
         Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
 
-        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
+        List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
         Map<Long, SysUser> sysUserMap;
         if (!CollectionUtils.isEmpty(updateUserId)) {
             List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
@@ -625,7 +704,7 @@
             sysUserMap = new HashMap<>();
         }
 
-        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
             List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
             if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
                 //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
@@ -648,7 +727,7 @@
                 processTaskListVO.setCreateBy(sysUser.getNickName());
             }
         }
-        return pageInfo;
+        return processTaskListVOS;
     }
     @Override
     public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) {
@@ -715,6 +794,9 @@
         if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
             stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime);
         }
+        if(Objects.isNull(processTaskListBO.getSortBy())){
+            processTaskListBO.setSortBy(2);
+        }
         if (processTaskListBO.getSortBy() == 1) {
             stateTaskQuery.orderByAsc(BaseModel::getCreateTime);
         }
@@ -730,7 +812,7 @@
         // 查询合同信息
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
             // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
             processTaskListVO.setContract(contract);
         }
 
@@ -898,15 +980,21 @@
         if (ObjectUtil.isNull(flwTask)) {
             throw new GlobalException("任务已处理或者不存在");
         }
-        flowLongEngine.executeTask(taskId, currentFlowCreator());
-        // 动作执行记录
         StateProcessInstanceAction stateProcessInstanceAction = new StateProcessInstanceAction();
+        if(Objects.nonNull(processAgreeBO.getUserId())){
+            flowLongEngine.executeTask(taskId, currentFlowCreator(processAgreeBO.getUserId()));
+            stateProcessInstanceAction.setAuditorId(String.valueOf(processAgreeBO.getUserId()));
+        }else {
+            stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
+            flowLongEngine.executeTask(taskId, currentFlowCreator());
+        }
+        // 动作执行记录
         stateProcessInstanceAction.setId(IdUtils.simpleUUID());
         stateProcessInstanceAction.setInstanceId(flwTask.getInstanceId().toString());
-        stateProcessInstanceAction.setAuditorId(String.valueOf(SecurityUtils.getUserId()));
         stateProcessInstanceAction.setActionType(StateProcessActionEnum.APPROVED.getValue());
         stateProcessInstanceAction.setNodeId(processAgreeBO.getTaskId());
         stateProcessInstanceAction.setRemark(processAgreeBO.getRemark());
+        stateProcessInstanceAction.setPictures(processAgreeBO.getPictures());
         stateProcessInstanceActionService.save(stateProcessInstanceAction);
     }
 
@@ -924,7 +1012,13 @@
         record.setActionType(StateProcessActionEnum.REJECTED.getValue());
         record.setNodeId(processRefuseBO.getTaskId());
         record.setRemark(processRefuseBO.getRemark());
+        record.setPictures(processRefuseBO.getPictures());
         stateProcessInstanceActionService.save(record);
+    }
+    @Override
+    public void revoke(Long instanceId) {
+        FlowCreator flowCreator = FlowCreator.of(String.valueOf(SecurityUtils.getUserId()), SecurityUtils.getLoginUser().getUser().getNickName());
+        flowLongEngine.runtimeService().revoke(instanceId, flowCreator);
     }
 
     @Override
@@ -1174,23 +1268,24 @@
         if(Objects.nonNull(flwTask)){
             instanceId = flwTask.getInstanceId();
             // 查询合同信息
-            contract = contractService.getById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId"));
+            contract = contractMapper.selectById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId"));
         }else {
             FlwHisTask flwHisTask = flwHisTaskMapper.selectById(Long.valueOf(taskId));
             if(Objects.isNull(flwHisTask)){
                 throw new GlobalException("流程不存在");
             }
             instanceId = flwHisTask.getInstanceId();
-            contract = contractService.getById(Objects.requireNonNull(JSONObject.parseObject(flwHisTask.getVariable())).getString("projectId"));
+            contract = contractMapper.selectById(Objects.requireNonNull(JSONObject.parseObject(flwHisTask.getVariable())).getString("projectId"));
         }
         BeanUtil.copyProperties(contract, processDetailVO);
 
         // 查询历史任务
         List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId));
+        processDetailVO.setInstanceId(String.valueOf(instanceId));
         processDetailVO.setFlwHisTasks(flwHisTasks);
 
-        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, flwTask.getInstanceId())
-                .orderByDesc(StateProcessInstanceAction::getCreateTime));
+        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, instanceId)
+                .orderByAsc(StateProcessInstanceAction::getCreateTime));
         for (StateProcessInstanceAction stateProcessInstanceAction : list) {
             SysUser sysUser = sysUserService.selectUserById(Long.valueOf(stateProcessInstanceAction.getAuditorId()));
             if(Objects.nonNull(sysUser)){
@@ -1230,6 +1325,9 @@
         if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
             stateTaskQuery.between(FlwHisTask::getCreateTime, startTime, endTime);
         }
+        if(Objects.isNull(processTaskListBO.getSortBy())){
+            processTaskListBO.setSortBy(2);
+        }
         if (processTaskListBO.getSortBy() == 1) {
             stateTaskQuery.orderByAsc(FlwHisTask::getCreateTime);
         }
@@ -1246,11 +1344,9 @@
         // 查询合同信息
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
             // 查询合同信息
-            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
+            TContract contract = contractMapper.selectById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
             processTaskListVO.setContract(contract);
         }
-
-        pageInfo.setRecords(processTaskListVOS);
 
         if (ObjectUtil.isEmpty(processTaskListVOS)) {
             return pageInfo;
@@ -1268,13 +1364,15 @@
         } else {
             sysUserMap = new HashMap<>();
         }
-
         for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
+            processTaskListVO.setStatus(processTaskListVO.getTaskState() == 10 ? "2" : processTaskListVO.getTaskState().toString());
+            processTaskListVO.setTaskId(processTaskListVO.getId());
             SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
             if (Objects.nonNull(sysUser)) {
                 processTaskListVO.setCreateBy(sysUser.getNickName());
             }
         }
+        pageInfo.setRecords(processTaskListVOS);
         return pageInfo;
     }
 
@@ -1285,5 +1383,12 @@
         }
         return FlowCreator.of(String.valueOf(loginUser.getUserId()), loginUser.getUser().getNickName());
     }
+    private FlowCreator currentFlowCreator(Long userId) {
+        if (null == userId) {
+            throw new GlobalException("非法用户");
+        }
+        SysUser sysUser = sysUserService.selectUserById(userId);
+        return FlowCreator.of(String.valueOf(sysUser.getUserId()), sysUser.getNickName());
+    }
 
 }

--
Gitblit v1.7.1