李林
2023-10-07 658d4927d468c47208fd012d9128b09249c07eff
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
package com.chinaztt.mes.plan.state.manufacturing;
 
import cn.hutool.core.collection.CollectionUtil;
import com.chinaztt.mes.common.handler.StateMachineHandler;
import com.chinaztt.mes.plan.entity.ManufacturingOrder;
import com.chinaztt.mes.plan.mapper.ManufacturingOrderMapper;
import com.chinaztt.mes.plan.service.ManufacturingOrderService;
import com.chinaztt.mes.plan.state.manufacturing.constant.ManufacturingOrderEvents;
import com.chinaztt.mes.plan.state.manufacturing.constant.ManufacturingOrderStateStringValues;
import com.chinaztt.ztt.common.core.util.R;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.messaging.Message;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.annotation.OnTransition;
import org.springframework.statemachine.annotation.WithStateMachine;
import org.springframework.stereotype.Component;
 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
 
 
/**
 * @Author: cxf
 * @Date: 2020-09-19 9:51
 */
@AllArgsConstructor
@Component
@WithStateMachine(id = "manufacturingOrderStateMachine")
public class ManufacturingOrderStateListener {
 
    private ManufacturingOrderMapper manufacturingOrderMapper;
    private ManufacturingOrderService manufacturingOrderService;
 
    /**
     * 已下达
     */
    @OnTransition(target = ManufacturingOrderStateStringValues.ISSUED)
    public boolean issued(StateMachine stateMachine, Message<ManufacturingOrderEvents> msg) {
        ManufacturingOrder manufacturingOrder = (ManufacturingOrder) msg.getHeaders().get("manufacturingOrder");
        //已计划到已下达
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.PLANNED)) {
            //修改车间状态
            R result = manufacturingOrderService.changeState(manufacturingOrder, "RELEASE");
            if (result.getCode() == 1) {
                stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, manufacturingOrder.getMoNo() + result.getMsg());
                return false;
            }
        }
        //已完成到已下达
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.COMPLETED)) {
 
            //修改车间订单状态
            R result = manufacturingOrderService.changeState(manufacturingOrder, false);
            if (result.getCode() == 1) {
                stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, manufacturingOrder.getMoNo() + result.getMsg());
                return false;
            }
        }
        //已取消到已下达
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.CANCELED)) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "已取消不可改为已下达");
            return false;
        }
        manufacturingOrder.setState(ManufacturingOrderStateStringValues.ISSUED);
        manufacturingOrderMapper.updateById(manufacturingOrder);
        return true;
    }
 
    /**
     * 已完成
     */
    @OnTransition(target = ManufacturingOrderStateStringValues.COMPLETED)
    public boolean completed(StateMachine stateMachine, Message<ManufacturingOrderEvents> msg) {
        ManufacturingOrder manufacturingOrder = (ManufacturingOrder) msg.getHeaders().get("manufacturingOrder");
        //判断一下对应的工单是否全部完成/取消
        List<String> checkResult = manufacturingOrderMapper.checkOperationTaskStateByMoId(manufacturingOrder.getId(),
                Arrays.asList("04completed","05canceled"));
        if (CollectionUtil.isNotEmpty(checkResult)) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY,
                    "工单:" + checkResult.stream().collect(Collectors.joining("、")) + "未完成/未取消");
            return false;
        }
        //已计划到已完成
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.PLANNED)) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "请先下达");
            return false;
        }
        //已下达到已完成
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.ISSUED)) {
 
            //修改车间订单状态
            R result = manufacturingOrderService.changeState(manufacturingOrder, true);
            if (result.getCode() == 1) {
                stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, manufacturingOrder.getMoNo() + result.getMsg());
                return false;
            }
        }
        manufacturingOrder.setState(ManufacturingOrderStateStringValues.COMPLETED);
        manufacturingOrderMapper.updateById(manufacturingOrder);
        return true;
    }
 
    /**
     * 已取消
     */
    @OnTransition(target = ManufacturingOrderStateStringValues.CANCELED)
    public boolean canceled(StateMachine stateMachine, Message<ManufacturingOrderEvents> msg) {
        ManufacturingOrder manufacturingOrder = (ManufacturingOrder) msg.getHeaders().get("manufacturingOrder");
        //已计划到已取消
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.PLANNED) && StringUtils.isNotBlank(manufacturingOrder.getIfsOrderNo())) {
            //修改车间状态
            R result = manufacturingOrderService.changeState(manufacturingOrder, "CANCEL");
            if (result.getCode() == 1) {
                stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, manufacturingOrder.getMoNo() + result.getMsg());
                return false;
            }
        }
        //已下达到已取消
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.ISSUED) && StringUtils.isNotBlank(manufacturingOrder.getIfsOrderNo())) {
 
            //修改车间订单状态
            R result = manufacturingOrderService.changeState(manufacturingOrder, "CANCEL");
            if (result.getCode() == 1) {
                stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, manufacturingOrder.getMoNo() + result.getMsg());
                return false;
            }
        }
        manufacturingOrder.setState(ManufacturingOrderStateStringValues.CANCELED);
        manufacturingOrderMapper.updateById(manufacturingOrder);
        return true;
    }
 
    /**
     * 已计划
     */
    @OnTransition(target = ManufacturingOrderStateStringValues.PLANNED)
    public boolean plan(StateMachine stateMachine, Message<ManufacturingOrderEvents> msg) {
        ManufacturingOrder manufacturingOrder = (ManufacturingOrder) msg.getHeaders().get("manufacturingOrder");
        //已完成到已计划
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.COMPLETED)) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "已完成订单不可改为已计划");
            return false;
        }
        //已取消到已计划
        if (manufacturingOrder.getState().equals(ManufacturingOrderStateStringValues.CANCELED)) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "已取消订单不可改为已计划");
            return false;
        }
        manufacturingOrder.setState(ManufacturingOrderStateStringValues.PLANNED);
        manufacturingOrderMapper.updateById(manufacturingOrder);
        return true;
    }
}