|
@@ -0,0 +1,370 @@
|
|
|
+package com.platform.service.customize;
|
|
|
+
|
|
|
+import cn.hutool.core.collection.CollectionUtil;
|
|
|
+import com.platform.activiti.dao.entity.ActApplyInfo;
|
|
|
+import com.platform.activiti.dao.entity.ActAuditRecord;
|
|
|
+import com.platform.activiti.dao.entity.ActAuditRequest;
|
|
|
+import com.platform.common.bean.AbstractPageResultBean;
|
|
|
+import com.platform.common.constant.CommonConstants;
|
|
|
+import com.platform.common.exception.BusinessException;
|
|
|
+import com.platform.common.model.UserInfo;
|
|
|
+import com.platform.common.util.SecurityUtils;
|
|
|
+import com.platform.dao.entity.activiti.ActivitiUserModel;
|
|
|
+import com.platform.dao.entity.customize.CustomFieldTemplateData;
|
|
|
+import com.platform.dao.entity.upms.SysUser;
|
|
|
+import com.platform.dao.mapper.customize.CustomFieldTemplateDataMapper;
|
|
|
+import com.platform.dao.mapper.sb.SbInfoMapper;
|
|
|
+import com.platform.dao.vo.query.customize.CustomFieldTemplateDataVO;
|
|
|
+import com.platform.service.activiti.ActivitiAssignStrategy;
|
|
|
+import com.platform.service.activiti.ActivitiUserModelService;
|
|
|
+import com.platform.service.upms.SysUserService;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import org.activiti.engine.*;
|
|
|
+import org.activiti.engine.history.HistoricDetail;
|
|
|
+import org.activiti.engine.history.HistoricProcessInstance;
|
|
|
+import org.activiti.engine.history.HistoricVariableUpdate;
|
|
|
+import org.activiti.engine.repository.Model;
|
|
|
+import org.activiti.engine.runtime.ProcessInstance;
|
|
|
+import org.activiti.engine.task.Task;
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@AllArgsConstructor
|
|
|
+public abstract class BaseFormCheckServiceAbstract implements BaseFormCheckService{
|
|
|
+ @Autowired
|
|
|
+ private RepositoryService repositoryService;
|
|
|
+ @Autowired
|
|
|
+ private IdentityService identityService;
|
|
|
+ @Autowired
|
|
|
+ private RuntimeService runtimeService;
|
|
|
+ @Autowired
|
|
|
+ private HistoryService historyService;
|
|
|
+ @Autowired
|
|
|
+ private TaskService taskService;
|
|
|
+ @Autowired
|
|
|
+ private SysUserService sysUserService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ActivitiUserModelService activitiUserModelService;
|
|
|
+ /**
|
|
|
+ * 通过spring获取所有策略类
|
|
|
+ */
|
|
|
+ @Autowired
|
|
|
+ private List<ActivitiAssignStrategy> activitiAssignStrategyList;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ protected CustomFieldTemplateDataMapper customFieldTemplateDataMapper;
|
|
|
+ @Autowired
|
|
|
+ protected SbInfoMapper sbInfoMapper;
|
|
|
+
|
|
|
+ protected BaseFormCheckServiceAbstract(){}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String checkPrepare(String data) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String packageData(String data, String no) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void resultWrite(AbstractPageResultBean<CustomFieldTemplateDataVO> pageInfos) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void start(ActAuditRequest actAuditRequest) {
|
|
|
+ doCheck(actAuditRequest);
|
|
|
+ doStart(actAuditRequest);
|
|
|
+ doUpdate(actAuditRequest);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected abstract void doCheck(ActAuditRequest actAuditRequest);
|
|
|
+
|
|
|
+ protected abstract void doUpdate(ActAuditRequest actAuditRequest);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @see com.platform.activiti.controller.ActivitiController#showTaskListStart
|
|
|
+ * @param actAuditRequest
|
|
|
+ */
|
|
|
+ protected void doStart(ActAuditRequest actAuditRequest) {
|
|
|
+ UserInfo user = SecurityUtils.getUserInfo();
|
|
|
+ // 设置发起对象,保存到流程实例中
|
|
|
+ ActApplyInfo applyInfo = new ActApplyInfo(actAuditRequest.getId(),
|
|
|
+ actAuditRequest.getAuditModelName(), actAuditRequest.getAuditModelKey(),
|
|
|
+ 0,
|
|
|
+ LocalDateTime.now());
|
|
|
+ Map<String, Object> map = new HashMap<>(1);
|
|
|
+
|
|
|
+ applyInfo.setUserId(user.getUserId());
|
|
|
+ applyInfo.setUserName(user.getRealName());
|
|
|
+ map.put("data", applyInfo);
|
|
|
+ map.put("userId", applyInfo.getUserId());
|
|
|
+ ProcessInstance instance = null;
|
|
|
+ if (StringUtils.isBlank(actAuditRequest.getProcessInstanceId())) {
|
|
|
+ // 第一次启动,设置流程启动人信息,为了后面查询我的发起列表
|
|
|
+ identityService.setAuthenticatedUserId(user.getUserId());
|
|
|
+ instance = runtimeService.startProcessInstanceByKey(actAuditRequest.getAuditModelKey(), actAuditRequest.getId(), map);
|
|
|
+ actAuditRequest.setProcessInstanceId(instance.getId());
|
|
|
+ } else { // 再次提交审批的,之前被拒绝的
|
|
|
+ ProcessInstance instanceExsit = runtimeService.createProcessInstanceQuery()
|
|
|
+ .processInstanceId(actAuditRequest.getProcessInstanceId()).singleResult();
|
|
|
+ if (instanceExsit == null) {
|
|
|
+ instance = runtimeService.startProcessInstanceByKey(actAuditRequest.getAuditModelKey(), actAuditRequest.getId(), map);
|
|
|
+ actAuditRequest.setProcessInstanceId(instance.getId());
|
|
|
+ } else {
|
|
|
+ instance = runtimeService.startProcessInstanceById(actAuditRequest.getProcessInstanceId(), actAuditRequest.getId(), map);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 第一个审批人为发起人,为自动审批。557501
|
|
|
+ // 设置审批对象,保存到task实例中,每次审核都要更新追加这个对象
|
|
|
+ Task task = taskService.createTaskQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
|
|
|
+
|
|
|
+ List<ActAuditRecord> records = new ArrayList<>();
|
|
|
+ records.add(new ActAuditRecord(user.getUserId(), user.getRealName(), "提交",
|
|
|
+ LocalDateTime.now(), true, task.getId(), task.getName()));
|
|
|
+ Map<String, Object> data = new HashMap<>();
|
|
|
+ data.put(CommonConstants.ACT_AUDIT_RECORD, records);
|
|
|
+ data.put("result", 1);
|
|
|
+ task.setAssignee(user.getUserId());
|
|
|
+ taskService.addComment(task.getId(), actAuditRequest.getProcessInstanceId(), "提交");
|
|
|
+ taskService.complete(task.getId(), data);
|
|
|
+ // 分配下一个节点的审批人信息
|
|
|
+ // 设置各个节点审批人员信息
|
|
|
+ Model model = repositoryService.createModelQuery().modelKey(actAuditRequest.getAuditModelKey()).singleResult();
|
|
|
+ List<ActivitiUserModel> list = activitiUserModelService.getModelByModelId(model.getId());
|
|
|
+ if (CollectionUtil.isEmpty(list)) {
|
|
|
+ throw new BusinessException("审批节点未设置,请先设置");
|
|
|
+ }
|
|
|
+ Task nextTask = taskService.createTaskQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
|
|
|
+ Map<String, String> maps = new HashMap<>();
|
|
|
+ maps.put("userId", user.getUserId());
|
|
|
+ modifyTaskAssign(model.getId(), maps, nextTask, list);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审批,第一个审批人为发起人,自动审批。
|
|
|
+ * 审批设置对象:ActApplyInfo
|
|
|
+ *
|
|
|
+ * @param actAuditRequest
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void audit(ActAuditRequest actAuditRequest) {
|
|
|
+ UserInfo user = SecurityUtils.getUserInfo();
|
|
|
+ if (doAudit(actAuditRequest)) {
|
|
|
+ if (!doCheckLast(actAuditRequest)) {
|
|
|
+ // 分配下一个节点的审批人信息
|
|
|
+ Model model = repositoryService.createModelQuery().modelKey(actAuditRequest.getAuditModelKey()).singleResult();
|
|
|
+ List<ActivitiUserModel> list = activitiUserModelService.getModelByModelId(model.getId());
|
|
|
+ if (CollectionUtil.isEmpty(list)) {
|
|
|
+ throw new BusinessException("审批节点未设置,请先设置");
|
|
|
+ }
|
|
|
+ Map<String, String> maps = new HashMap<>();
|
|
|
+ maps.put("userId", user.getUserId());
|
|
|
+ Task nextTask = taskService.createTaskQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).orderByTaskCreateTime().desc().singleResult();
|
|
|
+ modifyTaskAssign(model.getId(), maps, nextTask, list);
|
|
|
+ } else {
|
|
|
+ doFinish(actAuditRequest);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ doRefuse(actAuditRequest);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ protected abstract void doRefuse(ActAuditRequest actAuditRequest);
|
|
|
+
|
|
|
+ protected abstract void doFinish(ActAuditRequest actAuditRequest);
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ protected boolean doAudit(ActAuditRequest actAuditRequest) {
|
|
|
+ UserInfo user = SecurityUtils.getUserInfo();
|
|
|
+ // 设置发起对象,保存到流程实例中
|
|
|
+ String taskId = actAuditRequest.getTaskId();
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ Integer result = 0;
|
|
|
+ if (actAuditRequest.getAuditFlag()) {
|
|
|
+ result = 1;// 同意
|
|
|
+ } else {
|
|
|
+ result = 0;// 拒绝
|
|
|
+ }
|
|
|
+ map.put("result", result);
|
|
|
+ Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
|
|
|
+ Map<String, Object> variables = taskService.getVariables(taskId);
|
|
|
+ List<ActAuditRecord> records = new ArrayList<>();
|
|
|
+ Object o = variables.get(CommonConstants.ACT_AUDIT_RECORD);
|
|
|
+ if (o != null) {
|
|
|
+ records = (List<ActAuditRecord>) o;
|
|
|
+ }
|
|
|
+
|
|
|
+ records.add(0, new ActAuditRecord(user.getUserId(), user.getRealName(), actAuditRequest.getRefuseReason(),
|
|
|
+ LocalDateTime.now(), result == 0 ? false : true, taskId, task.getName()));
|
|
|
+ map.put(CommonConstants.ACT_AUDIT_RECORD, records);
|
|
|
+ taskService.addComment(taskId, actAuditRequest.getProcessInstanceId(), actAuditRequest.getRefuseReason());
|
|
|
+ taskService.complete(taskId, map);
|
|
|
+ // 审批拒绝,则不用判断是否结束。审批同意则要判断是否流程结束,结束则更新报废单状态和设备状态
|
|
|
+ return result == 0 ? false : true;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 终止审核:如果已经终止删除过的
|
|
|
+ * 审批设置对象:ActApplyInfo
|
|
|
+ *
|
|
|
+ * @param actAuditRequest
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void stop(ActAuditRequest actAuditRequest) {
|
|
|
+ String processInstanceId = actAuditRequest.getProcessInstanceId();
|
|
|
+ if (StringUtils.isNotEmpty(processInstanceId)) {
|
|
|
+ ProcessInstance instance = runtimeService.createProcessInstanceQuery()
|
|
|
+ .processInstanceId(processInstanceId).singleResult();
|
|
|
+ if (instance != null) {
|
|
|
+ runtimeService.deleteProcessInstance(processInstanceId, "发起人终止");
|
|
|
+ historyService.deleteHistoricProcessInstance(processInstanceId);
|
|
|
+ }else{
|
|
|
+ List<ProcessInstance> instanceList = runtimeService.createProcessInstanceQuery()
|
|
|
+ .processInstanceBusinessKey(actAuditRequest.getId()).list();
|
|
|
+ for(ProcessInstance processInstance:instanceList){
|
|
|
+ runtimeService.deleteProcessInstance(processInstance.getId(), "发起人终止");
|
|
|
+ historyService.deleteHistoricProcessInstance(processInstance.getId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ doStop(actAuditRequest);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected abstract void doStop(ActAuditRequest actAuditRequest);
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 签收
|
|
|
+ * 审批设置对象:ActApplyInfo
|
|
|
+ *
|
|
|
+ * @param actAuditRequest
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void claim(ActAuditRequest actAuditRequest) {
|
|
|
+ String taskId = actAuditRequest.getTaskId();
|
|
|
+ String userId = SecurityUtils.getUserInfo().getUserId();
|
|
|
+ if (StringUtils.isEmpty(taskId)) {
|
|
|
+ throw new BusinessException("taskId为空,请选择");
|
|
|
+ }
|
|
|
+ taskService.setAssignee(taskId, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转签
|
|
|
+ * 审批设置对象:ActApplyInfo
|
|
|
+ *
|
|
|
+ * @param actAuditRequest
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ public void assign(ActAuditRequest actAuditRequest) {
|
|
|
+ String taskId = actAuditRequest.getTaskId();
|
|
|
+ String userId = actAuditRequest.getChangeUser();
|
|
|
+ if (StringUtils.isEmpty(taskId)) {
|
|
|
+ throw new BusinessException("taskId为空,请选择");
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(userId)) {
|
|
|
+ throw new BusinessException("请设置转签人员");
|
|
|
+ }
|
|
|
+ SysUser sysUser = sysUserService.getModelById(userId);
|
|
|
+ if (sysUser == null) {
|
|
|
+ throw new BusinessException("用户不存在,请选择其他人员");
|
|
|
+ }
|
|
|
+ taskService.setAssignee(taskId, userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审核历史:都在ActRecord里面
|
|
|
+ * 审批设置对象:ActApplyInfo
|
|
|
+ *
|
|
|
+ * @param processInstanceId
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<ActAuditRecord> history(String processInstanceId) {
|
|
|
+ ProcessInstance instance = runtimeService.createProcessInstanceQuery()
|
|
|
+ .processInstanceId(processInstanceId).singleResult();
|
|
|
+ //保证运行ing
|
|
|
+ List<ActAuditRecord> records = new ArrayList<>();
|
|
|
+ if (instance != null) {
|
|
|
+ Task task = this.taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
|
|
|
+ Map<String, Object> variables = taskService.getVariables(task.getId());
|
|
|
+ Object o = variables.get(CommonConstants.ACT_AUDIT_RECORD);
|
|
|
+ if (o != null) {
|
|
|
+ /*获取历史审核信息*/
|
|
|
+ records = (List<ActAuditRecord>) o;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<HistoricDetail> list = historyService.createHistoricDetailQuery().
|
|
|
+ processInstanceId(processInstanceId).orderByTime().desc().list();
|
|
|
+ if (CollectionUtil.isNotEmpty(list)) {
|
|
|
+ HistoricDetail historicDetail = list.get(0);
|
|
|
+ HistoricVariableUpdate variable = (HistoricVariableUpdate) historicDetail;
|
|
|
+ String variableName = variable.getVariableName();
|
|
|
+ if (CommonConstants.ACT_AUDIT_RECORD.equals(variableName)) {
|
|
|
+ records.clear();
|
|
|
+ records.addAll((List<ActAuditRecord>) variable.getValue());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return records;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判定流程是否结束
|
|
|
+ *
|
|
|
+ * @param actAuditRequest
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public boolean doCheckLast(ActAuditRequest actAuditRequest) {
|
|
|
+ HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(actAuditRequest.getProcessInstanceId()).singleResult();
|
|
|
+ if (Objects.isNull(historicProcessInstance)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (Objects.isNull(historicProcessInstance.getEndTime())) {
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 修改审批节点:每次审批后,包括第一次提交,来更新下一次任务的审批人信息。不能更新xml。更新xml只适合部根据发起人所属部门的情况
|
|
|
+ * 每次上一个节点审批后,设置下一个审批人员信息,并记录到task的变量里面
|
|
|
+ *
|
|
|
+ * @param modeId
|
|
|
+ * @param map,发起人信息,为了设置
|
|
|
+ * @param list
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public void modifyTaskAssign(String modeId, Map<String, String> map, Task task, List<ActivitiUserModel> list) {
|
|
|
+ Model model = repositoryService.getModel(modeId);
|
|
|
+ ActivitiUserModel userTaskModel =
|
|
|
+ list.stream().filter(u -> u.getId().equals(task.getTaskDefinitionKey())).collect(Collectors.toList()).get(0);
|
|
|
+ Integer type = userTaskModel.getType();
|
|
|
+ ActivitiAssignStrategy activitiAssignStrategy =
|
|
|
+ activitiAssignStrategyList.stream().filter(strategy -> strategy.getType().equals(type)).collect(Collectors.toList()).get(0);
|
|
|
+ activitiAssignStrategy.handleAssign(task, map, userTaskModel);
|
|
|
+ userTaskModel.setDeploymentId(model.getDeploymentId());
|
|
|
+ // activitiUserModelService.updateBatch(list);
|
|
|
+ }
|
|
|
+
|
|
|
+ protected CustomFieldTemplateData getById(String id){
|
|
|
+ return customFieldTemplateDataMapper.selectByPrimaryKey(id);
|
|
|
+ }
|
|
|
+}
|