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 12d3f2e..b9bd648 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProjectController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProjectController.java @@ -4,6 +4,7 @@ import cn.palmte.work.bean.*; import cn.palmte.work.model.*; import cn.palmte.work.pojo.ActHisTask; import cn.palmte.work.service.*; +import cn.palmte.work.utils.ActUtil; import cn.palmte.work.utils.FreeMarkerUtil; import cn.palmte.work.utils.InterfaceUtil; import cn.palmte.work.utils.Utils; @@ -14,6 +15,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.activiti.engine.HistoryService; import org.activiti.engine.history.HistoricProcessInstance; +import org.activiti.engine.task.Task; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -81,6 +83,8 @@ public class ProjectController extends BaseController { @Autowired private ProjectRepository projectRepository; @Autowired + private ActUtil actUtil; + @Autowired private NumSeqService numSeqService; /** @@ -551,6 +555,10 @@ public class ProjectController extends BaseController { model.put("taskRecords", list); } + //当前审批任务 + Task currentTask = actUtil.getCurrentTask(project.getId()); + model.put("currentTaskName", currentTask==null ? "" : currentTask.getName()); + return "admin/project_approve"; } @@ -564,6 +572,15 @@ public class ProjectController extends BaseController { } + /** + * 预算审批 跳到执行董事审批任务 + */ + @ResponseBody + @RequestMapping("/skipTask/{projectId}/{approvetype}") + public ResponseMsg skipTask(@PathVariable int projectId, @PathVariable int approvetype) { + return projectService.skipTask(projectId, approvetype); + } + /** * 查看审核流程 */ diff --git a/src/main/java/cn/palmte/work/service/ActListenerService.java b/src/main/java/cn/palmte/work/service/ActListenerService.java index 7ebe017..5a9670d 100644 --- a/src/main/java/cn/palmte/work/service/ActListenerService.java +++ b/src/main/java/cn/palmte/work/service/ActListenerService.java @@ -50,38 +50,20 @@ public class ActListenerService { public void create(DelegateTask delegateTask) throws Exception { String procInsId = delegateTask.getProcessInstanceId(); logger.info("--节点创建后监听-- procInsId:{}, {}", procInsId, delegateTask); + logger.info("**** rwcjjt【{}】任务创建监听 procInsId:{} **** ", delegateTask, procInsId); String procDefId = delegateTask.getProcessDefinitionId(); String taskDefKey = delegateTask.getTaskDefinitionKey(); List candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); + logger.info("**** rwcjjt 任务创建监听 查询候选人 procInsId:{},任务名称:{},候选人:{} **** ", procInsId, delegateTask.getName(), candidateUsers); ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult(); - logger.info("addCandidateUsers : {}, taskName:{}, hasProcIns:{}", candidateUsers, delegateTask.getName(), processInstance != null); - updateProjectApprover(candidateUsers, processInstance, procDefId, taskDefKey); delegateTask.addCandidateUsers(candidateUsers); } - /** - * 多实例任务查询办理人 - * - * @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(); - - List candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); - logger.info("--getMultiCandidateUsers-- {}", candidateUsers); - return candidateUsers; - } - - /** * 更新项目审批人 四算业务需要 * @@ -90,7 +72,6 @@ public class ActListenerService { */ private void updateProjectApprover(List candidateUsers, ProcessInstance processInstance, String procDefId, String taskDefKey) { String businessKey = processInstance.getBusinessKey(); - logger.info("businessKey : {}", businessKey); ActTaskDef actTaskDef = actTaskDefService.findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey); try { @@ -106,7 +87,8 @@ public class ActListenerService { } } } - + logger.info("**** rwcjjt 任务创建监听 更新审批人 procInsId:{}, projectId:{}, adminId:{} **** ", + processInstance.getProcessInstanceId(), businessKey, adminId); projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId); } catch (Exception e) { logger.error("", e); diff --git a/src/main/java/cn/palmte/work/service/ActTaskDefService.java b/src/main/java/cn/palmte/work/service/ActTaskDefService.java index e69b425..f0595c1 100644 --- a/src/main/java/cn/palmte/work/service/ActTaskDefService.java +++ b/src/main/java/cn/palmte/work/service/ActTaskDefService.java @@ -96,6 +96,45 @@ public class ActTaskDefService { } } + /** + * 预算跳过剩下审批任务直接到执行董事节点 + * @param procInsId + */ + public void skipTaskByProcInsId(String procInsId) { + ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult(); + if (ActConstant.PROCESS_DEFKEY_BUDGET.equals(processInstance.getProcessDefinitionKey())) { + throw new RuntimeException("只有预算审批流程才能执行会签"); + } + + //完成当前任务 + Task task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult(); + if ("执行董事".equals(task.getName())) { + throw new RuntimeException("当前状态不能用会签功能,请使用审批功能。"); + } + completeTask(task.getId(), procInsId, "申请会签", ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus()); + + + //非执行董事节点自动跳过 + task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult(); + while (!"执行董事".equals(task.getName())) { + completeSkipTask(task, processInstance, "会签,任务自动审批通过", ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus()); + task = taskService.createTaskQuery().processInstanceId(procInsId).singleResult(); + } + } + + + private void completeSkipTask(Task task, ProcessInstance processInstance, String message, int type) { + String taskId = task.getId(); + ActTaskDef actTaskDef = findFirstByProcDefIdAndTaskKey(task.getProcessDefinitionId(), task.getTaskDefinitionKey()); + + Authentication.setAuthenticatedUserId("-1"); + taskService.addComment(taskId, processInstance.getProcessInstanceId(), message); + taskService.setAssignee(taskId, "-1"); + + if (ActConstant.TASK_TYPE_SINGE == actTaskDef.getTaskType()) { + handleSinge(processInstance, taskId, type, actTaskDef); + } + } /** * 或签处理 @@ -311,6 +350,11 @@ public class ActTaskDefService { */ private void setAssign(ActHisTask actHisTask) { if (StringUtils.isNotBlank(actHisTask.getAssign())) { + if ("-1".equals(actHisTask.getAssign())) { + actHisTask.setAssign("系统"); + return; + } + String userName = accountService.getNameById(Integer.parseInt(actHisTask.getAssign())); actHisTask.setAssign(userName); return; diff --git a/src/main/java/cn/palmte/work/service/ProjectService.java b/src/main/java/cn/palmte/work/service/ProjectService.java index 62382d9..7a0e7b0 100644 --- a/src/main/java/cn/palmte/work/service/ProjectService.java +++ b/src/main/java/cn/palmte/work/service/ProjectService.java @@ -222,6 +222,18 @@ public class ProjectService { } + public ResponseMsg skipTask(int projectId, int approvetype) { + List relationList = projectInstanceRelationRepository.findByProjectIdOrderByCreateTimeDesc(projectId); + if (relationList == null || relationList.isEmpty()) { + return ResponseMsg.buildFailedMsg("会签失败"); + } + + ProjectInstanceRelation projectInstanceRelation = relationList.get(0); + actTaskDefService.skipTaskByProcInsId(projectInstanceRelation.getProcessInsId()); + + return ResponseMsg.buildSuccessMsg("会签成功", approvetype); + } + /** * 更新项目状态和审批状态 */ diff --git a/src/main/java/cn/palmte/work/utils/ActUtil.java b/src/main/java/cn/palmte/work/utils/ActUtil.java index 0fee77b..5f53887 100644 --- a/src/main/java/cn/palmte/work/utils/ActUtil.java +++ b/src/main/java/cn/palmte/work/utils/ActUtil.java @@ -3,6 +3,8 @@ package cn.palmte.work.utils; import cn.palmte.work.config.activiti.ActConstant; import cn.palmte.work.config.activiti.DeleteTaskCommand; import cn.palmte.work.config.activiti.JumpCommand; +import cn.palmte.work.model.ProjectInstanceRelation; +import cn.palmte.work.model.ProjectInstanceRelationRepository; import cn.palmte.work.service.AccountService; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.FlowNode; @@ -47,8 +49,22 @@ public class ActUtil { private TaskService taskService; @Autowired private AccountService accountService; + @Autowired + private ProjectInstanceRelationRepository projectInstanceRelationRepository; + public Task getCurrentTask(int projectId) { + try { + List relationList = projectInstanceRelationRepository + .findByProjectIdOrderByCreateTimeDesc(projectId); + ProjectInstanceRelation projectInstanceRelation = relationList.get(0); + return taskService.createTaskQuery().processInstanceId(projectInstanceRelation.getProcessInsId()).singleResult(); + } catch (Exception e) { + logger.error("", e); + return null; + } + } + /** * 获取流程实例里的变量 * diff --git a/src/main/resources/templates/admin/project_approve.ftl b/src/main/resources/templates/admin/project_approve.ftl index cb87402..a4de9ae 100644 --- a/src/main/resources/templates/admin/project_approve.ftl +++ b/src/main/resources/templates/admin/project_approve.ftl @@ -2470,6 +2470,53 @@ + + <#--会签弹窗--> +
+
+
会签—${project.name}
+
+
+
+
+
+ +
+
会签单
+ +
+ + +
+ +
+
+
+ +
+
+
+
+
+ +
+
+
+ + <#--预算状态 待审核状态 --> + <#if project.status==5 && project.approveStatusBudget==1 && currentTaskName != "执行董事" > + +
@@ -2511,6 +2563,17 @@ } }); }); + + $("#huiQian").click(function () { + $('#my-approve2').modal({ + relatedTarget: this, + onConfirm: function (e) { + }, + onCancel: function (e) { + } + }); + }); + $("#incomeAddBtn").click(function () { appendTrIncome(); }); @@ -2554,6 +2617,37 @@ }); }; + + var completeHuiQianTask = function (projectId) { + var approvetype = $("#type").val(); + var params = { + message: "" + }; + $.ajax({ + url: '${base}/project/skipTask/' + projectId + "/" + approvetype, + data: JSON.stringify(params), + dataType: "json", + contentType: "application/json", + type: 'post', + async: false, + success: function (data) { + if (data.status == 0) { + alert(data.msg); + refreshMyApproveMsg(); + var urlType = data.data; + if(urlType == 1){ + location.href = "${base}/project/list"; + }else { + location.href = "${base}/project/listApprove"; + } + + } else if (data.status == 1) { + alert(data.msg); + } + } + }); + }; + layui.use('laydate', function(){ var laydate = layui.laydate;