ソースを参照

流程流转记录

大数据与最优化研究所 1 年間 前
コミット
89f5368a46

+ 1 - 1
src/main/java/com/xjrsoft/module/workflow/entity/XjrWorkflowOperateRecord.java

@@ -75,7 +75,7 @@ public class XjrWorkflowOperateRecord implements Serializable {
     * 记录时间
     */
     @ApiModelProperty("记录时间")
-    private Date recordTime;
+    private LocalDateTime recordTime;
     /**
     * 传阅信息
     */

+ 272 - 41
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -87,19 +87,8 @@ import com.xjrsoft.module.workflow.dto.SetSuspendedDto;
 import com.xjrsoft.module.workflow.dto.TransferDto;
 import com.xjrsoft.module.workflow.dto.UpdateDraftDto;
 import com.xjrsoft.module.workflow.dto.WithdrawDto;
-import com.xjrsoft.module.workflow.entity.WorkflowApproveRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowCirculated;
-import com.xjrsoft.module.workflow.entity.WorkflowDelegate;
-import com.xjrsoft.module.workflow.entity.WorkflowDraft;
-import com.xjrsoft.module.workflow.entity.WorkflowExtra;
-import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
-import com.xjrsoft.module.workflow.entity.WorkflowRecord;
-import com.xjrsoft.module.workflow.entity.WorkflowSchema;
-import com.xjrsoft.module.workflow.mapper.WorkflowDelegateMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowRecordMapper;
-import com.xjrsoft.module.workflow.mapper.WorkflowSchemaMapper;
-import com.xjrsoft.module.workflow.mapper.XjrWorkflowExtraMapper;
+import com.xjrsoft.module.workflow.entity.*;
+import com.xjrsoft.module.workflow.mapper.*;
 import com.xjrsoft.module.workflow.model.ApiConfig;
 import com.xjrsoft.module.workflow.model.ApiRequestParamsConfig;
 import com.xjrsoft.module.workflow.model.AuthConfig;
@@ -112,13 +101,7 @@ import com.xjrsoft.module.workflow.model.RelationProcessConfig;
 import com.xjrsoft.module.workflow.model.StartNodeConfig;
 import com.xjrsoft.module.workflow.model.UserTaskConfig;
 import com.xjrsoft.module.workflow.model.WorkflowSchemaConfig;
-import com.xjrsoft.module.workflow.service.IWorkflowApproveRecordService;
-import com.xjrsoft.module.workflow.service.IWorkflowCirculatedService;
-import com.xjrsoft.module.workflow.service.IWorkflowDraftService;
-import com.xjrsoft.module.workflow.service.IWorkflowExecuteService;
-import com.xjrsoft.module.workflow.service.IWorkflowExtraService;
-import com.xjrsoft.module.workflow.service.IWorkflowFormRelationService;
-import com.xjrsoft.module.workflow.service.IWorkflowRecordService;
+import com.xjrsoft.module.workflow.service.*;
 import com.xjrsoft.module.workflow.utils.WorkFlowUtil;
 import com.xjrsoft.module.workflow.vo.AllRecordListVo;
 import com.xjrsoft.module.workflow.vo.ApproveMultiInfoVo;
@@ -238,6 +221,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
     private final WorkflowRecordMapper workflowRecordMapper;
 
+    private final XjrWorkflowOperateRecordMapper xjrWorkflowOperateRecordMapper;
+
     private final IWorkflowCirculatedService circulatedService;
 
     private final IWorkflowApproveRecordService approveRecordService;
@@ -560,7 +545,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
             //获取主流程审批记录
-            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+            // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+            List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(superProcessInstanceId, 0);
 
             Map<String, Object> superProcessMap = new HashMap<>();
             superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
@@ -586,7 +572,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
 
                     //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                    // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                    List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
                     superProcessMap.put("records", processRecordListVos);
 
                     otherProcessApproveRecord.add(superProcessMap);
@@ -595,7 +582,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         }
         //TODO  新增返回值  返回 主/子 流程 审批记录
 
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
+        // List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
+        List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(task.getProcessInstanceId(), 0);
         vo.setTaskRecords(recordListVos);
         vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
         return vo;
@@ -799,7 +787,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                     HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
                     //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+                    // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+                    List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(superProcessInstanceId, 0);
 
                     Map<String, Object> superProcessMap = new HashMap<>();
                     superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
@@ -823,7 +812,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                             superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
 
                             //获取主流程审批记录
-                            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                            // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                            List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
                             superProcessMap.put("records", processRecordListVos);
 
                             otherProcessApproveRecord.add(superProcessMap);
@@ -832,7 +822,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 }
                 //TODO  新增返回值  返回 主/子 流程 审批记录
 
-                List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+                // List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+                List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(processId, 0);
                 vo.setTaskRecords(recordListVos);
                 vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
             }
@@ -918,7 +909,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                     HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
                     //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+                    // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+                    List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(superProcessInstanceId, 0);
 
                     Map<String, Object> superProcessMap = new HashMap<>();
                     superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
@@ -942,7 +934,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                             superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
 
                             //获取主流程审批记录
-                            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                            // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                            List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
                             superProcessMap.put("records", processRecordListVos);
 
                             otherProcessApproveRecord.add(superProcessMap);
@@ -951,7 +944,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 }
                 //TODO  新增返回值  返回 主/子 流程 审批记录
 
-                List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+                //List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+                List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(processId, 0);
                 vo.setTaskRecords(recordListVos);
                 vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
             }
@@ -1039,7 +1033,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
                 //获取主流程审批记录
-                List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+                // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 0);
+                List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(superProcessInstanceId, 0);
 
                 Map<String, Object> superProcessMap = new HashMap<>();
                 superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
@@ -1063,7 +1058,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                         superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
 
                         //获取主流程审批记录
-                        List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                        //List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
+                        List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 0);
                         superProcessMap.put("records", processRecordListVos);
 
                         otherProcessApproveRecord.add(superProcessMap);
@@ -1072,7 +1068,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             }
             //TODO  新增返回值  返回 主/子 流程 审批记录
 
-            List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+            // List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+            List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(processId, 0);
             vo.setTaskRecords(recordListVos);
             vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
 
@@ -1098,7 +1095,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
             HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(superProcessInstanceId).variableName(WorkflowConstant.PROCESS_SCHEMA_NAME_KEY).singleResult();
             //获取主流程审批记录
-            List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 1);
+            // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(superProcessInstanceId, 1);
+            List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(superProcessInstanceId, 1);
 
             Map<String, Object> superProcessMap = new HashMap<>();
             superProcessMap.put("schemaName", historicVariableInstance.getValue() + "(上级流程)");
@@ -1121,7 +1119,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     superProcessMap.put("schemaName", schemaNameVar.getValue() + "(下级流程)");
 
                     //获取主流程审批记录
-                    List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 1);
+                    // List<ProcessRecordListVo> processRecordListVos = getProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 1);
+                    List<ProcessRecordListVo> processRecordListVos = getCustomProcessRecordListVos(schemaNameVar.getProcessInstanceId(), 1);
                     superProcessMap.put("records", processRecordListVos);
 
                     otherProcessApproveRecord.add(superProcessMap);
@@ -1130,7 +1129,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         }
         //TODO  新增返回值  返回 主/子 流程 审批记录
 
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 1);
+        // List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 1);
+        List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(processId, 1);
         vo.setTaskRecords(recordListVos);
         vo.setOtherProcessApproveRecord(otherProcessApproveRecord);
         return vo;
@@ -2019,6 +2019,20 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 String oldTaskName = task.getName();
                 record.setCirculateMessage(circulateMessage);
 
+                //新增流程自定义发起流程记录
+                XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                xjrWorkflowOperateRecord.setNodeId(task.getId());
+                xjrWorkflowOperateRecord.setNodeName(task.getName());
+                xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
+                xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+                //当前任务的名称
+                String oldTaskNameCustom = task.getName();
+                xjrWorkflowOperateRecord.setCirculateMessage(circulateMessage);
+
                 taskService.complete(task.getId());
                 List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
                 result = isPrevChooseApprove(workflowSchemaConfig, list, variableMap);
@@ -2032,6 +2046,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 //新增工作流程信息数据
                 addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, oldTaskName, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
 
+                addCustomWorkflowRecord(userTaskConfig, nextTaskNameList, user, xjrWorkflowOperateRecord, oldTaskNameCustom, buttonConfig.getButtonName(), dto.getApprovedContent(), task, resultName);
+
             }
 
             //如果是驳回
@@ -2066,6 +2082,21 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 //                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
                     record.setMessage("审批信息:【" + user.getName() + "】【驳回】审批,由【" + task.getName() + "】 流转到【" + rejectUserTaskConfig.getName() + "】");
                     workflowRecordMapper.insert(record);
+
+                    //新增自定义流程发起流程记录
+                    XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                    xjrWorkflowOperateRecord.setNodeId(task.getId());
+                    xjrWorkflowOperateRecord.setNodeName(task.getName());
+                    xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                    xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                    xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                    xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                    xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now().minusSeconds(+1));//时间设置提前1秒钟,好排序
+
+//                    record.setMessage("【审批人:" + user.getName() + "】 将 【任务:" + task.getName() + "】 驳回到 【任务:" + rejectUserTaskConfig.getName() + "】");
+                    String message = "审批人:" + user.getName() + ", 审批结果:驳回, 审批内容:驳回, 审批日期:" + LocalDateTime.now();
+                    xjrWorkflowOperateRecord.setOperateInfo(message);
+                    xjrWorkflowOperateRecordMapper.insert(xjrWorkflowOperateRecord);
                 });
 
             }
@@ -2095,6 +2126,19 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
                 workflowRecordMapper.insert(record);
 
+                //新增流程发起流程记录
+                XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                xjrWorkflowOperateRecord.setNodeId(task.getId());
+                xjrWorkflowOperateRecord.setNodeName(task.getName());
+                xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+
+                String message = "审批人:" + user.getName() + ", 审批结果:结束, 审批内容:结束流程, 审批日期:" + LocalDateTime.now();
+                xjrWorkflowOperateRecord.setOperateInfo(message);
+                xjrWorkflowOperateRecordMapper.insert(xjrWorkflowOperateRecord);
             }
 
             updateFileInfo(dto.getFileFolderIds(), task.getProcessInstanceId());
@@ -2371,6 +2415,17 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
                     record.setRecordTime(LocalDateTime.now());
 
+                    //批量审批流程信息记录
+                    XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+                    xjrWorkflowOperateRecord.setNodeId(task.getId());
+                    xjrWorkflowOperateRecord.setNodeName(task.getName());
+                    xjrWorkflowOperateRecord.setNodeType(WorkflowConstant.USER_TASK_TYPE_NAME);
+                    xjrWorkflowOperateRecord.setProcessId(task.getProcessInstanceId());
+                    xjrWorkflowOperateRecord.setSchemaId(schemaId);
+                    xjrWorkflowOperateRecord.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+                    //时间设值必须写在complete上面,防止用户任务节点监听时的流程信息,在次任务前面。
+                    xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+
                     //新增审批详情返回给前端
                     ApproveMultiVo approveMultiVo = new ApproveMultiVo();
                     WorkflowExtra extraFirst = workflowExtras.stream().filter(x -> x.getTaskId().equals(task.getId())).findFirst().orElse(new WorkflowExtra());
@@ -2380,6 +2435,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     if (dto.getApprovedType() == WorkflowApproveType.AGREE.getCode()) {
                         //新增工作流程信息数据
                         addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "同意", dto.getApprovedContent(), task, resultName);
+                        addCustomWorkflowRecord(userTaskConfig, nextTaskNameList, user, xjrWorkflowOperateRecord, task.getName(), "同意", dto.getApprovedContent(), task, resultName);
 
                         if (nextTaskNameList.size() == 0) {
                             String message = "【" + user.getName() + "】【同意】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
@@ -2402,6 +2458,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                     if (dto.getApprovedType() == WorkflowApproveType.DISAGREE.getCode()) {
                         //新增工作流程信息数据
                         addWorkflowRecord(userTaskConfig, nextTaskNameList, user, record, task.getName(), "拒绝", dto.getApprovedContent(), task, resultName);
+                        addCustomWorkflowRecord(userTaskConfig, nextTaskNameList, user, xjrWorkflowOperateRecord, task.getName(), "拒绝", dto.getApprovedContent(), task, resultName);
                         if (nextTaskNameList.size() == 0) {
                             String message = "【" + user.getName() + "】【拒绝】审批,审批意见为:“【" + dto.getApprovedContent() + "】”,由【" + task.getName() + "】 流转到【结束节点】";
                             approveMultiVo.setApproveDetail(message);
@@ -2746,7 +2803,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             throw new MyException("当前任务没有开始节点");
         }
 
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
+        // List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
+        List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(task.getProcessInstanceId(), 0);
         vo.setTaskRecords(recordListVos);
 
         //将map 转为 java类
@@ -2811,7 +2869,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         if (!userNodeConfigOp.isPresent()) {
             throw new MyException("当前任务没有开始节点");
         }
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
+        //List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(task.getProcessInstanceId(), 0);
+        List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(task.getProcessInstanceId(), 0);
         vo.setTaskRecords(recordListVos);
 
         //查询任务关联任务
@@ -2905,7 +2964,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
 
 
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+        //List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(processId, 0);
+        List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(processId, 0);
         vo.setTaskRecords(recordListVos);
 
         List<Object> allFormConfigs = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsKey("formConfigs")).map(x -> x.get("formConfigs")).collect(Collectors.toList());
@@ -2983,7 +3043,8 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         if (!userNodeConfigOp.isPresent()) {
             throw new MyException("当前任务没有开始节点");
         }
-        List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(historicTaskInstance.getProcessInstanceId(), 0);
+        //List<ProcessRecordListVo> recordListVos = getProcessRecordListVos(historicTaskInstance.getProcessInstanceId(), 0);
+        List<ProcessRecordListVo> recordListVos = getCustomProcessRecordListVos(historicTaskInstance.getProcessInstanceId(), 0);
         vo.setTaskRecords(recordListVos);
 
         //查询任务关联任务
@@ -3192,13 +3253,13 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
             List<String> currentTask = list.stream().map(Task::getTaskDefinitionKey).distinct().collect(Collectors.toList());
             vo.setCurrentNodes(currentTask);
         }
-
         return vo;
     }
 
     @Override
     public List<ProcessRecordListVo> getProcessRecord(String processInstanceId) {
-        return getProcessRecordListVos(processInstanceId, 0);
+        //return getProcessRecordListVos(processInstanceId, 0);
+        return getCustomProcessRecordListVos(processInstanceId, 0);
     }
 
     @Override
@@ -3639,6 +3700,7 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
         record.setRecordTime(LocalDateTime.now());
         String oldTaskName = workflowExtra.getTaskName();
+
         //如果传入的是开始节点的值  默认是关闭流程  重新发起
         if (StrUtil.equals(dto.getActivityId(), historicProcessInstance.getStartActivityId())) {
 
@@ -4329,6 +4391,63 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         return recordListVos;
     }
 
+    /**
+     * 根据流程id  获取流程流转信息(自定义)
+     *
+     * @param processInstanceId
+     * @return
+     */
+    private List<ProcessRecordListVo> getCustomProcessRecordListVos(String processInstanceId, int onlySelf) {
+
+        User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
+        List<Long> roleIds = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_ROLE_ID_KEY, new ArrayList<>());
+        LambdaQueryWrapper<XjrWorkflowOperateRecord> workflowOperateRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        if (onlySelf == YesOrNoEnum.YES.getCode()) {//仅查看本人
+            if (roleIds.contains(GlobalConstant.SUPER_ADMIN_ROLE_ID)) {//管理员数据
+                workflowOperateRecordLambdaQueryWrapper.eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .orderByAsc(XjrWorkflowOperateRecord::getRecordTime)
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, user.getName())
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, "流程结束")
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, "脚本节点")
+                        .eq(XjrWorkflowOperateRecord::getCreateUserId, StpUtil.getLoginIdAsLong())//脚本任务
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId);
+            } else {//其他人数据
+                workflowOperateRecordLambdaQueryWrapper.eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .orderByAsc(XjrWorkflowOperateRecord::getRecordTime)
+                        .eq(XjrWorkflowOperateRecord::getCreateUserId, StpUtil.getLoginIdAsLong())
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, user.getName())
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, user.getName())
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                        .or()
+                        .like(XjrWorkflowOperateRecord::getOperateInfo, "脚本节点")
+                        .eq(XjrWorkflowOperateRecord::getCreateUserId, StpUtil.getLoginIdAsLong())//脚本任务
+                        .eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId);
+            }
+        } else {
+            workflowOperateRecordLambdaQueryWrapper.eq(XjrWorkflowOperateRecord::getProcessId, processInstanceId)
+                    .orderByAsc(XjrWorkflowOperateRecord::getRecordTime);
+        }
+
+        List<XjrWorkflowOperateRecord> workflowOperateRecords = xjrWorkflowOperateRecordMapper.selectList(workflowOperateRecordLambdaQueryWrapper);
+
+        List<ProcessRecordListVo> recordListVos = new ArrayList<>(workflowOperateRecords.size());
+        for (XjrWorkflowOperateRecord workflowOperateRecord : workflowOperateRecords) {
+            ProcessRecordListVo recordListVo = new ProcessRecordListVo();
+            recordListVo.setNodeType(workflowOperateRecord.getNodeType());
+            recordListVo.setNodeName(workflowOperateRecord.getNodeName());
+            recordListVo.setComment(workflowOperateRecord.getOperateInfo());
+            recordListVo.setStartTime(workflowOperateRecord.getRecordTime());
+            recordListVo.setCirculateMessage(workflowOperateRecord.getCirculateMessage());
+            recordListVos.add(recordListVo);
+        }
+
+        return recordListVos;
+    }
+
 
     private void invokeAutoAgree(String processInstanceId, Long schemaId, WorkflowSchemaConfig workflowSchemaConfig, List<Task> taskList) {
 
@@ -4387,6 +4506,9 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         List<Long> allUserIds = new ArrayList<>();//所有自动同意审批的用户id
         //新增流程发起流程记录
         WorkflowRecord record = new WorkflowRecord();
+        //自定义流程发起记录
+        XjrWorkflowOperateRecord xjrWorkflowOperateRecord = new XjrWorkflowOperateRecord();
+
         //候选审批人包含流程任务发起人
         if (autoAgreeConfig.contains(WorkflowAutoAgreeType.APPROVED_INCLUDE_INITIATOR.getCode())) {
             if (approveUserIds.contains(startUserId)) {
@@ -4454,6 +4576,9 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         if (isAgree) {
             //自动同意之后完成本次任务
             record.setRecordTime(LocalDateTime.now());
+
+            xjrWorkflowOperateRecord.setRecordTime(LocalDateTime.now());
+
             taskService.complete(task.getId());
             List<Task> list = taskService.createTaskQuery().processInstanceId(task.getProcessInstanceId()).list();
             String allOpinions = StringPool.EMPTY;
@@ -4467,12 +4592,19 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
                 String allNextTaskName = StrUtil.join(StringPool.SPACE, list.parallelStream().map(t -> "【" + t.getName() + "】").collect(Collectors.toList()));
 
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 " + allNextTaskName;
+                String operateInfo = "审批人:" + approveName + ", 审批结果:" + allOpinions + ", 审批内容:自动同意, 审批日期:" + LocalDateTime.now();
+
                 addProcessRecord(task, schemaId, message, record);
+                addCustomProcessRecord(task, schemaId, operateInfo, xjrWorkflowOperateRecord);
+
                 // 如果还有用户任务  则递归调用
                 invokeAutoAgree(processInstanceId, schemaId, workflowSchemaConfig, list);
             } else {
                 String message = "【" + approveName + "】【自动同意】 审批, 审批意见为:“【" + allOpinions + "】”,由【" + task.getName() + "】流转到 结束节点";
+                String operateInfo = "审批人:" + approveName + ", 审批结果:" + allOpinions + ", 审批内容:自动同意, 审批日期:" + LocalDateTime.now();
+
                 addProcessRecord(task, schemaId, message, record);
+                addCustomProcessRecord(task, schemaId, operateInfo, xjrWorkflowOperateRecord);
             }
         }
 
@@ -4788,6 +4920,22 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
 
     }
 
+    private void addCustomProcessRecord(Task task, Long schemaId, String message, XjrWorkflowOperateRecord record) {
+
+        IXjrWorkflowOperateRecordService xjrWorkflowOperateRecordService = SpringUtil.getBean(IXjrWorkflowOperateRecordService.class);
+        //新增流程发起流程记录
+        record.setNodeId(task.getId());
+        record.setNodeName(task.getName());
+        record.setNodeType(WorkflowConstant.START_EVENT_TYPE_NAME);
+        record.setProcessId(task.getProcessInstanceId());
+        record.setSchemaId(schemaId);
+        record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
+
+        record.setOperateInfo(message);
+
+        xjrWorkflowOperateRecordService.save(record);
+    }
+
 
     /**
      * 记录开始节点
@@ -5045,6 +5193,89 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         workflowRecordMapper.insert(record);
     }
 
+    /**
+     * 新增工作流程信息数据
+     *
+     * @param userTaskConfig   用户任务配置信息
+     * @param nextTaskNameList 下一个节点的名称集合
+     * @param user             当前用户的对象
+     * @param record           工作流程信息的对象
+     * @param oldTaskName      前一个节点的名称
+     * @param buttonName       按钮名称
+     */
+    private void addCustomWorkflowRecord(UserTaskConfig userTaskConfig, List<String> nextTaskNameList, User user, XjrWorkflowOperateRecord record, String oldTaskName, String buttonName, String approvedContent, Task task, Object resultName) {
+        //单实例
+        if (userTaskConfig.getCountersignConfig().getMultipleInstancesType() == WorkflowMultiInstanceType.NONE.getCode()) {
+            //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
+            if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
+                String message = "审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now();
+                record.setOperateInfo(message);
+            }
+            //单流向
+            if (nextTaskNameList.size() == 1) {
+                String message = "审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now();
+                record.setOperateInfo(message);
+            }//多流向
+            if (nextTaskNameList.size() > 1) {
+                String message = "审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now();
+                record.setOperateInfo(message);
+            }
+        }
+        //多实例,判断是不是会签流程,以及会签流程的状态
+        else {
+            //判断是否达到完成条件
+            List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceIdIn(task.getProcessInstanceId()).list();
+            Boolean getCompleteConditional = isGetCompleteConditional(userTaskConfig, list);
+
+            //审批但未达到完成条件;审批信息:[会签][用户名] [审批按钮名称]审批,审批意见为:“[审批意见]”。
+            if (getCompleteConditional) {
+                //获取当前节点是否完成会签或者会签失败
+                if (ObjectUtil.isNotEmpty(resultName)) { //resultName只能从这个节点拿,不然会签节点后直接结束流程,就会拿不到流程变量信息
+                    Boolean isSuccess = Boolean.valueOf(resultName.toString());
+                    //审批达到完成条件,完成会签;审批信息:[会签][用户名] [审按名称]审批,审批见为:[审批意见]”,达到会签完成条件,由[上一节点名称]流转到下,多流向的情况则由[上一节点名称] 流转到[多流向节点名称]。
+                    if (isSuccess) {
+                        //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
+                        if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                        //单流向
+                        if (nextTaskNameList.size() == 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }//多流向
+                        if (nextTaskNameList.size() > 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                    }
+                    //审批达到完成条件,会签失败;例如:审批信息:[会签][用户名][审按名称]审批,审批意见为:“[审批意见]”,未达到会签完成条件,由[管理层审批]流转到(部门审批]
+                    if (buttonName.equals(WorkflowApproveType.DISAGREE.getValue())) {
+                        //用户节点到结束节点或者脚本节点,点击按钮时,也需要设置流程信息
+                        if (nextTaskNameList.size() == 0 && !buttonName.equals("")) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",未达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                        //单流向
+                        if (nextTaskNameList.size() == 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",未达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }//多流向
+                        if (nextTaskNameList.size() > 1) {
+                            String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",未达到会签完成条件";
+                            record.setOperateInfo(message);
+                        }
+                    }
+                }
+            } else {
+                //审批但未达到完成条件;审批信息:[会签][用户名] [审批按钮名称]审批,审批意见为:“[审批意见]”。
+                String message = "【会签】审批人:" + user.getName() + ", 审批结果:" + buttonName + ", 审批内容:" + approvedContent + ", 审批日期:" + LocalDateTime.now() + ",未达到会签完成条件";
+                record.setOperateInfo(message);
+            }
+        }
+        xjrWorkflowOperateRecordMapper.insert(record);
+    }
+
     /**
      * 判断多实例是否达到完成条件
      *

+ 26 - 7
src/main/resources/mapper/textbook/TextbookIssueRecordMapper.xml

@@ -71,25 +71,44 @@
     </select>
 
     <select id="getList" parameterType="com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto" resultType="com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo">
-        SELECT t1.id,t1.sort_code,t3.issn,t3.book_name,t3.publishing_house,t3.editor_in_chief,t7.group_name,t5.name AS grade_name,
-        t6.name AS class_name,t8.name AS course_name,t10.name AS textbook_type_cn,t3.specifications_models,
-        t11.name AS issue_mode_cn,t1.create_date,t9.name AS claim_user,t1.issue_number FROM textbook_issue_record t1
+        SELECT t1.id,
+        t1.sort_code,
+        t3.issn,
+        t3.book_name,
+        t3.publishing_house,
+        t3.editor_in_chief,
+        t7.group_name,
+        t5.name  AS grade_name,
+        ifnull(t6.name, t14.name)  AS class_name,
+        t8.name  AS course_name,
+        t10.name AS textbook_type_cn,
+        t3.specifications_models,
+        t11.name AS issue_mode_cn,
+        t1.create_date,
+        t9.name  AS claim_user,
+        t1.issue_number,
+        t15.name as baseSemesterIdCn
+        FROM textbook_issue_record t1
         LEFT JOIN wf_textbook_claim_item t2 ON t1.data_item_id = t2.id
-        LEFT JOIN textbook t3 ON t2.textbook_id = t3.id
-        LEFT JOIN wf_textbook_claim t4 ON t2.wf_textbook_claim_id = t4.id
+        LEFT JOIN wf_textbook_claim t4 ON t1.data_id = t4.id
+        LEFT JOIN wf_textbook_recede_item t12 ON t12.id = t1.data_item_id
+        LEFT JOIN wf_textbook_recede t13 ON t13.id = t1.data_id
+        LEFT JOIN textbook t3 ON t3.id = t1.textbook_id
         LEFT JOIN base_grade t5 ON t3.grade_id = t5.id
         LEFT JOIN base_class t6 ON t4.class_id = t6.id
+        LEFT JOIN base_class t14 ON t13.class_id = t14.id
         LEFT JOIN subject_group t7 ON t3.subject_group_id = t7.id
         LEFT JOIN base_course_subject t8 ON t3.course_subject_id = t8.id
-        LEFT JOIN xjr_user t9 ON t4.claim_user_id = t9.id
+        LEFT JOIN xjr_user t9 ON t1.receive_user_id = t9.id
         LEFT JOIN xjr_dictionary_detail t10 ON t3.textbook_type = t10.code AND t10.item_id = 1739209191193636865
         LEFT JOIN xjr_dictionary_detail t11 ON t1.issue_mode = t11.code AND t11.item_id = 1739821685805215745
+        LEFT JOIN base_semester t15 ON t15.id = t3.base_semester_id
         WHERE t1.delete_mark = 0
         <if test="dto.ids != null and dto.ids.size() > 0">
             and t1.id in <foreach item="id" index="index" collection="dto.ids" open="(" close=")"
                                   separator=",">
             #{id}
-        </foreach>
+                        </foreach>
         </if>
         order by t1.create_date desc
     </select>

+ 1 - 1
src/main/resources/mapper/textbook/TextbookMapper.xml

@@ -272,7 +272,7 @@
                 left join textbook t2 on t2.id = t1.textbook_id
             where claim_type = 'claim_student'
             <if test="dto.baseSemesterId != null and dto.baseSemesterId > 0">
-                amd t.base_semester_id = #{dto.baseSemesterId}
+                and t.base_semester_id = #{dto.baseSemesterId}
             </if>
             <if test="dto.classId != null and dto.classId > 0">
                 and t.class_id = #{dto.classId}