注意:以下示例,不是真正意义的策略枚举,只是简化版,只适合简单的状态流转。
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("操作成功");
}