|
|
|
@ -184,15 +184,41 @@ public class WmsMoveServiceImpl implements IWmsMoveService {
|
|
|
|
|
|
|
|
|
|
WmsBaseWarehouse baseWareHouse = wmsBaseWarehouseMapper.
|
|
|
|
|
selectWmsBaseWarehouseByWarehouseId(oriLocation.getWarehouseId());
|
|
|
|
|
if (!baseWareHouse.getWarehouseType().equals(WmsConstants.WMS_WAREHOUSE_TYPE_NORMAL)) {
|
|
|
|
|
throw new ServiceException("请选择人工仓库的库位进行移库");
|
|
|
|
|
String warehouseType = baseWareHouse.getWarehouseType();
|
|
|
|
|
Date currentDate = new Date();
|
|
|
|
|
String userName = SecurityUtils.getUsername();
|
|
|
|
|
String warehouseInstockType = baseWareHouse.getWarehouseInstockType();
|
|
|
|
|
String moveWay = "", operationType = "";
|
|
|
|
|
if (warehouseType.equals(WmsConstants.WMS_WAREHOUSE_TYPE_WORKBIN_AGV)) {
|
|
|
|
|
throw new ServiceException("立库库位移库请在调度页面进行移库");
|
|
|
|
|
} else if (warehouseType.equals(WmsConstants.WMS_WAREHOUSE_TYPE_AGV)) {
|
|
|
|
|
moveWay = WmsConstants.WMS_MOVEMERGE_WAY_AGV;
|
|
|
|
|
operationType = WmsConstants.MWS_OPERATION_TYPE_DISPATCHD;
|
|
|
|
|
|
|
|
|
|
WmsMove queryMove = new WmsMove();
|
|
|
|
|
queryMove.setWarehouseId(oriLocation.getWarehouseId());
|
|
|
|
|
queryMove.setExecuteStatusStr(WmsConstants.WMS_EXECUTE_STATUS_TOEXECUTE + "," + WmsConstants.WMS_MOVE_EXECUTE_STATUS_EXECUTING + "," + WmsConstants.WMS_MOVE_EXECUTE_STATUS_OUTSTOCK_FINISH);
|
|
|
|
|
|
|
|
|
|
List<WmsMove> wmsMoveList = wmsMoveMapper.selectWmsMoveList(queryMove);
|
|
|
|
|
if (wmsMoveList != null && !wmsMoveList.isEmpty()) {
|
|
|
|
|
throw new ServiceException("有正在执行的移库任务");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//todo:判断有没有还没有完成从此原库位到目标库位的移库任务(预防还没修改库位状态生成此数据,连续点击问题,或者已经移库出库完成的情况不能将原库位再设置移库记录)
|
|
|
|
|
String warehouseInstockType = baseWareHouse.getWarehouseInstockType();
|
|
|
|
|
} else {
|
|
|
|
|
moveWay = WmsConstants.WMS_MOVEMERGE_WAY_MANUAL;
|
|
|
|
|
operationType = WmsConstants.WMS_OPERATION_TYPE_MANUAL;
|
|
|
|
|
|
|
|
|
|
oriLocation.setLocationStatus(WmsConstants.WMS_BASE_LOCATION_STATUS_MOVE_LOCK);
|
|
|
|
|
oriLocation.setUpdateTime(currentDate);
|
|
|
|
|
oriLocation.setUpdateBy(userName);
|
|
|
|
|
wmsBaseLocationMapper.updateWmsBaseLocation(oriLocation);
|
|
|
|
|
|
|
|
|
|
targetLocation.setLocationStatus(WmsConstants.WMS_BASE_LOCATION_STATUS_MOVE_LOCK);
|
|
|
|
|
targetLocation.setUpdateTime(currentDate);
|
|
|
|
|
targetLocation.setUpdateBy(userName);
|
|
|
|
|
wmsBaseLocationMapper.updateWmsBaseLocation(targetLocation);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Date currentDate = new Date();
|
|
|
|
|
String userName = SecurityUtils.getUsername();
|
|
|
|
|
|
|
|
|
|
WmsMove wmsMove = new WmsMove();
|
|
|
|
|
String taskCode = Seq.getId(Seq.wmsMoveSeqType, Seq.wmsMoveSeqCode);
|
|
|
|
@ -201,8 +227,8 @@ public class WmsMoveServiceImpl implements IWmsMoveService {
|
|
|
|
|
wmsMove.setOriLocationCode(wmsMoveApplyVo.getOriLocationCode());
|
|
|
|
|
wmsMove.setTargetLocationCode(wmsMoveApplyVo.getTargetLocationCode());
|
|
|
|
|
wmsMove.setExecuteStatus(WmsConstants.WMS_MOVE_EXECUTE_STATUS_TOEXECUTE);
|
|
|
|
|
wmsMove.setOperationType(WmsConstants.WMS_OPERATION_TYPE_MANUAL);
|
|
|
|
|
wmsMove.setMoveWay(WmsConstants.WMS_MOVEMERGE_WAY_MANUAL);
|
|
|
|
|
wmsMove.setOperationType(operationType);
|
|
|
|
|
wmsMove.setMoveWay(moveWay);
|
|
|
|
|
wmsMove.setMoveType(wmsMoveApplyVo.getMoveType());
|
|
|
|
|
wmsMove.setAuditStatus(WmsConstants.WMS_AUDIT_STATUS_PASS);
|
|
|
|
|
wmsMove.setExecuteStatus(WmsConstants.WMS_EXECUTE_STATUS_TOEXECUTE);
|
|
|
|
@ -213,6 +239,8 @@ public class WmsMoveServiceImpl implements IWmsMoveService {
|
|
|
|
|
|
|
|
|
|
List<WmsMoveDetail> toInsertedMoveDetails = new ArrayList<>();
|
|
|
|
|
|
|
|
|
|
//判断库位状态,如果原库位和目标库位是深库位,需要判断浅库位状态,需要判断对应的浅库位有没有库存
|
|
|
|
|
|
|
|
|
|
if (warehouseInstockType.equals(WmsConstants.WMS_WAREHOUSE_INSTOCK_TYPE_RAW)) {//如果是原材料
|
|
|
|
|
WmsRawStock queryRawStock = new WmsRawStock();
|
|
|
|
|
queryRawStock.setLocationCode(oriLocationCode);
|
|
|
|
@ -268,21 +296,70 @@ public class WmsMoveServiceImpl implements IWmsMoveService {
|
|
|
|
|
toInsertedMoveDetails = getMoveDetailsByProductStocks(productStocks, wmsMove, userName, currentDate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
oriLocation.setLocationStatus(WmsConstants.WMS_BASE_LOCATION_STATUS_MOVE_LOCK);
|
|
|
|
|
oriLocation.setUpdateTime(currentDate);
|
|
|
|
|
oriLocation.setUpdateBy(userName);
|
|
|
|
|
wmsBaseLocationMapper.updateWmsBaseLocation(oriLocation);
|
|
|
|
|
if (warehouseType.equals(WmsConstants.WMS_WAREHOUSE_TYPE_NORMAL)) {
|
|
|
|
|
wmsMoveMapper.batchWmsMoveDetail(toInsertedMoveDetails);
|
|
|
|
|
} else if (warehouseType.equals(WmsConstants.WMS_WAREHOUSE_TYPE_AGV)) {
|
|
|
|
|
this.checkFrontLocationStock(oriLocation, warehouseInstockType, "1");
|
|
|
|
|
this.checkFrontLocationStock(targetLocation, warehouseInstockType, "2");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
targetLocation.setLocationStatus(WmsConstants.WMS_BASE_LOCATION_STATUS_MOVE_LOCK);
|
|
|
|
|
targetLocation.setUpdateTime(currentDate);
|
|
|
|
|
targetLocation.setUpdateBy(userName);
|
|
|
|
|
wmsBaseLocationMapper.updateWmsBaseLocation(targetLocation);
|
|
|
|
|
|
|
|
|
|
int rows = wmsMoveMapper.batchWmsMoveDetail(toInsertedMoveDetails);
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void checkFrontLocationStock(WmsBaseLocation baseLocation, String warehouseInstockType, String moveType) {
|
|
|
|
|
if (baseLocation.getLocDeep() != null && baseLocation.getLocDeep().equals(WmsConstants.WMS_BASE_LOCATION_LOC_DEEP_BACK)) {
|
|
|
|
|
WmsBaseLocation queryBaseLocation = new WmsBaseLocation();
|
|
|
|
|
Long locRow = baseLocation.getLocRow();
|
|
|
|
|
Long frontRow;
|
|
|
|
|
if (locRow % 2 == 0) {
|
|
|
|
|
frontRow = locRow - 1;
|
|
|
|
|
} else {
|
|
|
|
|
frontRow = locRow + 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
queryBaseLocation.setWarehouseId(baseLocation.getWarehouseId());
|
|
|
|
|
queryBaseLocation.setLocColumn(baseLocation.getLocColumn());
|
|
|
|
|
queryBaseLocation.setLayerNum(baseLocation.getLayerNum());
|
|
|
|
|
queryBaseLocation.setLocRow(frontRow);
|
|
|
|
|
queryBaseLocation.setLocDeep(WmsConstants.WMS_BASE_LOCATION_LOC_DEEP_FRONT);
|
|
|
|
|
List<WmsBaseLocation> baseLocationList = wmsBaseLocationMapper.selectWmsBaseLocationList(queryBaseLocation);
|
|
|
|
|
String locationName = "";
|
|
|
|
|
if (moveType.equals("1")) {
|
|
|
|
|
locationName = "原库位";
|
|
|
|
|
} else {
|
|
|
|
|
locationName = "目标库位";
|
|
|
|
|
}
|
|
|
|
|
if (baseLocationList == null || baseLocationList.isEmpty()) {
|
|
|
|
|
throw new ServiceException(locationName + "的浅库位未找到");
|
|
|
|
|
}
|
|
|
|
|
WmsBaseLocation frontLocation = baseLocationList.get(0);
|
|
|
|
|
|
|
|
|
|
return rows;
|
|
|
|
|
if (!frontLocation.getLocationStatus().equals(WmsConstants.WMS_BASE_LOCATION_STATUS_NORMAL)) {
|
|
|
|
|
throw new ServiceException(locationName + "的浅库位状态为" + WmsConstants.LOCATION_STATUS_PROMPT_MAP.get(frontLocation.getLocationStatus()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (warehouseInstockType.equals(WmsConstants.WMS_WAREHOUSE_INSTOCK_TYPE_RAW)) {//如果是原材料
|
|
|
|
|
WmsRawStock queryRawStock = new WmsRawStock();
|
|
|
|
|
queryRawStock.setLocationCode(frontLocation.getLocationCode());
|
|
|
|
|
List<WmsRawStock> wmsRawStocks = wmsRawStockMapper.selectWmsRawStockInList(queryRawStock);
|
|
|
|
|
if (wmsRawStocks != null && !wmsRawStocks.isEmpty()) {
|
|
|
|
|
throw new ServiceException(locationName + "的浅库位有库存,无法申请移库");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
WmsProductStock queryProductStock = new WmsProductStock();
|
|
|
|
|
queryProductStock.setLocationCode(frontLocation.getLocationCode());
|
|
|
|
|
List<WmsProductStock> productStocks = wmsProductStockMapper.selectWmsProductStockInList(queryProductStock);
|
|
|
|
|
if (productStocks != null && !productStocks.isEmpty()) {
|
|
|
|
|
throw new ServiceException(locationName + "的浅库位有库存,无法申请移库");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private List<WmsMoveDetail> getMoveDetailsByRawStocks(List<WmsRawStock> wmsRawStocks, WmsMove wmsMove,
|
|
|
|
|
String userName, Date currentDate) {
|
|
|
|
|
List<WmsMoveDetail> wmsMoveDetailList = new ArrayList<>();
|
|
|
|
@ -718,12 +795,31 @@ public class WmsMoveServiceImpl implements IWmsMoveService {
|
|
|
|
|
throw new ServiceException("没有此移库信息");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//根据物料ID找移库明细(主要原因是移库入库的库位的物料条码跟之前的条码不一定一样,物料条码都是贴在料框上的)
|
|
|
|
|
WmsMoveDetail existedMoveDetail = wmsMoveDetailList.stream().filter(moveDetail ->
|
|
|
|
|
moveDetail.getMaterialBarcode().equals(materialBarcode)).findFirst().get();
|
|
|
|
|
moveDetail.getMaterialId().equals(baseBarcodeInfo.getMaterialId())).findFirst().get();
|
|
|
|
|
|
|
|
|
|
if (existedMoveDetail == null) {
|
|
|
|
|
throw new ServiceException("没有此移库信息");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String oriBarcodeInfoStr = existedMoveDetail.getMaterialBarcode();
|
|
|
|
|
R<MesBaseBarcodeInfo> oriBarcodeInfoR = remoteMesService.getBarcode(oriBarcodeInfoStr, SecurityConstants.INNER);
|
|
|
|
|
MesBaseBarcodeInfo oriBarcodeInfo = oriBarcodeInfoR.getData();
|
|
|
|
|
if (oriBarcodeInfo == null) {
|
|
|
|
|
throw new ServiceException("原物料条码有误");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Long targetPurchaseOrderId = baseBarcodeInfo.getPurchaseOrderId() == null ? 0L : baseBarcodeInfo.getPurchaseOrderId();
|
|
|
|
|
Long oriPurchaseOrderId = oriBarcodeInfo.getPurchaseOrderId() == null ? 0L : oriBarcodeInfo.getPurchaseOrderId();
|
|
|
|
|
|
|
|
|
|
if (!targetPurchaseOrderId.equals(oriPurchaseOrderId)) {
|
|
|
|
|
String targetPoNo = baseBarcodeInfo.getPoNo() == null ? "" : baseBarcodeInfo.getPoNo();
|
|
|
|
|
String oriPoNo = oriBarcodeInfo.getPoNo() == null ? "" : oriBarcodeInfo.getPoNo();
|
|
|
|
|
throw new ServiceException("原物料条码(" + oriPoNo + ")和此条码采购订单(" + targetPoNo + ")不一致");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String detailExecuteStatus = existedMoveDetail.getExecuteStatus();
|
|
|
|
|
|
|
|
|
|
if (detailExecuteStatus.equals(WmsConstants.WMS_MOVE_EXECUTE_STATUS_INSTOCK_FINISH)) {
|
|
|
|
@ -856,7 +952,6 @@ public class WmsMoveServiceImpl implements IWmsMoveService {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询移库合库记录,Join material
|
|
|
|
|
*
|
|
|
|
|