|
@@ -0,0 +1,194 @@
|
|
|
+package com.platform.service.workflow.verifyStrategy.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.platform.common.constant.CommonConstants;
|
|
|
+import com.platform.common.exception.DeniedException;
|
|
|
+import com.platform.common.util.*;
|
|
|
+import com.platform.dao.dto.workflow.WorkflowNodeDTO;
|
|
|
+import com.platform.dao.dto.workflow.WorkflowTaskRecordDTO;
|
|
|
+import com.platform.dao.entity.custom.CustomClassName;
|
|
|
+import com.platform.dao.entity.custom.CustomFormData;
|
|
|
+import com.platform.dao.entity.workflow.WorkflowTask;
|
|
|
+import com.platform.dao.entity.workflow.WorkflowTaskBom;
|
|
|
+import com.platform.dao.enums.FlowTaskStatusEnum;
|
|
|
+import com.platform.dao.enums.TaskRecordStatusEnum;
|
|
|
+import com.platform.dao.enums.YesNoEnum;
|
|
|
+import com.platform.dao.mapper.custom.CustomClassNameMapper;
|
|
|
+import com.platform.dao.mapper.custom.CustomFormDataMapper;
|
|
|
+import com.platform.dao.mapper.workflow.WorkflowNodeMapper;
|
|
|
+import com.platform.dao.mapper.workflow.WorkflowTaskBomMapper;
|
|
|
+import com.platform.dao.mapper.workflow.WorkflowTaskMapper;
|
|
|
+import com.platform.dao.vo.query.workflow.WorkflowNodeVO;
|
|
|
+import com.platform.service.workflow.verifyStrategy.AbstractBaseStrategy;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.lang.reflect.InvocationTargetException;
|
|
|
+import java.lang.reflect.Method;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 3 同意 4 回退 5 终止 6 撤回
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+@Service("verifyPassStrategy")
|
|
|
+public class VerifyPassStrategy extends AbstractBaseStrategy {
|
|
|
+ @Resource
|
|
|
+ private CustomFormDataMapper customFormDataMapper;
|
|
|
+ @Resource
|
|
|
+ private CustomClassNameMapper customClassNameMapper;
|
|
|
+ @Resource
|
|
|
+ private WorkflowNodeMapper workflowNodeMapper;
|
|
|
+ @Resource
|
|
|
+ private WorkflowTaskBomMapper workflowTaskBomMapper;
|
|
|
+ @Resource
|
|
|
+ private WorkflowTaskMapper workflowTaskMapper;
|
|
|
+ ;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Integer getType() {
|
|
|
+ return TaskRecordStatusEnum.YES.getValue();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void verify(List<WorkflowNodeVO> nodeList, WorkflowTaskRecordDTO record) {
|
|
|
+ WorkflowTask updTask = new WorkflowTask();
|
|
|
+ updTask.setId(record.getTaskId());
|
|
|
+ updTask.setFlowId(record.getFlowId());
|
|
|
+ WorkflowTaskBom updBom = new WorkflowTaskBom();
|
|
|
+ updBom.setId(record.getId());
|
|
|
+ updBom.setHandleRemark(record.getHandleRemark());
|
|
|
+ if (CollectionUtils.isEmpty(nodeList)) {
|
|
|
+ // 流程结束
|
|
|
+ finishTask(updBom,updTask);
|
|
|
+ } else {
|
|
|
+ // 生成taskBom
|
|
|
+ generateTaskBom(nodeList, updTask, updBom, customFormDataMapper.selectByPrimaryKey(record.getFormDataId()));
|
|
|
+ }
|
|
|
+ // 存储记录
|
|
|
+ saveTaskRecord(record);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void saveTaskRecord(WorkflowTaskRecordDTO record) {
|
|
|
+ super.saveTaskRecord(record);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void finishTask(WorkflowTaskBom updBom, WorkflowTask updTask) {
|
|
|
+ updBom.setStatus(YesNoEnum.YES.getValue());
|
|
|
+ updBom.setHandleTime(LocalDateTime.now());
|
|
|
+ // 修改老节点
|
|
|
+ workflowTaskBomMapper.updateByPrimaryKey(updBom);
|
|
|
+ // 修改任务
|
|
|
+ updTask.setStatus(FlowTaskStatusEnum.FINISH.getValue());
|
|
|
+ updTask.setLastTime(LocalDateTime.now());
|
|
|
+ updTask.setLastUserName(SecurityUtils.getUserInfo().getRealName());
|
|
|
+ updTask.setLastUserId(SecurityUtils.getUserInfo().getUserId());
|
|
|
+ updTask.setRemark("已结束");
|
|
|
+ workflowTaskMapper.updateByPrimaryKeySelective(updTask);
|
|
|
+ }
|
|
|
+
|
|
|
+ private WorkflowTaskBom generateTaskBom(List<WorkflowNodeVO> nodeList, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
|
|
|
+ WorkflowTaskBom bom = null;
|
|
|
+ for (WorkflowNodeVO nodeVO : nodeList) {
|
|
|
+ bom = generateTaskBom(nodeVO, updTask, updBom, data);
|
|
|
+ if (bom != null) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return bom;
|
|
|
+ }
|
|
|
+
|
|
|
+ private WorkflowTaskBom generateTaskBom(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom, CustomFormData data) {
|
|
|
+ WorkflowTaskBom bom = null;
|
|
|
+ switch (node.getType()) {
|
|
|
+ case CommonConstants.CONDITION_TYPE: // 条件分支
|
|
|
+ JSONObject switchJson = JSONObject.parseObject(node.getSwitchJson());
|
|
|
+ int symbol = switchJson.getInteger("symbol"); // 比较符号 > = < 等
|
|
|
+ BigDecimal val = BigDecimalUtil.valueNull(switchJson.getString("value")); // 比较值
|
|
|
+ String fieldName = switchJson.getString("fieldName");
|
|
|
+ // 获取主键ID值
|
|
|
+ String primaryKey = getPrimaryKey(data.getJsonString(), fieldName);
|
|
|
+ // 获取表单关联关系
|
|
|
+ if (StringUtils.isBlank(node.getSwitchHandleId())) {
|
|
|
+ throw new DeniedException("分支条件处理class流程未配置");
|
|
|
+ }
|
|
|
+ CustomClassName className = customClassNameMapper.selectByPrimaryKey(node.getSwitchHandleId());
|
|
|
+ Object obj = BeanUtils.getBean(className.getHandleCode());
|
|
|
+ Class cla = obj.getClass();
|
|
|
+ Boolean findFlag = Boolean.FALSE; // 符合分支条件
|
|
|
+ try {
|
|
|
+ Method method = cla.getMethod("");
|
|
|
+ findFlag = (Boolean) method.invoke(obj, primaryKey, val, symbol);
|
|
|
+ } catch (NoSuchMethodException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IllegalAccessException e2) {
|
|
|
+ e2.printStackTrace();
|
|
|
+ } catch (InvocationTargetException e3) {
|
|
|
+ e3.printStackTrace();
|
|
|
+ }
|
|
|
+ if (findFlag) {
|
|
|
+ // 获取下一个节点,封装审批人
|
|
|
+ int nodeSort = node.getNodeLevel();
|
|
|
+ nodeSort++;
|
|
|
+ WorkflowNodeDTO nextNode = new WorkflowNodeDTO();
|
|
|
+ nextNode.setNodeLevel(nodeSort);
|
|
|
+ nextNode.setFlowId(data.getFlowId());
|
|
|
+ nextNode.setFrontParentId(node.getFrontId());
|
|
|
+ List<WorkflowNodeVO> nodeList = workflowNodeMapper.selectNodeList(nextNode);
|
|
|
+ bom = getBomByNode(nodeList.get(0), updTask, updBom);
|
|
|
+ }
|
|
|
+ // 获取分支
|
|
|
+ break;
|
|
|
+ case CommonConstants.VERIFY_USER_TYPE: // 审核人处理
|
|
|
+ bom = getBomByNode(node, updTask, updBom);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return bom;
|
|
|
+ }
|
|
|
+
|
|
|
+ private WorkflowTaskBom getBomByNode(WorkflowNodeVO node, WorkflowTask updTask, WorkflowTaskBom updBom) {
|
|
|
+ WorkflowTaskBom bom = new WorkflowTaskBom();
|
|
|
+ bom.setId(IdGeneratorUtils.getObjectId());
|
|
|
+ bom.setTaskId(updTask.getId());
|
|
|
+ bom.setStatus(YesNoEnum.NO.getValue());
|
|
|
+ bom.setPersonalType(YesNoEnum.YES.getValue() + 1);
|
|
|
+ bom.setCreatedUserName(node.getUserName());
|
|
|
+ bom.setCreatedUserId(node.getUserId());
|
|
|
+ bom.setCreatedTime(LocalDateTime.now());
|
|
|
+ bom.setReadFlag(YesNoEnum.NO.getValue());
|
|
|
+ bom.setReminderNum(YesNoEnum.NO.getValue());
|
|
|
+ // 修改已有taskBom
|
|
|
+ updBom.setStatus(YesNoEnum.YES.getValue());
|
|
|
+ updBom.setHandleTime(LocalDateTime.now());
|
|
|
+ // 修改Task
|
|
|
+ updTask.setStatus(FlowTaskStatusEnum.VERIFYING.getValue());
|
|
|
+ updTask.setNodeSort(node.getNodeLevel());
|
|
|
+ updTask.setFrontId(node.getFrontId());
|
|
|
+ updTask.setLastTime(LocalDateTime.now());
|
|
|
+ updTask.setLastUserName(SecurityUtils.getUserInfo().getRealName());
|
|
|
+ updTask.setLastUserId(SecurityUtils.getUserInfo().getUserId());
|
|
|
+ updTask.setCurrentUserId(node.getUserId());
|
|
|
+ updTask.setCurrentUserName(node.getUserName());
|
|
|
+ updTask.setRemark("待" + node.getUserName() + "处理");
|
|
|
+ // 存入bom
|
|
|
+ workflowTaskBomMapper.insert(bom);
|
|
|
+ // 修改老节点
|
|
|
+ workflowTaskBomMapper.updateByPrimaryKey(updBom);
|
|
|
+ // 修改任务
|
|
|
+ workflowTaskMapper.updateByPrimaryKeySelective(updTask);
|
|
|
+ return bom;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String getPrimaryKey(String json, String fieldName) {
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(json);
|
|
|
+ return jsonObject.getString(fieldName);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|