From 5243873983f80615b575486a95122c029e409f3a Mon Sep 17 00:00:00 2001 From: pengqiang <1067496116@qq.com> Date: Tue, 9 Aug 2022 15:58:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E7=AD=BE=E5=8A=9F=E8=83=BD=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/backend/ProjectController.java | 17 ++++ .../work/service/ActListenerService.java | 26 +---- .../work/service/ActTaskDefService.java | 44 +++++++++ .../palmte/work/service/ProjectService.java | 12 +++ .../java/cn/palmte/work/utils/ActUtil.java | 16 ++++ .../templates/admin/project_approve.ftl | 94 +++++++++++++++++++ 6 files changed, 187 insertions(+), 22 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 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<String> 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<String> getMultiCandidateUsers(DelegateExecution delegateExecution) throws Exception { - logger.info("--多实例任务查询办理人-- eventName:{}, {}", delegateExecution.getEventName(), delegateExecution); - String procInsId = delegateExecution.getProcessInstanceId(); - String procDefId = delegateExecution.getProcessDefinitionId(); - String taskDefKey = delegateExecution.getCurrentActivityId(); - - List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey); - logger.info("--getMultiCandidateUsers-- {}", candidateUsers); - return candidateUsers; - } - - /** * 更新项目审批人 四算业务需要 * @@ -90,7 +72,6 @@ public class ActListenerService { */ private void updateProjectApprover(List<String> 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<ProjectInstanceRelation> 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<ProjectInstanceRelation> 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 @@ </div> </div> + + <#--会签弹窗--> + <div class="am-modal am-modal-prompt" style="width: 1000px;max-height:600px;overflow-y:auto;" + tabindex="-1" id="my-approve2"> + <div class="am-modal-dialog"> + <div style="word-wrap:break-word; word-break:break-all; " class="am-modal-hd">会签—${project.name}</div> + <div class="am-modal-bd" style="border-bottom: none"> + <form method="post" class="am-form" id="tmpForm" action="${base}/procurement/type/save"> + <div class="am-tabs am-margin" data-am-tabs> + <div class="am-tabs-bd"> + <div class="am-tab-panel am-fade am-in am-active" id="tab1"> + + <div class="am-g am-form-group am-margin-top"> + <div class="am-u-sm-4 am-u-md-2 am-text-right">会签单</div> + + <div class="am-u-sm-12 am-u-md-4 switch-button" style="height: 25px;"> + <label class="am-radio-inline"> + <input type="file" name="myFile" /> + </label> + + </div> + + <div class="am-hide-sm-only am-u-md-1" style="color: red;"></div> + <div class="am-u-sm-2 am-u-md-5 input-msg"></div> + </div> + + </div> + </div> + </div> + </form> + </div> + <div class="am-modal-footer"> + <button type="button" + class="am-btn am-btn-default am-btn-xs am-text-secondary" + onclick="$('#my-approve2').modal('close')"> + 取消 + </button> + <span style="margin-left: 100px"></span> + <button type="button" + class="am-btn am-btn-default am-btn-xs am-text-secondary" + onclick="completeHuiQianTask('${project.id}')"> + 确定 + </button> + </div> + </div> + </div> + <!--选项卡(tabs)end--> <div class="am-margin"> <button type="button" class="am-btn am-btn-warning am-btn-xs" onclick="javascript:history.go(-1);"> @@ -2478,6 +2525,11 @@ <#if adminId==project.approveId> <button type="submit" class="am-btn am-btn-primary am-btn-xs" id="saveFinal">审核</button> </#if> + + <#--预算状态 待审核状态 --> + <#if project.status==5 && project.approveStatusBudget==1 && currentTaskName != "执行董事" > + <button type="submit" class="am-btn am-btn-primary am-btn-xs" id="huiQian">会签</button> + </#if> </div> </form> @@ -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;