```java
CREATE TABLE `t_process_flow` (
`process_id` bigint NOT NULL AUTO_INCREMENT COMMENT '审批任务流程id\r\n',
`purchase_id` int DEFAULT NULL COMMENT '供应商子公司采购id',
`operator_id` bigint DEFAULT NULL,
`action` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`result` varchar(255) DEFAULT NULL,
`reason` varchar(255) DEFAULT NULL,
`create_time` datetime DEFAULT NULL,
`audit_time` datetime DEFAULT NULL,
`order_no` int DEFAULT NULL,
`state` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL,
`is_last` int DEFAULT NULL COMMENT '是否是最后节点 0-否 1-是',
PRIMARY KEY (`process_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;```
@Service
public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements IPurchaseService {
@Autowired
private PurchaseMapper purchaseMapper;
@Autowired
private ProcessFlowMapper processFlowMapper;
@Override
public Purchase createPurchase(Purchase purchase,Integer adminUserId) {
Double monthlyCooperationQuota = purchase.getMonthlyCooperationQuota();
purchase.setCreateTime(new Date());
purchase.setCreator(1);
purchase.setState(1);
purchaseMapper.insert(purchase);
ProcessFlow flow1 = new ProcessFlow();
flow1.setPurchaseId(purchase.getId());
flow1.setOperatorId(adminUserId.longValue());
flow1.setAction("apply");
flow1.setCreateTime(new Date());
flow1.setOrderNo(1);
flow1.setState("complete");
flow1.setIsLast(0);
processFlowMapper.insert(flow1);
Integer routeFlag = route(monthlyCooperationQuota);
ProcessFlow flow2 = new ProcessFlow();
flow2.setPurchaseId(purchase.getId());
flow2.setAction("audit");
flow2.setCreateTime(new Date());
flow2.setOrderNo(2);
flow2.setState("process");
if(Objects.equals(ApprovalProcessEnum.BUSINESS_DIVISION.getCode(), routeFlag)||
Objects.equals(ApprovalProcessEnum.GROUP.getCode(), routeFlag)){
flow2.setOperatorId(getLeader(ApprovalProcessEnum.BUSINESS_DIVISION.getCode()));
flow2.setIsLast(1);
processFlowMapper.insert(flow2);
}else {
flow2.setOperatorId(getLeader(ApprovalProcessEnum.BUSINESS_DIVISION.getCode()));
flow2.setIsLast(0);
processFlowMapper.insert(flow2);
ProcessFlow flow3 = new ProcessFlow();
flow3.setPurchaseId(purchase.getId());
flow3.setAction("audit");
flow3.setCreateTime(new Date());
flow3.setOrderNo(3);
flow3.setState("ready");
flow3.setIsLast(1);
processFlowMapper.insert(flow3);
}
return purchase;
}
@Override
public void audit(Long purchaseId, Long operatorId, Integer result, String reason) {
ProcessFlow process;
Wrapper<ProcessFlow> wrapper = new EntityWrapper<>();
wrapper.eq("purchase_id", purchaseId).last("order by order_no");
List<ProcessFlow> flowList = processFlowMapper.selectList(wrapper);
if(flowList.size() == 0){
throw new ResponseException("无效的审批流程");
}
List<ProcessFlow> processList = flowList.stream()
.filter(p -> Objects.equals(p.getOperatorId(), operatorId) && p.getState().equals(ProvessStateEnum.PROCESS.getValue()))
.collect(Collectors.toList());
if(processList.size()==0){
throw new ResponseException("未找到待处理任务");
}else {
process = processList.get(0);
process.setState(ProvessStateEnum.COMPLETE.getValue());
process.setResult(result.toString());
process.setReason(reason);
process.setAuditTime(new Date());
processFlowMapper.updateById(process);
}
Purchase purchase = purchaseMapper.selectById(purchaseId);
if(process.getIsLast() == 1){
purchase.setState(result);
purchaseMapper.updateById(purchase);
}else {
List<ProcessFlow> readyList = flowList.stream()
.filter(p -> p.getState().equals(ProvessStateEnum.READY.getValue()))
.collect(Collectors.toList());
if(result.equals(PurchaseAuditTypeEnum.APPROVED.getCode())){
ProcessFlow readyProcess = readyList.get(0);
readyProcess.setState(ProvessStateEnum.PROCESS.getValue());
processFlowMapper.updateById(readyProcess);
}else if(result.equals(PurchaseAuditTypeEnum.REFUSED.getCode())) {
for(ProcessFlow p:readyList){
p.setState(ProvessStateEnum.CANCEL.getValue());
processFlowMapper.updateById(p);
}
purchase.setState(result);
purchaseMapper.updateById(purchase);
}
}
}
private Integer route(Double monthlyCooperationQuota) {
return 1;
}
private Long getLeader(Integer level) {
return null;
}
}