会签功能开发
parent
c77cd70237
commit
5243873983
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 查看审核流程
|
||||
*/
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取流程实例里的变量
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue