java110
2020-06-20 9c44f5fdbfc8a6329c8a1987e8a733affb231f2f
工作流部署完成
7个文件已修改
302 ■■■■■ 已修改文件
java110-bean/src/main/java/com/java110/dto/workflow/WorkflowDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/dto/workflow/WorkflowStepDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/smo/common/IWorkflowInnerServiceSMO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-api/src/main/java/com/java110/api/listener/workflow/UpdateWorkflowListener.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-common/pom.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java 239 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/dto/workflow/WorkflowDto.java
@@ -4,6 +4,7 @@
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * @ClassName FloorDto
@@ -36,6 +37,9 @@
    private Date createTime;
    private String statusCd = "0";
    private List<WorkflowStepDto> workflowSteps;
    public String getSkipLevel() {
@@ -118,4 +122,12 @@
    public void setFlowTypeName(String flowTypeName) {
        this.flowTypeName = flowTypeName;
    }
    public List<WorkflowStepDto> getWorkflowSteps() {
        return workflowSteps;
    }
    public void setWorkflowSteps(List<WorkflowStepDto> workflowSteps) {
        this.workflowSteps = workflowSteps;
    }
}
java110-bean/src/main/java/com/java110/dto/workflow/WorkflowStepDto.java
@@ -4,6 +4,7 @@
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * @ClassName FloorDto
@@ -24,6 +25,8 @@
    private String storeId;
    private String flowId;
    private String seq;
    private List<WorkflowStepStaffDto> workflowStepStaffs;
    private Date createTime;
@@ -95,4 +98,12 @@
    public void setStatusCd(String statusCd) {
        this.statusCd = statusCd;
    }
    public List<WorkflowStepStaffDto> getWorkflowStepStaffs() {
        return workflowStepStaffs;
    }
    public void setWorkflowStepStaffs(List<WorkflowStepStaffDto> workflowStepStaffs) {
        this.workflowStepStaffs = workflowStepStaffs;
    }
}
java110-core/src/main/java/com/java110/core/smo/common/IWorkflowInnerServiceSMO.java
@@ -39,4 +39,11 @@
     */
    @RequestMapping(value = "/queryWorkflowsCount", method = RequestMethod.POST)
    int queryWorkflowsCount(@RequestBody WorkflowDto workflowDto);
    /**
     * @Date:2017/11/24
     * @Description:创建流程并部署
     */
    @RequestMapping(value = "/addFlowDeployment", method = RequestMethod.POST)
    void addFlowDeployment(@RequestBody WorkflowDto workflowDto);
}
pom.xml
@@ -494,6 +494,11 @@
                <artifactId>activiti-spring</artifactId>
                <version>6.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.activiti</groupId>
                <artifactId>activiti-bpmn-layout</artifactId>
                <version>6.0.0.RC1</version>
            </dependency>
            <dependency>
                <groupId>com.tencentcloudapi</groupId>
service-api/src/main/java/com/java110/api/listener/workflow/UpdateWorkflowListener.java
@@ -10,8 +10,10 @@
import com.java110.core.context.DataFlowContext;
import com.java110.core.event.service.api.ServiceDataFlowEvent;
import com.java110.core.factory.GenerateCodeFactory;
import com.java110.core.smo.common.IWorkflowInnerServiceSMO;
import com.java110.core.smo.common.IWorkflowStepInnerServiceSMO;
import com.java110.core.smo.common.IWorkflowStepStaffInnerServiceSMO;
import com.java110.dto.workflow.WorkflowDto;
import com.java110.dto.workflow.WorkflowStepDto;
import com.java110.dto.workflow.WorkflowStepStaffDto;
import com.java110.po.workflow.WorkflowPo;
@@ -20,9 +22,12 @@
import com.java110.utils.constant.BusinessTypeConstant;
import com.java110.utils.constant.ServiceCodeWorkflowConstant;
import com.java110.utils.util.Assert;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.vo.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import java.util.ArrayList;
import java.util.List;
/**
@@ -43,6 +48,9 @@
    @Autowired
    private IWorkflowStepInnerServiceSMO workflowStepInnerServiceSMOImpl;
    @Autowired
    private IWorkflowInnerServiceSMO workflowInnerServiceSMOImpl;
    @Override
    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
@@ -125,11 +133,14 @@
        workflowPo.setDescrible(reqJson.getString("describle"));
        super.update(context, workflowPo, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_WORKFLOW);
        WorkflowDto workflowDto = BeanConvertUtil.covertBean(workflowPo, WorkflowDto.class);
        //保存 工作流程步骤
        JSONArray steps = reqJson.getJSONArray("steps");
        JSONObject step = null;
        JSONObject subStaff = null;
        WorkflowStepStaffPo workflowStepStaffPo = null;
        List<WorkflowStepDto> tmpWorkflowStepDtos = new ArrayList<>();
        for (int stepIndex = 0; stepIndex < steps.size(); stepIndex++) {
            step = steps.getJSONObject(stepIndex);
            WorkflowStepPo workflowStepPo = new WorkflowStepPo();
@@ -140,8 +151,9 @@
            workflowStepPo.setType(step.getString("type"));
            workflowStepPo.setStoreId(reqJson.getString("storeId"));
            super.insert(context, workflowStepPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP);
            WorkflowStepDto tmpWorkflowStepDto = BeanConvertUtil.covertBean(workflowStepPo, WorkflowStepDto.class);
            //正常流程
            List<WorkflowStepStaffDto> workflowStepStaffDtos = new ArrayList<>();
            if (WorkflowStepDto.TYPE_NORMAL.equals(step.getString("type"))) {
                workflowStepStaffPo = new WorkflowStepStaffPo();
                workflowStepStaffPo.setWssId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_wssId));
@@ -150,6 +162,7 @@
                workflowStepStaffPo.setStaffName(step.getString("staffName"));
                workflowStepStaffPo.setStepId(workflowStepPo.getStepId());
                super.insert(context, workflowStepStaffPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP_STAFF);
                workflowStepStaffDtos.add(BeanConvertUtil.covertBean(workflowStepStaffPo, WorkflowStepStaffDto.class));
                continue;
            }
@@ -163,12 +176,19 @@
                workflowStepStaffPo.setStaffName(subStaff.getString("staffName"));
                workflowStepStaffPo.setStepId(workflowStepPo.getStepId());
                super.insert(context, workflowStepStaffPo, BusinessTypeConstant.BUSINESS_TYPE_SAVE_WORKFLOW_STEP_STAFF);
                workflowStepStaffDtos.add(BeanConvertUtil.covertBean(workflowStepStaffPo, WorkflowStepStaffDto.class));
            }
            tmpWorkflowStepDto.setWorkflowStepStaffs(workflowStepStaffDtos);
            tmpWorkflowStepDtos.add(tmpWorkflowStepDto);
        }
        //提交
        commit(context);
        workflowDto.setWorkflowSteps(tmpWorkflowStepDtos);
        workflowInnerServiceSMOImpl.addFlowDeployment(workflowDto);
        context.setResponseEntity(ResultVo.createResponseEntity(ResultVo.CODE_OK, ResultVo.MSG_OK));
    }
    private void deleteWorkflowStepAndStaff(DataFlowContext context, JSONObject reqJson, WorkflowStepDto workflowStepDto) {
service-common/pom.xml
@@ -30,6 +30,10 @@
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring</artifactId>
        </dependency>
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-bpmn-layout</artifactId>
        </dependency>
    </dependencies>
    <build>
service-common/src/main/java/com/java110/common/smo/impl/WorkflowInnerServiceSMOImpl.java
@@ -2,13 +2,29 @@
import com.java110.common.dao.IWorkflowServiceDao;
import com.java110.core.smo.common.IWorkflowInnerServiceSMO;
import com.java110.dto.workflow.WorkflowDto;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.core.base.smo.BaseServiceSMO;
import com.java110.dto.user.UserDto;
import com.java110.core.smo.common.IWorkflowInnerServiceSMO;
import com.java110.core.smo.user.IUserInnerServiceSMO;
import com.java110.dto.PageDto;
import com.java110.dto.user.UserDto;
import com.java110.dto.workflow.WorkflowDto;
import com.java110.dto.workflow.WorkflowStepDto;
import com.java110.dto.workflow.WorkflowStepStaffDto;
import com.java110.utils.util.BeanConvertUtil;
import com.java110.utils.util.StringUtil;
import org.activiti.bpmn.BpmnAutoLayout;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.bpmn.model.ParallelGateway;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@@ -34,7 +50,7 @@
    private IUserInnerServiceSMO userInnerServiceSMOImpl;
    @Override
    public List<WorkflowDto> queryWorkflows(@RequestBody  WorkflowDto workflowDto) {
    public List<WorkflowDto> queryWorkflows(@RequestBody WorkflowDto workflowDto) {
        //校验是否传了 分页信息
@@ -64,7 +80,7 @@
     * 从用户列表中查询用户,将用户中的信息 刷新到 floor对象中
     *
     * @param workflow 小区工作流信息
     * @param users 用户列表
     * @param users    用户列表
     */
    private void refreshWorkflow(WorkflowDto workflow, List<UserDto> users) {
        for (UserDto user : users) {
@@ -80,7 +96,7 @@
     * @param workflows 小区楼信息
     * @return 批量userIds 信息
     */
     private String[] getUserIds(List<WorkflowDto> workflows) {
    private String[] getUserIds(List<WorkflowDto> workflows) {
        List<String> userIds = new ArrayList<String>();
        for (WorkflowDto workflow : workflows) {
            userIds.add(workflow.getFlowId());
@@ -89,9 +105,216 @@
        return userIds.toArray(new String[userIds.size()]);
    }
    /**
     * @Date:2017/11/24
     * @Description:创建流程并部署
     */
    protected void addFlowDeployment(@RequestBody WorkflowDto workflowDto) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        RepositoryService repositoryService  = processEngine.getRepositoryService();
//        repositoryService.deleteDeployment("1");
        // 1. 建立模型
        BpmnModel model = new BpmnModel();
        Process process = new Process();
        model.addProcess(process);
        process.setId(workflowDto.getFlowId());
        process.setName(workflowDto.getFlowName());
        process.setDocumentation(workflowDto.getDescrible());
        //添加流程
        //开始节点
        process.addFlowElement(createStartEvent());
        List<WorkflowStepDto> workflowStepDtos = workflowDto.getWorkflowSteps();
        for (int i = 0; i < workflowStepDtos.size(); i++) {
            WorkflowStepDto step = workflowStepDtos.get(i);
            //判断是否会签
            if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(step.getType())) {
                //会签
                //加入并行网关-分支
                process.addFlowElement(createParallelGateway("parallelGateway-fork" + i, "并行网关-分支" + i));
                //获取角色下所有用户
                List<WorkflowStepStaffDto> userList = step.getWorkflowStepStaffs();
                for (int u = 0; u < userList.size(); u++) {
                    //并行网关分支的审核节点
                    process.addFlowElement(createUserTask("userTask" + i + u, "并行网关分支用户审核节点" + i + u, userList.get(u).getStaffId()));
                }
                //并行网关-汇聚
                process.addFlowElement(createParallelGateway("parallelGateway-join" + i, "并行网关到-汇聚" + i));
            } else {
                //普通流转
                //审核节点
                process.addFlowElement(createGroupTask("task" + i, "组审核节点" + i, step.getWorkflowStepStaffs().get(0).getStaffId()));
                //回退节点
                process.addFlowElement(createUserTask("repulse" + i, "回退节点" + i, "${startUserId}"));
            }
        }
        //结束节点
        process.addFlowElement(createEndEvent());
        //连线
        for (int y = 0; y < workflowStepDtos.size(); y++) {
            WorkflowStepDto step = workflowStepDtos.get(y);
            //是否会签
            if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(step.getType())) {
                //会签
                //判断是否第一个节点
                if (y == 0) {
                    //开始节点和并行网关-分支连线
                    process.addFlowElement(createSequenceFlow("startEvent", "parallelGateway-fork" + y, "开始节点到并行网关-分支" + y, ""));
                } else {
                    //审核节点或者并行网关-汇聚到并行网关-分支
                    //判断上一个节点是否是会签
                    if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
                        process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "parallelGateway-fork" + y, "并行网关-汇聚到并行网关-分支" + y, ""));
                    } else {
                        process.addFlowElement(createSequenceFlow("task" + (y - 1), "parallelGateway-fork" + y, "上一个审核节点到并行网关-分支" + y, ""));
                    }
                }
                //并行网关-分支和会签用户连线,会签用户和并行网关-汇聚连线
                List<WorkflowStepStaffDto> userList = step.getWorkflowStepStaffs();
                for (int u = 0; u < userList.size(); u++) {
                    process.addFlowElement(createSequenceFlow("parallelGateway-fork" + y, "userTask" + y + u, "并行网关-分支到会签用户" + y + u, ""));
                    process.addFlowElement(createSequenceFlow("userTask" + y + u, "parallelGateway-join" + y, "会签用户到并行网关-汇聚", ""));
                }
                //最后一个节点  并行网关-汇聚到结束节点
                if (y == (userList.size() - 1)) {
                    process.addFlowElement(createSequenceFlow("parallelGateway-join" + y, "endEvent", "并行网关-汇聚到结束节点", ""));
                }
            } else {
                //普通流转
                //第一个节点
                if (y == 0) {
                    //开始节点和审核节点1
                    process.addFlowElement(createSequenceFlow("startEvent", "task" + y, "开始节点到审核节点" + y, ""));
                } else {
                    //判断上一个节点是否会签
                    if (WorkflowStepDto.TYPE_COUNTERSIGN.equals(workflowStepDtos.get(y - 1).getType())) {
                        //会签
                        //并行网关-汇聚到审核节点
                        process.addFlowElement(createSequenceFlow("parallelGateway-join" + (y - 1), "task" + y, "并行网关-汇聚到审核节点" + y, ""));
                    } else {
                        //普通
                        process.addFlowElement(createSequenceFlow("task" + (y - 1), "task" + y, "审核节点" + (y - 1) + "到审核节点" + y, "${flag=='true'}"));
                    }
                }
                //是否最后一个节点
                if (y == (workflowStepDtos.size() - 1)) {
                    //审核节点到结束节点
                    process.addFlowElement(createSequenceFlow("task" + y, "endEvent", "审核节点" + y + "到结束节点", "${flag=='true'}"));
                }
                //审核节点到回退节点
                process.addFlowElement(createSequenceFlow("task" + y, "repulse" + y, "审核不通过-打回" + y, "${flag=='false'}"));
                process.addFlowElement(createSequenceFlow("repulse" + y, "task" + y, "回退节点到审核节点" + y, ""));
            }
        }
        // 2. 生成的图形信息
        new BpmnAutoLayout(model).execute();
        // 3. 部署流程
        Deployment deployment = processEngine.getRepositoryService().createDeployment().addBpmnModel(process.getId() + ".bpmn", model).name(process.getId() + "_deployment").deploy();
        //        // 4. 启动一个流程实例
//        ProcessInstance processInstance = processEngine.getRuntimeService().startProcessInstanceByKey(process.getId());
//
//        // 5. 获取流程任务
//        List<Task> tasks = processEngine.getTaskService().createTaskQuery().processInstanceId(processInstance.getId()).list();
//        try{
//            // 6. 将流程图保存到本地文件
//            InputStream processDiagram = processEngine.getRepositoryService().getProcessDiagram(processInstance.getProcessDefinitionId());
//            FileUtils.copyInputStreamToFile(processDiagram, new File("/deployments/"+process.getId()+".png"));
//
//            // 7. 保存BPMN.xml到本地文件
//            InputStream processBpmn = processEngine.getRepositoryService().getResourceAsStream(deployment.getId(), process.getId()+".bpmn");
//            FileUtils.copyInputStreamToFile(processBpmn,new File("/deployments/"+process.getId()+".bpmn"));
//        }catch (Exception e){
//            e.printStackTrace();
//        }
        System.out.println(".........end...");
    }
    //任务节点-组
    protected UserTask createGroupTask(String id, String name, String candidateGroup) {
        List<String> candidateGroups = new ArrayList<String>();
        candidateGroups.add(candidateGroup);
        UserTask userTask = new UserTask();
        userTask.setName(name);
        userTask.setId(id);
        userTask.setCandidateGroups(candidateGroups);
        return userTask;
    }
    //任务节点-用户
    protected UserTask createUserTask(String id, String name, String userPkno) {
        List<String> candidateUsers = new ArrayList<String>();
        candidateUsers.add(userPkno);
        UserTask userTask = new UserTask();
        userTask.setName(name);
        userTask.setId(id);
        userTask.setCandidateUsers(candidateUsers);
        return userTask;
    }
    //任务节点-锁定者
    protected UserTask createAssigneeTask(String id, String name, String assignee) {
        UserTask userTask = new UserTask();
        userTask.setName(name);
        userTask.setId(id);
        userTask.setAssignee(assignee);
        return userTask;
    }
    /*连线*/
    protected SequenceFlow createSequenceFlow(String from, String to, String name, String conditionExpression) {
        SequenceFlow flow = new SequenceFlow();
        flow.setSourceRef(from);
        flow.setTargetRef(to);
        flow.setName(name);
        if (!StringUtil.isEmpty(conditionExpression)) {
            flow.setConditionExpression(conditionExpression);
        }
        return flow;
    }
    //排他网关
    protected ExclusiveGateway createExclusiveGateway(String id, String name) {
        ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
        exclusiveGateway.setId(id);
        exclusiveGateway.setName(name);
        return exclusiveGateway;
    }
    //并行网关
    protected ParallelGateway createParallelGateway(String id, String name) {
        ParallelGateway gateway = new ParallelGateway();
        gateway.setId(id);
        gateway.setName(name);
        return gateway;
    }
    //开始节点
    protected StartEvent createStartEvent() {
        StartEvent startEvent = new StartEvent();
        startEvent.setId("startEvent");
        return startEvent;
    }
    /*结束节点*/
    protected EndEvent createEndEvent() {
        EndEvent endEvent = new EndEvent();
        endEvent.setId("endEvent");
        return endEvent;
    }
    @Override
    public int queryWorkflowsCount(@RequestBody WorkflowDto workflowDto) {
        return workflowServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));    }
        return workflowServiceDaoImpl.queryWorkflowsCount(BeanConvertUtil.beanCovertMap(workflowDto));
    }
    public IWorkflowServiceDao getWorkflowServiceDaoImpl() {
        return workflowServiceDaoImpl;