会签功能开发

master
pengqiang 2022-08-09 15:58:39 +08:00
parent c77cd70237
commit 5243873983
6 changed files with 187 additions and 22 deletions

View File

@ -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);
}
/**
*
*/

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
/**
*
*/

View File

@ -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;
}
}
/**
*
*

View File

@ -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>
<!--选项卡tabsend-->
<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;