ChenYang пре 1 година
родитељ
комит
7a949bdebb

+ 16 - 9
ruoyi-admin/src/main/java/com/ruoyi/xuankuang/controller/PdaAgvCallController.java

@@ -1,19 +1,17 @@
 package com.ruoyi.xuankuang.controller;
 
-import com.ruoyi.ams.inv.service.IInvLotLocIdService;
-import com.ruoyi.ams.xuankuang.domain.form.AgvCallForm;
 import com.ruoyi.ams.xuankuang.service.AgvCallProxyService;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.StringUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.aspectj.weaver.loadtime.Aj;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import java.math.BigDecimal;
 
 /**
  * @author Jwk
@@ -31,7 +29,6 @@ public class PdaAgvCallController {
     private AgvCallProxyService agvCallProxyService;
 
 
-
     @ApiOperation("桶装入库")
     @PostMapping("/bucketIntoStorage")
     public AjaxResult bucketIntoStorage(@RequestParam String palletNo, @RequestParam String materialType,
@@ -47,9 +44,19 @@ public class PdaAgvCallController {
      */
     @ApiOperation("桶装出库")
     @PostMapping("/bucketOutOfStorage")
-    public AjaxResult bucketOutOfStorage(@RequestParam String palletNo, @RequestParam String materialType,
-                                          @RequestParam String targetLocationId, @RequestParam  Double quantity) {
+    public AjaxResult bucketOutOfStorage(@RequestParam String materialType, @RequestParam String targetLocationId,
+                                         @RequestParam  Double quantity) {
         agvCallProxyService.bucketOutOfStorage(materialType, targetLocationId, quantity);
         return AjaxResult.success("桶装出库下发任务成功");
     }
+
+
+    @ApiOperation("桶装越库")
+    @PostMapping("/bucketCrossStorage")
+    public AjaxResult bucketCrossStorage(@RequestParam String palletNo, @RequestParam String materialType,
+                                         @RequestParam String sourceLocationId, @RequestParam String targetLocationId,
+                                         @RequestParam Double quantity) {
+        agvCallProxyService.bucketCrossStorage(palletNo, materialType, sourceLocationId, targetLocationId, quantity);
+        return AjaxResult.success("桶装出库下发任务成功");
+    }
 }

+ 1 - 1
ruoyi-admin/src/main/resources/application-prod.yml

@@ -100,7 +100,7 @@ modbus:
             open: true
             host: 192.168.100.136
             port: 502
-        third:
+        third: #皮带线
             open: true
             host: 192.168.100.71
             port: 502

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java

@@ -398,7 +398,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
                         // 将起始点库存移动到中间缓存位
                         moveStartingPointToMiddleCache(wcsTask);
                         //agv回调wcs取货完成
-                        wmsDocAsnSubService.wmsAgvCallbackOutTaskByTaskNo(taskNo);
+                        wmsDocAsnSubService.wmsAgvCallbackOuttask(taskNo);
                         //释放redis锁
                         if (!StringUtils.isEmpty(wcsTask.getExt8())) {
                             redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()), wcsTask.getLocationFrom());

+ 89 - 25
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/AgvCallProxyService.java

@@ -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));

+ 40 - 3
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WcsTaskSubService.java

@@ -95,13 +95,45 @@ public class WcsTaskSubService {
 
 
 
+    public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo
+            , String asnNo, String palletNo, String wcsNo, Long state, String remake) {
+
+        BaseLocationInfo baseLocationInfoFrom = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationFrom, 1l);
+        BaseLocationInfo baseLocationInfoTo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, 1l);
+
+        WcsTask wcsTask = new WcsTask();
+        wcsTask.setTaskNo(taskNo);
+        wcsTask.setState(state);
+        wcsTask.setTaskType(Constant.TASK_TYPE.FORWARD.getValue());
+        wcsTask.setBusinessType("01");
+        wcsTask.setAreaFrom(baseLocationInfoFrom.getZoneId().toString());
+        wcsTask.setLocationFrom(baseLocationInfoFrom.getId().toString());
+        wcsTask.setAreaTo(baseLocationInfoTo.getZoneId().toString());
+        wcsTask.setLocationTo(baseLocationInfoTo.getId().toString());
+        wcsTask.setCreateTime(new Date());
+        wcsTask.setCreateBy("Wcs");
+        wcsTask.setShopId(Constant.WAREHOUSE_ID.toString());
+        wcsTask.setPriority(10L);
+        wcsTask.setExt1(asnNo);
+        wcsTask.setExt2(palletNo);
+        wcsTask.setExt3(wcsNo);
+        wcsTask.setRemark(remake);
+        if (iWcsTaskService.insertWcsTask(wcsTask) > 0) {
+            iBaseLocationInfoService.lockLocationStockStatus(Long.valueOf(wcsTask.getLocationFrom())
+                    , Long.valueOf(wcsTask.getLocationTo())
+                    , Constant.WAREHOUSE_ID, "Wcs");
+            return AjaxResult.success("任务增加成功!", taskNo);
+        }
+        return AjaxResult.error("任务增加失败");
+    }
+
     /**
      * 增加一个wcs任务
      *
      * @return
      */
-    public AjaxResult addWcsTask(String taskNo, String locationFrom, String locationTo
-            , String asnNo, String palletNo, String wcsNo, Long state, String remake) {
+    public AjaxResult addCrossWcsTask(String taskNo, String locationFrom, String locationTo
+            , String asnNo, String palletNo, String orderNo, Long state, String remake) {
 
         BaseLocationInfo baseLocationInfoFrom = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationFrom, 1l);
         BaseLocationInfo baseLocationInfoTo = iBaseLocationInfoService.selectBaseLocationInfoByIdOrNo(locationTo, 1l);
@@ -121,7 +153,7 @@ public class WcsTaskSubService {
         wcsTask.setPriority(10L);
         wcsTask.setExt1(asnNo);
         wcsTask.setExt2(palletNo);
-        wcsTask.setExt3(wcsNo);
+        wcsTask.setExt3(orderNo);
         wcsTask.setRemark(remake);
         if (iWcsTaskService.insertWcsTask(wcsTask) > 0) {
             iBaseLocationInfoService.lockLocationStockStatus(Long.valueOf(wcsTask.getLocationFrom())
@@ -138,6 +170,11 @@ public class WcsTaskSubService {
         return addWcsTask(taskNo, locationFrom, locationTo, orderNo, palletNo, StringUtils.EMPTY, state, remark);
     }
 
+    public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
+            , String orderNo, Long state, String remark) {
+        return addWcsOutTask(taskNo, locationFrom, locationTo, orderNo, StringUtils.EMPTY, state, remark);
+    }
+
 
     public AjaxResult addWcsOutTask(String taskNo, String locationFrom, String locationTo
             , String orderNo, String palletNo) {

+ 0 - 17
warewms-ams/src/main/java/com/ruoyi/ams/xuankuang/service/WmsDocAsnSubService.java

@@ -1,12 +1,10 @@
 package com.ruoyi.ams.xuankuang.service;
 
-import cn.hutool.core.util.ObjectUtil;
 import com.ruoyi.ams.asn.domain.WmsDocAsnDetails;
 import com.ruoyi.ams.asn.domain.WmsDocAsnHeader;
 import com.ruoyi.ams.asn.mapper.WmsDocAsnHeaderMapper;
 import com.ruoyi.ams.asn.service.IWmsDocAsnDetailsService;
 import com.ruoyi.ams.asn.service.IWmsDocAsnHeaderService;
-import com.ruoyi.ams.task.domain.WcsTask;
 import com.ruoyi.ams.task.service.IWcsTaskService;
 import com.ruoyi.ams.xuankuang.domain.form.BillTaskForm;
 import com.ruoyi.ams.xuankuang.domain.vo.WcsResponseVo;
@@ -15,7 +13,6 @@ import com.ruoyi.base.domain.BaseSku;
 import com.ruoyi.base.service.IBaseSkuService;
 import com.ruoyi.base.utils.IdSequenceUtils;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -113,20 +110,6 @@ public class WmsDocAsnSubService {
 
     }
 
-    /**
-     * agv回调wcs取货完成
-     * @param taskNo
-     * @return
-     */
-    public void wmsAgvCallbackOutTaskByTaskNo(String taskNo){
-        WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(taskNo);
-        if(ObjectUtil.isNull(wcsTask) || StringUtils.isBlank(wcsTask.getExt3())){
-            log.info("task is not found, taskNo is {}, caused by : {}");
-            return;
-        }
-        wmsAgvCallbackOuttask(wcsTask.getExt3());
-    }
-
     /**
      * agv回调wcs卸货完成
      * @param taskNo

+ 0 - 7
warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseLocationInfoServiceImpl.java

@@ -14,11 +14,9 @@ import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.base.utils.CommonUtils;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,10 +42,6 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
     private BaseLocationInfoMapper baseLocationInfoMapper;
     @Autowired
     private BaseLocationZoneMapper baseLocationZoneMapper;
-    @Autowired
-    private RedisCache redisCache;
-    @Autowired
-    private ISysConfigService sysConfigService;
 
     /**
      * 入库校验同列任务任务状态和阻挡
@@ -92,7 +86,6 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
      */
     public BaseLocationLotattDTO checkTheSameColumnLocation1(BaseLocationLotattDTO baseLocationLotattVO, List<BaseLocationLotattDTO> baseLocationList) {
 
-        if (CollectionUtil.isEmpty(baseLocationList)) return null;
 
         //查同列所有库位
         List<BaseLocationLotattDTO> baseLocationInfos = baseLocationInfoMapper.queryByListInUserdeFine1(baseLocationLotattVO);