状态机之会审

背景

同一个节点下只有所有的审核人都审批同意,状态才允许向下扭转。

扩展说明

基于状态机中的节点执行动作来完成会审的扩展,在进入会审节点中,扩展生成会审节点明细审核条目

@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