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<StockMapper, Stock> 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<SplitTask> 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<String, String> 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<JSONObject> pdaList(QueryWrapper<FeedingStockDTO> gen) {
|
return baseMapper.pdaList(gen);
|
}
|
|
@Override
|
public IPage<StockDTO> getStockPage(Page page, QueryWrapper<StockDTO> gen) {
|
IPage<StockDTO> stockDTOList = baseMapper.getStockPage(page, gen);
|
return stockDTOList;
|
}
|
|
|
@Override
|
public IPage<StockDTO> getRealTimeStockPage(Page page, QueryWrapper<StockDTO> gen, StockDTO stockDTO) {
|
IPage<StockDTO> 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<StockDTO> getStockBySn(String partBatchNo) {
|
return baseMapper.getStockBySn(partBatchNo);
|
}
|
|
@Override
|
public List<FeedingStockDTO> getFeedingStock(Long workstationId, QueryWrapper<FeedingStockDTO> gen) {
|
return baseMapper.getFeedingStock(workstationId, gen);
|
}
|
|
@Override
|
public IPage<List<StockDTO>> getStockByPartIdPage(Page page, QueryWrapper<StockDTO> gen, Long partId) {
|
return baseMapper.getStockByPartIdPage(page, gen, partId);
|
}
|
|
@Override
|
public IPage<List<StockDTO>> getStockByWorkstationId(Page page, QueryWrapper<StockDTO> gen) {
|
return baseMapper.getStockByWorkstationId(page, gen);
|
}
|
|
@Override
|
public IPage<List<StockDTO>> getToDealStockByWorkstationId(Page page, QueryWrapper<StockDTO> gen) {
|
return baseMapper.getToDealStockByWorkstationId(page, gen);
|
}
|
|
@Override
|
public List<StockDTO> getStockByLocation(List<Long> ids) {
|
return baseMapper.getStockByLocation(ids);
|
}
|
|
@Override
|
public void importExcel(List<StockData> list) {
|
if (CollectionUtil.isEmpty(list)) {
|
return;
|
}
|
for (StockData data : list) {
|
Part part = partMapper.selectOne(Wrappers.<Part>lambdaQuery().eq(Part::getPartNo, data.getPartNo()));
|
if (part == null) {
|
log.error("零件号:" + data.getPartNo() + "不存在");
|
continue;
|
}
|
Location location = locationMapper.selectOne(Wrappers.<Location>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<StockDTO> stockDTOList) {
|
if (CollectionUtil.isEmpty(stockDTOList)) {
|
return false;
|
}
|
List<IfsMoveLibraryInfoDTO> 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<String> 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<String> checkIfsMoveLibrary(String startLocationNo, String arriveLocationNo) {
|
List<String> 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<IfsMoveLibraryInfoDTO> 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<IfsMoveLibraryDTO.DataBean> 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<StockDTO> getStock(StockDTO stockDTO, String condition) {
|
List<StockDTO> newStockDTOList = new ArrayList<>();
|
if (stockDTO.getLocationId() == null && stockDTO.getPartBatchNo() != null) {
|
List<StockDTO> stockDTOList = baseMapper.getStock(stockDTO.getPartId(), null, stockDTO.getPartBatchNo(), condition);
|
newStockDTOList.addAll(stockDTOList);
|
}
|
if (stockDTO.getLocationId() == null && stockDTO.getPartBatchNo() == null) {
|
List<StockDTO> stockDTOList = baseMapper.getStock(stockDTO.getPartId(), null, null, condition);
|
newStockDTOList.addAll(stockDTOList);
|
}
|
if (stockDTO.getLocationId() != null && stockDTO.getPartBatchNo() == null) {
|
List<StockDTO> stockDTOList = baseMapper.getStock(stockDTO.getPartId(), stockDTO.getLocationId(), null, condition);
|
newStockDTOList.addAll(stockDTOList);
|
}
|
if (stockDTO.getLocationId() != null && stockDTO.getPartBatchNo() != null) {
|
List<StockDTO> 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<StockDTO> 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<IfsInventAdjustDetailDTO> 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<StockDTO> stockList, String wdrNo) {
|
IfsImportChangeWdrStdDTO ifsImportChangeWdrStdDTO = new IfsImportChangeWdrStdDTO();
|
ifsImportChangeWdrStdDTO.setRECORD_ID(UUID.randomUUID().toString().replace("-", ""));
|
List<IfsImportChangeWdrStdDTO.DataBean> 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<StockDTO> 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<StockDTO> 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<List<StockDTO>> getStockPageByOperation(Page page, QueryWrapper<StockDTO> gen, Long operationTaskId) {
|
return baseMapper.getStockPageByOperation(page, gen, operationTaskId);
|
}
|
|
@Override
|
public IPage<List<StockDTO>> getStockPageByOperation(Page page, QueryWrapper<StockDTO> gen, StockDTO stockDTO, Long operationTaskId) {
|
List<StockDTO> erpStockListByOperation = getERPStockListByOperation(stockDTO.getPartNo(), stockDTO.getPartBatchNo());
|
if (CollectionUtil.isNotEmpty(erpStockListByOperation)) {
|
for (StockDTO result : erpStockListByOperation) {
|
Stock stock = new Stock();
|
BeanUtils.copyProperties(result, stock);
|
LambdaQueryWrapper<Stock> eq = new LambdaQueryWrapper<Stock>().eq(Stock::getPartBatchNo, result.getPartBatchNo()).eq(Stock::getPartId, stockDTO.getPartId());
|
List<Stock> 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<StockDTO> getStockListByOperation(QueryWrapper<StockDTO> gen, StockDTO stockDTO, Long operationTaskId) {
|
// List<StockDTO> erpStockListByOperation = getERPStockListByOperation(stockDTO.getPartNo(), stockDTO.getPartBatchNo());
|
// if (CollectionUtil.isNotEmpty(erpStockListByOperation)) {
|
// for (StockDTO result : erpStockListByOperation) {
|
// Stock stock = new Stock();
|
// BeanUtils.copyProperties(result, stock);
|
// LambdaQueryWrapper<Stock> eq = new LambdaQueryWrapper<Stock>().eq(Stock::getPartBatchNo, result.getPartBatchNo()).eq(Stock::getPartId, stockDTO.getPartId());
|
// List<Stock> 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<StockDTO> getStockListByOperation(QueryWrapper<StockDTO> gen, Long operationTaskId) {
|
return baseMapper.getStockListByOperation(gen, operationTaskId);
|
}
|
|
// @Override
|
// public boolean reserve(List<JoinStockOrder> joinStockOrderList) {
|
// for (JoinStockOrder joinStockOrder : joinStockOrderList) {
|
// joinStockOrderMapper.insert(joinStockOrder);
|
// if (joinStockOrder.getType().equals("客户订单预留")) {
|
// SplitTask splitTask = new SplitTask();
|
// List<Part> parts = partMapper.selectList(Wrappers.<Part>lambdaQuery().eq(Part::getPartNo, joinStockOrder.getPartNo()).orderByDesc(Part::getId));
|
// if (CollectionUtil.isEmpty(parts)) {
|
// throw new RuntimeException("缺少零件号为" + joinStockOrder.getPartNo() + "的零件");
|
// }
|
// Location location = locationMapper.selectOne(Wrappers.<Location>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<JoinStockOrder> joinStockOrderList) {
|
Long locationId = null;
|
for (JoinStockOrder joinStockOrder : joinStockOrderList) {
|
if ("erp".equals(joinStockOrderList.get(0).getSource())) {
|
if (locationId == null) {
|
List<Location> locations = locationMapper.selectList(new LambdaQueryWrapper<Location>().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<Part>().eq(Part::getPartNo, joinStockOrder.getPartNo()));
|
List<Stock> stockList = baseMapper.selectList(new LambdaQueryWrapper<Stock>().eq(Stock::getPartBatchNo, joinStockOrder.getPartBatchNo()).eq(Stock::getPartId, part.getId()));
|
|
List<StockDTO> 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<Stock>().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<Part> parts = partMapper.selectList(Wrappers.<Part>lambdaQuery().eq(Part::getPartNo, joinStockOrder.getPartNo()).orderByDesc(Part::getId));
|
if (CollectionUtil.isEmpty(parts)) {
|
throw new RuntimeException("缺少零件号为" + joinStockOrder.getPartNo() + "的零件");
|
}
|
Location location = locationMapper.selectOne(Wrappers.<Location>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<JoinStockOrder> joinStockOrderList) {
|
List<Long> 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<Long> ids) {
|
List<SplitTask> splitTaskList = splitTaskMapper.selectList(Wrappers.<SplitTask>lambdaQuery()
|
.eq(SplitTask::getStatus, SplitTaskStateStringValues.USED)
|
.in(SplitTask::getStockOrderId, ids)
|
);
|
if (!CollectionUtils.isEmpty(splitTaskList)) {
|
List<String> splitNos = splitTaskList.stream().map(SplitTask::getSplitTaskNo).collect(Collectors.toList());
|
throw new RuntimeException(splitNos.toString() + " 已下发不可移除");
|
}
|
splitTaskMapper.delete(Wrappers.<SplitTask>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<MoveLibraryBoxDTO> moveLibraryBoxDTOList) {
|
//校验移库对象是否存在
|
if (CollectionUtil.isEmpty(moveLibraryBoxDTOList)) {
|
return R.failed("移库对象为空");
|
}
|
|
//校验移库对象必传参数:库存id、移库数量、到达库位号(不自动过滤无效移库对象,只要存在无效移库对象,则中断移库操作)
|
List<MoveLibraryBoxDTO> 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<BasicCustomerPartRelationMap> customerPartRelationMaps = customerPartRelationMapper.selectList(Wrappers.<BasicCustomerPartRelationMap>lambdaQuery()
|
.eq(BasicCustomerPartRelationMap::getCusMaterialCode, moveLibraryBoxDTOList.get(i).getMaterialCode())
|
.eq(BasicCustomerPartRelationMap::getCusCode, "HW"));
|
if (CollectionUtil.isNotEmpty(customerPartRelationMaps)) {
|
List<QualityHw19Verify> qualityHw19VerifyList = hw19VerifyMapper.selectList(Wrappers.<QualityHw19Verify>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<MoveLibraryBoxDTO> 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<Location> getFinishProductLocation() {
|
return locationMapper.selectList(Wrappers.<Location>lambdaQuery().eq(Location::getLocType, "8"));
|
}
|
|
@Override
|
public List<StockDTO> getFinishProductStock(String sn, String partNo) {
|
List<StockDTO> finishProductStock = stockMapper.getFinishProductStock(sn, partNo);
|
if (CollectionUtil.isNotEmpty(finishProductStock)) {
|
List<StockDTO> 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<String> 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.<ProductOutput>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.<ProductOutput>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.<Location>lambdaQuery().eq(Location::getLocNo, locationNo));
|
List<InventoryDetail> 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<InventoryDetail> returnList = new ArrayList<>();
|
returnList.add(stockByLocIdAndSn.get(0));
|
return R.ok(returnList);
|
}
|
}
|
|
|
@Override
|
public IPage<List<StockDTO>> getStockPageByLocNo(Page page, QueryWrapper<StockDTO> gen) {
|
return baseMapper.getStockPageByLocNo(page, gen);
|
}
|
|
@Override
|
public R checkWdr(List<StockDTO> 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.<Location>lambdaQuery()
|
.eq(Location::getLocNo, "CPK01"));
|
List<Stock> fromStockList = stockMapper.selectList(Wrappers.<Stock>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.<Location>lambdaQuery()
|
.eq(Location::getLocNo, transaction.getLocationNo()));
|
List<Stock> toStockList = stockMapper.selectList(Wrappers.<Stock>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<IfsMoveLibraryInfoDTO> 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.<FeederCertificate>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<StockDTO> getERPStockListByOperation(String partNo, String batchNo) {
|
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
|
String syncErpUrl = environment.getProperty("erpStoreUrl");
|
HttpPost httpPost = new HttpPost(syncErpUrl);
|
// 将参数转换为JSON字符串
|
Map<String, String> 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<StockDTO> results = new ArrayList<>();
|
|
Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper<Part>().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<String, String> linkedTreeMap = (LinkedTreeMap<String, String>) 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<String, Object> 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<StockDTO> results = new ArrayList<>();
|
|
// Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper<Part>().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<String, Object> resultMap = (Map<String, Object>) r.getData();
|
ArrayList list = (ArrayList) resultMap.get("records");
|
Map<String, Object> pageMap = (Map<String, Object>) resultMap.get("page");
|
page.setRecords(list);
|
page.setOrders(new ArrayList<OrderItem>());
|
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<String, String> linkedTreeMap = (LinkedTreeMap<String, String>) 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<String, Object> params = new HashMap<>();
|
|
Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper<Part>().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<JoinStockOrder> joinStockOrderList) {
|
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
|
String syncErpUrl = environment.getProperty("erpUnLockStore");
|
HttpPost httpPost = new HttpPost(syncErpUrl);
|
// 将参数转换为JSON字符串
|
// Map<String, Object> params = new HashMap<>();
|
|
|
// Part part = partService.getBaseMapper().selectOne(new LambdaQueryWrapper<Part>().eq(Part::getPartNo, stockDTO.getPartNo()));
|
List<Map<String, Object>> mapList = new ArrayList<>();
|
for (JoinStockOrder stockOrder : joinStockOrderList) {
|
Map<String, Object> 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();
|
}
|
}
|