流程状态枚举类自动流转

注意:以下示例,不是真正意义的策略枚举,只是简化版,只适合简单的状态流转。

1、定义状态枚举类

public enum FlowStatusEnum {

    /**
     * 流程状态 枚举类,有序6钟,其他2钟
     */
    DRAFT("draft", "草稿"),
    AUDIT("audit", "待审核"),
    COMMIT("commit", "待签发"),
    ISSUED("issued", "已签发"),
    PUBLISHING("publishing", "发布中"),
    PUBLISHED("published", "已发布"),

    REJECT("reject", "被驳回"),
    UNKNOWN("unknown", "未知");

    private final String type;
    private final String desc;

    FlowStatusEnum(String type, String desc) {
        this.type = type;
        this.desc = desc;
    }

    public String getType() {
        return type;
    }

    public String getDesc() {
        return desc;
    }

    /**
     * 获取前一个状态,如果不存在则返回 UNKNOWN
     *     * @return 前一个状态
     */
    public FlowStatusEnum getPreviousStatus() {
        int index = this.ordinal() - 1;
        return index >= 0 ? values()[index] : UNKNOWN;
    }

    /**
     * 获取后一个状态,如果不存在则返回 UNKNOWN
     *     * @return 后一个状态
     */
    public FlowStatusEnum getNextStatus() {
        int index = this.ordinal() + 1;
        return index < values().length ? values()[index] : UNKNOWN;
    }
}

2、根据当前状态获取前后状态

String statusType = "audit";
FlowStatusEnum statusEnum = FlowStatusEnum.valueOf(statusType.toUpperCase());

System.out.println("前一个状态:" + statusEnum.getPreviousStatus());
// 前一个状态:DRAFT

System.out.println("后一个状态:" + statusEnum.getNextStatus());
// 后一个状态:COMMIT

3、状态流转示例

public Result updateFlowStatus(AuditVO auditVO) {

        String identifier = auditVO.getIdentifier();
        Boolean accept = auditVO.getAccept();

        DbAlert dbAlert = dbAlertDAO.findByIdentifier(identifier);
        if (dbAlert == null) {
            return Result.fail("预警信息查询失败");
        }
        // 当前状态
        String flowStatus = dbAlert.getFlowStatus();
        FlowStatusEnum statusEnum = FlowStatusEnum.valueOf(flowStatus.toUpperCase());
        // 下一状态
        FlowStatusEnum nextStatus;
        if (accept) {
            // 流转到下一状态
            nextStatus = statusEnum.getNextStatus();
            if (FlowStatusEnum.DRAFT == statusEnum) {
                // 草稿 审核通过 流转到待签发状态
                nextStatus = statusEnum.getNextStatus().getNextStatus();
            }
        } else {
            // 被驳回
            nextStatus = FlowStatusEnum.REJECT;
        }
        dbAlert.setFlowStatus(nextStatus.getType());
        dbAlert.setUpdateTime(new Date());
        dbAlert.setMessage(auditVO.getMessage());
        dbAlertDAO.save(dbAlert);

        // 签发,提交xxx平台
        if (FlowStatusEnum.ISSUED == nextStatus) {
            // 组装信息包
            Result result = alertCapService.buildCap(identifier);
            if (result.isSuccess()) {
                String capPath = (String) result.getData();
                // 调用xxx平台信息保存接口
                boolean save = capSave(capPath);
                if (save) {
                    // 修改状态为发布中
                    dbAlert.setStatus(FlowStatusEnum.PUBLISHING.getType());
                    dbAlertDAO.save(dbAlert);
                    // 记录流程
                    dbAlertFeedbackFlowDAO.saveAll(flowList);
                    return Result.success("签发成功");
                } else {
                    return Result.fail("签发失败");
                }
            } else {
                return Result.fail("信息包查询失败");
            }
        }
        return Result.fail("操作成功");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值