会签功能开发
parent
c77cd70237
commit
5243873983
|
@ -4,6 +4,7 @@ import cn.palmte.work.bean.*;
|
||||||
import cn.palmte.work.model.*;
|
import cn.palmte.work.model.*;
|
||||||
import cn.palmte.work.pojo.ActHisTask;
|
import cn.palmte.work.pojo.ActHisTask;
|
||||||
import cn.palmte.work.service.*;
|
import cn.palmte.work.service.*;
|
||||||
|
import cn.palmte.work.utils.ActUtil;
|
||||||
import cn.palmte.work.utils.FreeMarkerUtil;
|
import cn.palmte.work.utils.FreeMarkerUtil;
|
||||||
import cn.palmte.work.utils.InterfaceUtil;
|
import cn.palmte.work.utils.InterfaceUtil;
|
||||||
import cn.palmte.work.utils.Utils;
|
import cn.palmte.work.utils.Utils;
|
||||||
|
@ -14,6 +15,7 @@ import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import org.activiti.engine.HistoryService;
|
import org.activiti.engine.HistoryService;
|
||||||
import org.activiti.engine.history.HistoricProcessInstance;
|
import org.activiti.engine.history.HistoricProcessInstance;
|
||||||
|
import org.activiti.engine.task.Task;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
import org.apache.poi.xssf.usermodel.XSSFSheet;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -81,6 +83,8 @@ public class ProjectController extends BaseController {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ProjectRepository projectRepository;
|
private ProjectRepository projectRepository;
|
||||||
@Autowired
|
@Autowired
|
||||||
|
private ActUtil actUtil;
|
||||||
|
@Autowired
|
||||||
private NumSeqService numSeqService;
|
private NumSeqService numSeqService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -551,6 +555,10 @@ public class ProjectController extends BaseController {
|
||||||
model.put("taskRecords", list);
|
model.put("taskRecords", list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//当前审批任务
|
||||||
|
Task currentTask = actUtil.getCurrentTask(project.getId());
|
||||||
|
model.put("currentTaskName", currentTask==null ? "" : currentTask.getName());
|
||||||
|
|
||||||
return "admin/project_approve";
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查看审核流程
|
* 查看审核流程
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -50,38 +50,20 @@ public class ActListenerService {
|
||||||
public void create(DelegateTask delegateTask) throws Exception {
|
public void create(DelegateTask delegateTask) throws Exception {
|
||||||
String procInsId = delegateTask.getProcessInstanceId();
|
String procInsId = delegateTask.getProcessInstanceId();
|
||||||
logger.info("--节点创建后监听-- procInsId:{}, {}", procInsId, delegateTask);
|
logger.info("--节点创建后监听-- procInsId:{}, {}", procInsId, delegateTask);
|
||||||
|
logger.info("**** rwcjjt【{}】任务创建监听 procInsId:{} **** ", delegateTask, procInsId);
|
||||||
|
|
||||||
String procDefId = delegateTask.getProcessDefinitionId();
|
String procDefId = delegateTask.getProcessDefinitionId();
|
||||||
String taskDefKey = delegateTask.getTaskDefinitionKey();
|
String taskDefKey = delegateTask.getTaskDefinitionKey();
|
||||||
List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
|
List<String> candidateUsers = actTaskDefService.findCandidateUsers(procDefId, procInsId, taskDefKey);
|
||||||
|
logger.info("**** rwcjjt 任务创建监听 查询候选人 procInsId:{},任务名称:{},候选人:{} **** ", procInsId, delegateTask.getName(), candidateUsers);
|
||||||
|
|
||||||
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
|
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(procInsId).singleResult();
|
||||||
logger.info("addCandidateUsers : {}, taskName:{}, hasProcIns:{}", candidateUsers, delegateTask.getName(), processInstance != null);
|
|
||||||
|
|
||||||
updateProjectApprover(candidateUsers, processInstance, procDefId, taskDefKey);
|
updateProjectApprover(candidateUsers, processInstance, procDefId, taskDefKey);
|
||||||
|
|
||||||
delegateTask.addCandidateUsers(candidateUsers);
|
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) {
|
private void updateProjectApprover(List<String> candidateUsers, ProcessInstance processInstance, String procDefId, String taskDefKey) {
|
||||||
String businessKey = processInstance.getBusinessKey();
|
String businessKey = processInstance.getBusinessKey();
|
||||||
logger.info("businessKey : {}", businessKey);
|
|
||||||
ActTaskDef actTaskDef = actTaskDefService.findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey);
|
ActTaskDef actTaskDef = actTaskDefService.findFirstByProcDefIdAndTaskKey(procDefId, taskDefKey);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -106,7 +87,8 @@ public class ActListenerService {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
logger.info("**** rwcjjt 任务创建监听 更新审批人 procInsId:{}, projectId:{}, adminId:{} **** ",
|
||||||
|
processInstance.getProcessInstanceId(), businessKey, adminId);
|
||||||
projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId);
|
projectInstanceService.updateApprover(Integer.parseInt(businessKey), adminId);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("", e);
|
logger.error("", e);
|
||||||
|
|
|
@ -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) {
|
private void setAssign(ActHisTask actHisTask) {
|
||||||
if (StringUtils.isNotBlank(actHisTask.getAssign())) {
|
if (StringUtils.isNotBlank(actHisTask.getAssign())) {
|
||||||
|
if ("-1".equals(actHisTask.getAssign())) {
|
||||||
|
actHisTask.setAssign("系统");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String userName = accountService.getNameById(Integer.parseInt(actHisTask.getAssign()));
|
String userName = accountService.getNameById(Integer.parseInt(actHisTask.getAssign()));
|
||||||
actHisTask.setAssign(userName);
|
actHisTask.setAssign(userName);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新项目状态和审批状态
|
* 更新项目状态和审批状态
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -3,6 +3,8 @@ package cn.palmte.work.utils;
|
||||||
import cn.palmte.work.config.activiti.ActConstant;
|
import cn.palmte.work.config.activiti.ActConstant;
|
||||||
import cn.palmte.work.config.activiti.DeleteTaskCommand;
|
import cn.palmte.work.config.activiti.DeleteTaskCommand;
|
||||||
import cn.palmte.work.config.activiti.JumpCommand;
|
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 cn.palmte.work.service.AccountService;
|
||||||
import org.activiti.bpmn.model.BpmnModel;
|
import org.activiti.bpmn.model.BpmnModel;
|
||||||
import org.activiti.bpmn.model.FlowNode;
|
import org.activiti.bpmn.model.FlowNode;
|
||||||
|
@ -47,8 +49,22 @@ public class ActUtil {
|
||||||
private TaskService taskService;
|
private TaskService taskService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private AccountService accountService;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取流程实例里的变量
|
* 获取流程实例里的变量
|
||||||
*
|
*
|
||||||
|
|
|
@ -2470,6 +2470,53 @@
|
||||||
</div>
|
</div>
|
||||||
</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-->
|
<!--选项卡(tabs)end-->
|
||||||
<div class="am-margin">
|
<div class="am-margin">
|
||||||
<button type="button" class="am-btn am-btn-warning am-btn-xs" onclick="javascript:history.go(-1);">
|
<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>
|
<#if adminId==project.approveId>
|
||||||
<button type="submit" class="am-btn am-btn-primary am-btn-xs" id="saveFinal">审核</button>
|
<button type="submit" class="am-btn am-btn-primary am-btn-xs" id="saveFinal">审核</button>
|
||||||
</#if>
|
</#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>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
@ -2511,6 +2563,17 @@
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#huiQian").click(function () {
|
||||||
|
$('#my-approve2').modal({
|
||||||
|
relatedTarget: this,
|
||||||
|
onConfirm: function (e) {
|
||||||
|
},
|
||||||
|
onCancel: function (e) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
$("#incomeAddBtn").click(function () {
|
$("#incomeAddBtn").click(function () {
|
||||||
appendTrIncome();
|
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(){
|
layui.use('laydate', function(){
|
||||||
var laydate = layui.laydate;
|
var laydate = layui.laydate;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue