From 00ad42b44862742b6ff6855b0f78ceae5872381c Mon Sep 17 00:00:00 2001 From: pengqiang Date: Mon, 15 Nov 2021 11:12:34 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/ActProcInsController.java | 2 +- .../work/service/ActListenerService.java | 76 ++++++++++++------- .../palmte/work/service/ActModelService.java | 14 +++- .../work/service/ActProcInsService.java | 19 +++-- .../work/service/ActTaskDefService.java | 57 +++++++------- .../work/service/ProjectInstanceService.java | 6 +- .../service/ProjectTaskRecordService.java | 6 +- .../java/cn/palmte/work/utils/ActUtil.java | 14 ++++ 8 files changed, 115 insertions(+), 79 deletions(-) diff --git a/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java b/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java index c0bbd04..3cb6a07 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ActProcInsController.java @@ -94,7 +94,7 @@ public class ActProcInsController extends BaseController { variables.put(ActConstant.START_PROCESS_USERID, InterfaceUtil.getAdminId()); String procInsId = null; try { - procInsId = actProcInsService.startProcessInstance(procDefKey, variables); + procInsId = actProcInsService.startProcessInstance(procDefKey, "", variables); } catch (Exception e) { logger.error("", e); return ResponseMsg.buildFailedMsg("流程启动失败:" + e.getMessage()); diff --git a/src/main/java/cn/palmte/work/service/ActListenerService.java b/src/main/java/cn/palmte/work/service/ActListenerService.java index 1b35b6c..3a44ddd 100644 --- a/src/main/java/cn/palmte/work/service/ActListenerService.java +++ b/src/main/java/cn/palmte/work/service/ActListenerService.java @@ -2,9 +2,13 @@ package cn.palmte.work.service; import cn.palmte.work.config.activiti.ActConstant; +import cn.palmte.work.utils.ActUtil; import com.alibaba.fastjson.JSONObject; +import org.activiti.engine.RuntimeService; import org.activiti.engine.delegate.DelegateExecution; import org.activiti.engine.delegate.DelegateTask; +import org.activiti.engine.runtime.ProcessInstance; +import org.activiti.engine.runtime.ProcessInstanceQuery; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -30,14 +34,20 @@ public class ActListenerService { @Autowired private ProjectInstanceService projectInstanceService; + @Autowired + private RuntimeService runtimeService; + + @Autowired + private ActUtil actUtil; + /** - * 节点创建监听 动态设置审批人 + * 任务节点创建后监听 动态设置审批人 * * @param delegateTask * @throws Exception */ public void create(DelegateTask delegateTask) throws Exception { - logger.info("--- {}", JSONObject.toJSONString(delegateTask)); + logger.info("--节点创建后监听-- name:{}, {}", delegateTask.getName(), JSONObject.toJSONString(delegateTask)); String procDefId = delegateTask.getProcessDefinitionId(); String procInsId = delegateTask.getProcessInstanceId(); @@ -45,41 +55,53 @@ public class ActListenerService { 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); - } + ProcessInstanceQuery processInstanceQuery = runtimeService.createProcessInstanceQuery(); + List list = processInstanceQuery.list(); + System.out.println(list); + ProcessInstance processInstance = processInstanceQuery.processInstanceId(delegateTask.getProcessInstanceId()).singleResult(); + if (actUtil.isProjectProcessIns(processInstance)) { + updateProjectApprover(candidateUsers, processInstance); } delegateTask.addCandidateUsers(candidateUsers); } - /*public void multiTaskcreate(DelegateTask delegateTask) throws Exception { - logger.info("--- {}", JSONObject.toJSONString(delegateTask)); - - String procDefId = delegateTask.getProcessDefinitionId(); - String procInsId = delegateTask.getProcessInstanceId(); - String taskDefKey = delegateTask.getTaskDefinitionKey(); - Set candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); - logger.info("addCandidateUsers : {}", candidateUsers); - delegateTask.addCandidateUsers(candidateUsers); - }*/ - - - public List multipleInstanceTask(DelegateExecution delegateExecution) throws Exception { + /** + * 多实例任务查询办理人 + * + * @param delegateExecution + * @throws Exception + */ + public List getMultiCandidateUsers(DelegateExecution delegateExecution) throws Exception { + logger.info("--多实例任务查询办理人-- eventName:{}, {}", delegateExecution.getEventName(), delegateExecution); String procInsId = delegateExecution.getProcessInstanceId(); String procDefId = delegateExecution.getProcessDefinitionId(); String taskDefKey = delegateExecution.getCurrentActivityId(); - return actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); + List candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); + logger.info("--getMultiCandidateUsers-- {}", candidateUsers); + return candidateUsers; } + + /** + * 更新项目审批人 四算业务需要 + * + * @param candidateUsers + * @param processInstance + */ + private void updateProjectApprover(List candidateUsers, ProcessInstance processInstance) { + String businessKey = processInstance.getBusinessKey(); + logger.info("businessKey : {}", businessKey); + + if (candidateUsers != null && !candidateUsers.isEmpty() && businessKey != null) { + try { + int adminId = Integer.parseInt(candidateUsers.get(0)); + projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId); + } catch (Exception e) { + logger.error("", e); + } + } + } } diff --git a/src/main/java/cn/palmte/work/service/ActModelService.java b/src/main/java/cn/palmte/work/service/ActModelService.java index e5aa4e4..ade2cb9 100644 --- a/src/main/java/cn/palmte/work/service/ActModelService.java +++ b/src/main/java/cn/palmte/work/service/ActModelService.java @@ -114,6 +114,7 @@ public class ActModelService { BpmnJsonConverter jsonConverter = new BpmnJsonConverter(); BpmnModel model = jsonConverter.convertToBpmnModel(modelNode); + //任务创建后监听器 ActivitiListener activitiListener = new ActivitiListener(); activitiListener.setEvent(TaskListener.EVENTNAME_CREATE); activitiListener.setImplementation("${actListenerService.create(task)}"); @@ -135,20 +136,25 @@ public class ActModelService { taskDef = new ActTaskDef(); taskDef.setTaskName(element.getName()); taskDef.setTaskKey(element.getId()); + MultiInstanceLoopCharacteristics loopCharacteristics = userTaskElement.getLoopCharacteristics(); - if (loopCharacteristics != null) { - taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE); - loopCharacteristics.setInputDataItem("${actListenerService.multipleInstanceTask(execution)}"); + if (loopCharacteristics != null) { //多实列 + loopCharacteristics.setInputDataItem("${actListenerService.getMultiCandidateUsers(execution)}"); loopCharacteristics.setElementVariable("assignee"); userTaskElement.setAssignee("${assignee}"); + + taskDef.setTaskType(ActConstant.TASK_TYPE_MULTI); }else { userTaskElement.setTaskListeners(activitiListenerList); + + taskDef.setTaskType(ActConstant.TASK_TYPE_SINGE); } - if (i == 1) { + if (i == 1) {//画流程图时,要保证第一个用户任务一定要先画 taskDef.setTaskIndex(ActConstant.TASK_INDEX_FIRST_USER_TASK); first = taskDef; } + taskList.add(taskDef); } i ++; diff --git a/src/main/java/cn/palmte/work/service/ActProcInsService.java b/src/main/java/cn/palmte/work/service/ActProcInsService.java index 6ac7e85..891650b 100644 --- a/src/main/java/cn/palmte/work/service/ActProcInsService.java +++ b/src/main/java/cn/palmte/work/service/ActProcInsService.java @@ -2,6 +2,7 @@ package cn.palmte.work.service; import cn.palmte.work.bean.ApproveStatusEnum; +import cn.palmte.work.config.activiti.ActConstant; import cn.palmte.work.model.ActTaskDefRepository; import cn.palmte.work.pojo.ActProcIns; import cn.palmte.work.utils.ActUtil; @@ -71,7 +72,7 @@ public class ActProcInsService { * @param variables * @return */ - public String startProcessInstance(String procDefKey, Map variables) throws Exception { + public String startProcessInstance(String procDefKey, String businessKey, Map variables) throws Exception { List list = repositoryService.createProcessDefinitionQuery().processDefinitionKey(procDefKey).active().orderByProcessDefinitionVersion().desc().list(); if (list == null || list.isEmpty()) { throw new Exception("procDefKey(" + procDefKey + ")未定义"); @@ -80,8 +81,10 @@ public class ActProcInsService { //取最新版本的流程定义进行启动流程实列 ProcessDefinition processDefinition = list.get(0); + String adminId = InterfaceUtil.getAdminId() + ""; + variables.put(ActConstant.START_PROCESS_USERID, adminId); //启动流程 - ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), variables); + ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId(), businessKey, variables); String procInsId = processInstance.getProcessInstanceId(); Task task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult(); @@ -90,18 +93,18 @@ public class ActProcInsService { } //设置发起人为办理人 然后完成任务 任务转入下一个审批节点 - String assignee = InterfaceUtil.getAdminId() + ""; - task.setAssignee(assignee); + task.setAssignee(adminId); String taskId = task.getId(); String comment = "提交" + processDefinition.getName(); - Authentication.setAuthenticatedUserId(assignee); + Authentication.setAuthenticatedUserId(adminId); 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); + if (actUtil.isProjectProcessIns(processInstance)) { + projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()), + 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 d55c265..82bf297 100644 --- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java +++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java @@ -11,6 +11,7 @@ import com.alibaba.fastjson.JSONObject; import org.activiti.engine.*; import org.activiti.engine.impl.identity.Authentication; import org.activiti.engine.impl.persistence.entity.TaskEntity; +import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; @@ -42,6 +43,8 @@ public class ActTaskDefService { private ActUtil actUtil; @Autowired private ProjectInstanceService projectInstanceService; + @Autowired + private RuntimeService runtimeService; /** @@ -63,22 +66,22 @@ public class ActTaskDefService { Authentication.setAuthenticatedUserId(userId); taskService.addComment(taskId, procInsId, message); - actTaskDefRepository.updateHiTaskAssign(userId, procInsId, taskId); - actTaskDefRepository.updateHiActAssign(userId, procInsId, taskId); - Task currentTask = taskService.createTaskQuery().taskId(taskId).singleResult(); ActTaskDef actTaskDef = findFirstByProcDefIdAndTaskKey(currentTask.getProcessDefinitionId(), currentTask.getTaskDefinitionKey()); + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult(); + taskService.setAssignee(taskId, userId); if (ActConstant.TASK_TYPE_SINGE == actTaskDef.getTaskType()) { - //或签处理 - handleSinge(taskId, procInsId, type, userId, actTaskDef); + handleSinge(processInstance, taskId, type, actTaskDef); } else if (ActConstant.TASK_TYPE_MULTI == actTaskDef.getTaskType()) { - //会签处理 - handleMulti(taskId, procInsId, type, userId, actTaskDef); + //多实列 会签处理 + handleMulti(processInstance, taskId, type, actTaskDef); } - //保存审批记录 - projectTaskRecordService.saveTaskRecord(currentTask, type, message); + if (actUtil.isProjectProcessIns(processInstance)) { + //保存审批记录 + projectTaskRecordService.saveTaskRecord(Integer.parseInt(processInstance.getBusinessKey()), currentTask, type, message); + } } @@ -105,27 +108,24 @@ public class ActTaskDefService { * 会签处理 * * @param taskId - * @param procInsId + * @param processInstance * @param type - * @param userId * @param actTaskDef */ - private void handleMulti(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) { - /* Double instanceCount = Double.parseDouble(ActUtil.filterNullToZero(taskService.getVariable(taskId, ActConstant.NUMBER_OF_INSTANCES))); //会签任务总数 - 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))); //完成会签任务数*/ - + private void handleMulti(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) { if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) { //一个人驳回 整个任务节点驳回 - List taskList = taskService.createTaskQuery().processInstanceId(procInsId).list(); + List taskList = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); for (int i = 0; i < taskList.size(); i++) { TaskEntity taskEntity = (TaskEntity) taskList.get(i); if (!taskId.equals(taskEntity.getId())) { - taskEntity.setProcessInstanceId(null); + /* taskEntity.setProcessInstanceId(null); taskEntity.setExecutionId(null); - taskService.saveTask(taskEntity); - taskService.addComment(taskEntity.getId(), procInsId, "会签驳回,任务失效"); - taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录 + taskService.saveTask(taskEntity);*/ + + taskService.addComment(taskEntity.getId(), processInstance.getId(), "会签驳回,任务自动失效"); + taskService.complete(taskEntity.getId()); + //taskService.deleteTask(taskEntity.getId(), false); // 不删除历史记录 } } @@ -141,21 +141,19 @@ public class ActTaskDefService { * 或签处理 * * @param taskId - * @param procInsId + * @param processInstance * @param type - * @param userId * @param actTaskDef */ - private void handleSinge(String taskId, String procInsId, int type, String userId, ActTaskDef actTaskDef) { + private void handleSinge(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) { if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) { //审批通过 - taskService.setAssignee(taskId, userId); taskService.complete(taskId); //执行配置的审批通过脚本 int endScript = actTaskDef.getEndScript(); if (endScript != 0) { - actUtil.invokeEventScript(endScript, procInsId, actTaskDef); + actUtil.invokeEventScript(endScript, processInstance.getId(), actTaskDef); } else { logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName()); } @@ -168,15 +166,14 @@ public class ActTaskDefService { //执行配置的驳回脚本 int rollbackScript = actTaskDef.getRollbackScript(); if (rollbackScript != 0) { - actUtil.invokeEventScript(rollbackScript, procInsId, actTaskDef); + actUtil.invokeEventScript(rollbackScript, processInstance.getId(), actTaskDef); } else { logger.info("未配置驳回脚本 task:{}", actTaskDef.getTaskName()); } - int projectId = actUtil.getProjectId(procInsId); - if (projectId > 0) { - projectInstanceService.updateApproveStatus(projectId, ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey()); + if (actUtil.isProjectProcessIns(processInstance)) { + projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey()); } } } diff --git a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java index e81ec79..ef361a4 100644 --- a/src/main/java/cn/palmte/work/service/ProjectInstanceService.java +++ b/src/main/java/cn/palmte/work/service/ProjectInstanceService.java @@ -89,11 +89,9 @@ public class ProjectInstanceService { private void startProcess(Project project, Admin admin, String processDefkey) throws Exception { HashMap variables = new HashMap<>(); - variables.put(ActConstant.START_PROCESS_USERID, admin.getId()); - variables.put(ActConstant.KEY_PROJECT_ID, project.getId()); variables.put(ActConstant.KEY_PROJECT_TYPE, project.getType()); - - String processInstanceId = actProcInsService.startProcessInstance(processDefkey, variables); + String businessKey = String.valueOf(project.getId()); + String processInstanceId = actProcInsService.startProcessInstance(processDefkey, businessKey, variables); //保存流程实例id与项目的关联关系 ProjectInstanceRelation relation = new ProjectInstanceRelation(); diff --git a/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java b/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java index 4b34640..377dbb1 100644 --- a/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java +++ b/src/main/java/cn/palmte/work/service/ProjectTaskRecordService.java @@ -36,11 +36,7 @@ public class ProjectTaskRecordService { * @param status * @param comment */ - public void saveTaskRecord(Task task, int status, String comment) { - int projectId = actUtil.getProjectId(task.getProcessInstanceId()); - if (projectId == 0) { - return; - } + public void saveTaskRecord(int projectId, Task task, int status, String comment) { task.getProcessDefinitionId(); ProjectTaskRecord record = new ProjectTaskRecord(); record.setProjectId(projectId); diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java index 6e84c00..27a4fac 100644 --- a/src/main/java/cn/palmte/work/utils/ActUtil.java +++ b/src/main/java/cn/palmte/work/utils/ActUtil.java @@ -13,6 +13,8 @@ import org.activiti.engine.ManagementService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.RepositoryService; import org.activiti.engine.TaskService; +import org.activiti.engine.repository.ProcessDefinition; +import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.IdentityLink; import org.activiti.engine.task.Task; import org.activiti.image.ProcessDiagramGenerator; @@ -249,6 +251,18 @@ public class ActUtil { } + public boolean isProjectProcessIns(ProcessInstance processInstance) { + if (processInstance == null) { + return false; + } + ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult(); + String procDefKey = processDefinition.getKey(); + return procDefKey.equals(ActConstant.PROCESS_DEFKEY_ESTIMATE) + || procDefKey.equals(ActConstant.PROCESS_DEFKEY_BUDGET) + || procDefKey.equals(ActConstant.PROCESS_DEFKEY_SETTLE) + || procDefKey.equals(ActConstant.PROCESS_DEFKEY_FINAL); + } + /** * 生成xml流 From fa29d772346eddabcfc00fe796ecd4fc416e8734 Mon Sep 17 00:00:00 2001 From: pengqiang Date: Mon, 15 Nov 2021 16:53:43 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=AE=A1=E6=A0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/backend/ProjectController.java | 33 +++++++++- .../ProjectInstanceRelationRepository.java | 2 + .../work/service/ActCallbackScript.java | 23 +------ .../work/service/ActTaskDefService.java | 28 +++++++-- .../palmte/work/service/ProjectService.java | 21 ++++++- .../java/cn/palmte/work/utils/ActUtil.java | 12 ++-- .../templates/admin/project_approve.ftl | 32 +++++++++- .../templates/admin/project_list.ftl | 7 +++ .../admin/project_task_record_list.ftl | 62 +++++++++++++++++++ 9 files changed, 178 insertions(+), 42 deletions(-) create mode 100644 src/main/resources/templates/admin/project_task_record_list.ftl diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java index cdae9a5..4ee29ad 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -5,6 +5,7 @@ import cn.palmte.work.model.*; import cn.palmte.work.service.ProjectBudgetService; import cn.palmte.work.service.ProjectEstimateService; import cn.palmte.work.service.ProjectService; +import cn.palmte.work.service.ProjectTaskRecordService; import cn.palmte.work.utils.FreeMarkerUtil; import cn.palmte.work.utils.InterfaceUtil; import cn.palmte.work.utils.Utils; @@ -19,10 +20,7 @@ import org.springframework.format.datetime.DateFormatter; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; -import top.jfunc.common.db.bean.Page; -import top.jfunc.common.utils.CollectionUtil; -import javax.persistence.criteria.CriteriaBuilder; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ArrayList; @@ -48,6 +46,8 @@ public class ProjectController extends BaseController { private ProjectEstimateService projectEstimateService; @Autowired private ProjectBudgetService projectBudgetService; + @Autowired + private ProjectTaskRecordService projectTaskRecordService; /** * 项目列表 @@ -372,6 +372,33 @@ public class ProjectController extends BaseController { return "admin/project_approve"; } + /** + * 审批完成任务 + * @param projectId + * @param json + * @return + */ + @ResponseBody + @RequestMapping("/completeTask/{projectId}") + public ResponseMsg completeTask(@PathVariable int projectId, @RequestBody String json) { + return projectService.completeTask(projectId, json); + } + + + /** + * 查看审核流程 + * @param projectId + * @param model + * @return + */ + @RequestMapping("/taskRecords/{projectId}") + public String taskRecords(@PathVariable int projectId, Map model) { + List list = projectTaskRecordService.list(projectId); + if (list != null && !list.isEmpty()) { + model.put("list", list); + } + return "admin/project_task_record_list"; + } @InitBinder public void initBinder(WebDataBinder webDataBinder) { diff --git a/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java b/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java index a51082c..59128d4 100644 --- a/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java +++ b/src/main/java/cn/palmte/work/model/ProjectInstanceRelationRepository.java @@ -9,4 +9,6 @@ public interface ProjectInstanceRelationRepository extends JpaRepository findAllByProjectIdEqualsAndProcessTypeEqualsOrderByCreateTimeDesc(int projectId, String processType); + + List findByProjectIdOrderByCreateTimeDesc(int projectId); } diff --git a/src/main/java/cn/palmte/work/service/ActCallbackScript.java b/src/main/java/cn/palmte/work/service/ActCallbackScript.java index ed6d7bc..8a75982 100644 --- a/src/main/java/cn/palmte/work/service/ActCallbackScript.java +++ b/src/main/java/cn/palmte/work/service/ActCallbackScript.java @@ -1,13 +1,8 @@ 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.*; @@ -19,27 +14,15 @@ 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) { + public void demo(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); - } } diff --git a/src/main/java/cn/palmte/work/service/ActTaskDefService.java b/src/main/java/cn/palmte/work/service/ActTaskDefService.java index 82bf297..05abc07 100644 --- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java +++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java @@ -98,9 +98,9 @@ public class ActTaskDefService { List assignUserList; for (Task task : taskList) { assignUserList = actUtil.getAssignUserList(task.getId()); - if (assignUserList.contains(String.valueOf(adminId))) { - completeTask(task.getId(), procInsId, comment, type); - } + //if (assignUserList.contains(String.valueOf(adminId))) { + completeTask(task.getId(), procInsId, comment, type); + //} } } @@ -146,6 +146,7 @@ public class ActTaskDefService { * @param actTaskDef */ private void handleSinge(ProcessInstance processInstance, String taskId, int type, ActTaskDef actTaskDef) { + String procDefKey = actTaskDef.getProcDefKey(); if (ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus() == type) { //审批通过 taskService.complete(taskId); @@ -158,6 +159,10 @@ public class ActTaskDefService { logger.info("未配置审批通过脚本 task:{}", actTaskDef.getTaskName()); } + if (actUtil.isProjectProcessIns(procDefKey)) { + updateProjectPassed(processInstance, actTaskDef, procDefKey); + } + } else if (ApproveStatusEnum.APPROVAL_UNPASS.getApproveStatus() == type) { //驳回 String rollbackTaskKey = actTaskDef.getRollbackTaskKey(); @@ -172,12 +177,25 @@ public class ActTaskDefService { } - if (actUtil.isProjectProcessIns(processInstance)) { - projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_UNPASS, actTaskDef.getProcDefKey()); + if (actUtil.isProjectProcessIns(procDefKey)) { + projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_UNPASS, procDefKey); } } } + private void updateProjectPassed(ProcessInstance processInstance, ActTaskDef actTaskDef, String procDefKey) { + if (ActConstant.PROCESS_DEFKEY_FINAL.equals(procDefKey)) { + if ("财务总监".equals(actTaskDef.getTaskName())) { + projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_PASSED, procDefKey); + } + } else { + if ("执行董事".equals(actTaskDef.getTaskName())) { + projectInstanceService.updateApproveStatus(Integer.parseInt(processInstance.getBusinessKey()), ApproveStatusEnum.APPROVAL_PASSED, procDefKey); + } + } + + } + /** * 审批过程任务查询 * diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index f3075db..453824c 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -1,9 +1,9 @@ package cn.palmte.work.service; import cn.palmte.work.bean.*; -import cn.palmte.work.model.Admin; -import cn.palmte.work.model.Project; -import cn.palmte.work.model.ProjectRepository; +import cn.palmte.work.model.*; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -34,6 +34,8 @@ public class ProjectService { private ProjectInstanceService projectInstanceService; @Autowired private ActTaskDefService actTaskDefService; + @Autowired + private ProjectInstanceRelationRepository projectInstanceRelationRepository; private QueryHelper getQueryHelper(Map searchInfo, int pageNumber, int pageSize) { @@ -278,4 +280,17 @@ public class ProjectService { projectBudgetService.saveBudget(p, budgetBean); return p; } + + public ResponseMsg completeTask(int projectId, String json) { + List relationList = projectInstanceRelationRepository.findByProjectIdOrderByCreateTimeDesc(projectId); + if (relationList == null || relationList.isEmpty()) { + return ResponseMsg.buildFailedMsg("审核失败"); + } + ProjectInstanceRelation projectInstanceRelation = relationList.get(0); + JSONObject obj = JSON.parseObject(json); + actTaskDefService.completeTaskByProcInsId(projectInstanceRelation.getProcessInsId(), + obj.getIntValue("type"), obj.getString("message")); + + return ResponseMsg.buildSuccessMsg("审核成功"); + } } diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java index 27a4fac..341aa57 100644 --- a/src/main/java/cn/palmte/work/utils/ActUtil.java +++ b/src/main/java/cn/palmte/work/utils/ActUtil.java @@ -77,14 +77,6 @@ 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; - } - /** * 获取流程实列里的所有变量 @@ -257,6 +249,10 @@ public class ActUtil { } ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processInstance.getProcessDefinitionId()).singleResult(); String procDefKey = processDefinition.getKey(); + return isProjectProcessIns(procDefKey); + } + + public boolean isProjectProcessIns(String procDefKey) { return procDefKey.equals(ActConstant.PROCESS_DEFKEY_ESTIMATE) || procDefKey.equals(ActConstant.PROCESS_DEFKEY_BUDGET) || procDefKey.equals(ActConstant.PROCESS_DEFKEY_SETTLE) diff --git a/src/main/resources/templates/admin/project_approve.ftl b/src/main/resources/templates/admin/project_approve.ftl index 1db827c..dbe6c06 100644 --- a/src/main/resources/templates/admin/project_approve.ftl +++ b/src/main/resources/templates/admin/project_approve.ftl @@ -2004,10 +2004,10 @@
@@ -2031,7 +2031,7 @@ @@ -2077,6 +2077,32 @@ appendTrIncome(); }); }); + + + var completeTask = function (projectId) { + var message = $("#doc-vld-ta-2").val(); + var type = $("input[name='docVlGender']:checked").val(); + var params = { + type: type, + message: message + }; + $.ajax({ + url: '${base}/project/completeTask/' + projectId, + data: JSON.stringify(params), + dataType: "json", + contentType: "application/json", + type: 'post', + async: false, + success: function (data) { + if (data.status == 0) { + alert(data.msg); + window.location.href = '${base}/project/list'; + } else if (data.status == 1) { + alert(data.msg); + } + } + }); + } diff --git a/src/main/resources/templates/admin/project_list.ftl b/src/main/resources/templates/admin/project_list.ftl index caf00c9..ca7e0c3 100644 --- a/src/main/resources/templates/admin/project_list.ftl +++ b/src/main/resources/templates/admin/project_list.ftl @@ -229,6 +229,13 @@ onclick="location.href='${base}/project/approve?id=${list.id}'">审核 + + + diff --git a/src/main/resources/templates/admin/project_task_record_list.ftl b/src/main/resources/templates/admin/project_task_record_list.ftl new file mode 100644 index 0000000..aeba985 --- /dev/null +++ b/src/main/resources/templates/admin/project_task_record_list.ftl @@ -0,0 +1,62 @@ +<#assign base=request.contextPath /> +<#import "../common/defaultLayout.ftl" as defaultLayout> +<@defaultLayout.layout> + +
+
+ +
项目管理 / + 审核流程 +
+
+
+
    + <#if list?exists > + + <#list list as node> +
  • +
    ${node.createTime} +
    +
    ${node.roleName}-${node.assigneeName}: + <#if node.taskStatus==2>审批通过 + <#if node.taskStatus==3>审批不通过 +
    +
    + ${node.taskComment} +
    +
  • + + <#else> +
    +

    没有找到任何记录!

    +
    + +
+
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + From 1b47962e676093ecbc7b3bceb1bbd4f9a705f9b8 Mon Sep 17 00:00:00 2001 From: pengqiang Date: Mon, 15 Nov 2021 17:34:28 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=87=8C=E7=9A=84=E5=AE=A1=E6=A0=B8=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../work/controller/backend/ProjectController.java | 2 ++ src/main/resources/templates/admin/act_task_def.ftl | 8 ++++---- .../resources/templates/admin/project_detail.ftl | 13 +++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java index 4ee29ad..c6db245 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -333,6 +333,8 @@ public class ProjectController extends BaseController { model.put("finalBean", new FinalBean()); //freemarker可以利用的静态方法 model.put("Utils", FreeMarkerUtil.fromStaticPackage("cn.palmte.work.utils.Utils")); + List list = projectTaskRecordService.list(id); + model.put("taskRecords", list); return "admin/project_detail"; } diff --git a/src/main/resources/templates/admin/act_task_def.ftl b/src/main/resources/templates/admin/act_task_def.ftl index 3520039..a599a94 100644 --- a/src/main/resources/templates/admin/act_task_def.ftl +++ b/src/main/resources/templates/admin/act_task_def.ftl @@ -20,10 +20,10 @@ 任务名称 <#--任务类型--> 回退任务 - 审批人 - 审批角色 - 审批通过脚本 - 审批驳回脚本 + 按人员设置审批人 + 按角色设置审批人 + 审批通过脚本 + 审批驳回脚本 操作 diff --git a/src/main/resources/templates/admin/project_detail.ftl b/src/main/resources/templates/admin/project_detail.ftl index 1958af0..980a6dd 100644 --- a/src/main/resources/templates/admin/project_detail.ftl +++ b/src/main/resources/templates/admin/project_detail.ftl @@ -1338,13 +1338,14 @@
- *审核意见:
-
-
- ${project.name} -
+ 审核意见 +
+
+ <#list taskRecords as node> + ${node.assigneeName} : ${node.taskComment}    ${node.createTime} +
+
-
From ba8d4efbe47325f8e3980b651376f65332b40076 Mon Sep 17 00:00:00 2001 From: pengqiang Date: Mon, 15 Nov 2021 18:07:16 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=87=8C=E7=9A=84=E5=AE=A1=E6=A0=B8=E6=84=8F=E8=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/backend/ProjectController.java | 26 ++++++-- .../admin/project_task_record_list.ftl | 64 ++++++++++++------- 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java index c6db245..b5e2625 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -2,10 +2,7 @@ package cn.palmte.work.controller.backend; import cn.palmte.work.bean.*; import cn.palmte.work.model.*; -import cn.palmte.work.service.ProjectBudgetService; -import cn.palmte.work.service.ProjectEstimateService; -import cn.palmte.work.service.ProjectService; -import cn.palmte.work.service.ProjectTaskRecordService; +import cn.palmte.work.service.*; import cn.palmte.work.utils.FreeMarkerUtil; import cn.palmte.work.utils.InterfaceUtil; import cn.palmte.work.utils.Utils; @@ -48,6 +45,10 @@ public class ProjectController extends BaseController { private ProjectBudgetService projectBudgetService; @Autowired private ProjectTaskRecordService projectTaskRecordService; + @Autowired + private ActProcInsService actProcInsService; + @Autowired + private ProjectInstanceRelationRepository projectInstanceRelationRepository; /** * 项目列表 @@ -395,6 +396,7 @@ public class ProjectController extends BaseController { */ @RequestMapping("/taskRecords/{projectId}") public String taskRecords(@PathVariable int projectId, Map model) { + model.put("projectId", projectId); List list = projectTaskRecordService.list(projectId); if (list != null && !list.isEmpty()) { model.put("list", list); @@ -402,6 +404,22 @@ public class ProjectController extends BaseController { return "admin/project_task_record_list"; } + /** + * 流程实列图片 + * + * @param response + * @param projectId + * @throws Exception + */ + @RequestMapping("/procInsPng/{projectId}") + public void png(HttpServletResponse response, @PathVariable("projectId") int projectId) throws Exception { + List relationList = projectInstanceRelationRepository.findByProjectIdOrderByCreateTimeDesc(projectId); + if (relationList == null || relationList.isEmpty()) { + return; + } + actProcInsService.createProcInsPng(response, relationList.get(0).getProcessInsId()); + } + @InitBinder public void initBinder(WebDataBinder webDataBinder) { webDataBinder.addCustomFormatter(new DateFormatter("yyyy-MM-dd")); diff --git a/src/main/resources/templates/admin/project_task_record_list.ftl b/src/main/resources/templates/admin/project_task_record_list.ftl index aeba985..d5355b8 100644 --- a/src/main/resources/templates/admin/project_task_record_list.ftl +++ b/src/main/resources/templates/admin/project_task_record_list.ftl @@ -9,31 +9,51 @@ 审核流程 -
-
    - <#if list?exists > - - <#list list as node> -
  • -
    ${node.createTime} -
    -
    ${node.roleName}-${node.assigneeName}: - <#if node.taskStatus==2>审批通过 - <#if node.taskStatus==3>审批不通过 -
    -
    - ${node.taskComment} -
    -
  • - - <#else> -
    -

    没有找到任何记录!

    -
    - +
    + + +
    +
    +
    +
      + <#if list?exists > + + <#list list as node> +
    • +
      ${node.createTime} + +
      +
      ${node.roleName}-${node.assigneeName}: + <#if node.taskStatus==2>审批通过 + <#if node.taskStatus==3>审批不通过 +
      +
      + ${node.taskComment} +
      +
    • + + <#else> +
      +

      没有找到任何记录!

      +
      + +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    - - - -
diff --git a/src/main/resources/templates/admin/project_final_edit.ftl b/src/main/resources/templates/admin/project_final_edit.ftl index b00e519..dfe1a40 100644 --- a/src/main/resources/templates/admin/project_final_edit.ftl +++ b/src/main/resources/templates/admin/project_final_edit.ftl @@ -72,9 +72,9 @@ 合计 - - - + + + @@ -95,35 +95,35 @@ 成本 采购成本 设备 - + - + 成本 采购成本 施工 - - - + + + 成本 采购成本 服务 - - - + + + 成本 采购成本 其他 - - + + @@ -131,8 +131,8 @@ 成本 项目管理成本 项目管理成本 - - + + @@ -140,8 +140,8 @@ 成本 其他 其他 - - + + @@ -149,8 +149,8 @@ 合计 - - + + @@ -170,17 +170,17 @@ 财务费用 资金占用成本 - - - + + + 公司管理费用 - - - + + + @@ -215,23 +215,23 @@ 项目毛利 - - + + 项目贡献利润 - - + + 项目净利润 - + / @@ -251,85 +251,85 @@ 销售商品、提供劳务收到的现金 - - + + 收到的税费返还 / - + 收到其他与经营活动有关的现金 - - + + 购买商品、接受劳务支付的现金 - - + + 支付的各项税费 / - + 支付其他与经营活动有关的现金 - - + + 经营活动产生的现金流量净额 - - + + 投资活动现金流入 / - + 投资活动现金流出 / - + 投资活动产生的现金流量净额 / - + 融资资金流入 - - + + 还款资金流出 - - + + 筹资活动产生的现金流量净额 - - + + 货币资金净增加额 - +