package com.chinaztt.mes.warehouse.state.joinstockorder; import cn.hutool.core.collection.CollectionUtil; import com.chinaztt.mes.common.handler.StateMachineHandler; import com.chinaztt.mes.warehouse.dto.JoinStockOrderDTO; import com.chinaztt.mes.warehouse.entity.JoinStockOrder; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.JoinStockOrderMapper; import com.chinaztt.mes.warehouse.mapper.StockMapper; import com.chinaztt.mes.warehouse.state.joinstockorder.constant.JoinStockOrderEvents; import com.chinaztt.mes.warehouse.state.joinstockorder.constant.JoinStockOrderStateStringValues; import com.chinaztt.mes.warehouse.util.StockUtils; import com.chinaztt.mes.warehouse.util.TransactionType; import lombok.AllArgsConstructor; 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.math.BigDecimal; import java.util.List; import java.util.stream.Collectors; /** * @Author: cxf * @Date: 2020-07-24 9:51 */ @AllArgsConstructor @Component @WithStateMachine(id = "joinStockOrderStateMachine") public class JoinStockOrderStateListener { private StockUtils stockUtils; private JoinStockOrderMapper joinStockOrderMapper; private StockMapper stockMapper; /** * 确认 */ @OnTransition(source = JoinStockOrderStateStringValues.UNCONFIRMED, target = JoinStockOrderStateStringValues.CONFIRMED) public boolean confirm(StateMachine stateMachine, Message msg) { JoinStockOrder joinStockOrder = (JoinStockOrder) msg.getHeaders().get("joinStockOrder"); try { // 1.更新状态 joinStockOrder.setStatus(JoinStockOrderStateStringValues.CONFIRMED); joinStockOrderMapper.updateById(joinStockOrder); // 2.更新实时库存锁定数量 stockUtils.updateById(joinStockOrder.getStockId(), BigDecimal.ZERO, joinStockOrder.getReservedQuantity(), BigDecimal.ZERO, BigDecimal.ZERO, null, TransactionType.CONFIRM_RESERVED.getValue()); // 3.更新库存的客户订单号 JoinStockOrderDTO order = joinStockOrderMapper.getStockOrderById(joinStockOrder.getId()); Stock update = new Stock(); update.setId(joinStockOrder.getStockId()); update.setCustomerOrderNo(order.getCustomerOrderNo()); stockMapper.updateById(update); } catch (RuntimeException e) { stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, joinStockOrder.getPartBatchNo() + ":" + e.getMessage()); return false; } return true; } /** * 取消 * * @param stateMachine * @param msg * @return */ @OnTransition(source = JoinStockOrderStateStringValues.CONFIRMED, target = JoinStockOrderStateStringValues.UNCONFIRMED) public boolean cancel(StateMachine stateMachine, Message msg) { JoinStockOrder joinStockOrder = (JoinStockOrder) msg.getHeaders().get("joinStockOrder"); try { // 1.更新状态 joinStockOrder.setStatus(JoinStockOrderStateStringValues.UNCONFIRMED); joinStockOrderMapper.updateById(joinStockOrder); // 2.更新实时库存锁定数量 stockUtils.updateById(joinStockOrder.getStockId(), BigDecimal.ZERO, joinStockOrder.getReservedQuantity().negate(), BigDecimal.ZERO, BigDecimal.ZERO, null, TransactionType.CANCEL_RESERVED.getValue()); } catch (RuntimeException e) { stateMachine.getExtendedState().getVariables().put(StateMachineHandler.ERROR_KEY, joinStockOrder.getPartBatchNo() + ":" + e.getMessage()); return false; } return true; } }