From 9c11f9598708bca0fc9c2bdd95715ce2ea3cd0a7 Mon Sep 17 00:00:00 2001 From: pengqiang Date: Fri, 12 Nov 2021 16:43:47 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A1=A8=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E9=A1=B9=E7=9B=AE=E7=9A=84=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work/config/activiti/ActConstant.java | 10 +--- .../palmte/work/model/ProjectTaskRecord.java | 52 +++++++++++++++++ .../model/ProjectTaskRecordRepository.java | 8 +++ .../work/service/ActCallbackScript.java | 36 ++++++++---- .../work/service/ActListenerService.java | 23 +++++++- .../work/service/ActProcInsService.java | 9 ++- .../work/service/ActTaskDefService.java | 44 +++++++++------ .../service/ProjectTaskRecordService.java | 56 +++++++++++++++++++ .../java/cn/palmte/work/utils/ActUtil.java | 12 +++- .../templates/admin/act_his_task_list.ftl | 4 +- .../templates/admin/act_task_def.ftl | 6 +- 11 files changed, 212 insertions(+), 48 deletions(-) create mode 100644 src/main/java/cn/palmte/work/model/ProjectTaskRecord.java create mode 100644 src/main/java/cn/palmte/work/model/ProjectTaskRecordRepository.java create mode 100644 src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java diff --git a/src/main/java/cn/palmte/work/config/activiti/ActConstant.java b/src/main/java/cn/palmte/work/config/activiti/ActConstant.java index c51e9b8..2fa77d7 100644 --- a/src/main/java/cn/palmte/work/config/activiti/ActConstant.java +++ b/src/main/java/cn/palmte/work/config/activiti/ActConstant.java @@ -9,21 +9,13 @@ public class ActConstant { public static final String PROC_INS_ID="procInsId"; + public static final String PROC_DEF_KEY="procDefKey"; /** * 第一个用户任务 即:发起申请任务 */ public static final int TASK_INDEX_FIRST_USER_TASK= 1; - /** - * 审批通过 - */ - public static final int TYPE_APPROVE= 1; - /** - * 审批驳回 - */ - public static final int TYPE_ROLLBACK= 2; - /** * 单实例 或签 diff --git a/src/main/java/cn/palmte/work/model/ProjectTaskRecord.java b/src/main/java/cn/palmte/work/model/ProjectTaskRecord.java new file mode 100644 index 0000000..fca0582 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectTaskRecord.java @@ -0,0 +1,52 @@ +package cn.palmte.work.model; + +import lombok.Data; + +import javax.persistence.*; +import java.util.Date; +import java.util.List; + +/** + * 项目审批任务记录 + */ +@Data +@Entity +@Table(name = "project_task_record") +public class ProjectTaskRecord { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int id; + + @Column(name = "project_id") + private int projectId; + + @Column(name = "proc_def_id") + private String procDefId; + + @Column(name = "proc_ins_id") + private String procInsId; + + @Column(name = "task_def_key") + private String taskDefKey; + + @Column(name = "task_name") + private String taskName; + + @Column(name = "task_status") + private int taskStatus; + + @Column(name = "task_assignee_id") + private String taskAssigneeId; + + @Column(name = "task_assignee_name") + private String taskAssigneeName; + + @Column(name = "task_comment") + private String taskComment; + + @Column(name = "create_time") + private Date createTime; + + +} diff --git a/src/main/java/cn/palmte/work/model/ProjectTaskRecordRepository.java b/src/main/java/cn/palmte/work/model/ProjectTaskRecordRepository.java new file mode 100644 index 0000000..288b8b3 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/ProjectTaskRecordRepository.java @@ -0,0 +1,8 @@ +package cn.palmte.work.model; + +import org.springframework.data.jpa.repository.JpaRepository; + + +public interface ProjectTaskRecordRepository extends JpaRepository { + +} diff --git a/src/main/java/cn/palmte/work/service/ActCallbackScript.java b/src/main/java/cn/palmte/work/service/ActCallbackScript.java index 9d23550..ed6d7bc 100644 --- a/src/main/java/cn/palmte/work/service/ActCallbackScript.java +++ b/src/main/java/cn/palmte/work/service/ActCallbackScript.java @@ -1,9 +1,13 @@ package cn.palmte.work.service; +import cn.palmte.work.bean.ApproveStatusEnum; import cn.palmte.work.config.activiti.ActConstant; +import cn.palmte.work.utils.ActUtil; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @@ -15,21 +19,29 @@ import java.util.*; @Service public class ActCallbackScript { private static final Logger logger = LoggerFactory.getLogger(ActCallbackScript.class); + @Autowired + private ActUtil actUtil; + @Autowired + private ProjectInstanceService projectInstanceService; + /** + * 更新流程审批通过 + * + * @param map + */ + public void updateApproveStatus(Map map) { + logger.info("--- updateApproveStatus--- : {} ", map); + //String startUserId = (String) map.get(ActConstant.START_PROCESS_USERID); + String procInsId = (String) map.get(ActConstant.PROC_INS_ID); + String procDefKey = (String) map.get(ActConstant.PROC_DEF_KEY); + logger.info(" updateApproveStatus procInsId:{}, procDefKey:{}", procInsId, procDefKey); + + int projectId = actUtil.getProjectId(procInsId); + if (projectId > 0) { + projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_PASSED, procDefKey); + } - public void endScriptDemo(Map map) { - logger.info("--- endScriptDemo--- : {} ", map); - String startUserId = (String)map.get(ActConstant.START_PROCESS_USERID); - String procInsId = (String)map.get(ActConstant.START_PROCESS_USERID); - logger.info(" startUserId:{}, procInsId:{}", startUserId, procInsId); } - public void rollbackScriptDemo(Map map) { - logger.info("--- rollbackScriptDemo--- : {} ", map); - String startUserId = (String)map.get(ActConstant.START_PROCESS_USERID); - String procInsId = (String)map.get(ActConstant.START_PROCESS_USERID); - logger.info(" startUserId:{}, procInsId:{}", startUserId, procInsId); - } - } diff --git a/src/main/java/cn/palmte/work/service/ActListenerService.java b/src/main/java/cn/palmte/work/service/ActListenerService.java index 938c30b..1b35b6c 100644 --- a/src/main/java/cn/palmte/work/service/ActListenerService.java +++ b/src/main/java/cn/palmte/work/service/ActListenerService.java @@ -1,6 +1,7 @@ package cn.palmte.work.service; +import cn.palmte.work.config.activiti.ActConstant; import com.alibaba.fastjson.JSONObject; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateTask; @@ -10,6 +11,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Iterator; import java.util.List; import java.util.Set; @@ -25,6 +27,9 @@ public class ActListenerService { @Autowired private ActTaskDefService actTaskDefService; + @Autowired + private ProjectInstanceService projectInstanceService; + /** * 节点创建监听 动态设置审批人 * @@ -37,8 +42,22 @@ public class ActListenerService { String procDefId = delegateTask.getProcessDefinitionId(); String procInsId = delegateTask.getProcessInstanceId(); String taskDefKey = delegateTask.getTaskDefinitionKey(); - Set candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); + List candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); logger.info("addCandidateUsers : {}", candidateUsers); + + + Object projectIdObj = delegateTask.getVariable(ActConstant.KEY_PROJECT_ID); + logger.info("projectIdObj : {}", projectIdObj); + + if (candidateUsers != null && !candidateUsers.isEmpty() && projectIdObj != null) { + try { + int adminId = Integer.parseInt(candidateUsers.get(0)); + projectInstanceService.updateApprover((Integer) projectIdObj, adminId); + } catch (Exception e) { + logger.error("", e); + } + } + delegateTask.addCandidateUsers(candidateUsers); } @@ -55,7 +74,7 @@ public class ActListenerService { }*/ - public Set multipleInstanceTask(DelegateExecution delegateExecution) throws Exception { + public List multipleInstanceTask(DelegateExecution delegateExecution) throws Exception { String procInsId = delegateExecution.getProcessInstanceId(); String procDefId = delegateExecution.getProcessDefinitionId(); String taskDefKey = delegateExecution.getCurrentActivityId(); diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java index f90e188..d6c8616 100644 --- a/src/main/java/cn/palmte/work/service/ActProcInsService.java +++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java @@ -1,6 +1,7 @@ package cn.palmte.work.service; +import cn.palmte.work.bean.ApproveStatusEnum; import cn.palmte.work.model.ActTaskDefRepository; import cn.palmte.work.pojo.ActProcIns; import cn.palmte.work.utils.ActUtil; @@ -50,7 +51,7 @@ public class ActProcInsService { Pagination pagination; @Autowired - private ActTaskDefService actTaskDefService; + private ProjectTaskRecordService projectTaskRecordService; @Autowired private HistoryService historyService; //历史管理(执行完的数据的管理) @@ -91,16 +92,18 @@ public class ActProcInsService { String assignee = InterfaceUtil.getAdminId() + ""; task.setAssignee(assignee); String taskId = task.getId(); - taskService.addComment(taskId, procInsId, "提交审批"); + String comment = "提交" + processDefinition.getName(); + taskService.addComment(taskId, procInsId, comment); taskService.complete(taskId); actTaskDefRepository.updateHiTaskAssign(assignee, procInsId, taskId); actTaskDefRepository.updateHiActAssign(assignee, procInsId, taskId); + projectTaskRecordService.saveTaskRecord(task, ApproveStatusEnum.APPROVAL_PENDING.getApproveStatus(), comment); + return processInstance.getId(); } - /** * 流程实列列表 * diff --git a/src/main/java/cn/palmte/work/service/ActTaskDefService.java b/src/main/java/cn/palmte/work/service/ActTaskDefService.java index 4fdda65..e053e54 100644 --- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java +++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java @@ -1,5 +1,6 @@ package cn.palmte.work.service; +import cn.palmte.work.bean.ApproveStatusEnum; import cn.palmte.work.config.activiti.ActConstant; import cn.palmte.work.model.*; @@ -25,9 +26,9 @@ import java.util.*; public class ActTaskDefService { private static final Logger logger = LoggerFactory.getLogger(ActTaskDefService.class); @Autowired - private RepositoryService repositoryService; //管理流程定义 与流程定义和部署对象相关的Service + private ProjectTaskRecordService projectTaskRecordService; @Autowired - private ProcessEngine processEngine; //流程引擎对象 + private RepositoryService repositoryService; @Autowired private TaskService taskService; //任务管理 与正在执行的任务管理相关的Service @Autowired @@ -38,6 +39,8 @@ public class ActTaskDefService { Pagination pagination; @Autowired private ActUtil actUtil; + @Autowired + private ProjectInstanceService projectInstanceService; /** @@ -71,6 +74,9 @@ public class ActTaskDefService { //会签处理 handleMulti(taskId, procInsId, type, userId, actTaskDef); } + + //保存审批记录 + projectTaskRecordService.saveTaskRecord(currentTask, type, message); } @@ -107,7 +113,7 @@ public class ActTaskDefService { Double instanceActiveCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_ACTIVE_INSTANCES))); //活动的会签任务数 Double instanceCompleteCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_COMPLETED_INSTANCES))); //完成会签任务数*/ - if (ActConstant.TYPE_ROLLBACK == type) { + if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) { //一个人驳回 整个任务节点驳回 List taskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); for (int i = 0; i < taskList.size(); i++) { @@ -139,7 +145,7 @@ public class ActTaskDefService { * @param actTaskDef */ private void handleSinge(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) { - if (ActConstant.TYPE_APPROVE == type) { + if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) { //审批通过 taskService.setAssignee(taskId, userId); taskService.complete(taskId); @@ -147,12 +153,12 @@ public class ActTaskDefService { //执行配置的审批通过脚本 int endScript = actTaskDef.getEndScript(); if (endScript != 0) { - actUtil.invokeEventScript(endScript, procInsId); + actUtil.invokeEventScript(endScript, procInsId, actTaskDef); } else { logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName()); } - } else if (ActConstant.TYPE_ROLLBACK == type) { + } else if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) { //驳回 String rollbackTaskKey = actTaskDef.getRollbackTaskKey(); actUtil.jumpToTargetTask(taskId, rollbackTaskKey); @@ -160,10 +166,16 @@ public class ActTaskDefService { //执行配置的驳回脚本 int rollbackScript = actTaskDef.getRollbackScript(); if (rollbackScript != 0) { - actUtil.invokeEventScript(rollbackScript, procInsId); + actUtil.invokeEventScript(rollbackScript, procInsId, actTaskDef); } else { logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName()); } + + + int projectId = actUtil.getProjectId(procInsId); + if (projectId > 0) { + projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey()); + } } } @@ -264,24 +276,25 @@ public class ActTaskDefService { * @param taskDefKey * @return */ - public Set findCandidateUsers(String procDefId, String procInsId, String taskDefKey) { + public List findCandidateUsers(String procDefId, String procInsId, String taskDefKey) { ActTaskDef taskDef = findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey); if (taskDef.getTaskIndex() == ActConstant.TASK_INDEX_FIRST_USER_TASK) { //任务驳回到发起节点 审批人设置为发起人 String startUserId = actUtil.getStartUserId(procInsId); - Set res = new HashSet<>(1); + List res = new ArrayList<>(1); logger.info("findCandidateUsers-0-task:{}, startUserId:{}", taskDef.getTaskName(), startUserId); res.add(startUserId); return res; } - List resList = new ArrayList<>(); + //去重 + Set res = new HashSet<>(); //通过人员id查询 List candidateUserList = taskDef.getCandidateUserList(); logger.info("findCandidateUsers-1-task:{}, userList:{}", taskDef.getTaskName(), candidateUserList); if (!candidateUserList.isEmpty()) { - resList.addAll(candidateUserList); + res.addAll(candidateUserList); } //通过角色id查询 @@ -290,13 +303,12 @@ public class ActTaskDefService { List list = accountService.getUserIsByRole(candidateRoleList); logger.info("findCandidateUsers-3-task:{}, userIdListByRole:{}", taskDef.getTaskName(), list); if (!list.isEmpty()) { - resList.addAll(list); + res.addAll(list); } - //去重 - Set res = new HashSet<>(resList); - logger.info("findCandidateUsers-4-task:{}, resIds:{}", taskDef.getTaskName(), res); - return res; + List resList = new ArrayList<>(res); + logger.info("findCandidateUsers-4-task:{}, resIds:{}", taskDef.getTaskName(), resList); + return resList; } diff --git a/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java b/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java new file mode 100644 index 0000000..e16f65d --- /dev/null +++ b/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java @@ -0,0 +1,56 @@ +package cn.palmte.work.service; + +import cn.palmte.work.model.ProjectTaskRecord; +import cn.palmte.work.model.ProjectTaskRecordRepository; +import cn.palmte.work.utils.ActUtil; +import cn.palmte.work.utils.InterfaceUtil; +import org.activiti.engine.TaskService; +import org.activiti.engine.task.Task; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.jfunc.common.db.utils.Pagination; + +import java.util.Date; + + +@Service +public class ProjectTaskRecordService { + private static final Logger logger = LoggerFactory.getLogger(ProjectTaskRecordService.class); + @Autowired + private ProjectTaskRecordRepository projectTaskRecordRepository; + + @Autowired + Pagination pagination; + + @Autowired + private ActUtil actUtil; + + + public void saveTaskRecord(Task task, int status, String comment) { + int projectId = actUtil.getProjectId(task.getProcessInstanceId()); + if (projectId == 0) { + return; + } + task.getProcessDefinitionId(); + ProjectTaskRecord record = new ProjectTaskRecord(); + record.setProjectId(projectId); + record.setProcDefId(task.getProcessDefinitionId()); + record.setProcInsId(task.getProcessInstanceId()); + record.setTaskDefKey(task.getTaskDefinitionKey()); + record.setTaskName(task.getName()); + record.setTaskComment(comment); + record.setTaskStatus(status); + record.setTaskAssigneeId(InterfaceUtil.getAdminId() + ""); + record.setTaskAssigneeName(InterfaceUtil.getAdmin().getRealName()); + record.setCreateTime(new Date()); + try { + projectTaskRecordRepository.save(record); + } catch (Exception e) { + logger.error("", e); + } + } + + +} diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java index dfb06eb..6e84c00 100644 --- a/src/main/java/cn/palmte/work/utils/ActUtil.java +++ b/src/main/java/cn/palmte/work/utils/ActUtil.java @@ -5,6 +5,7 @@ import cn.palmte.work.config.activiti.DeleteTaskCommand; import cn.palmte.work.config.activiti.JumpCommand; import cn.palmte.work.model.ActScript; import cn.palmte.work.model.ActScriptRepository; +import cn.palmte.work.model.ActTaskDef; import cn.palmte.work.service.AccountService; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.FlowNode; @@ -74,6 +75,14 @@ public class ActUtil { return "0"; } + public int getProjectId(String procInsId) { + Record record = getVariable(ActConstant.KEY_PROJECT_ID, procInsId); + if (record != null) { + return Integer.valueOf(record.get("text")); + } + return 0; + } + /** * 获取流程实列里的所有变量 @@ -93,7 +102,7 @@ public class ActUtil { * @param scriptId * @param procInsId */ - public void invokeEventScript(int scriptId, String procInsId) { + public void invokeEventScript(int scriptId, String procInsId, ActTaskDef actTaskDef) { ActScript actScript = actScriptRepository.findOne(scriptId); if (actScript == null) { logger.info("脚本配置错误"); @@ -102,6 +111,7 @@ public class ActUtil { Map map = new HashMap<>(); map.put(ActConstant.PROC_INS_ID, procInsId); + map.put(ActConstant.PROC_DEF_KEY, actTaskDef.getProcDefKey()); List variables = getVariables(procInsId); for (Record variable : variables) { map.put(variable.getStr("name"), variable.get("text")); diff --git a/src/main/resources/templates/admin/act_his_task_list.ftl b/src/main/resources/templates/admin/act_his_task_list.ftl index 023d339..c63137d 100644 --- a/src/main/resources/templates/admin/act_his_task_list.ftl +++ b/src/main/resources/templates/admin/act_his_task_list.ftl @@ -46,14 +46,14 @@ <#if !list.endTime??> diff --git a/src/main/resources/templates/admin/act_task_def.ftl b/src/main/resources/templates/admin/act_task_def.ftl index a4a32a9..6e98a7b 100644 --- a/src/main/resources/templates/admin/act_task_def.ftl +++ b/src/main/resources/templates/admin/act_task_def.ftl @@ -18,7 +18,7 @@ 序号 任务名称 - 任务类型 + <#--任务类型--> 回退任务 审批人 审批角色 @@ -33,7 +33,7 @@ ${list_index+1} ${list.taskName!} - + <#-- <#if list.taskIndex != 1> <#if list.taskType == 0> 或签 @@ -41,7 +41,7 @@ 会签 - + --> <#if list.taskIndex != 1>