@ -2,6 +2,7 @@ package com.hw.wms.service.impl;
import com.alibaba.fastjson2.JSONArray ;
import com.alibaba.fastjson2.JSONObject ;
import com.hw.common.core.constant.MesConstants ;
import com.hw.common.core.constant.SecurityConstants ;
import com.hw.common.core.constant.WmsConstants ;
import com.hw.common.core.domain.R ;
@ -10,6 +11,7 @@ import com.hw.common.core.utils.StringUtils;
import com.hw.common.core.utils.uuid.Seq ;
import com.hw.common.security.utils.SecurityUtils ;
import com.hw.mes.api.RemoteMesService ;
import com.hw.mes.api.domain.MesBaseBarcodeInfo ;
import com.hw.mes.api.domain.MesBaseMaterialInfo ;
import com.hw.mes.api.domain.vo.MesBaseMaterialInfoVo ;
import com.hw.wms.domain.* ;
@ -196,7 +198,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
JSONObject returnJson = new JSONObject ( ) ;
returnJson . put ( "auditStatus" , auditStatus ) ;
//审核不通过,需要有审核意见,并且需要更新库位占用数量 。
//审核不通过,需要有审核意见,并且需要更新库位占用数量 (解除之前占用的数量) 。
if ( auditStatus . equalsIgnoreCase ( WmsConstants . RAW_OUTSTOCK_AUDIT_STATUS_FAIL ) ) {
if ( StringUtils . isEmpty ( auditReason ) ) {
throw new ServiceException ( "请输入审核意见" ) ;
@ -224,20 +226,20 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
} ) ;
} else {
//如果操作类型是agv, 需要 返回具体任务信息给上位机,由上位机通知 WCS调度agv
if ( wmsRawOutstock . getOperationType ( ) . equals ( WmsConstants . WMS_OPERATION_TYPE_AUTO ) ) {
JSONArray agvTasks = new JSONArray ( ) ;
List < WmsRawOutstockDetail > wmsRawOutstockDetails = wmsRawOutstock . getWmsRawOutstockDetailList ( ) ;
wmsRawOutstockDetails . forEach ( wmsRawOutstockDetail - > {
//todo:双排库,先出前排,再出后排,如果前排有挡住的需要移库锁库等,按顺序下发任务
JSONObject agvTask = new JSONObject ( ) ;
agvTask . put ( "stationId" , wmsRawOutstock . getStationId ( ) ) ;
agvTask . put ( "locationCode" , wmsRawOutstockDetail . getLocationCode ( ) ) ;
agvTask . put ( "planAmount" , wmsRawOutstockDetail . getPlanAmount ( ) ) ;
agvTasks . add ( agvTask ) ;
} ) ;
returnJson . put ( "agvTasks" , agvTasks . toString ( ) ) ;
}
//如果操作类型是agv, 需要 WCS轮询获取任务去 调度agv
// if (wmsRawOutstock.getOperationType().equals(WmsConstants.WMS_OPERATION_TYPE_AUTO)) {
// JSONArray agvTasks = new JSONArray();
// List<WmsRawOutstockDetail> wmsRawOutstockDetails = wmsRawOutstock.getWmsRawOutstockDetailList();
// wmsRawOutstockDetails.forEach(wmsRawOutstockDetail -> {
// //todo:双排库,先出前排,再出后排,如果前排有挡住的需要移库锁库等,按顺序下发任务
// JSONObject agvTask = new JSONObject();
// agvTask.put("stationId", wmsRawOutstock.getStationId());
// agvTask.put("locationCode", wmsRawOutstockDetail.getLocationCode());
// agvTask.put("planAmount", wmsRawOutstockDetail.getPlanAmount());
// agvTasks.add(agvTask);
// });
// returnJson.put("agvTasks", agvTasks.toString());
// }
}
wmsRawOutstockMapper . updateWmsRawOutstock ( wmsRawOutstock ) ;
@ -257,17 +259,35 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
public int confirmWmsRawOutstock ( WmsRawOutstockConfirmVo wmsRawOutstockConfirmVo ) {
Long rawOutstockDetailId = wmsRawOutstockConfirmVo . getRawOutstockDetailId ( ) ;
String locationCode = wmsRawOutstockConfirmVo . getLocationCode ( ) ;
String instockBatch = wmsRawOutstockConfirmVo . getInstockBatch ( ) ;
String materialBarcode = wmsRawOutstockConfirmVo . getInstockBatch ( ) ; //在此是物料条码,不是批次码
R < MesBaseBarcodeInfo > baseBarcodeInfoR = remoteMesService . getBarcode ( materialBarcode , SecurityConstants . INNER ) ;
MesBaseBarcodeInfo baseBarcodeInfo = baseBarcodeInfoR . getData ( ) ;
if ( baseBarcodeInfo = = null ) {
throw new ServiceException ( "物料编码有误" ) ;
}
BigDecimal outstockAmount = wmsRawOutstockConfirmVo . getOutstockAmount ( ) ;
if ( outstockAmount . compareTo ( BigDecimal . ZERO ) < = 0 ) {
throw new ServiceException ( "数量需大于0" ) ;
}
String batchFlag = baseBarcodeInfo . getBatchFlag ( ) ;
if ( ! batchFlag . equals ( MesConstants . IS_BATCH ) ) { //如果不是批次
if ( outstockAmount . compareTo ( BigDecimal . ONE ) ! = 0 ) {
throw new ServiceException ( "非批次物料数量需等于1" ) ;
}
}
//判断是否有此出库任务,人工出库的同一个出库记录, 同一个库位、同一个物料对应一个明细( agv的有可能是多个)
WmsRawOutstockDetail queryRawOutstockDetail = new WmsRawOutstockDetail ( ) ;
queryRawOutstockDetail . setLocationCode ( locationCode ) ;
queryRawOutstockDetail . setInstockBatch ( instockBatch ) ;
queryRawOutstockDetail . setInstockBatch ( baseBarcodeInfo . getBatchCode ( ) ) ;
queryRawOutstockDetail . setExecuteStatusStr ( WmsConstants . WMS_EXECUTE_STATUS_TOEXECUTE + "," + WmsConstants . WMS_EXECUTE_STATUS_EXECUTING ) ;
queryRawOutstockDetail . setAuditStatus ( WmsConstants . WMS_AUDIT_STATUS_PASS ) ;
List < WmsRawOutstockDetail > wmsRawOutstockDetails = wmsRawOutstockDetailMapper . selectWmsRawOutstockDetailList ( queryRawOutstockDetail ) ;
WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail ( ) ;
WmsRawOutstockDetail wmsRawOutstockDetail ;
if ( wmsRawOutstockDetails = = null | | wmsRawOutstockDetails . isEmpty ( ) ) {
throw new ServiceException ( "没有此出库任务" ) ;
} else if ( wmsRawOutstockDetails . size ( ) > 1 ) {
} else if ( wmsRawOutstockDetails . size ( ) > 1 ) { //如果有同一库位, 同一批次多次领料申请( 比方说张三领料批次A库位A3个, 李四领取批次A库位A4个, 此时就需要选择)
if ( rawOutstockDetailId = = null ) {
throw new ServiceException ( "请选择具体出库任务后点击确认" ) ;
} else {
@ -277,11 +297,11 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
wmsRawOutstockDetail = wmsRawOutstockDetails . get ( 0 ) ;
}
// 判断质检状态
if ( wmsRawOutstockDetail . getQualityStatus ( ) ! = null
& & ! wmsRawOutstockDetail . getQualityStatus ( ) . equals ( WmsConstants . WMS_QUALITY_STATUS_PASS ) ) {
throw new ServiceException ( "质检通过才能出库" ) ;
}
// todo 判断质检状态
// if (wmsRawOutstockDetail.getQualityStatus() != null
// && !wmsRawOutstockDetail.getQualityStatus().equals(WmsConstants.WMS_QUALITY_STATUS_PASS)) {
// throw new ServiceException("质检通过才能出库");
// }
// 判断本次出库数量+已出库数量是否大于计划出库数量
BigDecimal hadOutstockAmount = wmsRawOutstockDetail . getOutstockAmount ( ) = = null ? BigDecimal . ZERO : wmsRawOutstockDetail . getOutstockAmount ( ) ;
@ -289,12 +309,12 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
BigDecimal updatedOutstockAmount = hadOutstockAmount . add ( outstockAmount ) ;
if ( updatedOutstockAmount . compareTo ( planOutstockAmount ) > 0 ) {
throw new ServiceException ( "出库数量不能大于" + planOutstockAmount );
throw new ServiceException ( "出库数量不能大于" + planOutstockAmount .subtract ( hadOutstockAmount ) );
}
wmsRawOutstockDetail . setOutstockAmount ( updatedOutstockAmount ) ;
String executeStatus = "" ;
if ( updatedOutstockAmount . compareTo ( planOutstockAmount ) = = 0 ) {
if ( updatedOutstockAmount . compareTo ( planOutstockAmount ) = = 0 ) { //如果已出完
executeStatus = WmsConstants . WMS_EXECUTE_STATUS_FINISH ;
//更新出库记录执行状态
this . updateRawOutstockDetailExecuteStatus ( wmsRawOutstockDetail . getRawOutstockId ( ) ,
@ -318,9 +338,9 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
}
//更新原材料库存占用数量和总数量
WmsRawStock wmsRawStock = wmsRawStockMapper . selectRawStockByLocationAndBatch ( locationCode , instockBatch ) ;
WmsRawStock wmsRawStock = wmsRawStockMapper . selectRawStockByLocationAndBatch ( locationCode , baseBarcodeInfo. getBatchCode ( ) ) ;
if ( wmsRawStock = = null ) {
throw new ServiceException ( " 数据异常 ") ;
throw new ServiceException ( " 没找到库存信息 ") ;
} else {
BigDecimal totalAmount = wmsRawStock . getTotalAmount ( ) = = null ? BigDecimal . ZERO : wmsRawStock . getTotalAmount ( ) ;
BigDecimal occupyAmount = wmsRawStock . getOccupyAmount ( ) = = null ? BigDecimal . ZERO : wmsRawStock . getOccupyAmount ( ) ;
@ -337,7 +357,6 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
wmsRawOutstockDetailMapper . updateWmsRawOutstockDetail ( wmsRawOutstockDetail ) ;
//todo 同步erp
return 1 ;
}
@ -407,10 +426,10 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
List < WmsRawOutstockDetail > toUpdatedRawOutstockDetails = new ArrayList < > ( ) ;
Date currentDate = new Date ( ) ;
String userName = SecurityUtils . getUsername ( ) ;
rawOutstockDetails . forEach ( rawOutstockDetail - > {
BigDecimal planAmount = rawOutstockDetail . getPlanAmount ( ) = = null ? BigDecimal . ZERO : rawOutstockDetail . getPlanAmount ( ) ;
rawOutstockDetails . forEach ( rawOutstockDetail - > {
BigDecimal planAmount = rawOutstockDetail . getPlanAmount ( ) = = null ? BigDecimal . ZERO : rawOutstockDetail . getPlanAmount ( ) ;
Long materialId = rawOutstockDetail . getMaterialId ( ) ;
if ( planAmount . compareTo ( BigDecimal . ZERO ) > 0 ) {
if ( planAmount . compareTo ( BigDecimal . ZERO ) > 0 ) {
BigDecimal realRawStock = BigDecimal . ZERO ; //实际库存总量
WmsRawStock queryRawStock = new WmsRawStock ( ) ;
queryRawStock . setWarehouseId ( warehouseId ) ;
@ -488,15 +507,15 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
//出库要求 ( 0申请出库, 1申请审核出库, 2直接出库)
String outRequirement = warehouse . getOutRequirement ( ) ;
String auditStatus = WmsConstants . WMS_AUDIT_STATUS_PASS ;
if ( outRequirement . equals ( WmsConstants . WMS_WAREHOUSE_OUT_REQUIREMENT_APPLY_AUDIT ) ) {
if ( outRequirement . equals ( WmsConstants . WMS_WAREHOUSE_OUT_REQUIREMENT_APPLY_AUDIT ) ) {
wmsRawOutstock . setAuditStatus ( WmsConstants . RAW_OUTSTOCK_AUDIT_STATUS_TOAUDIT ) ;
wmsRawOutstock . setExecuteStatus ( WmsConstants . WMS_EXECUTE_STATUS_TOEXECUTE ) ;
} else {
} else {
wmsRawOutstock . setAuditStatus ( WmsConstants . WMS_AUDIT_STATUS_PASS ) ;
wmsRawOutstock . setExecuteStatus ( WmsConstants . WMS_EXECUTE_STATUS_FINISH ) ;
}
wmsRawOutstock . setTaskCode ( Seq . getId ( Seq . rawOutstockSeqType , Seq . rawOutstockSeqCode ) ) ;
wmsRawOutstock . setTaskCode ( Seq . getId ( Seq . rawOutstockSeqType , Seq . rawOutstockSeqCode ) ) ;
wmsRawOutstock . setStationId ( SecurityUtils . getStationId ( ) ) ;
wmsRawOutstock . setOperationType ( operationType ) ;
@ -525,6 +544,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
private WmsRawOutstockDetail getWmsRawOutstockDetail ( WmsRawStock wmsRawStock , Long materialId ,
BigDecimal availableAmount , Date currentDate , String userName , String outstockWay ) {
WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail ( ) ;
wmsRawOutstockDetail . setWarehouseId ( wmsRawStock . getWarehouseId ( ) ) ;
wmsRawOutstockDetail . setLocationCode ( wmsRawStock . getLocationCode ( ) ) ;
wmsRawOutstockDetail . setMaterialId ( materialId ) ;
wmsRawOutstockDetail . setInstockBatch ( wmsRawStock . getInstockBatch ( ) ) ;
@ -734,6 +754,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
/ * *
* 获 取 空 的 库 位
*
* @param warehouseId
* @return
* /
@ -747,6 +768,7 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
/ * *
* agv 拆 分 后 的 柜 体 返 库
*
* @param wmsAgvRawReturnVo
* /
public void agvReturn ( WmsAgvRawReturnVo wmsAgvRawReturnVo ) {
@ -756,4 +778,28 @@ public class WmsRawOutstockServiceImpl implements IWmsRawOutstockService {
// WmsConstants.WMS_RAW_STOCK_COMPLETE_FLAG_NO;
}
/ * *
* 查 询 原 材 料 出 库 记 录 列 表 , join warehouse
*
* @param wmsRawOutstock 原 材 料 出 库 记 录
* @return 原 材 料 出 库 记 录
* /
@Override
public List < WmsRawOutstock > selectWmsRawOutstockJoinList ( WmsRawOutstock wmsRawOutstock ) {
return wmsRawOutstockMapper . selectWmsRawOutstockJoinList ( wmsRawOutstock ) ;
}
/ * *
* 组 装 出 库
*
* @param wmsAssembleOutstockVo
* @return
* /
@Override
public int assembleOutstock ( WmsAssembleOutstockVo wmsAssembleOutstockVo ) {
return 1 ;
}
}