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 manufacturingOrderStateMachineFactory; private StateMachinePersister persister; /** * 开始 */ @OnTransition(target = OperationTaskStateStringValues.INPROGRESS) public boolean start(StateMachine stateMachine, Message 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 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 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 list = operationTaskService.list(Wrappers.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 operationTaskList = operationTaskMapper.getAllTaskStateByTaskId(operationTask.getId()); boolean match = operationTaskList.stream().allMatch(a -> a.equals(OperationTaskStateStringValues.COMPLETED)); if(match){ List operationTaskSupplyList = operationTaskSupplyMapper.selectList(Wrappers.lambdaQuery() .eq(OperationTaskSupply::getOperationTaskId, operationTask.getId())); ManufacturingOrder manufacturingOrder = manufacturingOrderMapper.selectById(operationTaskSupplyList.get(0).getMoId()); if(!ManufacturingOrderStateStringValues.COMPLETED.equals(manufacturingOrder.getState())) { Message 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 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; } }