|
@@ -84,8 +84,11 @@ public class AgvCallProxyService {
|
|
|
private IWcsTaskService iWcsTaskService;
|
|
|
|
|
|
/**
|
|
|
- * 桶装入库
|
|
|
- * @return
|
|
|
+ * 主方法:桶装入库
|
|
|
+ * @param palletNo 入库托盘号
|
|
|
+ * @param materialType 物料类型 丁胺黑药类型:5
|
|
|
+ * @param agvSourceLocationId agv的起始点位
|
|
|
+ * @param quantity 数量
|
|
|
*/
|
|
|
@Transactional(rollbackFor = RuntimeException.class)
|
|
|
public void bucketIntoStorage(String palletNo, String materialType,
|
|
@@ -98,7 +101,7 @@ public class AgvCallProxyService {
|
|
|
BigDecimal quantityDecimal = new BigDecimal(quantity);
|
|
|
|
|
|
//2. 获取agv的库位,并创建agv的wcs任务
|
|
|
- String agvTargetLocationId = String.valueOf(getAgvTargetLocationId("bucketLocationIdList"));
|
|
|
+ String agvTargetLocationId = String.valueOf(getAgvLocationId("bucketLocationIdList"));
|
|
|
String agvTaskNo = IdWorker.getIdStr();
|
|
|
wcsTaskSubService.addWcsTask(agvTaskNo, agvSourceLocationId, agvTargetLocationId,
|
|
|
asnNo, palletNo, Constant.TASK_STS.TASK_CREATE.getLongValue(), "agv入库任务下发");
|
|
@@ -125,29 +128,44 @@ public class AgvCallProxyService {
|
|
|
}
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 主方法:桶装出库
|
|
|
+ * @param materialType 物料类型,丁胺黑药默认传5
|
|
|
+ * @param targetLocationId 出库的最终目标库位
|
|
|
+ * @param quantity 数量 不能大于4
|
|
|
+ */
|
|
|
@Transactional(rollbackFor = RuntimeException.class)
|
|
|
public void bucketOutOfStorage(String materialType, String targetLocationId, Double quantity) {
|
|
|
+
|
|
|
+ //1.预备参数设置
|
|
|
BaseSku baseSku = iBaseSkuService.selectBaseSkuByMaterialType(materialType);
|
|
|
Assert.isTrue(ObjectUtil.isNotNull(baseSku) && StringUtils.isNotBlank(baseSku.getSku()), "the materialType is illegal");
|
|
|
String orderNo = idSequenceUtils.generateId(Constant.ID_TYPE.ORDERNO.getDesc());
|
|
|
Assert.isTrue(ObjectUtil.isNotNull(quantity) && quantity > 0, "quantity is illegal");
|
|
|
BigDecimal quantityDecimal = new BigDecimal(quantity);
|
|
|
|
|
|
- WmsDocOrderHeader docOrderHeader = iWmsDocOrderHeaderService.createOrderHeader(orderNo, Constant.ORDER_TYP.TZ.getValue(), Constant.ORDER_STS.STS00.getValue());
|
|
|
- WmsDocOrderDetails docOrderDetail = iWmsDocOrderDetailsService.createOrderDetail(orderNo, baseSku.getSku(), quantityDecimal);
|
|
|
+ //2. 获取agv的库位,并创建agv的wcs任务
|
|
|
+ String agvSourceLocationId = String.valueOf(getAgvLocationId("bucketLocationIdList"));
|
|
|
+ String agvTaskNo = IdWorker.getIdStr();
|
|
|
+ wcsTaskSubService.addWcsOutTask(agvTaskNo, agvSourceLocationId, targetLocationId,
|
|
|
+ orderNo, Constant.TASK_STS.TASK_CREATE.getLongValue(), "agv出库任务下发");
|
|
|
|
|
|
+ //3.出库单创建
|
|
|
+ WmsDocOrderHeader docOrderHeader =
|
|
|
+ iWmsDocOrderHeaderService.createOrderHeader(orderNo, Constant.ORDER_TYP.TZ.getValue(), Constant.ORDER_STS.STS00.getValue());
|
|
|
+ WmsDocOrderDetails docOrderDetail =
|
|
|
+ iWmsDocOrderDetailsService.createOrderDetail(orderNo, baseSku.getSku(), quantityDecimal);
|
|
|
+
|
|
|
+ //4. 根据出库单进行出库任务下发,通知wcs并生成wcs任务;改变订单的状态
|
|
|
List<BaseLocationLotattDTO> baseLocationLotattList = wmsDocOrderSubService.addConfirmAllocationAuto(orderNo);
|
|
|
List<BaseLocationLotattDTO> filteredBaseLocationLotattList = wmsDocOrderSubService.filterInv(baseLocationLotattList, orderNo);
|
|
|
Assert.isTrue(CollectionUtil.isNotEmpty(filteredBaseLocationLotattList), "filteredBaseLocationLotattList is empty");
|
|
|
-
|
|
|
//int errorCount = 0;
|
|
|
- for (BaseLocationLotattDTO baseLocationLotatt : filteredBaseLocationLotattList){
|
|
|
+ for (BaseLocationInfo baseLocationInfo : filteredBaseLocationLotattList){
|
|
|
+ //每个推荐的出库库存都创建一个wcs任务,agv的起始点则是wcs任务的目标点位
|
|
|
String taskNo = idSequenceUtils.generateId(Constant.ID_TYPE.LOTNUMBER.getDesc());
|
|
|
- String locationInfoId = String.valueOf(baseLocationLotatt.getId());
|
|
|
- //每个推荐的出库库存都创建一个wcs任务
|
|
|
- wcsTaskSubService.addWcsOutTask(taskNo, locationInfoId, Constant.DRUM_CONNECTORS.toString(), orderNo);
|
|
|
- OutTaskForm outTaskForm = assemblyOutTaskForm(orderNo, taskNo, baseSku.getSkuType(), materialType, quantity, baseLocationLotatt);
|
|
|
- WcsResponseVo wcsResponseVo = wmsToWcsApiService.wmsOutTask(outTaskForm);
|
|
|
+ //通知wcs的桶装出库的任务
|
|
|
+ WcsResponseVo wcsResponseVo = noticeBucketOutLocTask(taskNo, agvSourceLocationId, orderNo, materialType, quantity, baseLocationInfo);
|
|
|
if (!wcsResponseVo.isSuccess()) {
|
|
|
//errorCount++;
|
|
|
docOrderHeader.setRemark(wcsResponseVo.getMessage());
|
|
@@ -160,20 +178,38 @@ public class AgvCallProxyService {
|
|
|
docOrderDetail.setLineStatus(Constant.ASN_STS.STS10.getValue());
|
|
|
iWmsDocOrderDetailsService.updateWmsDocOrderDetails(docOrderDetail);
|
|
|
iWmsDocOrderHeaderService.updateWmsDocOrderHeader(docOrderHeader);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- private OutTaskForm assemblyOutTaskForm(String orderNo, String taskNo, String skuType, String materialType, Double quantity, BaseLocationLotattDTO baseLocationLotatt) {
|
|
|
- OutTaskForm outTaskForm = new OutTaskForm();
|
|
|
- outTaskForm.setDocNo(orderNo);
|
|
|
- outTaskForm.setTaskNo(taskNo);
|
|
|
- outTaskForm.setRow(Integer.valueOf(baseLocationLotatt.getRowIndex()));
|
|
|
- outTaskForm.setCol(Integer.parseInt(baseLocationLotatt.getRowNo()));
|
|
|
- outTaskForm.setFloor(Integer.parseInt(baseLocationLotatt.getShiftNo()));
|
|
|
- outTaskForm.setPackageType(Integer.valueOf(skuType));
|
|
|
- outTaskForm.setMaterial(Integer.valueOf(materialType));
|
|
|
- outTaskForm.setTotal(quantity.intValue());
|
|
|
- return outTaskForm;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 主方法:桶装越库
|
|
|
+ * @param palletNo 托盘号
|
|
|
+ * @param materialType 物料类型 丁胺黑药类型5
|
|
|
+ * @param sourceLocationId 起始库位
|
|
|
+ * @param targetLocationId 目标库位
|
|
|
+ * @param quantity 数量 不大于4
|
|
|
+ */
|
|
|
+ public void bucketCrossStorage(String palletNo, String materialType, String sourceLocationId, String targetLocationId, Double quantity) {
|
|
|
+ //1.预备参数设置
|
|
|
+ Assert.isTrue(ObjectUtil.isNotNull(quantity) && quantity > 0, "quantity is illegal");
|
|
|
+ BaseSku baseSku = iBaseSkuService.selectBaseSkuByMaterialType(materialType);
|
|
|
+ Assert.isTrue(ObjectUtil.isNotNull(baseSku) && StringUtils.isNotBlank(baseSku.getSku()), "the materialType is illegal");
|
|
|
+ BigDecimal quantityDecimal = new BigDecimal(quantity);
|
|
|
+
|
|
|
+ //2.入库单创建
|
|
|
+ String asnNo = idSequenceUtils.generateId(Constant.ID_TYPE.ASNNO.getDesc());
|
|
|
+ iWmsDocAsnHeaderService.createAsnHeader(asnNo, Constant.ASN_TYP.TZ.getValue(), Constant.ASN_STS.STS10.getValue());
|
|
|
+ iWmsDocAsnDetailsService.createAsnDetail(asnNo, baseSku.getSku(), quantityDecimal);
|
|
|
+
|
|
|
+ //3.出库单创建
|
|
|
+ String orderNo = idSequenceUtils.generateId(Constant.ID_TYPE.ORDERNO.getDesc());
|
|
|
+ iWmsDocOrderHeaderService.createOrderHeader(orderNo, Constant.ORDER_TYP.TZ.getValue(), Constant.ORDER_STS.STS10.getValue());
|
|
|
+ iWmsDocOrderDetailsService.createOrderDetail(orderNo, baseSku.getSku(), quantityDecimal);
|
|
|
+
|
|
|
+ //2. 获取agv的库位,并创建agv的wcs任务
|
|
|
+ String agvTaskNo = IdWorker.getIdStr();
|
|
|
+ wcsTaskSubService.addCrossWcsTask(agvTaskNo, sourceLocationId, targetLocationId,
|
|
|
+ asnNo, palletNo, orderNo, Constant.TASK_STS.TASK_WAIT.getLongValue(), "agv越库任务下发");
|
|
|
}
|
|
|
|
|
|
|
|
@@ -200,6 +236,19 @@ public class AgvCallProxyService {
|
|
|
return iBusinessService.agvCall(Constant.FLOW_CONFIG_ID.ONE.getValue(), agvCallDTO);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ private WcsResponseVo noticeBucketOutLocTask(String taskNo, String bucketCacheLocationId, String orderNo, String materialType, Double quantity, BaseLocationInfo baseLocationInfo) {
|
|
|
+ BaseSku baseSku = iBaseSkuService.selectBaseSkuByMaterialType(materialType);
|
|
|
+ Assert.isTrue(ObjectUtil.isNotNull(baseSku), "baseSku is null");
|
|
|
+ //1.生成一个wcs任务
|
|
|
+ String locationInfoId = String.valueOf(baseLocationInfo.getId());
|
|
|
+ wcsTaskSubService.addWcsOutTask(taskNo, locationInfoId, bucketCacheLocationId, orderNo);
|
|
|
+ //4.组装wcs任务请求参数并同步当前的wcs任务
|
|
|
+ OutTaskForm outTaskForm = assemblyOutTaskForm(taskNo, orderNo, baseSku.getSkuType(), materialType, quantity, baseLocationInfo);
|
|
|
+ return wmsToWcsApiService.wmsOutTask(outTaskForm);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
private WcsResponseVo noticeBucketIntoLocTask(String taskNo, String bucketCacheLocationId, String asnNo, String palletNo, String materialType, Double quantity) {
|
|
|
|
|
|
BaseSku baseSku = iBaseSkuService.selectBaseSkuByMaterialType(materialType);
|
|
@@ -218,6 +267,21 @@ public class AgvCallProxyService {
|
|
|
}
|
|
|
|
|
|
|
|
|
+
|
|
|
+ private OutTaskForm assemblyOutTaskForm(String taskNo, String orderNo, String skuType, String materialType, Double quantity, BaseLocationInfo baseLocationInfo) {
|
|
|
+ OutTaskForm outTaskForm = new OutTaskForm();
|
|
|
+ outTaskForm.setDocNo(orderNo);
|
|
|
+ outTaskForm.setTaskNo(taskNo);
|
|
|
+ outTaskForm.setRow(Integer.valueOf(baseLocationInfo.getRowIndex()));
|
|
|
+ outTaskForm.setCol(Integer.parseInt(baseLocationInfo.getRowNo()));
|
|
|
+ outTaskForm.setFloor(Integer.parseInt(baseLocationInfo.getShiftNo()));
|
|
|
+ outTaskForm.setPackageType(Integer.valueOf(skuType));
|
|
|
+ outTaskForm.setMaterial(Integer.valueOf(materialType));
|
|
|
+ outTaskForm.setTotal(quantity.intValue());
|
|
|
+ return outTaskForm;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
private AgvInTaskForm assemblyAgvInTaskForm(String taskNo, String asnNo, String materialType, Double quantity, String palletNo, BaseLocationInfo baseLocationInfo) {
|
|
|
AgvInTaskForm agvInTaskForm = new AgvInTaskForm();
|
|
|
agvInTaskForm.setTaskNo(taskNo);
|
|
@@ -233,7 +297,7 @@ public class AgvCallProxyService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private Long getAgvTargetLocationId(String subSceneCode) {
|
|
|
+ private Long getAgvLocationId(String subSceneCode) {
|
|
|
List<Long> bucketLocationIdList = iWcsTaskService.getBucketLocationIdList(subSceneCode);
|
|
|
Assert.isTrue(CollectionUtil.isNotEmpty(bucketLocationIdList), "bucketLocationIdList is empty");
|
|
|
BaseLocationInfo agvTargetLocationInfo = iBaseLocationInfoService.selectBaseLocationInfoById(bucketLocationIdList.get(0));
|