java110
2022-03-24 020fe8a2568425843c2197e5a8888de9d64648c0
合并泰安代码
3个文件已修改
1个文件已添加
190 ■■■■■ 已修改文件
java110-interface/src/main/java/com/java110/intf/common/IWorkflowV1InnerServiceSMO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-api/src/main/java/com/java110/api/listener/workflow/UpdateWorkflowListener.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-common/src/main/java/com/java110/common/cmd/workflow/ListWorkflowNextNodeCmd.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-common/src/main/java/com/java110/common/smo/impl/WorkflowV1InnerServiceSMOImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-interface/src/main/java/com/java110/intf/common/IWorkflowV1InnerServiceSMO.java
@@ -15,6 +15,7 @@
 */
package com.java110.intf.common;
import com.alibaba.fastjson.JSONObject;
import com.java110.config.feign.FeignConfiguration;
import com.java110.dto.workflow.WorkflowDto;
import com.java110.po.workflow.WorkflowPo;
@@ -65,4 +66,7 @@
     */
    @RequestMapping(value = "/queryWorkflowsCount", method = RequestMethod.POST)
    int queryWorkflowsCount(@RequestBody WorkflowDto workflowDto);
    @RequestMapping(value = "/getWorkflowNextNode", method = RequestMethod.POST)
    public List<JSONObject> getWorkflowNextNode(@RequestBody JSONObject reqJson);
}
service-api/src/main/java/com/java110/api/listener/workflow/UpdateWorkflowListener.java
@@ -147,7 +147,7 @@
        //保存 工作流程步骤
        JSONArray steps = reqJson.getJSONArray("steps");
        String processDefinitionKey = "";
        if(steps != null && steps.size() > 0) { // 有步骤
        if (steps != null && steps.size() > 0) { // 有步骤
            JSONObject step = null;
            JSONObject subStaff = null;
            WorkflowStepStaffPo workflowStepStaffPo = null;
@@ -173,6 +173,10 @@
                workflowStepStaffPo.setStepId(workflowStepPo.getStepId());
                workflowStepStaffPo.setFlowType(reqJson.getString("flowType"));
                workflowStepStaffPo.setStaffRole(StringUtil.isEmpty(step.getString("staffRole")) ? "1001" : step.getString("staffRole"));
                if (!"1001".equals(step.getString("staffRole")) && step.getString("staffId").startsWith("${")) {
                    throw new IllegalArgumentException("采购人员或者物品领用人员必须指定人,不能是动态指定");
                }
                super.insert(context, workflowStepStaffPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP_STAFF);
                workflowStepStaffDtos.add(BeanConvertUtil.covertBean(workflowStepStaffPo, WorkflowStepStaffDto.class));
                //会签流程
@@ -202,7 +206,7 @@
            workflowDto.setWorkflowSteps(tmpWorkflowStepDtos);
            WorkflowDto tmpWorkflowDto = workflowInnerServiceSMOImpl.addFlowDeployment(workflowDto);
            processDefinitionKey = tmpWorkflowDto.getProcessDefinitionKey();
        }else{
        } else {
            processDefinitionKey = "-1";
        }
        //提交
service-common/src/main/java/com/java110/common/cmd/workflow/ListWorkflowNextNodeCmd.java
New file
@@ -0,0 +1,36 @@
package com.java110.common.cmd.workflow;
import com.alibaba.fastjson.JSONObject;
import com.java110.core.annotation.Java110Cmd;
import com.java110.core.context.ICmdDataFlowContext;
import com.java110.core.event.cmd.AbstractServiceCmdListener;
import com.java110.core.event.cmd.CmdEvent;
import com.java110.intf.common.IWorkflowV1InnerServiceSMO;
import com.java110.utils.exception.CmdException;
import com.java110.utils.util.Assert;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
@Java110Cmd(serviceCode = "workflow.listWorkflowNextNode")
public class ListWorkflowNextNodeCmd extends AbstractServiceCmdListener {
    @Autowired
    private IWorkflowV1InnerServiceSMO workflowV1InnerServiceSMOImpl;
    @Override
    public void validate(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) {
        Assert.hasKeyAndValue(reqJson, "taskId", "未包含任务ID");
        Assert.hasKeyAndValue(reqJson, "startUserId", "未包含提交者");
    }
    @Override
    public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
        JSONObject paramIn = new JSONObject();
        paramIn.put("taskId", reqJson.getString("taskId"));
        paramIn.put("startUserId", reqJson.getString("startUserId"));
        List<JSONObject> paramOuts = workflowV1InnerServiceSMOImpl.getWorkflowNextNode(paramIn);
        cmdDataFlowContext.setResponseEntity(ResultVo.createResponseEntity(paramOuts));
    }
}
service-common/src/main/java/com/java110/common/smo/impl/WorkflowV1InnerServiceSMOImpl.java
@@ -16,20 +16,28 @@
package com.java110.common.smo.impl;
import com.alibaba.fastjson.JSONObject;
import com.java110.common.dao.IWorkflowV1ServiceDao;
import com.java110.intf.common.IWorkflowV1InnerServiceSMO;
import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.dto.PageDto;
import com.java110.dto.workflow.WorkflowDto;
import com.java110.intf.common.IWorkflowV1InnerServiceSMO;
import com.java110.po.workflow.WorkflowPo;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.dto.user.UserDto;
import com.java110.dto.PageDto;
import com.java110.utils.util.StringUtil;
import org.activiti.bpmn.model.*;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 类表述: 服务之前调用的接口实现类,不对外提供接口能力 只用于接口建调用
@@ -45,28 +53,35 @@
    @Autowired
    private IWorkflowV1ServiceDao workflowV1ServiceDaoImpl;
    @Autowired
    private ProcessEngine processEngine;
    @Autowired
    private RepositoryService repositoryService;
    @Override
    public int saveWorkflow(@RequestBody  WorkflowPo workflowPo) {
    public int saveWorkflow(@RequestBody WorkflowPo workflowPo) {
        int saveFlag = workflowV1ServiceDaoImpl.saveWorkflowInfo(BeanConvertUtil.beanCovertMap(workflowPo));
        return saveFlag;
    }
     @Override
    public int updateWorkflow(@RequestBody  WorkflowPo workflowPo) {
    @Override
    public int updateWorkflow(@RequestBody WorkflowPo workflowPo) {
        int saveFlag = workflowV1ServiceDaoImpl.updateWorkflowInfo(BeanConvertUtil.beanCovertMap(workflowPo));
        return saveFlag;
    }
     @Override
    public int deleteWorkflow(@RequestBody  WorkflowPo workflowPo) {
       workflowPo.setStatusCd("1");
       int saveFlag = workflowV1ServiceDaoImpl.updateWorkflowInfo(BeanConvertUtil.beanCovertMap(workflowPo));
       return saveFlag;
    @Override
    public int deleteWorkflow(@RequestBody WorkflowPo workflowPo) {
        workflowPo.setStatusCd("1");
        int saveFlag = workflowV1ServiceDaoImpl.updateWorkflowInfo(BeanConvertUtil.beanCovertMap(workflowPo));
        return saveFlag;
    }
    @Override
    public List<WorkflowDto> queryWorkflows(@RequestBody  WorkflowDto workflowDto) {
    public List<WorkflowDto> queryWorkflows(@RequestBody WorkflowDto workflowDto) {
        //校验是否传了 分页信息
@@ -84,6 +99,105 @@
    @Override
    public int queryWorkflowsCount(@RequestBody WorkflowDto workflowDto) {
        return workflowV1ServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));    }
        return workflowV1ServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));
    }
    /**
     * @param reqJson {
     *                taskId:"",
     *                startUserId:""
     *                }
     * @return
     */
    @Override
    public List<JSONObject> getWorkflowNextNode(@RequestBody JSONObject reqJson) {
        List<JSONObject> tasks = new ArrayList<>();
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery().taskId(reqJson.getString("taskId")).singleResult();
        if (task == null) {
            throw new IllegalArgumentException("任务已处理");
        }
        BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId());
        FlowNode flowNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey());
        //获取当前节点输出连线
        List<SequenceFlow> outgoingFlows = flowNode.getOutgoingFlows();
        JSONObject taskObj = null;
        taskObj = new JSONObject();
        taskObj.put("assignee", "-1"); //  默认 不需要指定下一个处理人 表示结束
        boolean isReturn = false;
        //遍历输出连线
        for (SequenceFlow outgoingFlow : outgoingFlows) {
            //获取输出节点元素
            FlowElement targetFlowElement = outgoingFlow.getTargetFlowElement();
            isReturn = false;
            //排除非用户任务接点
            if (targetFlowElement instanceof UserTask) {
                //判断输出节点的el表达式
                Map vars = new HashMap();
                vars.put("flag", "false"); // 1100
                if (isCondition(outgoingFlow.getConditionExpression(), vars)) {
                    isReturn = true;
                }
                if (!isReturn) {
                    String assignee = ((UserTask) targetFlowElement).getAssignee();
                    if (!StringUtil.isEmpty(assignee) && assignee.indexOf("${") < 0) {
                        taskObj.put("assignee", assignee); // 下一节点处理人
                    }
                    if ("${startUserId}".equals(assignee)) {
                        taskObj.put("assignee", reqJson.getString("startUserId")); // 开始人
                    }
                    if ("${nextUserId}".equals(assignee)) {
                        taskObj.put("assignee", "-2"); // 需要前台指定
                    }
                }
            }
            //如果下一个为 结束节点
            if (targetFlowElement instanceof EndEvent) {
                //true 获取输出节点名称
                taskObj.put("assignee", "-1");
            }
        }
        tasks.add(taskObj);
        return tasks;
    }
    /**
     * el表达式判断
     *
     * @param expression
     * @param vars
     * @return
     */
    private static boolean isCondition(String expression, Map<String, Object> vars) {
        if (expression == null || expression == "") {
            return false;
        }
        //分割表达式
        String[] exprArr = expression.split("[{}$&]");
        for (String expr : exprArr) {
            //是否包含键message
            if (expr.contains("flag")) {
                if (!vars.containsKey("flag")) {
                    continue;
                }
                if (expr.contains("==")) {
                    String[] primes = expr.split("==");
                    String valExpr = primes[1].trim();
                    if (valExpr.startsWith("'")) {
                        valExpr = valExpr.substring(1);
                    }
                    if (valExpr.endsWith("'")) {
                        valExpr = valExpr.substring(0, valExpr.length() - 1);
                    }
                    if (primes.length == 2 && valExpr.equals(vars.get("flag"))) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
}