记录自己造流程引擎轮子(一)

流程引擎

发现写一点逻辑就更新下博客,有点麻烦,还是后端逻辑写完了在来更新了,可以去文章下方看看我gitee提交的代码,陆续更改吧!!!

流程引擎对于工作中,时刻在使用,最简单的就是请假,需要填写相关信息,提交给上级,然后再上一级,逐级下去,完成自己的请假。
以前使用activiti流程引擎实现工作上的任务扭转,基本就是通过调用api获取process的对象,基于此来进行一些逻辑判断。而现在因为工作不使用activiti,那么就只能开始了造轮子系列,前端菜鸟这里就只展示自己后端逻辑了。

前期设计

模板表设计(并不完整,后续补充)

1.模板表:用于记录流程模型
2.节点表:用于记录流程节点,与模板表关联
3.模板关联表:用于记录模型与表单关联

package com.process.processengine.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Date;

@Data
public class BaseEntity {
    @TableId(type = IdType.ASSIGN_UUID)
    @ApiModelProperty(value = "主键")
    private String id;
    private Date createTime;
    private Date updateTime;
    private String createBy;
    private String updateBy;
}

package com.process.processengine.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
@TableName("process_model")
@ApiModel(value="模板", description="模板")
public class ProcessModelEntity extends BaseEntity{

    @ApiModelProperty(value = "模板名")
    private String modelName;

    @ApiModelProperty(value = "是否启用 0否 1是")
    private Integer modelStatus = 0;
}

package com.process.processengine.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@ApiModel(value = "节点信息")
@TableName("process_model_node")
@Accessors(chain = true)
public class ProcessModelNodeEntity extends BaseEntity{
    @ApiModelProperty(value = "节点code")
    private String nodeCode;

    @ApiModelProperty(value = "节点名")
    private String nodeName;

    @ApiModelProperty(value = "节点类型 0开始节点 1普通节点 2判断节点 3退回到上一步节点 4退回到开始节点 5结束节点 (类型等扩展)")
    private Integer nodeType;

    @ApiModelProperty(value = "模板id")
    private String modelId;

    @ApiModelProperty(value = "下一节点code")
    private String nextNodeCode;

    @ApiModelProperty(value = "下一节点名")
    private String nextNodeName;

    @ApiModelProperty(value = "参与类型 机构0 人员1 角色2")
    private Integer participationType;

    @ApiModelProperty(value = "参与类型code 机构id 人员id 角色id")
    private String participationCode;

    @ApiModelProperty(value = "判断条件")
    private String paramCondition;
}

package com.process.engine.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;

@Data
@ApiModel("模板表单关联表")
@TableName("process_model_table")
@Accessors(chain = true)
public class ProcessModelTableEntity extends BaseEntity{
    @ApiModelProperty("表id")
    private String tableId;

    @ApiModelProperty("模板id")
    private String modelId;
}

流程模板相关功能

package com.process.engine.controller;

import com.process.common.result.Result;
import com.process.engine.entity.ProcessModelEntity;
import com.process.engine.service.ProcessModelService;
import com.process.engine.vo.Model2TableVo;
import com.process.engine.vo.ProcessModelInfoVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/processModle")
@Api(tags = "processModel")
public class ProcessModelController {

    @Autowired
    private ProcessModelService processModelService;

    /**
     * ProcessModelInfoVo 模板信息
     * 存储修改模板
     */
    @PostMapping("/saveOrUpdateModel")
    @ApiOperation(value = "存储修改模板", notes = "存储修改模板")
    public Result<?> saveOrUpdateModel(@RequestBody ProcessModelInfoVo processModelInfoVo) {
        try {
            return Result.ok(processModelService.saveOrUpdateModel(processModelInfoVo));
        }catch (RuntimeException e){
            e.printStackTrace();
            return Result.error("存储修改模板系统繁忙");
        }
    }

    /**
     * 查询模板
     * queryType 查询类型,默认查询本人,传1查询全部
     */
    @GetMapping("/getModel")
    @ApiOperation(value = "查询模板", notes = "查询模板")
    public Result<?> getModel(Integer queryType) {
        try{
            return  Result.ok(processModelService.findModel(queryType));
        }catch (RuntimeException e){
            e.printStackTrace();
            return Result.error("查询模板系统繁忙");
        }
    }

    /**
     * 启用暂停模板
     * modelId 模板id
     */
    @PostMapping("/start2Stop")
    @ApiOperation(value = "启用暂停模板", notes = "启用暂停模板")
    public Result<?> start2Stop(@RequestBody ProcessModelEntity processModelEntity) {
        try{
            processModelService.start2Stop(processModelEntity);
            return  Result.ok();
        }catch (RuntimeException e){
            e.printStackTrace();
            return Result.error(e.getMessage());
        }
    }

    @PostMapping("saveModel2Table")
    @ApiOperation(value = "模板与表单关联", notes = "模板与表单关联")
    public Result<?> saveModel2Table(@RequestBody Model2TableVo model2TableVo){
        try{
            processModelService.saveModel2Table(model2TableVo);
            return  Result.ok();
        }catch (RuntimeException e){
            e.printStackTrace();
            return Result.error(e.getMessage());
        }
    }
}


package com.process.engine.service.serviceImpl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.process.engine.Intercept.UserIntercept;
import com.process.common.utils.BeanChangeUtils;
import com.process.engine.entity.BaseEntity;
import com.process.engine.entity.ProcessModelEntity;
import com.process.engine.entity.ProcessModelNodeEntity;
import com.process.engine.entity.ProcessModelTableEntity;
import com.process.engine.mappers.ProcessModelMapper;
import com.process.engine.mappers.ProcessModelNodeMapper;
import com.process.engine.mappers.ProcessModelTableMapper;
import com.process.engine.service.ProcessModelService;
import com.process.engine.vo.Model2TableVo;
import com.process.engine.vo.ProcessModelInfoVo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class ProcessModelServiceImpl extends ServiceImpl<ProcessModelMapper, ProcessModelEntity> implements ProcessModelService {
    @Autowired
    private ProcessModelMapper processModelMapper;

    @Autowired
    private ProcessModelNodeMapper processModelNodeMapper;

    @Autowired
    private ProcessModelTableMapper processModelTableMapper;

    @Override
    @Transactional
    public String saveOrUpdateModel(ProcessModelInfoVo processModelInfoVo) {
        List<ProcessModelNodeEntity> nodeList = processModelInfoVo.getNodeList();
        ProcessModelEntity processModelEntity = new ProcessModelEntity();
        if (StringUtils.isEmpty(processModelInfoVo.getModelId())) {
            processModelEntity.setModelName(processModelInfoVo.getModelName());
            processModelMapper.insert(processModelEntity);
            if (nodeList == null || nodeList.size() < 1) throw new RuntimeException("节点信息未录入");
            for (ProcessModelNodeEntity node : nodeList) {
                node.setId(UUID.randomUUID().toString().trim().replaceAll("-", ""));
                node.setModelId(processModelEntity.getId());
                node.setCreateBy(UserIntercept.getCurrentUser().getCreateBy());
                node.setCreateTime(new Date());
            }
            processModelNodeMapper.saveNode(nodeList);
            return processModelEntity.getId();
        }
        //如果传了模板id,则模板节点修改
        processModelEntity.setId(processModelInfoVo.getModelId());
        if (StringUtils.isNotEmpty(processModelInfoVo.getModelName())) {
            processModelEntity.setModelName(processModelInfoVo.getModelName());
            processModelMapper.updateById(processModelEntity);
        }
        LambdaQueryWrapper<ProcessModelNodeEntity> nodeQueryWrapper = new LambdaQueryWrapper<>();
        nodeQueryWrapper.eq(ProcessModelNodeEntity::getModelId, processModelInfoVo.getModelId());
        processModelNodeMapper.delete(nodeQueryWrapper);
        if (nodeList == null || nodeList.size() < 1) throw new RuntimeException("节点信息未录入");
        for (ProcessModelNodeEntity node : nodeList) {
            node.setId(UUID.randomUUID().toString().trim().replaceAll("-", ""));
            node.setModelId(processModelInfoVo.getModelId());
            node.setCreateBy(UserIntercept.getCurrentUser().getCreateBy());
            node.setCreateTime(new Date());
        }
        processModelNodeMapper.saveNode(nodeList);
        return processModelEntity.getId();
    }

    @Override
    public List<ProcessModelEntity> findModel(Integer queryType) {
        LambdaQueryWrapper<ProcessModelEntity> queryWrapper = new LambdaQueryWrapper<>();
        if (queryType == null || queryType != 1) {
            queryWrapper.eq(BaseEntity::getCreateBy, UserIntercept.getCurrentUser().getCreateBy());
        }
        return processModelMapper.selectList(queryWrapper);
    }

    @Override
    public void start2Stop(ProcessModelEntity processModelEntity) {
        if (processModelEntity.getModelStatus() == 0) {
            processModelEntity.setModelStatus(1);
        } else {
            processModelEntity.setModelStatus(0);
        }
        if (processModelMapper.updateById(processModelEntity) < 1) {
            throw new RuntimeException("修改状态失败");
        }
    }

    @Override
    public void saveModel2Table(Model2TableVo model2TableVo) {
        //查询模板是否启用
        LambdaQueryWrapper<ProcessModelEntity> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(BaseEntity::getId,model2TableVo.getModelId());
        ProcessModelEntity processModelEntity = processModelMapper.selectOne(queryWrapper);
        if (processModelEntity != null && processModelEntity.getModelStatus() != 1) throw new RuntimeException("关联失败,请启动模板");

        //删除表单以前绑定模板,在重新关联
        LambdaQueryWrapper<ProcessModelTableEntity> pmtQueryWrapper = new LambdaQueryWrapper<>();
        pmtQueryWrapper.eq(ProcessModelTableEntity::getModelId,model2TableVo.getModelId()).eq(ProcessModelTableEntity::getTableId,model2TableVo.getTableId());
        processModelTableMapper.delete(pmtQueryWrapper);
        ProcessModelTableEntity processModelTableEntity = BeanChangeUtils.convert(model2TableVo, ProcessModelTableEntity.class);
        if (processModelTableMapper.insert(processModelTableEntity) < 1) {
            throw new RuntimeException("关联失败");
        }
    }
}




自己的gitee地址

随缘慢慢更新

https://gitee.com/skyfly-l/process-engine


版权声明:本文为GCsky_fly原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。