前言
多人审批功能简单实现
一、数据库设计
流程表
CREATE TABLE `system_flow` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(50) DEFAULT NULL,
`active` int DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
节点表
CREATE TABLE `system_node` (
`id` int NOT NULL AUTO_INCREMENT,
`fid` int DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`active` int DEFAULT '1',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
连接节点表
CREATE TABLE `system_link` (
`id` int NOT NULL AUTO_INCREMENT,
`fid` int DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`preNode` int DEFAULT NULL,
`nextNode` int DEFAULT NULL,
`active` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
审批人表
CREATE TABLE `system_approver` (
`id` int NOT NULL AUTO_INCREMENT,
`fid` int DEFAULT NULL,
`node` int DEFAULT NULL,
`userId` int DEFAULT NULL,
`active` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10003 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
业务测试表
CREATE TABLE `test_business` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`state` char(1) DEFAULT NULL,
`active` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10004 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
业务流程关联表
CREATE TABLE `test_flow_business` (
`id` int NOT NULL AUTO_INCREMENT,
`fid` int DEFAULT NULL,
`busId` int DEFAULT NULL,
`node` int DEFAULT NULL,
`userId` int DEFAULT NULL,
`active` varchar(255) DEFAULT NULL,
`state` char(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10006 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
2.实现逻辑
新增接口,增加业务表数据,以及关联表数据,根据上图链路表获取初始节点及审批人更新到业务流程关联表
//
TestBusinessEntity save = testBusinessService.save(testBusiness);
Integer fid = getIntegerParam("fid");
TestFlowBusinessEntity testFlowBusinessEntity = new TestFlowBusinessEntity();
testFlowBusinessEntity.setFid(fid);
//获取下一节点
Integer preNode = 0;
Integer nextNode = systemLinkService.getNextNode(fid,preNode);
testFlowBusinessEntity.setNode(nextNode);
//根据流程与节点获取审批人
Integer Approval = systemApproverService.getApprover(fid,nextNode);
testFlowBusinessEntity.setUserId(Approval);
testFlowBusinessEntity.setBusId(save.getId());
testFlowBusinessEntity.setState("0");
testFlowBusinessService.save(testFlowBusinessEntity);
审批接口,判断审核状态,同意的话进入下一个节点,不同意,结束流程
Integer busId = testFlowBusinessEntity.getBusId();
String state = testFlowBusinessEntity.getState();
Example example = new Example(TestFlowBusinessEntity.class);
example.createCriteria().andEqualTo("busId",busId).andEqualTo("userId",testFlowBusinessEntity.getUserId());
List<TestFlowBusinessEntity> list = testFlowBusinessService.findList(example, null);
TestFlowBusinessEntity testFlowBusinessEntity2 = list.get(0);
Integer fid = testFlowBusinessEntity2.getFid();
Integer node = testFlowBusinessEntity2.getNode();
testFlowBusinessEntity2.setState(state);
testFlowBusinessService.update(testFlowBusinessEntity2);
//判断审核状态,同意的话进入下一个节点,不同意,结束流程
if(state.equals("1")){
//同意
//判断是否是最后一个节点
Integer nextNode = systemLinkService.getNextNode(fid,node);
if(nextNode!=0){
//不是最后一个节点
//新增流程业务表关联数据
TestFlowBusinessEntity testFlowBusinessEntity1 = new TestFlowBusinessEntity();
testFlowBusinessEntity1.setFid(fid);
testFlowBusinessEntity1.setNode(nextNode);
//根据流程与节点获取审批人
Integer Approval = systemApproverService.getApprover(fid,nextNode);
testFlowBusinessEntity1.setUserId(Approval);
testFlowBusinessEntity1.setBusId(busId);
testFlowBusinessEntity1.setState("0");
testFlowBusinessService.save(testFlowBusinessEntity1);
} else {
//最后一个节点,更新业务表状态,流程结束
TestBusinessEntity byId = testBusinessService.findById(busId);
byId.setState(state);
testBusinessService.update(byId);
}
}
if(state.equals("2")){
//不同意
TestBusinessEntity byId = testBusinessService.findById(busId);
byId.setState(state);
testBusinessService.update(byId);
}
查询列表,根据userId,以及状态进行查询分页
SELECT
t1.*
FROM
test_business t1
LEFT JOIN test_flow_business t2 ON t1.id = t2.busId
WHERE
t1.active = 1
AND t2.userId = #{userId}
AND t1.state=#{state}