Parcourir la source

AGV批量呼叫修改

xiaoddyy123 il y a 3 ans
Parent
commit
c992596c9b
18 fichiers modifiés avec 471 ajouts et 363 suppressions
  1. 51 14
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/LineCallController.java
  2. 2 2
      ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java
  3. 67 55
      ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
  4. 6 0
      ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisKey.java
  5. 7 7
      ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java
  6. 5 6
      ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java
  7. 7 4
      ruoyi-ui/src/views/ams/lineCall/index.vue
  8. 121 87
      warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java
  9. 10 7
      warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java
  10. 12 46
      warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallDTO.java
  11. 15 0
      warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallItemDTO.java
  12. 59 34
      warewms-ams/src/main/java/com/ruoyi/ams/config/service/LocationAllocationStrategy.java
  13. 10 73
      warewms-ams/src/main/java/com/ruoyi/ams/lineCall/domain/form/LineCallForm.java
  14. 86 0
      warewms-ams/src/main/java/com/ruoyi/ams/lineCall/domain/form/LineCallListFrom.java
  15. 1 0
      warewms-ams/src/main/java/com/ruoyi/ams/lineCall/service/impl/LineCallServiceImpl.java
  16. 12 3
      warewms-ams/src/main/java/com/ruoyi/ams/task/service/impl/WcsTaskServiceImpl.java
  17. 0 7
      warewms-base/src/main/java/com/ruoyi/base/service/IBaseLocationInfoService.java
  18. 0 18
      warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseLocationInfoServiceImpl.java

+ 51 - 14
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/ams/LineCallController.java

@@ -1,24 +1,34 @@
 package com.ruoyi.web.controller.warewms.ams;
 
+import com.alibaba.fastjson.JSON;
 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.business.IBusinessService;
+import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
+import com.ruoyi.ams.config.service.IFlowConfigHeaderService;
 import com.ruoyi.ams.lineCall.domain.form.LineCallDetailsForm;
 import com.ruoyi.ams.lineCall.domain.form.LineCallForm;
+import com.ruoyi.ams.lineCall.domain.form.LineCallListFrom;
 import com.ruoyi.ams.lineCall.domain.vo.LineCallVO;
 import com.ruoyi.ams.lineCall.service.ILineCallService;
 import com.ruoyi.common.core.domain.AjaxResult;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by IntelliJ IDEA.
  * User: andy.qu
  * Date: 2022/3/7
  */
+@Slf4j
 @RestController
 @RequestMapping("/ams/agv")
 public class LineCallController {
@@ -27,6 +37,8 @@ public class LineCallController {
     private ILineCallService lineCallService;
     @Autowired
     private IBusinessService businessService;
+    @Autowired
+    private IFlowConfigHeaderService flowConfigHeaderService;
 
     @GetMapping(value = "/{id}")
     public LineCallVO choseFlow(@PathVariable("id") Long id) {
@@ -34,18 +46,39 @@ public class LineCallController {
     }
 
     @PostMapping("exec")
-    public AjaxResult exec(@RequestBody List<LineCallForm> lineCallForm) {
+    public AjaxResult exec(@RequestBody LineCallForm lineCallForm) {
+        //查询所属流程
+        FlowConfigHeaderVO flowConfigHeaderVO = flowConfigHeaderService.selectFlowConfigHeaderById(lineCallForm.getFlowId());
+        if (flowConfigHeaderVO == null) {
+            log.info("-----------指令查询不到对应的流程:" + JSON.toJSONString(lineCallForm));
+            return AjaxResult.error("指令查询不到对应的流程");
+        }
+
+        Map<String, AgvCallDTO> map = new HashMap<>();
         List<AgvCallDTO> list = new ArrayList<>();
-        for(LineCallForm lform : lineCallForm) {
-            AgvCallDTO agvCallDTO = new AgvCallDTO();
-            agvCallDTO.setLocationFrom(lform.getLocationFrom());
-            agvCallDTO.setLocationTo(lform.getLocationTo());
-            agvCallDTO.setSku(lform.getSku());
-            agvCallDTO.setWarehouseId(1L);//没用暂时写死
-            agvCallDTO.setQty(lform.getQty());
-            agvCallDTO.setSupplier(lform.getSupplier());
-            agvCallDTO.setWeight(lform.getWeight());
-            agvCallDTO.setId(lform.getId());
+        for (LineCallListFrom lform : lineCallForm.getLineCallList()) {
+            if (flowConfigHeaderVO.getFlowType().equals("ASN") && StringUtils.isEmpty(lform.getLocationFrom())) {
+                return AjaxResult.error("入库任务必须选择起始库位");
+            }
+            AgvCallDTO agvCallDTO;
+            if (map.containsKey(lform.getLocationFrom() + "-" + lform.getLocationTo())) {
+                agvCallDTO = map.get(lform.getLocationFrom() + "-" + lform.getLocationTo());
+            } else {
+                agvCallDTO = new AgvCallDTO();
+                agvCallDTO.setWarehouseId(1L);//没用暂时写死
+                agvCallDTO.setLocationFrom(lform.getLocationFrom());
+                agvCallDTO.setLocationTo(lform.getLocationTo());
+                agvCallDTO.setId(lform.getId());
+            }
+            AgvCallItemDTO agvCallItemDTO = new AgvCallItemDTO();
+            agvCallItemDTO.setWarehouseId(1L);
+            agvCallItemDTO.setSku(lform.getSku());
+            agvCallItemDTO.setQty(lform.getQty());
+            agvCallItemDTO.setSupplier(lform.getSupplier());
+            agvCallItemDTO.setWeight(lform.getWeight());
+            agvCallItemDTO.setLocationFrom(lform.getLocationFrom());
+            agvCallItemDTO.setLocationTo(lform.getLocationTo());
+            agvCallDTO.getAgvCallItemDTOList().add(agvCallItemDTO);
             LotattDTO lotattDTO = new LotattDTO();
             List<LineCallDetailsForm> lineCallDetailsForms = lform.getLineCallDetailsFormList();
             if (lineCallDetailsForms != null && lineCallDetailsForms.size() > 0) {
@@ -53,9 +86,13 @@ public class LineCallController {
                     lotattDTO.setAttr(detailsForm.getLotattId(), detailsForm.getLotattValue());
                 }
             }
-            agvCallDTO.setLotattDTO(lotattDTO);
-            list.add(agvCallDTO);
+            agvCallItemDTO.setLotattDTO(lotattDTO);
+            map.put(lform.getLocationFrom() + "-" + lform.getLocationTo(), agvCallDTO);
+        }
+        for (Map.Entry<String, AgvCallDTO> entry : map.entrySet()) {
+            AgvCallDTO mapValue = entry.getValue();
+            list.add(mapValue);
         }
-        return businessService.agvCall(list);
+        return businessService.agvCall(flowConfigHeaderVO, list);
     }
 }

+ 2 - 2
ruoyi-admin/src/test/java/com/ruoyi/admin/test/base/WarehouseTest.java

@@ -79,7 +79,7 @@ public class WarehouseTest {
         inWarehouseDTO.setSku("test2");
         inWarehouseDTO.setWarehouseId(1L);
         inWarehouseDTO.setLotattDTO(lotattDTO);
-        BaseLocationInfo locationInfo = businessService.inLocationAllocation(inWarehouseDTO);
+        BaseLocationInfo locationInfo = businessService.inLocationAllocation(inWarehouseDTO,1L);
         if (locationInfo != null) {
             System.out.println("-------------------");
             System.out.println(locationInfo.getId());
@@ -94,7 +94,7 @@ public class WarehouseTest {
         outWarehouseDTO.setSku("test1");
         outWarehouseDTO.setWarehouseId(1L);
         outWarehouseDTO.setLotattDTO(lotattDTO);
-        BaseLocationInfo locationInfo = businessService.outInvAllocation(outWarehouseDTO);
+        BaseLocationInfo locationInfo = businessService.outInvAllocation(outWarehouseDTO,1L);
         if (locationInfo != null) {
             System.out.println("-------------------");
             System.out.println(locationInfo.getId());

+ 67 - 55
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java

@@ -6,6 +6,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+
+import com.ruoyi.common.exception.ServiceException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.BoundSetOperations;
 import org.springframework.data.redis.core.HashOperations;
@@ -18,59 +20,84 @@ import org.springframework.stereotype.Component;
  *
  * @author ruoyi
  **/
-@SuppressWarnings(value = { "unchecked", "rawtypes" })
+@SuppressWarnings(value = {"unchecked", "rawtypes"})
 @Component
-public class RedisCache
-{
+public class RedisCache {
     @Autowired
     public RedisTemplate redisTemplate;
 
     /**
      * 缓存基本的对象,Integer、String、实体类等
      *
-     * @param key 缓存的键值
+     * @param key   缓存的键值
      * @param value 缓存的值
      */
-    public <T> void setCacheObject(final String key, final T value)
-    {
+    public <T> void setCacheObject(final String key, final T value) {
         redisTemplate.opsForValue().set(key, value);
     }
 
+    public <T> boolean lockCacheObject(final String key, final String value, Long token) {
+        boolean isOK = redisTemplate.opsForValue().setIfAbsent(key, value);
+        if (isOK) {
+            redisTemplate.opsForList().rightPush(RedisKey.LOCK_LIST + token, key);
+        }
+        return isOK;
+    }
+
+    public void unlockCacheObject(Long token) {
+        List<String> lockList = redisTemplate.opsForList().range(RedisKey.LOCK_LIST + token, 0, -1);
+        if (lockList != null && lockList.size() > 0) {
+            for (String s : lockList) {
+                s = s.replaceAll("\"","");
+                redisTemplate.delete(s);
+            }
+            redisTemplate.delete(RedisKey.LOCK_LIST + token);
+        }
+    }
+
+    public boolean checkIsLock(String key) {
+        boolean isLock = false;
+        Object obj = redisTemplate.opsForValue().get(key);
+        if (obj == null) {
+            isLock = false;
+        } else {
+            isLock = true;
+        }
+        return isLock;
+    }
+
     /**
      * 缓存基本的对象,Integer、String、实体类等
      *
-     * @param key 缓存的键值
-     * @param value 缓存的值
-     * @param timeout 时间
+     * @param key      缓存的键值
+     * @param value    缓存的值
+     * @param timeout  时间
      * @param timeUnit 时间颗粒度
      */
-    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
-    {
+    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
         redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
     }
 
     /**
      * 设置有效时间
      *
-     * @param key Redis键
+     * @param key     Redis键
      * @param timeout 超时时间
      * @return true=设置成功;false=设置失败
      */
-    public boolean expire(final String key, final long timeout)
-    {
+    public boolean expire(final String key, final long timeout) {
         return expire(key, timeout, TimeUnit.SECONDS);
     }
 
     /**
      * 设置有效时间
      *
-     * @param key Redis键
+     * @param key     Redis键
      * @param timeout 超时时间
-     * @param unit 时间单位
+     * @param unit    时间单位
      * @return true=设置成功;false=设置失败
      */
-    public boolean expire(final String key, final long timeout, final TimeUnit unit)
-    {
+    public boolean expire(final String key, final long timeout, final TimeUnit unit) {
         return redisTemplate.expire(key, timeout, unit);
     }
 
@@ -80,8 +107,7 @@ public class RedisCache
      * @param key 缓存键值
      * @return 缓存键值对应的数据
      */
-    public <T> T getCacheObject(final String key)
-    {
+    public <T> T getCacheObject(final String key) {
         ValueOperations<String, T> operation = redisTemplate.opsForValue();
         return operation.get(key);
     }
@@ -91,8 +117,7 @@ public class RedisCache
      *
      * @param key
      */
-    public boolean deleteObject(final String key)
-    {
+    public boolean deleteObject(final String key) {
         return redisTemplate.delete(key);
     }
 
@@ -102,20 +127,18 @@ public class RedisCache
      * @param collection 多个对象
      * @return
      */
-    public long deleteObject(final Collection collection)
-    {
+    public long deleteObject(final Collection collection) {
         return redisTemplate.delete(collection);
     }
 
     /**
      * 缓存List数据
      *
-     * @param key 缓存的键值
+     * @param key      缓存的键值
      * @param dataList 待缓存的List数据
      * @return 缓存的对象
      */
-    public <T> long setCacheList(final String key, final List<T> dataList)
-    {
+    public <T> long setCacheList(final String key, final List<T> dataList) {
         Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
         return count == null ? 0 : count;
     }
@@ -126,24 +149,21 @@ public class RedisCache
      * @param key 缓存的键值
      * @return 缓存键值对应的数据
      */
-    public <T> List<T> getCacheList(final String key)
-    {
+    public <T> List<T> getCacheList(final String key) {
         return redisTemplate.opsForList().range(key, 0, -1);
     }
 
     /**
      * 缓存Set
      *
-     * @param key 缓存键值
+     * @param key     缓存键值
      * @param dataSet 缓存的数据
      * @return 缓存数据的对象
      */
-    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
-    {
+    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
         BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
         Iterator<T> it = dataSet.iterator();
-        while (it.hasNext())
-        {
+        while (it.hasNext()) {
             setOperation.add(it.next());
         }
         return setOperation;
@@ -155,8 +175,7 @@ public class RedisCache
      * @param key
      * @return
      */
-    public <T> Set<T> getCacheSet(final String key)
-    {
+    public <T> Set<T> getCacheSet(final String key) {
         return redisTemplate.opsForSet().members(key);
     }
 
@@ -166,8 +185,7 @@ public class RedisCache
      * @param key
      * @param dataMap
      */
-    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
-    {
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
         if (dataMap != null) {
             redisTemplate.opsForHash().putAll(key, dataMap);
         }
@@ -179,44 +197,40 @@ public class RedisCache
      * @param key
      * @return
      */
-    public <T> Map<String, T> getCacheMap(final String key)
-    {
+    public <T> Map<String, T> getCacheMap(final String key) {
         return redisTemplate.opsForHash().entries(key);
     }
 
     /**
      * 往Hash中存入数据
      *
-     * @param key Redis键
-     * @param hKey Hash键
+     * @param key   Redis键
+     * @param hKey  Hash键
      * @param value 值
      */
-    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
-    {
+    public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
         redisTemplate.opsForHash().put(key, hKey, value);
     }
 
     /**
      * 获取Hash中的数据
      *
-     * @param key Redis键
+     * @param key  Redis键
      * @param hKey Hash键
      * @return Hash中的对象
      */
-    public <T> T getCacheMapValue(final String key, final String hKey)
-    {
+    public <T> T getCacheMapValue(final String key, final String hKey) {
         HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
         return opsForHash.get(key, hKey);
     }
 
     /**
      * 删除Hash中的数据
-     * 
+     *
      * @param key
      * @param mapkey
      */
-    public void delCacheMapValue(final String key, final String hkey)
-    {
+    public void delCacheMapValue(final String key, final String hkey) {
         HashOperations hashOperations = redisTemplate.opsForHash();
         hashOperations.delete(key, hkey);
     }
@@ -224,12 +238,11 @@ public class RedisCache
     /**
      * 获取多个Hash中的数据
      *
-     * @param key Redis键
+     * @param key   Redis键
      * @param hKeys Hash键集合
      * @return Hash对象集合
      */
-    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
-    {
+    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
         return redisTemplate.opsForHash().multiGet(key, hKeys);
     }
 
@@ -239,8 +252,7 @@ public class RedisCache
      * @param pattern 字符串前缀
      * @return 对象列表
      */
-    public Collection<String> keys(final String pattern)
-    {
+    public Collection<String> keys(final String pattern) {
         return redisTemplate.keys(pattern);
     }
 }

+ 6 - 0
ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisKey.java

@@ -0,0 +1,6 @@
+package com.ruoyi.common.core.redis;
+
+public class RedisKey {
+    public static final String LOCK_LIST = "lock_List_";
+    public static final String LOCK_LOCATION = "lock_location_";
+}

+ 7 - 7
ruoyi-common/src/main/java/com/ruoyi/common/exception/ServiceException.java

@@ -19,7 +19,7 @@ public final class ServiceException extends RuntimeException
      */
     private String message;
 
-    private String taskNo;
+    private Long token;
 
     /**
      * 错误明细,内部调试错误
@@ -40,10 +40,10 @@ public final class ServiceException extends RuntimeException
         this.message = message;
     }
 
-    public ServiceException(String message, String taskNo)
+    public ServiceException(String message, Long token)
     {
         this.message = message;
-        this.taskNo = taskNo;
+        this.token = token;
     }
 
     public ServiceException(String message, Integer code)
@@ -79,11 +79,11 @@ public final class ServiceException extends RuntimeException
         return this;
     }
 
-    public String getTaskNo() {
-        return taskNo;
+    public Long getToken() {
+        return token;
     }
 
-    public void setTaskNo(String taskNo) {
-        this.taskNo = taskNo;
+    public void setToken(Long token) {
+        this.token = token;
     }
 }

+ 5 - 6
ruoyi-framework/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java

@@ -2,6 +2,7 @@ package com.ruoyi.framework.web.exception;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.ruoyi.common.core.redis.RedisKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,8 +33,6 @@ public class GlobalExceptionHandler {
 
     @Autowired
     private RedisTemplate<String, String> redisTemplate;
-    @Autowired
-    private StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
 
     /**
      * 权限校验异常
@@ -63,13 +62,13 @@ public class GlobalExceptionHandler {
     public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request) {
         log.error(e.getMessage(), e);
         Integer code = e.getCode();
-        String tag = "redis_lock_tag_" + code;
-        List<String> lockList = stringRedisTemplate.opsForList().range(tag, 0, -1);
+        List<String> lockList = redisTemplate.opsForList().range(RedisKey.LOCK_LIST + e.getToken(), 0, -1);
         if (lockList != null && lockList.size() > 0) {
             for (String s : lockList) {
-                redisTemplate.delete(s);
+                s = s.replaceAll("\"","");
+                redisTemplate.delete( s);
             }
-            stringRedisTemplate.delete(tag);
+            redisTemplate.delete(RedisKey.LOCK_LIST + e.getToken());
         }
         return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
     }

+ 7 - 4
ruoyi-ui/src/views/ams/lineCall/index.vue

@@ -365,7 +365,7 @@
           this.form.locationToFlag = response.locationToFlag
           this.form.flowType = response.flowType
           this.skuTypeCombo = response.skuList;
-          this.form.id = response.id
+          this.form.id = id
 
           if (this.form.locationFromFlag === 'Required') {
             this.rules.locationFrom = [
@@ -470,11 +470,14 @@
                 }
               }
             }
-
+            let flowIdCurrent = this.form.id
             if(this.subData.length == 0) {
               this.addDetail()
             }
-            exec(this.subData).then(response => {
+            let subParam = {}
+            subParam.lineCallList = this.subData
+            subParam.flowId = flowIdCurrent
+            exec(subParam).then(response => {
               if (response.code === 200) {
                 this.$modal.msgSuccess("执行成功");
                 this.open = false;
@@ -603,7 +606,7 @@
             }
             let obj = JSON.parse(JSON.stringify(this.form))
             this.subData.push(obj)
-            this.reset();
+            // this.reset();
           }
         });
       },

+ 121 - 87
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -1,17 +1,10 @@
 package com.ruoyi.ams.business;
 
-import com.alibaba.fastjson.JSON;
 import com.ruoyi.ams.common.Constant;
 import com.ruoyi.ams.config.domain.AsnSoStrategy;
-import com.ruoyi.ams.config.domain.FlowConfigHeader;
-import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
-import com.ruoyi.ams.config.domain.dto.InWarehouseDTO;
-import com.ruoyi.ams.config.domain.dto.LotattDTO;
-import com.ruoyi.ams.config.domain.dto.OutWarehouseDTO;
+import com.ruoyi.ams.config.domain.dto.*;
 import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
 import com.ruoyi.ams.config.mapper.AsnSoStrategyMapper;
-import com.ruoyi.ams.config.service.IFlowConfigHeaderService;
-import com.ruoyi.ams.config.service.ILocationPriorityHeaderService;
 import com.ruoyi.ams.config.service.LocationAllocationStrategy;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.ams.inv.service.IInvLotLocIdService;
@@ -24,6 +17,8 @@ import com.ruoyi.base.mapper.BaseLocationInfoMapper;
 import com.ruoyi.base.service.IBaseLocationInfoService;
 import com.ruoyi.base.service.IBaseSkuService;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.core.redis.RedisKey;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.uuid.SnowflakeIdWorker;
@@ -38,7 +33,6 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 public class BusinessServiceImpl implements IBusinessService {
-
     @Autowired
     private IBusinessService businessService;
     @Autowired
@@ -58,82 +52,115 @@ public class BusinessServiceImpl implements IBusinessService {
     @Autowired
     private IBaseSkuService baseSkuService;
     @Autowired
-    private IFlowConfigHeaderService flowConfigHeaderService;
+    private RedisCache redisCache;
 
     @Transactional
     @Override
-    public AjaxResult agvCall(List<AgvCallDTO> agvCallDTOList) {
-        AgvCallDTO agvCallDTO = new AgvCallDTO();
-        for (AgvCallDTO agvCall : agvCallDTOList) {
-            agvCallDTO.setLocationFrom(agvCall.getLocationFrom());
-            agvCallDTO.setLocationTo(agvCall.getLocationTo());
-            agvCallDTO.setId(agvCall.getId());
-            agvCallDTO.setWarehouseId(agvCall.getWarehouseId());
-            agvCallDTO.setLotattDTO(agvCall.getLotattDTO());
-            break;
-        }
-
-        BaseLocationInfo locationFrom = null;
-        BaseLocationInfo locationTo = null;
-        List<WcsTask> wcsTaskList = new ArrayList<>();
-        //查询所属流程
-        FlowConfigHeaderVO flowConfigHeaderVO = flowConfigHeaderService.selectFlowConfigHeaderById(agvCallDTO.getId());
+    public AjaxResult agvCall(FlowConfigHeaderVO flowConfigHeaderVO, List<AgvCallDTO> agvCallDTOList) {
+        //唯一操作标识,用于redis标记。报错时根据该id进行删除
+        Long token = SnowflakeIdWorker.generateId();
+        //查询全局配置策略
         AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
-        if (flowConfigHeaderVO == null) {
-            log.info("-----------指令查询不到对应的流程:" + JSON.toJSONString(agvCallDTOList));
-            return AjaxResult.error("指令查询不到对应的流程");
-        }
-        String paramLocationFrom = agvCallDTO.getLocationFrom();
-        String paramLocationTo = agvCallDTO.getLocationTo();
-        List<String> zoneIdList = new ArrayList<>();
-        if (StringUtils.isEmpty(paramLocationFrom)) {
-            paramLocationFrom = flowConfigHeaderVO.getLocationFrom();
-        }
-        if (StringUtils.isEmpty(paramLocationTo)) {
-            paramLocationTo = flowConfigHeaderVO.getLocationTo();
-        }
-        if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
-            zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
-        }
 
+        for (AgvCallDTO agvCallDTO : agvCallDTOList) {
+            //如果是入库把起始库位相同的数据整合到一起生成库存记录
+            BaseLocationInfo locationFrom = null;
+            BaseLocationInfo locationTo = null;
+            List<WcsTask> wcsTaskList = new ArrayList<>();
+            String paramLocationFrom = agvCallDTO.getLocationFrom();
+            String paramLocationTo = agvCallDTO.getLocationTo();
+            List<String> zoneIdList = new ArrayList<>();
+            if (StringUtils.isEmpty(paramLocationFrom)) {
+                paramLocationFrom = flowConfigHeaderVO.getLocationFrom();
+            }
+            if (StringUtils.isEmpty(paramLocationTo)) {
+                paramLocationTo = flowConfigHeaderVO.getLocationTo();
+            }
+            if (!StringUtils.isEmpty(flowConfigHeaderVO.getLocationFrom())) {
+                zoneIdList = Arrays.stream(flowConfigHeaderVO.getLocationFrom().split(",")).collect(Collectors.toList());
+            }
 
-        List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId());
-        List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId());
+            List<BaseLocationInfo> locationFromList = this.convertLocation(paramLocationFrom, agvCallDTO.getWarehouseId());
+            List<BaseLocationInfo> locationToList = this.convertLocation(paramLocationTo, agvCallDTO.getWarehouseId());
 
-        if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
-            locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, agvCallDTO);
-            locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, agvCallDTO);
-            //2.初始化库存
-            for (AgvCallDTO agvCall : agvCallDTOList) {
-                invLotLocIdService.initInv(locationFrom.getId().toString(), agvCall.getSku(), Constant.CUSTOMER_ID, agvCall.getQty(), agvCall.getLotattDTO());
-            }
-            wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO));
-        } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
-            for (AgvCallDTO agvCall : agvCallDTOList) {
-                //判断总库存是否足够
-                Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
-                if (qty < agvCall.getQty()) {
-                    throw new ServiceException("所需库存不够");
+            if (flowConfigHeaderVO.getFlowType().equals("ASN")) {
+                AgvCallItemDTO agvCall = agvCallDTO.getAgvCallItemDTOList().get(0);
+                locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "ASN", asnSoStrategy, agvCall, token);
+                locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "ASN", asnSoStrategy, agvCall, token);
+                //2.初始化库存
+                for (AgvCallItemDTO call : agvCallDTO.getAgvCallItemDTOList()) {
+                    invLotLocIdService.initInv(locationFrom.getId().toString(), call.getSku(), Constant.CUSTOMER_ID, call.getQty(), call.getLotattDTO());
+                }
+                wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO, token));
+            } else if (flowConfigHeaderVO.getFlowType().equals("SO")) {
+                for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
+                    //判断总库存是否足够
+                    //TODO 循环判断取出的数据是否够,不够继续取
+                    Double qty = invLotLocIdService.queryInvBySku(agvCall.getSku(), agvCall.getLotattDTO(), zoneIdList);
+                    if (qty < agvCall.getQty()) {
+                        throw new ServiceException("所需库存不够");
+                    }
+                    // locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "SO", asnSoStrategy, agvCall, token);
+                    BaseLocationInfo soLocationFrom;
+                    if (locationFromList != null && locationFromList.size() > 0) {
+                        List<Long> locationList = new ArrayList<>();
+                        for (BaseLocationInfo b : locationFromList) {
+                            locationList.add(b.getId());
+                        }
+                        List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, 1L, agvCall.getLotattDTO().getAttr(), agvCall.getSku());
+                        OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
+                        outWarehouseDTO.setSku(agvCall.getSku());
+                        outWarehouseDTO.setQty(agvCall.getQty());
+                        outWarehouseDTO.setWeight(agvCall.getWeight());
+                        outWarehouseDTO.setSupplier(agvCall.getSupplier());
+                        outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
+                        outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
+                        soLocationFrom = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy, token);
+                    } else {
+                        OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
+                        outWarehouseDTO.setSku(agvCall.getSku());
+                        outWarehouseDTO.setQty(agvCall.getQty());
+                        outWarehouseDTO.setWeight(agvCall.getWeight());
+                        outWarehouseDTO.setSupplier(agvCall.getSupplier());
+                        outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
+                        outWarehouseDTO.setWarehouseId(agvCall.getWarehouseId());
+                        soLocationFrom = outInvAllocation(outWarehouseDTO, token);
+                    }
+                    if (soLocationFrom == null) {
+                        throw new ServiceException("没有可分配的库存", token);
+                    }
+                    locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, agvCall, token);
+                    wcsTaskList.addAll(this.genTask(soLocationFrom, locationTo, flowConfigHeaderVO, token));
+                }
+            } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
+                for (AgvCallItemDTO agvCall : agvCallDTO.getAgvCallItemDTOList()) {
+                    OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
+                    outWarehouseDTO.setSku(agvCall.getSku());
+                    outWarehouseDTO.setQty(agvCall.getQty());
+                    outWarehouseDTO.setWeight(agvCall.getWeight());
+                    outWarehouseDTO.setSupplier(agvCall.getSupplier());
+                    outWarehouseDTO.setLotattDTO(agvCall.getLotattDTO());
+                    outWarehouseDTO.setWarehouseId(agvCall.getWarehouseId());
+                    BaseLocationInfo mvLocationFrom = outInvAllocation(outWarehouseDTO, token);
+                    //locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, agvCall, token);
+                    locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, agvCall, token);
+                    if (mvLocationFrom == null) {
+                        throw new ServiceException("没有可以分配的库存", token);
+                    }
+                    wcsTaskList.addAll(this.genTask(mvLocationFrom, locationTo, flowConfigHeaderVO, token));
                 }
-                locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "SO", asnSoStrategy, agvCall);
-                locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "SO", asnSoStrategy, agvCall);
-                wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO));
             }
-        } else if (flowConfigHeaderVO.getFlowType().equals("MV")) {
-            locationFrom = this.zoneLocationAllocation(locationFromList, "locationFrom", "MV", asnSoStrategy, agvCallDTO);
-            locationTo = this.zoneLocationAllocation(locationToList, "locationTo", "MV", asnSoStrategy, agvCallDTO);
-            wcsTaskList.addAll(this.genTask(locationFrom, locationTo, flowConfigHeaderVO));
-        }
 
 //        for (WcsTask wcsTask : wcsTaskList) {
 //            this.addTask(wcsTask);
 //        }
+        }
         return AjaxResult.success("任务下发成功");
     }
 
     @Transactional
     @Override
-    public BaseLocationInfo inLocationAllocation(InWarehouseDTO inWarehouseDTO) {
+    public BaseLocationInfo inLocationAllocation(InWarehouseDTO inWarehouseDTO, Long token) {
         /**
          * 根据sku查询可以存放的zone
          * 根据每个zone的配置去分配可以存放的库位
@@ -186,18 +213,18 @@ public class BusinessServiceImpl implements IBusinessService {
                 } else {
                     locationInfoList = baseLocationInfoMapper.selectLocationBindSku(baseSku.getSkuType());
                 }
-                return locationAllocationStrategy.filterLockLocation(locationInfoList, inWarehouseDTO, asnSoStrategy);
+                return locationAllocationStrategy.filterLockLocation(locationInfoList, inWarehouseDTO, asnSoStrategy, token);
             } else {
                 // 指定区域的
                 List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectSortedLocatinListByZoneId(Long.parseLong(inWarehouseDTO.getLocationZoneTo()), inWarehouseDTO.getWarehouseId());
-                return locationAllocationStrategy.filterLockLocation(locationInfoList);
+                return locationAllocationStrategy.filterLockLocation(locationInfoList, token);
             }
         }
     }
 
     @Transactional
     @Override
-    public BaseLocationInfo outInvAllocation(OutWarehouseDTO outWarehouseDTO) {
+    public BaseLocationInfo outInvAllocation(OutWarehouseDTO outWarehouseDTO, Long token) {
         /**
          * 指定位置出库
          */
@@ -218,12 +245,12 @@ public class BusinessServiceImpl implements IBusinessService {
             LotattDTO lotattDTO = outWarehouseDTO.getLotattDTO();
             List<BaseLocationLotattVO> locationInfoList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneIdList(zoneIdList, outWarehouseDTO.getWarehouseId(), lotattDTO.getAttr());
             AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
-            return locationAllocationStrategy.filterLockInv(locationInfoList, outWarehouseDTO, asnSoStrategy);
+            return locationAllocationStrategy.filterLockInv(locationInfoList, outWarehouseDTO, asnSoStrategy, token);
         }
     }
 
     @Override
-    public BaseLocationInfo zoneLocationAllocation(List<BaseLocationInfo> locationInfoList, String locationType, String type, AsnSoStrategy asnSoStrategy, AgvCallDTO agvCallDTO) {
+    public BaseLocationInfo zoneLocationAllocation(List<BaseLocationInfo> locationInfoList, String locationType, String type, AsnSoStrategy asnSoStrategy, AgvCallItemDTO agvCallDTO, Long token) {
         BaseLocationInfo locationInfo = null;
         if (type.equals("ASN")) {
             //入库
@@ -232,15 +259,18 @@ public class BusinessServiceImpl implements IBusinessService {
                     if (!b.getStockStatus().equals("00")) {
                         continue;
                     }
+                    if (!redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                        continue;
+                    }
                     locationInfo = b;
                     break;
                 }
                 if (locationInfo == null) {
-                    throw new ServiceException("没有可以分配的库位");
+                    throw new ServiceException("入库起始库位没有可以分配的库位", token);
                 }
             } else {
                 if (locationInfoList != null && locationInfoList.size() > 0) {
-                    locationInfo = locationAllocationStrategy.filterLockLocation(locationInfoList);
+                    locationInfo = locationAllocationStrategy.filterLockLocation(locationInfoList, token);
                 } else {
                     InWarehouseDTO inWarehouseDTO = new InWarehouseDTO();
                     inWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
@@ -251,10 +281,10 @@ public class BusinessServiceImpl implements IBusinessService {
                     inWarehouseDTO.setSupplier(agvCallDTO.getSupplier());
                     inWarehouseDTO.setWeight(agvCallDTO.getWeight());
                     inWarehouseDTO.setLotattDTO(agvCallDTO.getLotattDTO());
-                    locationInfo = inLocationAllocation(inWarehouseDTO);
+                    locationInfo = inLocationAllocation(inWarehouseDTO, token);
                 }
                 if (locationInfo == null) {
-                    throw new RuntimeException("没有可以分配的库位");
+                    throw new ServiceException("目标库位没有可以分配的库位", token);
                 }
                 return locationInfo;
             }
@@ -267,7 +297,7 @@ public class BusinessServiceImpl implements IBusinessService {
                     for (BaseLocationInfo b : locationInfoList) {
                         locationList.add(b.getId());
                     }
-                    List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, agvCallDTO.getWarehouseId(), agvCallDTO.getLotattDTO().getAttr(), agvCallDTO.getSku());
+                    List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, 1L, agvCallDTO.getLotattDTO().getAttr(), agvCallDTO.getSku());
                     OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
                     outWarehouseDTO.setSku(agvCallDTO.getSku());
                     outWarehouseDTO.setQty(agvCallDTO.getQty());
@@ -275,7 +305,7 @@ public class BusinessServiceImpl implements IBusinessService {
                     outWarehouseDTO.setSupplier(agvCallDTO.getSupplier());
                     outWarehouseDTO.setLotattDTO(agvCallDTO.getLotattDTO());
                     outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
-                    locationInfo = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy);
+                    locationInfo = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy, token);
                 } else {
                     OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
                     outWarehouseDTO.setSku(agvCallDTO.getSku());
@@ -284,10 +314,10 @@ public class BusinessServiceImpl implements IBusinessService {
                     outWarehouseDTO.setSupplier(agvCallDTO.getSupplier());
                     outWarehouseDTO.setLotattDTO(agvCallDTO.getLotattDTO());
                     outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
-                    locationInfo = outInvAllocation(outWarehouseDTO);
+                    locationInfo = outInvAllocation(outWarehouseDTO, token);
                 }
                 if (locationInfo == null) {
-                    throw new RuntimeException("没有可分配的库存");
+                    throw new ServiceException("没有可分配的库存", token);
                 }
                 return locationInfo;
             } else { //目标库位
@@ -299,7 +329,7 @@ public class BusinessServiceImpl implements IBusinessService {
                     break;
                 }
                 if (locationInfo == null) {
-                    throw new RuntimeException("没有可以分配的库位");
+                    throw new ServiceException("没有可以分配的库位", token);
                 }
             }
         } else { //移库
@@ -309,7 +339,7 @@ public class BusinessServiceImpl implements IBusinessService {
                     for (BaseLocationInfo b : locationInfoList) {
                         locationList.add(b.getId());
                     }
-                    List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, agvCallDTO.getWarehouseId(), agvCallDTO.getLotattDTO().getAttr(), agvCallDTO.getSku());
+                    List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByLocationIdList(locationList, 1L, agvCallDTO.getLotattDTO().getAttr(), agvCallDTO.getSku());
                     OutWarehouseDTO outWarehouseDTO = new OutWarehouseDTO();
                     outWarehouseDTO.setSku(agvCallDTO.getSku());
                     outWarehouseDTO.setQty(agvCallDTO.getQty());
@@ -317,7 +347,7 @@ public class BusinessServiceImpl implements IBusinessService {
                     outWarehouseDTO.setSupplier(agvCallDTO.getSupplier());
                     outWarehouseDTO.setLotattDTO(agvCallDTO.getLotattDTO());
                     outWarehouseDTO.setWarehouseId(agvCallDTO.getWarehouseId());
-                    locationInfo = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy);
+                    locationInfo = locationAllocationStrategy.filterLockInv(locationLotattVOList, outWarehouseDTO, asnSoStrategy, token);
                 }
             } else {
                 for (BaseLocationInfo b : locationInfoList) {
@@ -329,7 +359,7 @@ public class BusinessServiceImpl implements IBusinessService {
                 }
             }
             if (locationInfo == null) {
-                throw new ServiceException("没有可以分配的库位");
+                throw new ServiceException("没有可以分配的库位", token);
             }
         }
         return locationInfo;
@@ -355,7 +385,10 @@ public class BusinessServiceImpl implements IBusinessService {
     }
 
     @Override
-    public List<WcsTask> genTask(BaseLocationInfo locationFrom, BaseLocationInfo locationTo, FlowConfigHeaderVO flowConfigHeaderVO) {
+    public List<WcsTask> genTask(BaseLocationInfo locationFrom, BaseLocationInfo locationTo, FlowConfigHeaderVO flowConfigHeaderVO, Long token) {
+        if (locationFrom == null || locationTo == null) {
+            throw new ServiceException("任务执行库位不能为空", token);
+        }
         List<WcsTask> wcsTaskList = new ArrayList<>();
         if (StringUtils.isEmpty(flowConfigHeaderVO.getRootFlow())) {
             String taskNo = System.currentTimeMillis() + "";
@@ -370,10 +403,11 @@ public class BusinessServiceImpl implements IBusinessService {
             wcsTask.setCreateDate(new Date());
             wcsTask.setBusinessType("01");
             wcsTask.setTaskType("");
+            wcsTask.setExt8(token.toString());
             wcsTaskList.add(wcsTask);
             businessService.addTask(wcsTask);
         } else {
-            //获取对应的流程
+            /*//获取对应的流程
             List<FlowConfigHeader> headerVOList = flowConfigHeaderService.sortFlowConfigHeader(Long.parseLong(flowConfigHeaderVO.getRootFlow()));
             AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
             String taskNo = System.currentTimeMillis() + "";
@@ -414,7 +448,7 @@ public class BusinessServiceImpl implements IBusinessService {
                 child.setTaskType("");
                 wcsTaskList.add(child);
                 beforeTaskNo = currentNo;
-            }
+            }*/
         }
         return wcsTaskList;
     }

+ 10 - 7
warewms-ams/src/main/java/com/ruoyi/ams/business/IBusinessService.java

@@ -2,6 +2,7 @@ package com.ruoyi.ams.business;
 
 import com.ruoyi.ams.config.domain.AsnSoStrategy;
 import com.ruoyi.ams.config.domain.dto.AgvCallDTO;
+import com.ruoyi.ams.config.domain.dto.AgvCallItemDTO;
 import com.ruoyi.ams.config.domain.dto.InWarehouseDTO;
 import com.ruoyi.ams.config.domain.dto.OutWarehouseDTO;
 import com.ruoyi.ams.config.domain.vo.FlowConfigHeaderVO;
@@ -22,10 +23,11 @@ public interface IBusinessService {
     /**
      * AGV呼叫业务
      *
+     * @param flowConfigHeaderVO
      * @param agvCallDTOList
      * @return
      */
-    AjaxResult agvCall(List<AgvCallDTO> agvCallDTOList);
+    AjaxResult agvCall(FlowConfigHeaderVO flowConfigHeaderVO, List<AgvCallDTO> agvCallDTOList);
 
     /**
      * 入库库位分配
@@ -33,24 +35,24 @@ public interface IBusinessService {
      * @param inWarehouseDTO
      * @return
      */
-    BaseLocationInfo inLocationAllocation(InWarehouseDTO inWarehouseDTO);
+    BaseLocationInfo inLocationAllocation(InWarehouseDTO inWarehouseDTO, Long token);
 
     /**
      * 出库库存分配
      *
      * @return
      */
-    BaseLocationInfo outInvAllocation(OutWarehouseDTO outWarehouseDTO);
+    BaseLocationInfo outInvAllocation(OutWarehouseDTO outWarehouseDTO, Long token);
 
     /**
      * 区域多库位分配
      *
      * @param locationInfoList 库位列表
-     * @param type 入库还是出库
-     * @param asnSoStrategy 策略对象
+     * @param type             入库还是出库
+     * @param asnSoStrategy    策略对象
      * @return
      */
-    BaseLocationInfo zoneLocationAllocation(List<BaseLocationInfo> locationInfoList, String locationType, String type, AsnSoStrategy asnSoStrategy, AgvCallDTO agvCallDTO);
+    BaseLocationInfo zoneLocationAllocation(List<BaseLocationInfo> locationInfoList, String locationType, String type, AsnSoStrategy asnSoStrategy, AgvCallItemDTO agvCallDTO, Long token);
 
     /***
      *  根据id转换库位列表(如果是库位id直接返回库位如果是区域id则返回相应的库位)
@@ -62,10 +64,11 @@ public interface IBusinessService {
 
     /**
      * 生成任务
+     *
      * @param flowConfigHeaderVO
      * @return
      */
-    List<WcsTask> genTask(BaseLocationInfo locationFrom,BaseLocationInfo locationTo,FlowConfigHeaderVO  flowConfigHeaderVO);
+    List<WcsTask> genTask(BaseLocationInfo locationFrom, BaseLocationInfo locationTo, FlowConfigHeaderVO flowConfigHeaderVO, Long token);
 
     /**
      * 新增任务

+ 12 - 46
warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallDTO.java

@@ -1,50 +1,24 @@
 package com.ruoyi.ams.config.domain.dto;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * AGV呼叫业务模型
  */
 public class AgvCallDTO {
-
     private Long id;
-    private String sku;
-    private Double qty;
-    private Double weight;
-    private String supplier;
     private String locationFrom;
     private String locationTo;
-    private LotattDTO lotattDTO;
     private Long warehouseId;
+    private List<AgvCallItemDTO> agvCallItemDTOList = new ArrayList<>();
 
-    public String getSku() {
-        return sku;
-    }
-
-    public void setSku(String sku) {
-        this.sku = sku;
-    }
-
-    public Double getQty() {
-        return qty;
-    }
-
-    public void setQty(Double qty) {
-        this.qty = qty;
-    }
-
-    public Double getWeight() {
-        return weight;
-    }
-
-    public void setWeight(Double weight) {
-        this.weight = weight;
-    }
-
-    public String getSupplier() {
-        return supplier;
+    public Long getId() {
+        return id;
     }
 
-    public void setSupplier(String supplier) {
-        this.supplier = supplier;
+    public void setId(Long id) {
+        this.id = id;
     }
 
     public String getLocationFrom() {
@@ -63,12 +37,12 @@ public class AgvCallDTO {
         this.locationTo = locationTo;
     }
 
-    public LotattDTO getLotattDTO() {
-        return lotattDTO;
+    public List<AgvCallItemDTO> getAgvCallItemDTOList() {
+        return agvCallItemDTOList;
     }
 
-    public void setLotattDTO(LotattDTO lotattDTO) {
-        this.lotattDTO = lotattDTO;
+    public void setAgvCallItemDTOList(List<AgvCallItemDTO> agvCallItemDTOList) {
+        this.agvCallItemDTOList = agvCallItemDTOList;
     }
 
     public Long getWarehouseId() {
@@ -78,12 +52,4 @@ public class AgvCallDTO {
     public void setWarehouseId(Long warehouseId) {
         this.warehouseId = warehouseId;
     }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
 }

+ 15 - 0
warewms-ams/src/main/java/com/ruoyi/ams/config/domain/dto/AgvCallItemDTO.java

@@ -0,0 +1,15 @@
+package com.ruoyi.ams.config.domain.dto;
+
+import lombok.Data;
+
+@Data
+public class AgvCallItemDTO {
+    private Long warehouseId;
+    private String locationFrom;
+    private String locationTo;
+    private String sku;
+    private Double qty;
+    private Double weight;
+    private String supplier;
+    private LotattDTO lotattDTO;
+}

+ 59 - 34
warewms-ams/src/main/java/com/ruoyi/ams/config/service/LocationAllocationStrategy.java

@@ -8,6 +8,8 @@ import com.ruoyi.ams.config.domain.dto.OutWarehouseDTO;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.domain.vo.BaseLocationLotattVO;
 import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.core.redis.RedisKey;
 import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -25,7 +27,7 @@ import java.util.*;
 public class LocationAllocationStrategy {
 
     @Autowired
-    private RedisTemplate<String, String> redisTemplate;
+    private RedisCache redisCache;
     @Autowired
     private IBaseLocationInfoService baseLocationInfoService;
 
@@ -35,7 +37,7 @@ public class LocationAllocationStrategy {
      * @param baseLocationInfos
      * @return
      */
-    public BaseLocationInfo filterLockLocation(List<BaseLocationInfo> baseLocationInfos) {
+    public BaseLocationInfo filterLockLocation(List<BaseLocationInfo> baseLocationInfos, Long token) {
         //将同一列的库位排序好
         LinkedHashMap<String, List<BaseLocationInfo>> map = new LinkedHashMap<>();
         for (BaseLocationInfo info : baseLocationInfos) {
@@ -56,12 +58,17 @@ public class LocationAllocationStrategy {
             for (BaseLocationInfo b : locationInfoList) {
                 if (currentLocation == null) {
                     if (b.getIsEmpty().equals("Y") && b.getStockStatus().equals("00")) {
-                        currentLocation = b;
+                        if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                            currentLocation = b;
+                        }
                     }
                 } else {
                     //如果前面的库位已阻挡则之前的库位不可用
+                    //TODO 如果阻挡但是在任务中可以使用
                     if (!b.getIsEmpty().equals("Y") || !b.getStockStatus().equals("00")) {
-                        currentLocation = null;
+                        if (!redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                            currentLocation = null;
+                        }
                     } else {
                         continue;
                     }
@@ -82,7 +89,7 @@ public class LocationAllocationStrategy {
      * @param asnSoStrategy        出入库策略
      * @return
      */
-    public BaseLocationInfo filterLockLocation(List<BaseLocationInfo> baseLocationInfoList, InWarehouseDTO inWarehouseDTO, AsnSoStrategy asnSoStrategy) {
+    public BaseLocationInfo filterLockLocation(List<BaseLocationInfo> baseLocationInfoList, InWarehouseDTO inWarehouseDTO, AsnSoStrategy asnSoStrategy, Long token) {
 
         //将同一列的库位排序好
         Integer parallelCount = 0;
@@ -95,7 +102,7 @@ public class LocationAllocationStrategy {
             } else {
                 infoList = new ArrayList<>();
             }
-            if (info.getStockStatus().equals("10")) {
+            if (info.getStockStatus().equals("10") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + info.getId())) {
                 taskingFlag.put(info.getColNo(), true);
                 parallelCount++;
             } else {
@@ -124,14 +131,18 @@ public class LocationAllocationStrategy {
                 }
                 if (currentLocation == null) {
                     if (b.getIsEmpty().equals("Y") && b.getStockStatus().equals("00")) {
-                        BaseLocationInfo locationInfo = new BaseLocationInfo();
-                        BeanUtils.copyProperties(b, locationInfo);
-                        currentLocation = locationInfo;
+                        if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                            BaseLocationInfo locationInfo = new BaseLocationInfo();
+                            BeanUtils.copyProperties(b, locationInfo);
+                            currentLocation = locationInfo;
+                        }
                     }
                 } else {
                     //如果前面的库位已阻挡则之前的库位不可用
                     if (!b.getIsEmpty().equals("Y") || !b.getStockStatus().equals("00")) {
-                        currentLocation = null;
+                        if (!redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                            currentLocation = null;
+                        }
                     } else {
                         continue;
                     }
@@ -151,7 +162,7 @@ public class LocationAllocationStrategy {
      * @param asnSoStrategy   出入库策略
      * @return
      */
-    public BaseLocationInfo filterLockInv(List<BaseLocationLotattVO> locationLotattVOList, OutWarehouseDTO outWarehouseDTO, AsnSoStrategy asnSoStrategy) {
+    public BaseLocationInfo filterLockInv(List<BaseLocationLotattVO> locationLotattVOList, OutWarehouseDTO outWarehouseDTO, AsnSoStrategy asnSoStrategy, Long token) {
 
         //将同一列的库位排序好
         LinkedHashMap<String, Boolean> taskingFlag = new LinkedHashMap<>();
@@ -165,7 +176,7 @@ public class LocationAllocationStrategy {
             } else {
                 infoList = new ArrayList<>();
             }
-            if (info.getStockStatus().equals("10")) {
+            if (info.getStockStatus().equals("10") || redisCache.checkIsLock(RedisKey.LOCK_LOCATION + info.getId())) {
                 taskingFlag.put(info.getColNo(), true);
             } else {
                 if (taskingFlag.get(info.getColNo()) == null || taskingFlag.get(info.getColNo()).booleanValue() == false) {
@@ -183,7 +194,7 @@ public class LocationAllocationStrategy {
             list.add(sortDTO);
 
             if (asnSoStrategy.getSoSameLotatt1Flag().equals("optimization")) {
-                String lotattValue = redisTemplate.opsForValue().get(asnSoStrategy.getAsnSameLotatt1Value());
+                String lotattValue = redisCache.getCacheObject(asnSoStrategy.getAsnSameLotatt1Value());
                 if (!StringUtils.isEmpty(lotattValue)) {
                     if (!StringUtils.isEmpty(info.getAttMap().get(asnSoStrategy.getSoSameLotatt1Value())) && info.getAttMap().get(asnSoStrategy.getSoSameLotatt1Value()).equals(lotattValue)) {
                         sameLotattList.add(sortDTO);
@@ -192,7 +203,6 @@ public class LocationAllocationStrategy {
             }
         }
 
-
         //过滤出每列可以用的库位并进行分配
         BaseLocationInfo currentLocation = null;
         BaseLocationLotattVO currentLocationLotatt = null;
@@ -212,16 +222,21 @@ public class LocationAllocationStrategy {
                         }
                     }
                     if (currentLocation == null) {
-                        if (baseLocationInfoService.checkIsLock(b, "N")) {
-                            BaseLocationInfo locationInfo = new BaseLocationInfo();
-                            BeanUtils.copyProperties(b, locationInfo);
-                            currentLocation = locationInfo;
-                            currentLocationLotatt = b;
+                        if (b.getIsEmpty().equals("Y") && b.getStockStatus().equals("00")) {
+                            if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                                BaseLocationInfo locationInfo = new BaseLocationInfo();
+                                BeanUtils.copyProperties(b, locationInfo);
+                                currentLocation = locationInfo;
+                                currentLocationLotatt = b;
+                            }
                         }
                     } else {
                         //如果前面的库位已阻挡则之前的库位不可用
+                        //TODO 任务中的库位可以继续使用
                         if (!b.getIsEmpty().equals("Y") || !b.getStockStatus().equals("00")) {
-                            currentLocation = null;
+                            if (!redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                                currentLocation = null;
+                            }
                         } else {
                             continue;
                         }
@@ -244,16 +259,21 @@ public class LocationAllocationStrategy {
                         }
                     }
                     if (currentLocation == null) {
-                        if (baseLocationInfoService.checkIsLock(b, "N")) {
-                            BaseLocationInfo locationInfo = new BaseLocationInfo();
-                            BeanUtils.copyProperties(b, locationInfo);
-                            currentLocation = locationInfo;
-                            currentLocationLotatt = b;
+                        if (!b.getIsEmpty().equals("Y") && b.getStockStatus().equals("00")) {
+                            if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                                BaseLocationInfo locationInfo = new BaseLocationInfo();
+                                BeanUtils.copyProperties(b, locationInfo);
+                                currentLocation = locationInfo;
+                                currentLocationLotatt = b;
+                            }
                         }
                     } else {
                         //如果前面的库位已阻挡则之前的库位不可用
+                        //TODO 任务中的库位可以继续使用
                         if (!b.getIsEmpty().equals("Y") || !b.getStockStatus().equals("00")) {
-                            currentLocation = null;
+                            if (!redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                                currentLocation = null;
+                            }
                         } else {
                             continue;
                         }
@@ -263,7 +283,7 @@ public class LocationAllocationStrategy {
                     String lotatt = asnSoStrategy.getSoSameLotatt1Value();
                     if (!StringUtils.isEmpty(lotatt)) {
                         String lotattValue = currentLocationLotatt.getAttMap().get(lotatt);
-                        redisTemplate.opsForValue().set(lotatt, lotattValue);
+                        redisCache.setCacheObject(lotatt, lotattValue);
                     }
                     break;
                 }
@@ -279,16 +299,21 @@ public class LocationAllocationStrategy {
                         }
                     }
                     if (currentLocation == null) {
-                        if (baseLocationInfoService.checkIsLock(b, "N")) {
-                            BaseLocationInfo locationInfo = new BaseLocationInfo();
-                            BeanUtils.copyProperties(b, locationInfo);
-                            currentLocation = locationInfo;
-                            currentLocationLotatt = b;
+                        if (b.getIsEmpty().equals("Y") && b.getStockStatus().equals("00")) {
+                            if (redisCache.lockCacheObject(RedisKey.LOCK_LOCATION + b.getId(), b.getId().toString(), token)) {
+                                BaseLocationInfo locationInfo = new BaseLocationInfo();
+                                BeanUtils.copyProperties(b, locationInfo);
+                                currentLocation = locationInfo;
+                                currentLocationLotatt = b;
+                            }
                         }
                     } else {
                         //如果前面的库位已阻挡则之前的库位不可用
+                        //TODO 任务中的库位可以继续使用
                         if (!b.getIsEmpty().equals("Y") || !b.getStockStatus().equals("00")) {
-                            currentLocation = null;
+                            if (!redisCache.checkIsLock(RedisKey.LOCK_LOCATION + b.getId())) {
+                                currentLocation = null;
+                            }
                         } else {
                             continue;
                         }
@@ -299,7 +324,7 @@ public class LocationAllocationStrategy {
                     String lotatt = asnSoStrategy.getSoSameLotatt1Value();
                     if (!StringUtils.isEmpty(lotatt)) {
                         String lotattValue = currentLocationLotatt.getAttMap().get(lotatt);
-                        redisTemplate.opsForValue().set(lotatt, lotattValue);
+                        redisCache.setCacheObject(lotatt, lotattValue);
                     }
                     break;
                 }

+ 10 - 73
warewms-ams/src/main/java/com/ruoyi/ams/lineCall/domain/form/LineCallForm.java

@@ -8,85 +8,22 @@ import java.util.List;
  * Date: 2022/3/9
  */
 public class LineCallForm {
+    private Long flowId;
+    private List<LineCallListFrom> lineCallList;
 
-    //编号
-    private Long id;
-    //物料
-    private String sku;
-    //数量
-    private Double qty;
-    //重量
-    private Double weight;
-    //供应商
-    private String supplier;
-    //起始(库位或者区域)
-    private String locationFrom;
-    //目标(库位或者区域)
-    private String locationTo;
-    //批次属性
-    private List<LineCallDetailsForm> lineCallDetailsFormList;
-
-    public String getSku() {
-        return sku;
-    }
-
-    public void setSku(String sku) {
-        this.sku = sku;
-    }
-
-    public Double getQty() {
-        return qty;
-    }
-
-    public void setQty(Double qty) {
-        this.qty = qty;
-    }
-
-    public Double getWeight() {
-        return weight;
-    }
-
-    public void setWeight(Double weight) {
-        this.weight = weight;
-    }
-
-    public String getSupplier() {
-        return supplier;
-    }
-
-    public void setSupplier(String supplier) {
-        this.supplier = supplier;
-    }
-
-    public String getLocationFrom() {
-        return locationFrom;
-    }
-
-    public void setLocationFrom(String locationFrom) {
-        this.locationFrom = locationFrom;
-    }
-
-    public String getLocationTo() {
-        return locationTo;
-    }
-
-    public void setLocationTo(String locationTo) {
-        this.locationTo = locationTo;
-    }
-
-    public Long getId() {
-        return id;
+    public Long getFlowId() {
+        return flowId;
     }
 
-    public void setId(Long id) {
-        this.id = id;
+    public void setFlowId(Long flowId) {
+        this.flowId = flowId;
     }
 
-    public List<LineCallDetailsForm> getLineCallDetailsFormList() {
-        return lineCallDetailsFormList;
+    public List<LineCallListFrom> getLineCallList() {
+        return lineCallList;
     }
 
-    public void setLineCallDetailsFormList(List<LineCallDetailsForm> lineCallDetailsFormList) {
-        this.lineCallDetailsFormList = lineCallDetailsFormList;
+    public void setLineCallList(List<LineCallListFrom> lineCallList) {
+        this.lineCallList = lineCallList;
     }
 }

+ 86 - 0
warewms-ams/src/main/java/com/ruoyi/ams/lineCall/domain/form/LineCallListFrom.java

@@ -0,0 +1,86 @@
+package com.ruoyi.ams.lineCall.domain.form;
+
+import java.util.List;
+
+public class LineCallListFrom {
+    //编号
+    private Long id;
+    //物料
+    private String sku;
+    //数量
+    private Double qty;
+    //重量
+    private Double weight;
+    //供应商
+    private String supplier;
+    //起始(库位或者区域)
+    private String locationFrom;
+    //目标(库位或者区域)
+    private String locationTo;
+    //批次属性
+    private List<LineCallDetailsForm> lineCallDetailsFormList;
+
+    public String getSku() {
+        return sku;
+    }
+
+    public void setSku(String sku) {
+        this.sku = sku;
+    }
+
+    public Double getQty() {
+        return qty;
+    }
+
+    public void setQty(Double qty) {
+        this.qty = qty;
+    }
+
+    public Double getWeight() {
+        return weight;
+    }
+
+    public void setWeight(Double weight) {
+        this.weight = weight;
+    }
+
+    public String getSupplier() {
+        return supplier;
+    }
+
+    public void setSupplier(String supplier) {
+        this.supplier = supplier;
+    }
+
+    public String getLocationFrom() {
+        return locationFrom;
+    }
+
+    public void setLocationFrom(String locationFrom) {
+        this.locationFrom = locationFrom;
+    }
+
+    public String getLocationTo() {
+        return locationTo;
+    }
+
+    public void setLocationTo(String locationTo) {
+        this.locationTo = locationTo;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public List<LineCallDetailsForm> getLineCallDetailsFormList() {
+        return lineCallDetailsFormList;
+    }
+
+    public void setLineCallDetailsFormList(List<LineCallDetailsForm> lineCallDetailsFormList) {
+        this.lineCallDetailsFormList = lineCallDetailsFormList;
+    }
+}

+ 1 - 0
warewms-ams/src/main/java/com/ruoyi/ams/lineCall/service/impl/LineCallServiceImpl.java

@@ -142,6 +142,7 @@ public class LineCallServiceImpl implements ILineCallService {
                 }
             }
         }
+        lineCallVO.setId(flowConfigHeaderVO.getId());
         lineCallVO.setSkuList(skuList);
         lineCallVO.setLocationFrom(locationFromList);
         lineCallVO.setLocationFromFlag(flowConfigHeaderVO.getLocationFromFlag());

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

@@ -5,6 +5,7 @@ import java.util.List;
 import com.ruoyi.ams.inv.mapper.InvLotLocIdMapper;
 import com.ruoyi.base.domain.BaseLocationInfo;
 import com.ruoyi.base.service.IBaseLocationInfoService;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
@@ -30,7 +31,7 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
     @Autowired
     private InvLotLocIdMapper invLotLocIdMapper;
     @Autowired
-    private RedisTemplate<String, String> redisTemplate;
+    private RedisCache redisCache;
 
     /**
      * 查询AGV任务
@@ -129,7 +130,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         if (!StringUtils.isEmpty(wcsTask.getLocationTo())) {
             bt = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationTo()));
             if (bt != null) {
-                redisTemplate.delete("lock_location_" + bt.getId());
                 bt.setIsEmpty("N");
                 bt.setStockStatus("00");
                 baseLocationInfoService.updateBaseLocationInfo(bt);
@@ -140,7 +140,6 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
         if (!StringUtils.isEmpty(wcsTask.getLocationFrom())) {
             bf = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationFrom()));
             if (bf != null) {
-                redisTemplate.delete("lock_location_" + bf.getId());
                 bf.setIsEmpty("Y");
                 bf.setStockStatus("00");
                 baseLocationInfoService.updateBaseLocationInfo(bf);
@@ -148,6 +147,12 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             baseLocationInfoService.updateLocationStockStatus(Long.parseLong(wcsTask.getLocationFrom()), "00");
         }
 
+        //释放redis锁
+        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+        }
+
+
         if (!StringUtils.isEmpty(wcsTask.getLocationFrom()) && !StringUtils.isEmpty(wcsTask.getLocationTo())) {
             invLotLocIdMapper.updateInvLotLocIdLocationId(Long.parseLong(wcsTask.getLocationFrom()), Long.parseLong(wcsTask.getLocationTo()));
         }
@@ -172,6 +177,10 @@ public class WcsTaskServiceImpl implements IWcsTaskService {
             bt = baseLocationInfoService.selectBaseLocationInfoById(Long.parseLong(wcsTask.getLocationTo()));
             baseLocationInfoService.updateLocationStockStatus(bt.getId(), "00");
         }
+        //释放redis锁
+        if (!StringUtils.isEmpty(wcsTask.getExt8())) {
+            redisCache.unlockCacheObject(Long.parseLong(wcsTask.getExt8()));
+        }
         //修改任务状态
         wcsTask.setState(7L);
         wcsTaskMapper.updateWcsTask(wcsTask);

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

@@ -108,13 +108,6 @@ public interface IBaseLocationInfoService
      */
     int updateLocationStockStatus(Long id,String status);
 
-    /**
-     * 判断库位是否锁定
-     * @param baseLocationInfo
-     * @return
-     */
-    boolean checkIsLock(BaseLocationInfo baseLocationInfo, String isEmpty);
-
     /**
      * 查询相邻可以存放的库位
      * @param colNo

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

@@ -171,27 +171,9 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
 
     @Override
     public int updateLocationStockStatus(Long id, String status) {
-        if (status.equals("10")) {
-            redisTemplate.opsForValue().set("lock_location_" + id, id.toString());
-        } else if (status.equals("00")) {
-            redisTemplate.delete("lock_location_" + id);
-        }
         return baseLocationInfoMapper.updateLocationStockStatus(id, status);
     }
 
-    @Override
-    public boolean checkIsLock(BaseLocationInfo baseLocationInfo, String isEmpty) {
-        String str = redisTemplate.opsForValue().get("lock_location_" + baseLocationInfo.getId());
-        if (baseLocationInfo.getIsEmpty().equals(isEmpty)
-                && baseLocationInfo.getStockStatus().equals("00")
-                && StringUtils.isEmpty(redisTemplate.opsForValue().get("lock_location_" + baseLocationInfo.getId()))
-        ) {
-            return true;
-        } else {
-            return false;
-        }
-    }
-
     @Override
     public List<BaseLocationInfo> selectNeighborLocation(String colNo, Long zoneId) {
         List<BaseLocationInfo> colNoList = baseLocationInfoMapper.selectAllColNo();