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<JoinStockOrderMapper, JoinStockOrder> implements JoinStockOrderService {
|
private StateMachineFactory<JoinStockOrderStates, JoinStockOrderEvents> joinStockOrderStateMachineFactory;
|
private StateMachinePersister<JoinStockOrderStates, JoinStockOrderEvents, JoinStockOrder> persister;
|
private PartMapper partMapper;
|
private WarehouseMapper warehouseMapper;
|
private LocationMapper locationMapper;
|
private SplitTaskMapper splitTaskMapper;
|
|
@Override
|
public IPage getJoinStockOrderPage(Page page, QueryWrapper<JoinStockOrderDTO> gen) {
|
return baseMapper.getJoinStockOrderPage(page, gen);
|
}
|
|
@Override
|
public R<Boolean> changeState(List<JoinStockOrder> joinStockOrderList, String event) {
|
for (JoinStockOrder joinStockOrder : joinStockOrderList) {
|
Message<JoinStockOrderEvents> 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<JoinStockOrder> joinStockOrderList = baseMapper.selectList(Wrappers.<JoinStockOrder>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<JoinStockOrder> joinStockOrderList = new ArrayList<>();
|
JoinStockOrder joinStockOrder = baseMapper.selectOne(Wrappers.<JoinStockOrder>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<JoinStockOrder> joinStockOrderList = new ArrayList<>();
|
Part part = partMapper.selectById(stock.getPartId());
|
Location location = locationMapper.selectById(stock.getLocationId());
|
JoinStockOrder newJoinStockOrder = baseMapper.selectOne(Wrappers.<JoinStockOrder>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.<Warehouse>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<JoinStockOrder> joinStockOrderList = baseMapper.selectList(Wrappers.<JoinStockOrder>lambdaQuery().eq(JoinStockOrder::getOperationTaskId, id)
|
.eq(JoinStockOrder::getStatus, JoinStockOrderStateStringValues.CONFIRMED));
|
//工单的总预留数量
|
BigDecimal total = BigDecimal.ZERO;
|
//先将当前工单下的所需物料的已预留数量置空
|
// baseMapper.updateOperationTaskMaterial(id);
|
if (CollectionUtils.isNotEmpty(joinStockOrderList)) {
|
//根据零件进行分组
|
Map<String, List<JoinStockOrder>> joinStockOrderMap = joinStockOrderList.stream().collect(Collectors.groupingBy(JoinStockOrder::getPartNo));
|
for (String key : joinStockOrderMap.keySet()) {
|
//所需物料的预留
|
BigDecimal number = BigDecimal.ZERO;
|
List<JoinStockOrder> newJoinStockOrderList = joinStockOrderMap.get(key);
|
number = newJoinStockOrderList.stream().map(JoinStockOrder::getReservedQuantity).reduce(BigDecimal.ZERO, BigDecimal::add);
|
Part part = partMapper.selectOne(Wrappers.<Part>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;
|
}
|
}
|