李林
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
package com.chinaztt.mes.production.state.operationtask;
 
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.chinaztt.mes.common.handler.StateMachineHandler;
import com.chinaztt.mes.common.util.StateResult;
import com.chinaztt.mes.plan.entity.ManufacturingOrder;
import com.chinaztt.mes.plan.mapper.ManufacturingOrderMapper;
import com.chinaztt.mes.plan.state.manufacturing.ManufacturingOrderStateMachineConfig;
import com.chinaztt.mes.plan.state.manufacturing.constant.ManufacturingOrderEvents;
import com.chinaztt.mes.plan.state.manufacturing.constant.ManufacturingOrderStateStringValues;
import com.chinaztt.mes.plan.state.manufacturing.constant.ManufacturingOrderStates;
import com.chinaztt.mes.production.entity.OperationTask;
import com.chinaztt.mes.production.entity.OperationTaskSupply;
import com.chinaztt.mes.production.mapper.OperationTaskMapper;
import com.chinaztt.mes.production.mapper.OperationTaskSupplyMapper;
import com.chinaztt.mes.production.service.OperationTaskService;
import com.chinaztt.mes.production.state.operationtask.constant.OperationTaskEvents;
import com.chinaztt.mes.production.state.operationtask.constant.OperationTaskStateStringValues;
import lombok.AllArgsConstructor;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.statemachine.StateMachine;
import org.springframework.statemachine.annotation.OnTransition;
import org.springframework.statemachine.annotation.WithStateMachine;
import org.springframework.statemachine.config.StateMachineFactory;
import org.springframework.statemachine.persist.StateMachinePersister;
import org.springframework.stereotype.Component;
 
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
 
 
/**
 * @Author: zhangxy
 * @Date: 2020-08-24 9:51
 */
@AllArgsConstructor
@Component
@WithStateMachine(id = "operationTaskStateMachine")
public class OperationTaskStateListener {
 
    private OperationTaskMapper operationTaskMapper;
    private OperationTaskService operationTaskService;
    private ManufacturingOrderMapper manufacturingOrderMapper;
    private OperationTaskSupplyMapper operationTaskSupplyMapper;
    private StateMachineFactory<ManufacturingOrderStates, ManufacturingOrderEvents> manufacturingOrderStateMachineFactory;
    private StateMachinePersister<ManufacturingOrderStates, ManufacturingOrderEvents, ManufacturingOrder> persister;
 
 
 
    /**
     * 开始
     */
    @OnTransition(target = OperationTaskStateStringValues.INPROGRESS)
    public boolean start(StateMachine stateMachine, Message<OperationTaskEvents> msg) {
        OperationTask operationTask = (OperationTask) msg.getHeaders().get("operationTask");
        if (!(OperationTaskStateStringValues.PENDING.equals(operationTask.getState()) || OperationTaskStateStringValues.INTERRUPTED.equals(operationTask.getState()) || OperationTaskStateStringValues.COMPLETED.equals(operationTask.getState()))) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "只有等待和暂停状态的才能开始");
            return false;
        }
        if (operationTask.getActualStartDate() == null) {
            operationTask.setActualStartDate(LocalDateTime.now());
        }
        if (OperationTaskStateStringValues.COMPLETED.equals(operationTask.getState())) {
            operationTaskMapper.removeActualFinishDateById(operationTask.getId());
        }
        operationTask.setState(OperationTaskStateStringValues.INPROGRESS);
        operationTaskMapper.updateById(operationTask);
        return true;
    }
 
    /**
     * 暂停
     */
    @OnTransition(target = OperationTaskStateStringValues.INTERRUPTED)
    public boolean interrupt(StateMachine stateMachine, Message<OperationTaskEvents> msg) {
        OperationTask operationTask = (OperationTask) msg.getHeaders().get("operationTask");
        if (!OperationTaskStateStringValues.INPROGRESS.equals(operationTask.getState())) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "只有进行状态的才能暂停");
            return false;
        }
 
        operationTask.setState(OperationTaskStateStringValues.INTERRUPTED);
        operationTaskMapper.updateById(operationTask);
        return true;
    }
 
    /**
     * 完成
     */
    @OnTransition(target = OperationTaskStateStringValues.COMPLETED)
    public boolean complete(StateMachine stateMachine, Message<OperationTaskEvents> msg) {
        OperationTask operationTask = (OperationTask) msg.getHeaders().get("operationTask");
        if (!OperationTaskStateStringValues.INPROGRESS.equals(operationTask.getState())) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "只有进行状态的才能完成");
            return false;
        }
        // 合并订单完成,将原有工单状态改为已完成
        if (operationTask.getCombineState().equals(OperationTask.COMBINE_STATE_MAIN)) {
            List<OperationTask> list = operationTaskService.list(Wrappers.<OperationTask>lambdaQuery().eq(OperationTask::getCombineTaskId, operationTask.getId()));
            for (OperationTask task : list) {
                task.setCompletedQuantity(operationTask.getCompletedQuantity().divide(operationTask.getPlannedQuantity(), 4, BigDecimal.ROUND_HALF_UP).multiply(task.getPlannedQuantity()));
                task.setActualFinishDate(LocalDateTime.now());
                task.setState(OperationTaskStateStringValues.COMPLETED);
            }
            operationTaskService.updateBatchById(list);
        }
        operationTask.setActualFinishDate(LocalDateTime.now());
        operationTask.setState(OperationTaskStateStringValues.COMPLETED);
        operationTaskMapper.updateById(operationTask);
        //如果所有工单都完成,则车间订单完成。调用车间订单状态机(完成状态)
/*        List<String> operationTaskList = operationTaskMapper.getAllTaskStateByTaskId(operationTask.getId());
        boolean match = operationTaskList.stream().allMatch(a -> a.equals(OperationTaskStateStringValues.COMPLETED));
        if(match){
            List<OperationTaskSupply> operationTaskSupplyList = operationTaskSupplyMapper.selectList(Wrappers.<OperationTaskSupply>lambdaQuery()
                    .eq(OperationTaskSupply::getOperationTaskId, operationTask.getId()));
            ManufacturingOrder manufacturingOrder = manufacturingOrderMapper.selectById(operationTaskSupplyList.get(0).getMoId());
            if(!ManufacturingOrderStateStringValues.COMPLETED.equals(manufacturingOrder.getState())) {
                Message<ManufacturingOrderEvents> message = MessageBuilder.withPayload(ManufacturingOrderEvents.valueOf("COMPLETE")).setHeader("manufacturingOrder", manufacturingOrder).build();
                StateMachineHandler handler = new StateMachineHandler(manufacturingOrderStateMachineFactory, persister, ManufacturingOrderStateMachineConfig.MACHINE_ID, manufacturingOrder);
                StateResult res = handler.sendEvent(message, manufacturingOrder.getId());
                if (!res.isSuccess()) {
                    throw new RuntimeException(res.getMsg());
                }
            }
        }*/
        return true;
    }
 
    /**
     * 取消
     */
    @OnTransition(target = OperationTaskStateStringValues.CANCELED)
    public boolean cancel(StateMachine stateMachine, Message<OperationTaskEvents> msg) {
        OperationTask operationTask = (OperationTask) msg.getHeaders().get("operationTask");
        if (!(OperationTaskStateStringValues.INPROGRESS.equals(operationTask.getState()) ||
                OperationTaskStateStringValues.PENDING.equals(operationTask.getState()) ||
                OperationTaskStateStringValues.INTERRUPTED.equals(operationTask.getState()))) {
            stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, "只有等待、进行和暂停状态的才能取消");
            return false;
        }
        operationTask.setActualFinishDate(LocalDateTime.now());
        operationTask.setState(OperationTaskStateStringValues.CANCELED);
        operationTaskMapper.updateById(operationTask);
        return true;
    }
}