场景:处理退款流程
废话不多说直接上代码:
定义状态
private static final Map<String, String[]> STATE_MACHINE_MAP = new ConcurrentHashMap<>();
public static final String STATE_INIT = "INIT"; // 数据初始状态
public static final String STATE_REFUND_REQUEST_PASS = "REFUND_REQUEST_PASS"; // 退款请求通过
public static final String STATE_REFUND_REQUEST_FAILED = "REFUND_REQUEST_FAILED"; // 退款请求失败
public static final String STATE_REFUND_SUCCESS = "REFUND_SUCCESS"; // 退款请求处理成功
public static final String STATE_REFUND_FAILED = "REFUND_FAILED"; // 退款请求处理失败
public static final String STATE_NOTIFICATION_SUCCESS = "NOTIFICATION_SUCCESS"; // 通知成功
public static final String STATE_NOTIFICATION_FAILED = "NOTIFICATION_FAILED"; // 通知失败
public static final String STATE_REFUND_REJECT_SUCCESS = "REFUND_REJECT_SUCCESS"; // 驳回成功
public static final String STATE_REFUND_REJECT_FAILED = "REFUND_REJECT_FAILED"; // 驳回成功
定义状态机
// 定义状态机
static {
STATE_MACHINE_MAP.put(STATE_REFUND_REQUEST_PASS, REFUND); // 请求通过-》可以进行退款动作
STATE_MACHINE_MAP.put(STATE_REFUND_SUCCESS, NOTIFICATION); // 退款成功-》可以进行通知动作
STATE_MACHINE_MAP.put(STATE_INIT, REQUEST); // 初始状态-》可以进行驳回动作
STATE_MACHINE_MAP.put(STATE_REFUND_FAILED, REJECT); // 退款失败-》可以进行驳回动作
STATE_MACHINE_MAP.put(STATE_REFUND_REJECT_FAILED, REJECT); // 驳回失败-》可以进行驳回动作
}
状态转换方法
/**
* 状态机状态转换
*
* @param refundOrderId 退款单ID
* @param targetState 目标状态
*/
public boolean stateTransit(int refundOrderId, String targetState) {
// 记录操作结果
boolean flag = true;
RefundOrder refundOrder = this.getRefundOrder(refundOrderId);
if (refundOrder == null) {
logger.error(String.format("cannot find record from d_order_refund [refund : %d]", refundOrderId));
flag = false;
}
String srcState = refundOrder.getStatus();
if (!STATE_MACHINE_MAP.containsKey(srcState)) {
logger.error(String.format("STATE TRANSIT FAILED: invalid state [%s TO %s]", srcState, targetState));
flag = false;
}
String[] stateNode = STATE_MACHINE_MAP.get(srcState);
if (!ArrayUtils.contains(stateNode, targetState)) {
logger.error(String.format("STATE TRANSIT FAILED: invalid state [%s TO %s]", srcState, targetState));
flag = false;
}
if (!updateRefundOrderState(refundOrder, targetState)) {
logger.error(String.format("UPDATE STATE FAILED: update refundOrder state failed"));
flag = false;
}
return flag;
}