状态机之会审
背景
同一个节点下只有所有的审核人都审批同意,状态才允许向下扭转。
扩展说明
基于状态机中的节点执行动作来完成会审的扩展,在进入会审节点中,扩展生成会审节点明细审核条目
@Service
public class HuiShenInitApproverAction implements Action {
@Autowired
private HuiShenExtendService huiShenExtendService;
@Autowired
private Approver approver;
@Override
public void execute(StateContext stateContext) {
List<ApproverVO> currentStateApprovers = approver.getCurrentStateApprovers(stateContext.getCurrentState(), stateContext.getStateMachine().getCurrentEvent(), stateContext.getStateMachine().getName());
// stateContext.
ApproverVO approverVO = currentStateApprovers.get(0);
// approverVo 中userId和account和name都可以通过特殊符号拼接
huiShenExtendService.initApprover(StateContextHelper.getTransactionId(stateContext),stateContext.getStateMachine().getName(), StateContextHelper.getCurrentStateName(stateContext),approverVO);
// 触发生成审核人会审记录
System.out.println("产生会审记录...");
}
}
当用户进行审核的时候,触发的本质上是节点自身自扭转的逻辑,根据“审核中”—“审核中”的执行动作,进行当前人审批状态的记录
@Service
public class HuiShenAgreeAction implements Action {
@Autowired
private HuiShenExtendService huiShenExtendService;
@Override
public void execute(StateContext stateContext) {
//TODO 审核驳回一样会触发,需要判断
String transactionId = String.valueOf(stateContext.getStateMachine().getCurrentEvent().getEventHeader().getHeader(EventHeaderConstant.TRANSACTION_ID));
String statemachine = stateContext.getStateMachine().getName();
if (!huiShenExtendService.check()) {
huiShenExtendService.agree(transactionId, statemachine, String.valueOf(stateContext.getStateMachine().getCurrentEvent().getEventHeader().getHeader("approver")));
}
}
}
当所有用户审批通过的时候,需要有程序代码手工触发,节点下推动作“审核中”—“审核完成”
eventHeader.addHeader("approver", "赵六");
stateMachineService.dispatchEvent(transactionId, new DefaultEvent("会审审批", eventHeader));
// 程序判定逻辑
if (huiShenExtendService.check()) {
stateMachineService.dispatchEvent(transactionId, new DefaultEvent("审核通过", eventHeader));
}
其中,会审需要扩展整体会审逻辑,示例代码如下
@Service
public class HuiShenExtendService implements Condition {
int i = 0;
/**
* 同意会审
*/
public void agree(String transactionId, String statemachine, String who) {
i++;
System.out.println(who + "会审通过" + i);
}
/**
* 清除之前会审
*/
public void clear(String transactionId, String statemachine, String approver) {
i = 0;
System.out.println(approver + "驳回");
}
/**
* 检查是否所有会审都完成
*/
public boolean check() {
return i == 4;
}
@Override
public boolean match(StateContext context, Event event) {
if (check()) {
return true;
} else {
throw new StateMachineConditionException("需要所有人都统一才能进行状态扭转");
}
}
/**
* 关键节点根据人员初始会审
* @param transactionId
* @param currentStateName
* @param approverVO
*/
public void initApprover(String transactionId, String statemachine, String currentStateName, ApproverVO approverVO) {
String userId = approverVO.getUserId();
String[] userIds = userId.split(",");
// 创建会审关联记录
}
/**
* 判断这个人是否审批
*
* @param transactionId
* @param statemachine
* @param userId
* @return
*/
public boolean checkUser(String transactionId, String statemachine, String userId) {
return true;
}
}
考虑每个会审通过的人员,其审核通过的按钮是不需要出现,所以需要对返回前端的审核事件做过滤,示例代码如下
String userId = "123";
List<Event> nextEvents = stateMachineService.getNextEvents(transactionId, userId);
// 用户如果已审核,事件要剔除
if(huiShenExtendService.checkUser(transactionId,statemachine,userId)){
// nextEvents.remove();
}
// 程序事件要剔除
System.out.println(JSON.toJSONString(nextEvents));
作者:王浩彬 创建时间:2021-11-02 19:17
最后编辑:王浩彬 更新时间:2024-12-27 15:01
最后编辑:王浩彬 更新时间:2024-12-27 15:01