Kaynağa Gözat

完成出库任务生成

zhifei 1 yıl önce
ebeveyn
işleme
ef6c57592a

+ 20 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/WcsTaskController.java

@@ -128,7 +128,7 @@ public class WcsTaskController extends BaseController {
         int agvNo = 9999;
         WcsTask wcsTask = wcsTaskService.selectWcsTaskByTaskNo(taskNo);
         if (wcsTask == null) {
-           return AjaxResult.error("任务回调失败");
+            return AjaxResult.error("任务回调失败");
         }
         if (StringUtils.isNotEmpty(wcsTask.getAgvNo())) {
             agvNo = Integer.parseInt(wcsTask.getAgvNo());
@@ -202,6 +202,25 @@ public class WcsTaskController extends BaseController {
         return AjaxResult.success("下发充电任务成功");
     }
 
+    /**
+     * 根据单号创建出库任务
+     *
+     * @param wcsTask
+     * @return
+     */
+    @PostMapping("/createOutboundTaskByDoc")
+    public AjaxResult createOutboundTaskByDoc(@RequestBody WcsTask wcsTask) {
+        if (StringUtils.isEmpty(wcsTask.getWhNoFrom())) {
+            return AjaxResult.error("缺省单据编号");
+        }
+        if (StringUtils.isEmpty(wcsTask.getExt7())) {
+            return AjaxResult.error("缺省物料信息");
+        }
+        if (StringUtils.isEmpty(wcsTask.getLocationTo())) {
+            return AjaxResult.error("缺省目标库位");
+        }
+        return wcsTaskService.createOutboundTaskByDoc(wcsTask);
+    }
 
     public static class ToChargeForm {
         private Integer agvNo;

+ 14 - 2
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -166,7 +166,17 @@ public class BusinessServiceImpl implements IBusinessService {
                     locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, token);
                     wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
 
-                } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
+                } else if (flowConfigHeaderVO.getFlowType().equals("BATCHSO")) {
+                    AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
+                    List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
+                    HashMap<String, String> hashMap = JSON.parseObject(JSON.toJSONString(agvCall.getLotattDTO()), HashMap.class);
+                    List<BaseLocationInfo> locationFromList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdListOrderBy(zoneIdList
+                            , agvCallDTO.getWarehouseId(), hashMap, agvCall.getSku(), "lotatt04 - DATEDIFF (NOW() ,att.lotatt03)  , lotatt07");
+                    locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "SO", asnSoStrategy, token);
+                    locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, token);
+                    wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, agvCallDTO, token));
+
+                }else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
                     List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId(), null);
                     List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId(), null);
                     locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, token);
@@ -183,8 +193,10 @@ public class BusinessServiceImpl implements IBusinessService {
             return AjaxResult.success("任务下发成功");
         } catch (Exception e) {
             redisCache.unlockCacheObject(token); // 异常捕获的话就不能释放锁
-            throw new ServiceException(e.getMessage(), token);
+//            throw new ServiceException(e.getMessage(), token);
+            e.printStackTrace();
         }
+        return AjaxResult.error();
     }
 
     @Transactional

+ 1 - 1
warewms-ams/src/main/java/com/ruoyi/ams/locationView/service/LocationViewService.java

@@ -191,7 +191,7 @@ public class LocationViewService {
                     .stream()
                     .mapToInt(t -> t.getBaseLocationGuiDTOList().size())
                     .max()
-                    .getAsInt();
+                    .orElse(1);
             basLocationGuiColDTOList.stream().forEach(v -> {
                 int size = v.getBaseLocationGuiDTOList().size();
                 List<BaseLocationGuiDTO> locationGuiDTOList = v.getBaseLocationGuiDTOList();

+ 7 - 0
warewms-ams/src/main/java/com/ruoyi/ams/task/service/IWcsTaskService.java

@@ -175,4 +175,11 @@ public interface IWcsTaskService {
      * @return
      */
     AjaxResult moveStartingPointToDestination(WcsTask wcsTask);
+
+    /**
+     * 根据单号生成AGVchu任务
+     * @param wcsTask
+     * @return
+     */
+    AjaxResult createOutboundTaskByDoc(WcsTask wcsTask);
 }

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

@@ -1,14 +1,27 @@
 package com.ruoyi.ams.task.service.impl;
 
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import com.ruoyi.ams.agv.ndc.domain.AmsTask;
 import com.ruoyi.ams.agv.ndc.entity.CallbackResult;
 import com.ruoyi.ams.agv.ndc.service.IAmsTaskService;
+import com.ruoyi.ams.bionutrition.doc.dto.BionutritionDocBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.dto.detail.BionutritionDocDetailsBaseDTO;
+import com.ruoyi.ams.bionutrition.doc.service.BionutritionDocHeaderService;
 import com.ruoyi.ams.box.service.IWmsBoxInfoService;
+import com.ruoyi.ams.business.IBusinessService;
 import com.ruoyi.ams.config.domain.FlowConfigEvent;
+import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
+import com.ruoyi.ams.config.domain.dto.AgvCallItemDTO;
+import com.ruoyi.ams.config.domain.dto.LotattDTO;
 import com.ruoyi.ams.config.service.IFlowConfigEventService;
 import com.ruoyi.ams.inv.domain.InvLotAtt;
 import com.ruoyi.ams.inv.domain.InvLotLocId;
@@ -18,13 +31,17 @@ import com.ruoyi.ams.inv.service.IInvLotLocIdService;
 import com.ruoyi.ams.task.dto.WcsTaskLocationDTO;
 import com.ruoyi.base.constant.Constant;
 import com.ruoyi.base.domain.BaseLocationInfo;
+import com.ruoyi.base.domain.vo.BaseLocationLotattVO;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.domain.BaseEntity;
 import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
 import com.ruoyi.hard.modbus.tcp.AutoDoorClient;
+import com.ruoyi.system.service.ISysConfigService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -66,6 +83,17 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     @Autowired
     private AutoDoorClient autoDoorClient;
 
+    @Autowired
+    private BionutritionDocHeaderService bionutritionDocHeaderService;
+
+    private List<String> outboundDocTypeList  = Arrays.asList("SaleOutboundOrder");
+
+    @Autowired
+    private ISysConfigService iSysConfigService;
+
+    @Autowired
+    private IBusinessService iBusinessService;
+
     //任务状态翻译
     private String codeConvert(int code) {
         switch (code) {
@@ -585,6 +613,51 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         return AjaxResult.success();
     }
 
+    /**
+     * 根据单号生成AGV出库任务
+     * @param wcsTask
+     * @return
+     */
+    @Override
+    public synchronized AjaxResult createOutboundTaskByDoc(WcsTask wcsTask) {
+        //校验单号
+        BionutritionDocBaseDTO bionutritionDocBaseDTO = bionutritionDocHeaderService.selectDocByDocNo(wcsTask.getWhNoFrom());
+        if (ObjectUtil.isEmpty(bionutritionDocBaseDTO)){
+           return AjaxResult.error("单据不存在");
+        }
+        if(!outboundDocTypeList.contains(bionutritionDocBaseDTO.getBionutritionDocHeaderBaseDTO().getDocType())){
+            return AjaxResult.error("该单据不是出库单据");
+        }
+        String skuCode = null;
+        for (BionutritionDocDetailsBaseDTO bionutritionDocDetailsBaseDTO : bionutritionDocBaseDTO.getBionutritionDocDetailsBaseDTOList()) {
+           if(wcsTask.getExt7().equals( bionutritionDocDetailsBaseDTO.getSkuCode())){
+               skuCode = bionutritionDocDetailsBaseDTO.getSkuCode();
+           }
+        }
+        if (StringUtils.isEmpty(skuCode)){
+            return AjaxResult.error("该单据不存在该物料信息!");
+        }
+
+        Long flowId = 0L;
+        for (Object o : JSONUtil.parseArray(iSysConfigService.selectConfigByKey("sys.docType.corresponding.business"))) {
+            JSONObject entries = JSONUtil.parseObj(o.toString());
+            if (bionutritionDocBaseDTO.getBionutritionDocHeaderBaseDTO().getDocType().equals(entries.get("docType"))){
+                flowId = Long.parseLong(entries.get("flowId").toString());
+            }
+        }
+        if (flowId==0){
+            return AjaxResult.error("未找到对应的任务下发流程!");
+        }
+        List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
+        AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+        agvCallItemDTO.setSku(wcsTask.getExt7());
+        agvCallItemDTOList.add(agvCallItemDTO);
+        AgvCallDTO agvCallDTO = new AgvCallDTO();
+        agvCallDTO.setLocationTo(wcsTask.getLocationTo());
+        agvCallDTO.setAgvCallItemDTOList(agvCallItemDTOList);
+        return iBusinessService.agvCall(flowId, agvCallDTO);
+    }
+
     /**
      * 修改库存出入库标记
      *