package com.chinaztt.mes.warehouse.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.chinaztt.mes.basic.entity.Location; import com.chinaztt.mes.basic.entity.Part; import com.chinaztt.mes.basic.entity.Warehouse; import com.chinaztt.mes.basic.mapper.LocationMapper; import com.chinaztt.mes.basic.mapper.PartMapper; import com.chinaztt.mes.basic.mapper.WarehouseMapper; import com.chinaztt.mes.common.handler.StateMachineHandler; import com.chinaztt.mes.common.util.StateResult; import com.chinaztt.mes.warehouse.dto.JoinStockOrderDTO; import com.chinaztt.mes.warehouse.dto.ScrapMainDTO; import com.chinaztt.mes.warehouse.entity.JoinStockOrder; import com.chinaztt.mes.warehouse.entity.SplitTask; import com.chinaztt.mes.warehouse.entity.Stock; import com.chinaztt.mes.warehouse.mapper.JoinStockOrderMapper; import com.chinaztt.mes.warehouse.mapper.SplitTaskMapper; import com.chinaztt.mes.warehouse.service.JoinStockOrderService; import com.chinaztt.mes.warehouse.state.joinstockorder.JoinStockOrderStateMachineConfig; import com.chinaztt.mes.warehouse.state.joinstockorder.constant.JoinStockOrderEvents; import com.chinaztt.mes.warehouse.state.joinstockorder.constant.JoinStockOrderStateStringValues; import com.chinaztt.mes.warehouse.state.joinstockorder.constant.JoinStockOrderStates; import com.chinaztt.mes.warehouse.state.splittask.constant.SplitTaskStateStringValues; import com.chinaztt.ztt.common.core.util.R; import lombok.AllArgsConstructor; import org.apache.commons.collections4.CollectionUtils; import org.springframework.messaging.Message; import org.springframework.messaging.support.MessageBuilder; import org.springframework.statemachine.config.StateMachineFactory; import org.springframework.statemachine.persist.StateMachinePersister; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 客户订单库存预留表 * * @author cxf * @date 2021-07-21 15:36:57 */ @Service @AllArgsConstructor @Transactional(rollbackFor = Exception.class) public class JoinStockOrderServiceImpl extends ServiceImpl implements JoinStockOrderService { private StateMachineFactory joinStockOrderStateMachineFactory; private StateMachinePersister persister; private PartMapper partMapper; private WarehouseMapper warehouseMapper; private LocationMapper locationMapper; private SplitTaskMapper splitTaskMapper; @Override public IPage getJoinStockOrderPage(Page page, QueryWrapper gen) { return baseMapper.getJoinStockOrderPage(page, gen); } @Override public R changeState(List joinStockOrderList, String event) { for (JoinStockOrder joinStockOrder : joinStockOrderList) { Message message = MessageBuilder.withPayload(JoinStockOrderEvents.valueOf(event)).setHeader("joinStockOrder", joinStockOrder).build(); StateMachineHandler handler = new StateMachineHandler(joinStockOrderStateMachineFactory, persister, JoinStockOrderStateMachineConfig.MACHINE_ID, joinStockOrder); StateResult res = handler.sendEvent(message, joinStockOrder.getId()); if (!res.isSuccess()) { throw new RuntimeException(res.getMsg()); } } return R.ok(); } @Override public BigDecimal updateOrderById(Long id) { List joinStockOrderList = baseMapper.selectList(Wrappers.lambdaQuery().eq(JoinStockOrder::getCustomerOrderId, id) .eq(JoinStockOrder::getStatus, JoinStockOrderStateStringValues.CONFIRMED)); BigDecimal total = BigDecimal.ZERO; if (CollectionUtils.isNotEmpty(joinStockOrderList)) { total = joinStockOrderList.stream().map(JoinStockOrder::getReservedQuantity).reduce(BigDecimal.ZERO, BigDecimal::add); } baseMapper.updateOrderById(id, total); return total; } /** * 工单自动预留取消 * * @param operationTaskId * @param stock */ public void cancelJoinStock(Long operationTaskId, Stock stock) { String state = "02confirmed"; List joinStockOrderList = new ArrayList<>(); JoinStockOrder joinStockOrder = baseMapper.selectOne(Wrappers.lambdaQuery().eq(JoinStockOrder::getOperationTaskId, operationTaskId).eq(JoinStockOrder::getStockId, stock.getId())); if (joinStockOrder != null && state.equals(joinStockOrder.getStatus())) { joinStockOrderList.add(joinStockOrder); changeState(joinStockOrderList, "CANCEL"); updateOperationTaskId(operationTaskId); } } /** * 工单自动预留新增 * * @param operationTaskId * @param stock * @param number */ public void addJoinStock(Long operationTaskId, Stock stock, BigDecimal number) { List joinStockOrderList = new ArrayList<>(); Part part = partMapper.selectById(stock.getPartId()); Location location = locationMapper.selectById(stock.getLocationId()); JoinStockOrder newJoinStockOrder = baseMapper.selectOne(Wrappers.lambdaQuery().eq(JoinStockOrder::getOperationTaskId, operationTaskId).eq(JoinStockOrder::getStockId, stock.getId())); if (newJoinStockOrder != null) { newJoinStockOrder.setReservedQuantity(number); baseMapper.updateById(newJoinStockOrder); joinStockOrderList.add(newJoinStockOrder); } else { JoinStockOrder joinStockOrder = new JoinStockOrder(); joinStockOrder.setOperationTaskId(operationTaskId); joinStockOrder.setStockId(stock.getId()); joinStockOrder.setReservedQuantity(number); if (part != null) { joinStockOrder.setPartName(part.getPartName()); joinStockOrder.setPartNo(part.getPartNo()); joinStockOrder.setPartUnit(part.getUnit()); } if (location != null) { joinStockOrder.setLocationName(location.getLocName()); joinStockOrder.setLocationNo(location.getLocNo()); Warehouse warehouse = warehouseMapper.selectOne(Wrappers.lambdaQuery().eq(Warehouse::getId, location.getLocGroup())); if (warehouse != null) { joinStockOrder.setWarehouseName(warehouse.getWarehouseName()); joinStockOrder.setWarehouseNo(warehouse.getWarehouseNo()); } } joinStockOrder.setPartBatchNo(stock.getPartBatchNo()); joinStockOrder.setIfsBatchNo(stock.getPartBatchNo()); joinStockOrder.setSystemNo(stock.getSystemNo()); joinStockOrder.setStatus("01unconfirmed"); joinStockOrder.setType("工单预留"); baseMapper.insert(joinStockOrder); joinStockOrderList.add(joinStockOrder); } changeState(joinStockOrderList, "CONFIRM"); updateOperationTaskId(operationTaskId); } @Override public BigDecimal updateOperationTaskId(Long id) { List joinStockOrderList = baseMapper.selectList(Wrappers.lambdaQuery().eq(JoinStockOrder::getOperationTaskId, id) .eq(JoinStockOrder::getStatus, JoinStockOrderStateStringValues.CONFIRMED)); //工单的总预留数量 BigDecimal total = BigDecimal.ZERO; //先将当前工单下的所需物料的已预留数量置空 // baseMapper.updateOperationTaskMaterial(id); if (CollectionUtils.isNotEmpty(joinStockOrderList)) { //根据零件进行分组 Map> joinStockOrderMap = joinStockOrderList.stream().collect(Collectors.groupingBy(JoinStockOrder::getPartNo)); for (String key : joinStockOrderMap.keySet()) { //所需物料的预留 BigDecimal number = BigDecimal.ZERO; List newJoinStockOrderList = joinStockOrderMap.get(key); number = newJoinStockOrderList.stream().map(JoinStockOrder::getReservedQuantity).reduce(BigDecimal.ZERO, BigDecimal::add); Part part = partMapper.selectOne(Wrappers.lambdaQuery().eq(Part::getPartNo, key)); if (part != null) { // baseMapper.updateOperationTaskMaterialById(id,number,part.getId()); } else { throw new RuntimeException("基础数据中找不到对应的零件"); } } total = joinStockOrderList.stream().map(JoinStockOrder::getReservedQuantity).reduce(BigDecimal.ZERO, BigDecimal::add); } // baseMapper.updateOperationTaskId(id, total); return total; } }