package com.chinaztt.mes.warehouse.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.OrderItem; 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.ifs.api.feign.IfsFeignClient; import com.chinaztt.mes.basic.entity.Location; import com.chinaztt.mes.basic.entity.Part; import com.chinaztt.mes.basic.mapper.LocationMapper; import com.chinaztt.mes.basic.mapper.PartMapper; import com.chinaztt.mes.basic.service.PartService; import com.chinaztt.mes.basic.util.BigDecimalUtils; import com.chinaztt.mes.common.numgen.NumberGenerator; import com.chinaztt.mes.warehouse.dto.*; import com.chinaztt.mes.warehouse.entity.*; import com.chinaztt.mes.warehouse.excel.StockData; import com.chinaztt.mes.warehouse.mapper.*; import com.chinaztt.mes.warehouse.service.JoinStockOrderService; import com.chinaztt.mes.warehouse.service.StockService; import com.chinaztt.mes.warehouse.state.splittask.constant.SplitTaskStateStringValues; import com.chinaztt.mes.warehouse.util.StockUtils; import com.chinaztt.mes.warehouse.util.WareHouseUtils; import com.chinaztt.ztt.admin.api.feign.RemoteParamService; import com.chinaztt.ztt.common.core.constant.SecurityConstants; import com.chinaztt.ztt.common.core.util.R; import com.google.gson.Gson; import com.google.gson.internal.LinkedTreeMap; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; /** * 库存表 * * @author cxf * @date 2020-10-22 16:37:46 */ @Service @Transactional(rollbackFor = Exception.class) @Slf4j public class StockServiceImpl extends ServiceImpl implements StockService { @Resource private PartMapper partMapper; @Resource private JoinStockOrderMapper joinStockOrderMapper; @Resource private LocationMapper locationMapper; @Resource private StockUtils stockUtils; @Resource private SplitTaskMapper splitTaskMapper; @Resource private NumberGenerator splitTaskNumberGenerator; @Resource private JoinStockOrderService joinStockOrderService; @Resource private StockConfigBean stockConfigBean; @Resource private IfsFeignClient ifsFeignClient; @Resource private WareHouseUtils wareHouseUtils; @Resource private RemoteParamService remoteParamService; @Resource private TransactionMapper transactionMapper; @Resource private StockMapper stockMapper; @Resource private ProductOutputMapper outputMapper; @Resource private FeederCertificateMapper feederMapper; @Resource private BasicCustomerPartRelationMapMapper customerPartRelationMapper; @Resource private QualityHw19VerifyMapper hw19VerifyMapper; @Autowired private PartService partService; @Autowired private Environment environment; public static final String CONTRACT = "IFS_DOMAIN"; private static final Map REASON_NO_MAP = new HashMap<>(); @PostConstruct private void initReasonNoMap() { REASON_NO_MAP.put("Receive-1", "T02"); REASON_NO_MAP.put("Receive-2", "R01"); REASON_NO_MAP.put("Receive-3", "R01"); REASON_NO_MAP.put("Issue-1", "T02"); REASON_NO_MAP.put("Issue-2", "T02"); REASON_NO_MAP.put("Issue-3", "R01"); } @Override public List pdaList(QueryWrapper gen) { return baseMapper.pdaList(gen); } @Override public IPage getStockPage(Page page, QueryWrapper gen) { IPage stockDTOList = baseMapper.getStockPage(page, gen); return stockDTOList; } @Override public IPage getRealTimeStockPage(Page page, QueryWrapper gen, StockDTO stockDTO) { IPage stockDTOList = baseMapper.getStockPage(page, gen); // if (!stockDTOList.getRecords().isEmpty()) { // boolean orderBy = stockDTO.getCriteria().contains("orderBy"); // if (orderBy) { // JSONObject json = JSONObject.parseObject(stockDTO.getCriteria()); // json.remove("orderBy"); // stockDTO.setCriteria(json.toJSONString()); // } // BigDecimal sum = baseMapper.getSumStockQuantity(QueryWrapperUtil.gen(stockDTO)); // StockDTO out = new StockDTO(); // out.setStockQuantity(sum); // stockDTOList.getRecords().add(out); // } return stockDTOList; } @Override public List getStockBySn(String partBatchNo) { return baseMapper.getStockBySn(partBatchNo); } @Override public List getFeedingStock(Long workstationId, QueryWrapper gen) { return baseMapper.getFeedingStock(workstationId, gen); } @Override public IPage> getStockByPartIdPage(Page page, QueryWrapper gen, Long partId) { return baseMapper.getStockByPartIdPage(page, gen, partId); } @Override public IPage> getStockByWorkstationId(Page page, QueryWrapper gen) { return baseMapper.getStockByWorkstationId(page, gen); } @Override public IPage> getToDealStockByWorkstationId(Page page, QueryWrapper gen) { return baseMapper.getToDealStockByWorkstationId(page, gen); } @Override public List getStockByLocation(List ids) { return baseMapper.getStockByLocation(ids); } @Override public void importExcel(List list) { if (CollectionUtil.isEmpty(list)) { return; } for (StockData data : list) { Part part = partMapper.selectOne(Wrappers.lambdaQuery().eq(Part::getPartNo, data.getPartNo())); if (part == null) { log.error("零件号:" + data.getPartNo() + "不存在"); continue; } Location location = locationMapper.selectOne(Wrappers.lambdaQuery().eq(Location::getLocNo, data.getLocationNo())); if (location == null) { log.error("零件号:" + data.getLocationNo() + "不存在"); continue; } StockAddDTO stockAdd = new StockAddDTO(); stockAdd.setPartsId(part.getId()); stockAdd.setNewLocationId(location.getId()); stockAdd.setNewPartBatchNo(data.getPartBatchNo()); Stock stock = stockUtils.query(stockAdd); stockUtils.updateById(stock.getId(), data.getStockQuantity(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE"); } } @Override public Boolean moveStock(List stockDTOList) { if (CollectionUtil.isEmpty(stockDTOList)) { return false; } List ifsMoveLibraryInfoDTOList = new ArrayList<>(); for (StockDTO stockDTO : stockDTOList) { Stock stock = baseMapper.selectById(stockDTO.getId()); //两个String用“!=”比较,肯定恒成立,这么写的用意是??? if (stock.getPartBatchNo() != stockDTO.getPartBatchNo()) { //传过来的批次号!=数据库记录行批次号 stockUtils.updateById(stock.getId(), stockDTO.getAvailableStockQuantityMove().negate(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "STOCK");//更新库存表数量(扣减库存) StockAddDTO stockAdd = new StockAddDTO(); stockAdd.setPartsId(stockDTO.getPartId()); stockAdd.setNewLocationId(stockDTO.getLocationId()); stockAdd.setNewPartBatchNo(stockDTO.getPartBatchNo()); stockAdd.setNewSystemNo(stockDTO.getSystemNo()); stockAdd.setReelNumber(stockDTO.getReelNumber()); stockAdd.setOperationStockStatus(stock.getOperationStockStatus()); stockAdd.setIfsBatchNo(stockDTO.getIfsBatchNo()); stockAdd.setManualInput(stockDTO.getManualInput()); Stock newStock = stockUtils.query(stockAdd); stockUtils.updateById(newStock.getId(), stockDTO.getAvailableStockQuantityMove(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE");//更新库存表数量(重新接收) //mes做完之后,调ifs移库 //通过出发库位、到达库位判断是否需要对接ifs移库 //根据库位id获取库位编号 //reslist-0:是否需要对接ifs移库;1:ifs出发库位码;2:ifs到达库位码 List reslist = checkIfsMoveLibrary(locationMapper.selectById(stock.getLocationId()).getLocNo(), stockDTO.getLocationNo()); if (CollectionUtil.isEmpty(reslist)) { throw new RuntimeException("校验是否对接ifs移库异常!"); } if (reslist.get(0).equals("true")) { //增加判断是否是虚拟件 Part part = partMapper.selectById(stockDTO.getPartId()); if (newStock.getOperationStockStatus() == null) { if (StringUtils.equals("3", part.getMaterialType())) { newStock.setOperationStockStatus(Boolean.FALSE); } } if (part.getPlanningMethod().equals("A") && BooleanUtil.isFalse(newStock.getOperationStockStatus())) { //收集需要对接ifs的明细数据 IfsMoveLibraryInfoDTO ifsMoveLibraryInfoDTO = new IfsMoveLibraryInfoDTO(); ifsMoveLibraryInfoDTO.setPartNo(stockDTO.getPartNo());//零件号 ifsMoveLibraryInfoDTO.setBatchNo(stockDTO.getIfsBatchNo());//ifs批次号 ifsMoveLibraryInfoDTO.setMoveQty(stockDTO.getAvailableStockQuantityMove());//移库数量 //盘点进来的库存是无法从车间订单中获取ifs序列号的,默认传* ifsMoveLibraryInfoDTO.setSerialNo(StringUtils.isNotBlank(baseMapper.getSerialNoBySystemNo(stockDTO.getSystemNo())) ? baseMapper.getSerialNoBySystemNo(stockDTO.getSystemNo()) : "*");//序列号-从车间订单获取-根据系统号查询序列号 ifsMoveLibraryInfoDTO.setEngChgLevel(partMapper.selectById(stockDTO.getPartId()).getEngChgLevel());//版本号-根据零件id获取 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { ifsMoveLibraryInfoDTO.setWaivDevRejNo(stockDTO.getPartBatchNo());//wdr号(把mes的sn号放里面) } else { ifsMoveLibraryInfoDTO.setWaivDevRejNo("*");//wdr号 } //ifsMoveLibraryInfoDTO.setWaivDevRejNo(stockDTO.getIfsBatchNo());//wdr号 ifsMoveLibraryInfoDTO.setStartLocationNo(reslist.get(1));//ifs出发库位号 ifsMoveLibraryInfoDTO.setArriveLocationNo(reslist.get(2));//ifs到达库位号 ifsMoveLibraryInfoDTOList.add(ifsMoveLibraryInfoDTO); } } } } //ifs移库 ifsMoveLibrary(ifsMoveLibraryInfoDTOList); return true; } /** * 校验是否需要对接ifs库存,如满足条件则返回对应的ifs库位号 * * @param startLocationNo 出发库位号 * @param arriveLocationNo 到达库位号 * @return */ public List checkIfsMoveLibrary(String startLocationNo, String arriveLocationNo) { List reslist = new ArrayList<>(); if (StringUtils.isBlank(startLocationNo) || StringUtils.isBlank(arriveLocationNo)) { throw new RuntimeException("出发库位号或到达库位号为空!"); } Location location; location = locationMapper.getLocationByLocationNo(startLocationNo); String startLocationNo_ifs = location.getIfsLocation();//对应的ifs出发库位号 location = locationMapper.getLocationByLocationNo(arriveLocationNo); String arriveLocationNo_ifs = location.getIfsLocation();//对应的ifs到达库位号 if (StringUtils.isBlank(startLocationNo_ifs) && StringUtils.isBlank(arriveLocationNo_ifs)) { reslist.add("false");//不需要对接ifs移库 return reslist; } else if (!StringUtils.isBlank(startLocationNo_ifs) && !StringUtils.isBlank(arriveLocationNo_ifs)) { reslist.add("true");//需要对接ifs移库 reslist.add(startLocationNo_ifs);//ifs出发库位 reslist.add(arriveLocationNo_ifs);//ifs到达库位 return reslist; } else { throw new RuntimeException("库位映射不对称,无法直接对接ifs移库!"); } } /** * ifs移库 * * @param ifsMoveLibraryInfoDTOList */ @Override public void ifsMoveLibrary(List ifsMoveLibraryInfoDTOList) { if (CollectionUtil.isNotEmpty(ifsMoveLibraryInfoDTOList)) { //对接ifs移库 //拼接inAttr //对接库存件移库 String contract = remoteParamService.getByKey(CONTRACT, SecurityConstants.FROM_IN).getData();//从系统参数中获取ifs域 IfsMoveLibraryDTO ifsMoveLibraryDTO = new IfsMoveLibraryDTO(); ifsMoveLibraryDTO.setRECORD_ID(UUID.randomUUID().toString()); List dataBeanList = new ArrayList<>();//批量标识 for (IfsMoveLibraryInfoDTO ifsMoveLibraryInfoDTO : ifsMoveLibraryInfoDTOList) { IfsMoveLibraryDTO.DataBean batchInfo = new IfsMoveLibraryDTO.DataBean(); batchInfo.setPART_NO(ifsMoveLibraryInfoDTO.getPartNo()); batchInfo.setLOT_BATCH_NO(ifsMoveLibraryInfoDTO.getBatchNo()); batchInfo.setMOVE_QTY(ifsMoveLibraryInfoDTO.getMoveQty()); batchInfo.setSERIAL_NO(ifsMoveLibraryInfoDTO.getSerialNo()); batchInfo.setENG_CHG_LEVEL(ifsMoveLibraryInfoDTO.getEngChgLevel()); batchInfo.setWAIV_DEV_REJ_NO(ifsMoveLibraryInfoDTO.getWaivDevRejNo()); batchInfo.setLOCATION_NO(ifsMoveLibraryInfoDTO.getStartLocationNo()); batchInfo.setTO_LOCATION_NO(ifsMoveLibraryInfoDTO.getArriveLocationNo()); batchInfo.setTO_CONTRACT(contract); // 因为现在多个 mes库位可能对应一个 ifs库位 所以 执行移库操作之前需要判断一下库位是否相同 // xcg 20230413 if (StrUtil.equals(batchInfo.getLOCATION_NO(), batchInfo.getTO_LOCATION_NO())) { continue; } dataBeanList.add(batchInfo); } if (CollectionUtil.isEmpty(dataBeanList)) { return; } ifsMoveLibraryDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); String jsonstr = gson.toJson(ifsMoveLibraryDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr);//解决序列化时自动将大写转小写问题 R res = ifsFeignClient.importMovePartStd(jsonObject, true); if (res.getCode() != 0) { throw new RuntimeException("ifs库存件移库失败;erromsg:" + res.getMsg()); } } } @Override public List getStock(StockDTO stockDTO, String condition) { List newStockDTOList = new ArrayList<>(); if (stockDTO.getLocationId() == null && stockDTO.getPartBatchNo() != null) { List stockDTOList = baseMapper.getStock(stockDTO.getPartId(), null, stockDTO.getPartBatchNo(), condition); newStockDTOList.addAll(stockDTOList); } if (stockDTO.getLocationId() == null && stockDTO.getPartBatchNo() == null) { List stockDTOList = baseMapper.getStock(stockDTO.getPartId(), null, null, condition); newStockDTOList.addAll(stockDTOList); } if (stockDTO.getLocationId() != null && stockDTO.getPartBatchNo() == null) { List stockDTOList = baseMapper.getStock(stockDTO.getPartId(), stockDTO.getLocationId(), null, condition); newStockDTOList.addAll(stockDTOList); } if (stockDTO.getLocationId() != null && stockDTO.getPartBatchNo() != null) { List stockDTOList = baseMapper.getStock(stockDTO.getPartId(), stockDTO.getLocationId(), stockDTO.getPartBatchNo(), condition); newStockDTOList.addAll(stockDTOList); } return newStockDTOList; } @Override public Integer countStock(StockDTO stockDTO, String condition) { if (stockDTO.getLocationId() == null && stockDTO.getPartBatchNo() != null) { return baseMapper.countStock(stockDTO.getPartId(), null, stockDTO.getPartBatchNo(), condition); } if (stockDTO.getLocationId() == null && stockDTO.getPartBatchNo() == null) { return baseMapper.countStock(stockDTO.getPartId(), null, null, condition); } if (stockDTO.getLocationId() != null && stockDTO.getPartBatchNo() == null) { return baseMapper.countStock(stockDTO.getPartId(), stockDTO.getLocationId(), null, condition); } if (stockDTO.getLocationId() != null && stockDTO.getPartBatchNo() != null) { return baseMapper.countStock(stockDTO.getPartId(), stockDTO.getLocationId(), stockDTO.getPartBatchNo(), condition); } return 0; } @Override public boolean fullSave(StockDTO stockDTO) { StockAddDTO stockAdd = new StockAddDTO(); stockAdd.setPartsId(stockDTO.getPartId()); stockAdd.setNewLocationId(stockDTO.getLocationId()); stockAdd.setNewPartBatchNo(stockDTO.getPartBatchNo()); stockAdd.setReelNumber(stockDTO.getReelNumber()); stockAdd.setIfsBatchNo(stockDTO.getIfsBatchNo()); stockAdd.setOperationStockStatus(stockDTO.getOperationStockStatus()); stockAdd.setManualInput(stockDTO.getManualInput()); Stock newStock = stockUtils.query(stockAdd); stockUtils.updateById(newStock.getId(), stockDTO.getStockQuantity(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE"); if (BooleanUtil.isTrue(stockDTO.getSynIfs())) { stockDTO.setAdjustType("Receive"); stockDTO.setAdjustMemo("库存新增"); inventAdjustForRfcable(Collections.singletonList(stockDTO), "Receive", null); } return false; } @Override public void inventAdjustForRfcable(List stockList, String adjustType, String reasonNo) { IfsInventAdjustDTO ifsInventAdjustDTO = new IfsInventAdjustDTO(); ifsInventAdjustDTO.setRECORD_ID(UUID.randomUUID().toString().replace("-", "")); ifsInventAdjustDTO.setREASON_NO(reasonNo); ifsInventAdjustDTO.setADJUST_DATE(DateUtil.format(new Date(), "yyyyMMdd")); List detailDTOList = new ArrayList<>(); for (StockDTO stock : stockList) { Part part = partMapper.selectById(stock.getPartId()); if (StringUtils.isBlank(part.getMaterialAttribute())) { throw new RuntimeException("零件属性为空"); } if (StrUtil.isNotBlank(reasonNo)) { ifsInventAdjustDTO.setREASON_NO(reasonNo); } else { reasonNo = REASON_NO_MAP.get(adjustType + "-" + part.getMaterialAttribute()); ifsInventAdjustDTO.setREASON_NO(reasonNo); } if (!StringUtils.equals("A", part.getPlanningMethod()) && !BooleanUtil.isFalse(stock.getOperationStockStatus())) { continue; } IfsInventAdjustDetailDTO detailDTO = new IfsInventAdjustDetailDTO(); detailDTO.setADJUST_TYPE(stock.getAdjustType()); detailDTO.setADJUST_MEMO(stock.getAdjustMemo()); detailDTO.setPART_NO(part.getPartNo()); if (stock.getLocationId() != null) { Location location = locationMapper.selectById(stock.getLocationId()); detailDTO.setLOCATION_NO(location.getIfsLocation()); } else { detailDTO.setLOCATION_NO(stock.getLocationNo()); } detailDTO.setLOT_BATCH_NO(stock.getIfsBatchNo()); if (StringUtils.equals("库存新增", stock.getAdjustMemo())) { detailDTO.setADJUST_QTY(stock.getStockQuantity()); } else { detailDTO.setADJUST_QTY(stock.getAvailableStockQuantityMove()); } // 判断是否启用批次管理 if (part.getLotTrackingIfs()) { detailDTO.setWAIV_DEV_REJ_NO(stock.getPartBatchNo()); } if (BigDecimalUtils.getBigDecimalValue(detailDTO.getADJUST_QTY()).compareTo(BigDecimal.ZERO) == 0) { continue; } detailDTOList.add(detailDTO); } ifsInventAdjustDTO.setLINE_INFO(detailDTOList); if (CollectionUtil.isEmpty(detailDTOList)) { return; } Gson gson = new Gson(); String jsonstr = gson.toJson(ifsInventAdjustDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr);//解决序列化时自动将大写转小写问题 // R result = ifsFeignClient.inventAdjustForStd(jsonObject, true); // if (result.getCode() != 0) { // throw new RuntimeException(result.getMsg()); // } } @Override public void ifsImportChangeWdrStd(List stockList, String wdrNo) { IfsImportChangeWdrStdDTO ifsImportChangeWdrStdDTO = new IfsImportChangeWdrStdDTO(); ifsImportChangeWdrStdDTO.setRECORD_ID(UUID.randomUUID().toString().replace("-", "")); List dataBeanList = new ArrayList<>();//批量标识 for (StockDTO stockDTO : stockList) { Part part = partMapper.selectById(stockDTO.getPartId()); IfsImportChangeWdrStdDTO.DataBean batchInfo = new IfsImportChangeWdrStdDTO.DataBean(); batchInfo.setPART_NO(part.getPartNo());//零件号 batchInfo.setMOVE_QTY(stockDTO.getAvailableStockQuantityMove());//移库数量 //判断是否启用批次管理 //WDR号&批次号 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { batchInfo.setWAIV_DEV_REJ_NO(wdrNo); batchInfo.setLOT_BATCH_NO(stockDTO.getIfsBatchNo()); //至WDR号 batchInfo.setTO_WAIV_DEV_REJ_NO(stockDTO.getPartBatchNo()); } else { batchInfo.setWAIV_DEV_REJ_NO("*"); batchInfo.setLOT_BATCH_NO(stockDTO.getIfsBatchNo()); //至WDR号 batchInfo.setTO_WAIV_DEV_REJ_NO("*"); } //版本号 batchInfo.setENG_CHG_LEVEL(part.getEngChgLevel()); batchInfo.setLOCATION_NO(stockDTO.getLocationNo());//库位号 dataBeanList.add(batchInfo); } ifsImportChangeWdrStdDTO.setBATCH_INFO(dataBeanList); Gson gson = new Gson(); String jsonstr = gson.toJson(ifsImportChangeWdrStdDTO); JSONObject jsonObject = JSONObject.parseObject(jsonstr); R res = ifsFeignClient.importChangeWdrStd(jsonObject, true); if (res.getCode() != 0) { throw new RuntimeException("ifs更新wdr接口失败;erromsg:" + res.getMsg()); } } @Override public Boolean deleteStock(List stockDTOList) { if (CollectionUtil.isEmpty(stockDTOList)) { return false; } for (StockDTO stockDTO : stockDTOList) { //移动的库存数量不为空时更新实时库存的数量 if (stockDTO.getAvailableStockQuantityMove() != null) { stockUtils.updateById(stockDTO.getId(), stockDTO.getAvailableStockQuantityMove().negate(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE"); } stockDTO.setAdjustType("Issue"); stockDTO.setAdjustMemo("库存发放"); } if (BooleanUtil.isTrue(stockDTOList.get(0).getSynIfs())) { inventAdjustForRfcable(stockDTOList, "Issue", null); } return true; } @Override public Boolean addStock(List stockDTOList) { if (CollectionUtil.isEmpty(stockDTOList)) { return false; } for (StockDTO stockDTO : stockDTOList) { //移动的库存数量不为空时更新实时库存的数量 if (stockDTO.getAvailableStockQuantityMove() != null) { stockUtils.updateById(stockDTO.getId(), stockDTO.getAvailableStockQuantityMove(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, null, "RECEIVE"); } stockDTO.setAdjustType("Receive"); stockDTO.setAdjustMemo("库存接收"); } if (BooleanUtil.isTrue(stockDTOList.get(0).getSynIfs())) { inventAdjustForRfcable(stockDTOList, "Receive", null); } return true; } @Override public IPage> getStockPageByOperation(Page page, QueryWrapper gen, Long operationTaskId) { return baseMapper.getStockPageByOperation(page, gen, operationTaskId); } @Override public IPage> getStockPageByOperation(Page page, QueryWrapper gen, StockDTO stockDTO, Long operationTaskId) { List erpStockListByOperation = getERPStockListByOperation(stockDTO.getPartNo(), stockDTO.getPartBatchNo()); if (CollectionUtil.isNotEmpty(erpStockListByOperation)) { for (StockDTO result : erpStockListByOperation) { Stock stock = new Stock(); BeanUtils.copyProperties(result, stock); LambdaQueryWrapper eq = new LambdaQueryWrapper().eq(Stock::getPartBatchNo, result.getPartBatchNo()).eq(Stock::getPartId, stockDTO.getPartId()); List selectList = baseMapper.selectList(eq); if (CollectionUtil.isEmpty(selectList)) { stock.setPartId(stockDTO.getPartId()); stock.setAvailableStockQuantity(new BigDecimal(0)); stock.setSAvailableStockQuantity(new BigDecimal(0)); stock.setStockQuantity(result.getStockQuantity()); stock.setSStockQuantity(new BigDecimal(0)); stock.setReserveQuantity(result.getReserveQuantity()); stock.setSReserveQuantity(new BigDecimal(0)); baseMapper.insert(stock); } } } return getStockPageByOperation(page, gen, operationTaskId); } @Override public List getStockListByOperation(QueryWrapper gen, StockDTO stockDTO, Long operationTaskId) { // List erpStockListByOperation = getERPStockListByOperation(stockDTO.getPartNo(), stockDTO.getPartBatchNo()); // if (CollectionUtil.isNotEmpty(erpStockListByOperation)) { // for (StockDTO result : erpStockListByOperation) { // Stock stock = new Stock(); // BeanUtils.copyProperties(result, stock); // LambdaQueryWrapper eq = new LambdaQueryWrapper().eq(Stock::getPartBatchNo, result.getPartBatchNo()).eq(Stock::getPartId, stockDTO.getPartId()); // List selectList = baseMapper.selectList(eq); // if (CollectionUtil.isEmpty(selectList)) { // stock.setPartId(stockDTO.getPartId()); // stock.setAvailableStockQuantity(new BigDecimal(0)); // stock.setSAvailableStockQuantity(new BigDecimal(0)); // stock.setStockQuantity(result.getStockQuantity()); // stock.setSStockQuantity(new BigDecimal(0)); // stock.setReserveQuantity(result.getReserveQuantity()); // stock.setSReserveQuantity(new BigDecimal(0)); // baseMapper.insert(stock); // } // } // // } return getStockListByOperation(gen, operationTaskId); } @Override public List getStockListByOperation(QueryWrapper gen, Long operationTaskId) { return baseMapper.getStockListByOperation(gen, operationTaskId); } // @Override // public boolean reserve(List joinStockOrderList) { // for (JoinStockOrder joinStockOrder : joinStockOrderList) { // joinStockOrderMapper.insert(joinStockOrder); // if (joinStockOrder.getType().equals("客户订单预留")) { // SplitTask splitTask = new SplitTask(); // List parts = partMapper.selectList(Wrappers.lambdaQuery().eq(Part::getPartNo, joinStockOrder.getPartNo()).orderByDesc(Part::getId)); // if (CollectionUtil.isEmpty(parts)) { // throw new RuntimeException("缺少零件号为" + joinStockOrder.getPartNo() + "的零件"); // } // Location location = locationMapper.selectOne(Wrappers.lambdaQuery().eq(Location::getLocNo, joinStockOrder.getLocationNo())); // Stock stock = getById(joinStockOrder.getStockId()); // splitTask.setCustomerOrderId(joinStockOrder.getCustomerOrderId()); // splitTask.setStockId(joinStockOrder.getStockId()); // splitTask.setPartId(parts.get(0).getId()); // splitTask.setPartBatchNo(joinStockOrder.getPartBatchNo()); // splitTask.setReservedQuantity(joinStockOrder.getReservedQuantity()); // if (null != location) { // splitTask.setLocationId(location.getId()); // splitTask.setLocationNo(joinStockOrder.getLocationNo()); // } // splitTask.setStatus(SplitTaskStateStringValues.UNUSED); // splitTask.setStockOrderId(joinStockOrder.getId()); // splitTask.setReelNumber(stock.getReelNumber()); // splitTask.setSplitTaskNo(splitTaskNumberGenerator.generateNumberWithPrefix(SplitTask.DIGIT, SplitTask.PREFIX, SplitTask::getSplitTaskNo)); // splitTaskMapper.insert(splitTask); // } // } // joinStockOrderService.changeState(joinStockOrderList, "CONFIRM"); // return true; // } @Override public boolean reserve(List joinStockOrderList) { Long locationId = null; for (JoinStockOrder joinStockOrder : joinStockOrderList) { if ("erp".equals(joinStockOrderList.get(0).getSource())) { if (locationId == null) { List locations = locationMapper.selectList(new LambdaQueryWrapper().eq(Location::getLocName, "erp入库库位")); if (CollectionUtil.isEmpty(locations)) { throw new RuntimeException("请取基础数据添加ERP入库库位"); } locationId = locations.get(0).getId(); } // joinStockOrder.setStatus(JoinStockOrderStateStringValues.CONFIRMED); Part part = partMapper.selectOne(new LambdaQueryWrapper().eq(Part::getPartNo, joinStockOrder.getPartNo())); List stockList = baseMapper.selectList(new LambdaQueryWrapper().eq(Stock::getPartBatchNo, joinStockOrder.getPartBatchNo()).eq(Stock::getPartId, part.getId())); List erpStockListByOperation = getERPStockListByOperation(joinStockOrder.getPartNo(), joinStockOrder.getPartBatchNo()); if (CollectionUtil.isEmpty(stockList)) { Stock stock = new Stock(); for (StockDTO stockDTO : erpStockListByOperation) { stock.setPartId(part.getId()); stock.setPartBatchNo(joinStockOrder.getPartBatchNo()); stock.setLocationId(locationId); stock.setSource("erp"); stock.setStockQuantity(stockDTO.getStockQuantity()); stock.setSStockQuantity(new BigDecimal(0)); stock.setReserveQuantity(joinStockOrder.getReservedQuantity()); stock.setSReserveQuantity(new BigDecimal(0)); stock.setAvailableStockQuantity(stockDTO.getStockQuantity()); stock.setSAvailableStockQuantity(new BigDecimal(0)); stock.setErpWareHouse(stockDTO.getWarehouseName()); baseMapper.insert(stock); } } else { // for (StockDTO stockDTO:erpStockListByOperation) { // stock.setPartId(part.getId()); // stock.setPartBatchNo(joinStockOrder.getPartBatchNo()); // stock.setLocationId(locationId); // stock.setSource("erp"); // // stock.setStockQuantity(stockDTO.getStockQuantity()); // stock.setSStockQuantity(new BigDecimal(0)); // stock.setReserveQuantity(joinStockOrder.getReservedQuantity()); // stock.setSReserveQuantity(new BigDecimal(0)); // stock.setAvailableStockQuantity(stockDTO.getStockQuantity()); // stock.setSAvailableStockQuantity(new BigDecimal(0)); // stock.setErpWareHouse(stockDTO.getWarehouseName()); // baseMapper.updateById(stock); // } } } if ("erp".equals(joinStockOrderList.get(0).getSource())) { Stock stock = stockMapper.selectOne(new LambdaQueryWrapper().eq(Stock::getPartBatchNo, joinStockOrder.getPartBatchNo()).eq(Stock::getErpWareHouse, joinStockOrder.getWarehouseName())); if (stock == null) { throw new RuntimeException("库存没有找到相关信息"); } joinStockOrder.setStockId(stock.getId()); } joinStockOrderMapper.insert(joinStockOrder); if (joinStockOrder.getType().equals("客户订单预留")) { SplitTask splitTask = new SplitTask(); List parts = partMapper.selectList(Wrappers.lambdaQuery().eq(Part::getPartNo, joinStockOrder.getPartNo()).orderByDesc(Part::getId)); if (CollectionUtil.isEmpty(parts)) { throw new RuntimeException("缺少零件号为" + joinStockOrder.getPartNo() + "的零件"); } Location location = locationMapper.selectOne(Wrappers.lambdaQuery().eq(Location::getLocNo, joinStockOrder.getLocationNo())); Stock stock = getById(joinStockOrder.getStockId()); splitTask.setCustomerOrderId(joinStockOrder.getCustomerOrderId()); splitTask.setStockId(joinStockOrder.getStockId()); splitTask.setPartId(parts.get(0).getId()); splitTask.setPartBatchNo(joinStockOrder.getPartBatchNo()); splitTask.setReservedQuantity(joinStockOrder.getReservedQuantity()); if (null != location) { splitTask.setLocationId(location.getId()); splitTask.setLocationNo(joinStockOrder.getLocationNo()); } splitTask.setStatus(SplitTaskStateStringValues.UNUSED); splitTask.setStockOrderId(joinStockOrder.getId()); splitTask.setReelNumber(stock.getReelNumber()); splitTask.setSplitTaskNo(splitTaskNumberGenerator.generateNumberWithPrefix(SplitTask.DIGIT, SplitTask.PREFIX, SplitTask::getSplitTaskNo)); splitTaskMapper.insert(splitTask); } } // if ("erp".equals(joinStockOrderList.get(0).getSource())) { // // } else { joinStockOrderService.changeState(joinStockOrderList, "CONFIRM"); // } return true; } @Override public R cancelReserve(List joinStockOrderList) { List ids = joinStockOrderList.stream().map(JoinStockOrder::getId).collect(Collectors.toList()); try { splitTaskDelete(ids); if ("erp".equals(joinStockOrderList.get(0).getSource())) { R r = unLockStore(joinStockOrderList); if (r.getCode() == 0) joinStockOrderService.removeByIds(ids); else return R.failed(r.getMsg()); } else { joinStockOrderService.changeState(joinStockOrderList, "CANCEL"); joinStockOrderService.removeByIds(ids); } } catch (Exception e) { e.printStackTrace(); log.error("cancleReserve:" + e.getLocalizedMessage()); return R.failed(e.getLocalizedMessage()); } return R.ok(); } @Override public R getIfsStock(String partNo, JSONObject jsonObject) { if (jsonObject == null) { jsonObject = new JSONObject(); } if (StringUtils.isNotBlank(partNo)) { jsonObject.put("PART_NO", partNo); jsonObject.put("QUANTITY_FLAG", ">0"); jsonObject.put("LOCATION_GROUP", "W02"); } R result = ifsFeignClient.queryInventoryInfoStd(jsonObject, true); if (result.getCode() == 0) { JSONObject data = (JSONObject) JSON.toJSON(result.getData()); JSONArray array = new JSONArray(); for (int i = 0; i < data.getJSONArray("LIST_INFO").size(); i++) { if (data.getJSONArray("LIST_INFO").getJSONObject(i).getBigDecimal("QTY_AVAILABLE").compareTo(BigDecimal.ZERO) > 0) { // 不使用科学计数法显示 String qty = data.getJSONArray("LIST_INFO").getJSONObject(i).getBigDecimal("QTY_AVAILABLE").stripTrailingZeros().toPlainString(); data.getJSONArray("LIST_INFO").getJSONObject(i).put("QTY_AVAILABLE", qty); array.add(data.getJSONArray("LIST_INFO").getJSONObject(i)); } } array.sort(Comparator.comparing(st -> ((JSONObject) st).getString("RECEIPT_DATE"))); return R.ok(array, "OK"); } else { return R.failed(result.getMsg()); } } /** * 根据预留id 删除分割任务 * * @param ids */ private void splitTaskDelete(List ids) { List splitTaskList = splitTaskMapper.selectList(Wrappers.lambdaQuery() .eq(SplitTask::getStatus, SplitTaskStateStringValues.USED) .in(SplitTask::getStockOrderId, ids) ); if (!CollectionUtils.isEmpty(splitTaskList)) { List splitNos = splitTaskList.stream().map(SplitTask::getSplitTaskNo).collect(Collectors.toList()); throw new RuntimeException(splitNos.toString() + " 已下发不可移除"); } splitTaskMapper.delete(Wrappers.lambdaQuery().in(SplitTask::getStockOrderId, ids)); } private void constructBean(StockDTO stockDTO, JoinStockOrder joinStockOrder) { // 01operationTaskId: this.currentOperationTask.id, // stockId: item.id, // reservedQuantity: item.availableStockQuantity, // partNo: item.partNo, // partName: item.partName, // warehouseNo: item.warehouseNo, // warehouseName: item.warehouseName, // locationNo: item.locationNo, // locationName: item.locationName, // partUnit: item.unit, // systemNo: item.systemNo, // partBatchNo: item.partBatchNo, // status: '01unconfirmed', // type: '工单预留' // joinStockOrder.setOperationTaskId(stockDTO.getc); } @Override public R getEnableStockObjList(String sn) { return R.ok(baseMapper.getEnableStockObjList(sn)); } @Override public R getEnableLocationObjList() { return R.ok(baseMapper.getEnableLocationObjList()); } @Override public R pdaMoveStockSubmit(List moveLibraryBoxDTOList) { //校验移库对象是否存在 if (CollectionUtil.isEmpty(moveLibraryBoxDTOList)) { return R.failed("移库对象为空"); } //校验移库对象必传参数:库存id、移库数量、到达库位号(不自动过滤无效移库对象,只要存在无效移库对象,则中断移库操作) List moveLibraryBoxDTOList_filter = moveLibraryBoxDTOList.stream().filter(o -> StringUtils.isBlank(String.valueOf(o.getStockId())) || StringUtils.isBlank(String.valueOf(o.getMoveQty())) || StringUtils.isBlank(o.getArriveLocationNo())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(moveLibraryBoxDTOList_filter)) { return R.failed("移库对象存在无效参数=库存id||移库数量||到达库位号"); } //补全MoveLibraryBoxDTO信息 for (int i = 0; i < moveLibraryBoxDTOList.size(); i++) { //防呆校验 if (StringUtils.isNotBlank(moveLibraryBoxDTOList.get(i).getMaterialCode())) { List customerPartRelationMaps = customerPartRelationMapper.selectList(Wrappers.lambdaQuery() .eq(BasicCustomerPartRelationMap::getCusMaterialCode, moveLibraryBoxDTOList.get(i).getMaterialCode()) .eq(BasicCustomerPartRelationMap::getCusCode, "HW")); if (CollectionUtil.isNotEmpty(customerPartRelationMaps)) { List qualityHw19VerifyList = hw19VerifyMapper.selectList(Wrappers.lambdaQuery() .eq(QualityHw19Verify::getCusMaterialCode, moveLibraryBoxDTOList.get(i).getMaterialCode()) .eq(QualityHw19Verify::getSn, moveLibraryBoxDTOList.get(i).getSnNo()) .eq(QualityHw19Verify::getActive, true)); if (CollectionUtil.isEmpty(qualityHw19VerifyList)) { throw new RuntimeException("没有进行华为标签防呆"); } } } //根据库存id获取MoveLibraryBoxDTO List moveLibraryBoxDTOList_tmp = baseMapper.getMoveLibraryBoxDTOListByStockId(moveLibraryBoxDTOList.get(i).getStockId()); if (CollectionUtil.isEmpty(moveLibraryBoxDTOList_tmp)) { return R.failed("根据库存id=" + moveLibraryBoxDTOList.get(i).getStockId() + "->无法获取库存对象"); } else if (moveLibraryBoxDTOList_tmp.size() != 1) { return R.failed("根据库存id=" + moveLibraryBoxDTOList.get(i).getStockId() + "->查询记录数大于1"); } if (moveLibraryBoxDTOList.get(i).getMoveQty().compareTo(BigDecimal.ZERO) != 1) { return R.failed("移库数量不予小于或等于0"); } //根据库存id获取库存对象 Stock stock = baseMapper.selectById(moveLibraryBoxDTOList.get(i).getStockId()); if (stock.getAvailableStockQuantity().compareTo(moveLibraryBoxDTOList.get(i).getMoveQty()) == -1) { return R.failed("移库数量不可大于库存可用数量"); } moveLibraryBoxDTOList.get(i).setStartLocationId(moveLibraryBoxDTOList_tmp.get(0).getStartLocationId());//出发库位id moveLibraryBoxDTOList.get(i).setStartLocationNo(moveLibraryBoxDTOList_tmp.get(0).getStartLocationNo());//出发库位编号 moveLibraryBoxDTOList.get(i).setStartLocationType(moveLibraryBoxDTOList_tmp.get(0).getStartLocationType());//出发库位类型 moveLibraryBoxDTOList.get(i).setStartLocationNoIfs(moveLibraryBoxDTOList_tmp.get(0).getStartLocationNoIfs());//ifs出发库位编号 moveLibraryBoxDTOList.get(i).setPartId(moveLibraryBoxDTOList_tmp.get(0).getPartId());//零件id moveLibraryBoxDTOList.get(i).setBatchNo(moveLibraryBoxDTOList_tmp.get(0).getBatchNo());//批次号 moveLibraryBoxDTOList.get(i).setSystemNo(moveLibraryBoxDTOList_tmp.get(0).getSystemNo());//产出系统编号 moveLibraryBoxDTOList.get(i).setPartNo(moveLibraryBoxDTOList_tmp.get(0).getPartNo());//零件编号 moveLibraryBoxDTOList.get(i).setEngChgLevel(moveLibraryBoxDTOList_tmp.get(0).getEngChgLevel());//零件版本号 moveLibraryBoxDTOList.get(i).setPlanningMethod(moveLibraryBoxDTOList_tmp.get(0).getPlanningMethod());//计划方法(A,K,P-K不在ifs中做库存) moveLibraryBoxDTOList.get(i).setIfsBatchNo(moveLibraryBoxDTOList_tmp.get(0).getIfsBatchNo());//ifs批次号 //根据到达库位号获取:到达库位id,到达库位类型、ifs到达库位编号 Location location_tmp = locationMapper.getLocationByLocationNo(moveLibraryBoxDTOList.get(i).getArriveLocationNo()); validateIsToProduct(stock, location_tmp); moveLibraryBoxDTOList.get(i).setArriveLocationId(location_tmp.getId());//到达库位id moveLibraryBoxDTOList.get(i).setArriveLocationType(location_tmp.getLocType());//到达库位类型 moveLibraryBoxDTOList.get(i).setArriveLocationNoIfs(location_tmp.getIfsLocation());//ifs到达库位编号 } //校验mes与ifs库位关系映射的对称性 if (!wareHouseUtils.isLocationMapSym(moveLibraryBoxDTOList)) { return R.failed("mes库位映射ifs库位不对称"); } //移库 wareHouseUtils.moveLibrary(moveLibraryBoxDTOList); return R.ok(); } private void validateIsToProduct(Stock stock, Location location) { if (StringUtils.equals("8", location.getLocType())) { int count = stockMapper.getFinishLocationProduct(stock.getPartBatchNo(), stock.getPartId()); if (count > 0) { throw new RuntimeException("成品已入库"); } } } @Override public List getFinishProductLocation() { return locationMapper.selectList(Wrappers.lambdaQuery().eq(Location::getLocType, "8")); } @Override public List getFinishProductStock(String sn, String partNo) { List finishProductStock = stockMapper.getFinishProductStock(sn, partNo); if (CollectionUtil.isNotEmpty(finishProductStock)) { List finishLocationStock = new ArrayList<>(); //是否是车间合格库位 finishLocationStock = finishProductStock.stream().filter(s -> StringUtils.equals("2", s.getLocationType())).collect(Collectors.toList()); if (CollectionUtil.isEmpty(finishLocationStock)) { //是否已经入成品库位 finishLocationStock = finishProductStock.stream().filter(s -> StringUtils.equals("8", s.getLocationType())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(finishLocationStock)) { throw new RuntimeException("{" + sn + "}已入成品库"); } //是否已经入待检库 List list = new ArrayList<>(); list.add("1"); list.add("9"); finishLocationStock = finishProductStock.stream().filter(s -> list.contains(s.getLocationType())).collect(Collectors.toList()); if (CollectionUtil.isNotEmpty(finishLocationStock)) { throw new RuntimeException("{" + sn + "}未检测"); } ProductOutput productOutput = outputMapper.selectOne(Wrappers.lambdaQuery().eq(ProductOutput::getOutBatchNo, sn)); if (productOutput == null) { throw new RuntimeException("{" + sn + "}没有该产出记录"); } if ("02submitted".equals(productOutput.getState())) { throw new RuntimeException("{" + sn + "}库存已被盘空"); } else { throw new RuntimeException("{" + sn + "}报工单未提交"); } } return finishLocationStock; } ProductOutput productOutput = outputMapper.selectOne(Wrappers.lambdaQuery().eq(ProductOutput::getOutBatchNo, sn)); if (productOutput == null) { throw new RuntimeException("{" + sn + "}没有该产出记录"); } if ("02submitted".equals(productOutput.getState())) { throw new RuntimeException("{" + sn + "}库存已被盘空"); } else { throw new RuntimeException("{" + sn + "}报工单未提交"); } } @Override public R getStockByLocNoAndSn(String locationNo, String sn) { Location location = locationMapper.selectOne(Wrappers.lambdaQuery().eq(Location::getLocNo, locationNo)); List stockByLocIdAndSn = baseMapper.getStockByLocIdAndSn(location.getId(), sn); if (CollectionUtil.isEmpty(stockByLocIdAndSn)) { return R.ok(); } if (stockByLocIdAndSn.get(0).getInyQty().compareTo(BigDecimal.ZERO) > 0) { return R.ok(stockByLocIdAndSn.stream().filter(d -> d.getInyQty().compareTo(BigDecimal.ZERO) > 0).collect(Collectors.toList())); } else { List returnList = new ArrayList<>(); returnList.add(stockByLocIdAndSn.get(0)); return R.ok(returnList); } } @Override public IPage> getStockPageByLocNo(Page page, QueryWrapper gen) { return baseMapper.getStockPageByLocNo(page, gen); } @Override public R checkWdr(List stockDTOList) { stockDTOList.stream().forEach(stock -> { Part part = partMapper.selectById(stock.getPartId()); if (!part.getLotTrackingIfs()) { if (!"*".equals(stock.getPartBatchNo())) { throw new RuntimeException("零件号" + part.getPartNo() + "未启用批次管理,且wdr不为“*”"); } } }); return R.ok(); } @Override public Transaction getTransactionBySn(String sn) { Transaction selectLatestCpk = transactionMapper.selectLatestCpk(sn); if (selectLatestCpk == null) { throw new RuntimeException("该sn号没有入成品库信息"); } Transaction transaction = transactionMapper.selectLatestStock(sn, selectLatestCpk.getPartNo(), selectLatestCpk.getQuantity().negate()); if (transaction == null) { throw new RuntimeException("该sn号没有移库信息"); } return transaction; } @Override public R returnStockBySn(String sn, BigDecimal quantity) { Transaction transaction = this.getTransactionBySn(sn); Location fromLocation = locationMapper.selectOne(Wrappers.lambdaQuery() .eq(Location::getLocNo, "CPK01")); List fromStockList = stockMapper.selectList(Wrappers.lambdaQuery() .eq(Stock::getPartBatchNo, sn) .eq(Stock::getLocationId, fromLocation.getId()) .ge(Stock::getStockQuantity, quantity)); if (CollectionUtil.isEmpty(fromStockList)) { throw new RuntimeException("成品库库存不足"); } Stock fromStock = fromStockList.get(0); Location toLocation = locationMapper.selectOne(Wrappers.lambdaQuery() .eq(Location::getLocNo, transaction.getLocationNo())); List toStockList = stockMapper.selectList(Wrappers.lambdaQuery() .eq(Stock::getPartBatchNo, sn) .eq(Stock::getLocationId, toLocation.getId())); Stock toStock = null; if (CollectionUtil.isEmpty(toStockList)) { StockAddDTO stockAdd = new StockAddDTO(); stockAdd.setPartsId(fromStock.getPartId()); stockAdd.setNewLocationId(toLocation.getId()); stockAdd.setNewPartBatchNo(sn); stockAdd.setOperationStockStatus(false); stockAdd.setManualInput(true); stockAdd.setIfsBatchNo(sn); toStock = stockUtils.query(stockAdd); } else { toStock = toStockList.get(0); } String billNo = RandomStringUtils.random(10, true, true); //退库 stockUtils.updateById(fromStock.getId(), quantity.negate(), BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, billNo, "RETURN"); //入库 stockUtils.updateById(toStock.getId(), quantity, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ZERO, billNo, "RECEIVE"); //调用ifs的移库接口 List ifsMoveLibraryInfoDTOList = new ArrayList<>(); Part part = partMapper.selectById(toStock.getPartId()); IfsMoveLibraryInfoDTO ifsMoveLibraryInfoDTO = new IfsMoveLibraryInfoDTO(); ifsMoveLibraryInfoDTO.setPartNo(part.getPartNo());//零件号 ifsMoveLibraryInfoDTO.setBatchNo(toStock.getIfsBatchNo());//ifs批次号 ifsMoveLibraryInfoDTO.setMoveQty(quantity);//移库数量 ifsMoveLibraryInfoDTO.setSerialNo(StringUtils.isNotBlank(baseMapper.getSerialNoBySystemNo(toStock.getSystemNo())) ? baseMapper.getSerialNoBySystemNo(toStock.getSystemNo()) : "*");//序列号-从车间订单获取-根据系统号查询序列号 ifsMoveLibraryInfoDTO.setEngChgLevel(part.getEngChgLevel());//版本号-根据零件id获取 //判断是否启用批次管理 if (part.getLotTrackingIfs() != null && part.getLotTrackingIfs()) { FeederCertificate feederCertificate = feederMapper.selectOne(Wrappers.lambdaQuery().eq(FeederCertificate::getSn, toStock.getPartBatchNo())); if (null != feederCertificate) { ifsMoveLibraryInfoDTO.setWaivDevRejNo(StringUtils.isNotBlank(feederCertificate.getExaminerAfter()) ? feederCertificate.getExaminerAfter() : feederCertificate.getExaminer()); } else { ifsMoveLibraryInfoDTO.setWaivDevRejNo(toStock.getPartBatchNo());//wdr号(把mes的sn号放里面) } } else { ifsMoveLibraryInfoDTO.setWaivDevRejNo("*");//wdr号 } ifsMoveLibraryInfoDTO.setStartLocationNo(fromLocation.getLocNo());//ifs出发库位号 ifsMoveLibraryInfoDTO.setArriveLocationNo(toLocation.getLocNo());//ifs到达库位号 ifsMoveLibraryInfoDTOList.add(ifsMoveLibraryInfoDTO); //ifs移库 ifsMoveLibrary(ifsMoveLibraryInfoDTOList); return R.ok(); } @Override public List getERPStockListByOperation(String partNo, String batchNo) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); String syncErpUrl = environment.getProperty("erpStoreUrl"); HttpPost httpPost = new HttpPost(syncErpUrl); // 将参数转换为JSON字符串 Map params = new HashMap<>(); params.put("productId", partNo); params.put("batchNo", batchNo); String jsonParams = new Gson().toJson(params); // 设置请求体为JSON格式 StringEntity requestEntity = new StringEntity(jsonParams, ContentType.APPLICATION_JSON); httpPost.setEntity(requestEntity); String responseString = null; List results = new ArrayList<>(); Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper().eq(Part::getPartNo, partNo)); if (part == null) { throw new RuntimeException("零件不存在"); } try { CloseableHttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); responseString = EntityUtils.toString(entity, "UTF-8"); R r = new Gson().fromJson(responseString, R.class); if (r.getCode() == 0) { ArrayList list = (ArrayList) r.getData(); for (int i = 0; i < list.size(); i++) { LinkedTreeMap linkedTreeMap = (LinkedTreeMap) list.get(i); StockDTO bean = new StockDTO(); BeanUtils.copyProperties(part, bean); bean.setStockQuantity(linkedTreeMap.get("num") == null ? new BigDecimal(0) : new BigDecimal(linkedTreeMap.get("num"))); // 接库缺少值 bean.setReserveQuantity(new BigDecimal(0)); bean.setUnit(part.getUnit()); bean.setPartId(part.getId()); //TODO start bean.setAvailableStockQuantity(bean.getStockQuantity()); // 批号 bean.setPartBatchNo(linkedTreeMap.get("batch")); //仓库 bean.setWarehouseName(linkedTreeMap.get("warehouseName")); //库位 bean.setLocationName(""); //系统编号 bean.setSystemNo(""); //载具编号 bean.setReelNumber(""); // TODO end // bean.setFullPath(linkedTreeMap.get("fullPath")); // bean.setUnitname(linkedTreeMap.get("unitname")); // bean.setBl(linkedTreeMap.get("bl")); // bean.setNum(linkedTreeMap.get("num")); results.add(bean); } } else { throw new RuntimeException(r.getMsg()); } log.info(responseString); response.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return results; } @Override public R getERPStockListPageByOperation(Page page, String partNo, Integer pageIndex, Integer pageSize) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); String syncErpUrl = environment.getProperty("erpStorePageUrl"); HttpPost httpPost = new HttpPost(syncErpUrl); // 将参数转换为JSON字符串 Map params = new HashMap<>(); params.put("searchKey", partNo); params.put("pageIndex", pageIndex); params.put("pageSize", pageSize); String jsonParams = new Gson().toJson(params); // 设置请求体为JSON格式 StringEntity requestEntity = new StringEntity(jsonParams, ContentType.APPLICATION_JSON); httpPost.setEntity(requestEntity); String responseString = null; List results = new ArrayList<>(); // Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper().eq(Part::getPartNo, partNo)); // if (part == null) { // throw new RuntimeException("零件不存在"); // } try { CloseableHttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); responseString = EntityUtils.toString(entity, "UTF-8"); R r = new Gson().fromJson(responseString, R.class); if (r.getCode() == 0) { // Map resultMap = (Map) r.getData(); ArrayList list = (ArrayList) resultMap.get("records"); Map pageMap = (Map) resultMap.get("page"); page.setRecords(list); page.setOrders(new ArrayList()); page.setOptimizeCountSql(true); page.setSearchCount(true); page.setTotal(Double.valueOf(pageMap.get("recordcount").toString()).longValue()); page.setPages(Double.valueOf(pageMap.get("pagecount").toString()).longValue()); // page.setPages() 总页数 // page.setSize() 每页条数 // page.setCurrent() 当前页 page.setHitCount(false); page.setSearchCount(true); for (int i = 0; i < list.size(); i++) { LinkedTreeMap linkedTreeMap = (LinkedTreeMap) list.get(i); StockDTO bean = new StockDTO(); // BeanUtils.copyProperties(part, bean); bean.setStockQuantity(linkedTreeMap.get("num") == null ? new BigDecimal(0) : new BigDecimal(linkedTreeMap.get("num"))); bean.setReserveQuantity(new BigDecimal(0)); // bean.setUnit(part.getUnit()); // bean.setPartId(part.getId()); //TODO start bean.setAvailableStockQuantity(bean.getStockQuantity()); // 批号 bean.setPartBatchNo(linkedTreeMap.get("batch")); //仓库 bean.setWarehouseName(linkedTreeMap.get("fullPath")); //库位 bean.setLocationName(""); //系统编号 bean.setSystemNo(""); //载具编号 bean.setReelNumber(""); // TODO end // bean.setFullPath(linkedTreeMap.get("fullPath")); // bean.setUnitname(linkedTreeMap.get("unitname")); // bean.setBl(linkedTreeMap.get("bl")); // bean.setNum(linkedTreeMap.get("num")); results.add(bean); } } else { throw new RuntimeException(r.getMsg()); } log.info(responseString); response.close(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e.getMessage()); } finally { try { httpClient.close(); } catch (IOException e) { e.printStackTrace(); } } return R.ok(page); } @Override public R lockStore(StockDTO stockDTO) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); String syncErpUrl = environment.getProperty("erpLockStore"); HttpPost httpPost = new HttpPost(syncErpUrl); // 将参数转换为JSON字符串 Map params = new HashMap<>(); Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper().eq(Part::getPartNo, stockDTO.getPartNo())); params.put("sourceType", 0); params.put("productID", part.getPartFamilyId()); params.put("num", stockDTO.getNum()); params.put("mType", 1); String jsonParams = new Gson().toJson(params); // 设置请求体为JSON格式 StringEntity requestEntity = new StringEntity(jsonParams, ContentType.APPLICATION_JSON); httpPost.setEntity(requestEntity); String responseString = null; CloseableHttpResponse response = null; try { response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); responseString = EntityUtils.toString(entity, "UTF-8"); return new Gson().fromJson(responseString, R.class); } catch (IOException e) { e.printStackTrace(); } return R.failed(); } private R unLockStore(List joinStockOrderList) { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); String syncErpUrl = environment.getProperty("erpUnLockStore"); HttpPost httpPost = new HttpPost(syncErpUrl); // 将参数转换为JSON字符串 // Map params = new HashMap<>(); // Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper().eq(Part::getPartNo, stockDTO.getPartNo())); List> mapList = new ArrayList<>(); for (JoinStockOrder stockOrder : joinStockOrderList) { Map innerMap = new HashMap<>(); innerMap.put("productID", stockOrder.getPartBatchNo()); innerMap.put("num", stockOrder.getReservedQuantity()); innerMap.put("batchNo", stockOrder.getPartBatchNo()); mapList.add(innerMap); } // params.put("datas",mapList); String jsonParams = new Gson().toJson(mapList); // 设置请求体为JSON格式 StringEntity requestEntity = new StringEntity(jsonParams, ContentType.APPLICATION_JSON); httpPost.setEntity(requestEntity); String responseString = null; CloseableHttpResponse response = null; try { response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); responseString = EntityUtils.toString(entity, "UTF-8"); return new Gson().fromJson(responseString, R.class); } catch (IOException e) { e.printStackTrace(); } return R.failed(); } }