1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
| public enum OrderStatus implements CodedEnum {
DRAFT("DFT", "草稿", Set.of()),
PENDING("PND", "待處理", Set.of(DRAFT)),
CONFIRMED("CNF", "已確認", Set.of(PENDING)),
PAID("PAD", "已付款", Set.of(CONFIRMED)),
SHIPPED("SHP", "已出貨", Set.of(PAID)),
DELIVERED("DLV", "已送達", Set.of(SHIPPED)),
CANCELLED("CXL", "已取消", Set.of(DRAFT, PENDING, CONFIRMED, PAID)),
REFUNDED("RFD", "已退款", Set.of(PAID, SHIPPED, DELIVERED));
private final String code;
private final String description;
private final Set<OrderStatus> allowedPreviousStatuses;
OrderStatus(String code, String description, Set<OrderStatus> allowedPreviousStatuses) {
this.code = code;
this.description = description;
this.allowedPreviousStatuses = allowedPreviousStatuses;
}
@Override
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
// 檢查狀態轉換是否合法
public boolean canTransitionFrom(OrderStatus currentStatus) {
return allowedPreviousStatuses.contains(currentStatus);
}
// 取得可轉換到的狀態
public Set<OrderStatus> getNextPossibleStatuses() {
return Arrays.stream(values())
.filter(status -> status.canTransitionFrom(this))
.collect(Collectors.toSet());
}
// 檢查是否為終結狀態
public boolean isFinalStatus() {
return this == DELIVERED || this == CANCELLED || this == REFUNDED;
}
// 檢查是否可取消
public boolean isCancellable() {
return CANCELLED.canTransitionFrom(this);
}
}
|
留言討論