Browse Source

入库分配

andy 3 years ago
parent
commit
86be3bad9a

+ 1 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/warewms/base/BaseLocationInfoController.java

@@ -85,7 +85,7 @@ public class BaseLocationInfoController extends BaseController {
         }
         List<BaseLocationInfo> list = baseLocationInfoMapper.checkIsRepeat(baseLocationInfo);
         if (list != null && list.size() > 0) {
-            return AjaxResult.error("库位编码和列号不能重复");
+            return AjaxResult.error("库位编码不能重复");
         }
         return toAjax(baseLocationInfoService.insertBaseLocationInfo(baseLocationInfo));
     }

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

@@ -68,9 +68,12 @@ public class WarehouseTest {
 
     @Test
     public void test1() {
+        LotattDTO lotattDTO = new LotattDTO();
+        lotattDTO.setLotatt01("1000");
         InWarehouseDTO inWarehouseDTO = new InWarehouseDTO();
-        inWarehouseDTO.setSku("A");
+        inWarehouseDTO.setSku("test1");
         inWarehouseDTO.setWarehouseId(1L);
+        inWarehouseDTO.setLotattDTO(lotattDTO);
         BaseLocationInfo locationInfo = businessService.inLocationAllocation(inWarehouseDTO);
         if (locationInfo != null) {
             System.out.println("-------------------");
@@ -121,16 +124,6 @@ public class WarehouseTest {
 
     @Test
     public void test4() {
-        //List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectNeighborLocation("A2",null);
-        //System.out.println(JSON.toJSONString(locationInfoList));
-        /*List<String> arr = new ArrayList<>();
-        arr.add("A1");
-        arr.add("A2");
-        arr.add("A3");
-        List<BaseLocationInfo> locationInfoList = baseLocationInfoMapper.selectLocationByColNos(arr);
-        System.out.println(JSON.toJSONString(locationInfoList));*/
-        Map<String, String> att = new HashMap<>();
-        att.put("lotatt01","");
-        baseLocationInfoMapper.selectSameSkuColNo("A", null, att);
+
     }
 }

+ 12 - 0
ruoyi-ui/src/views/ams/locationPriority/index.vue

@@ -167,6 +167,18 @@
         })
       },
       formSub() {
+        if (this.form.asnSameLotatt1Flag === 'optimization' && this.form.asnSameLotatt1Value === '') {
+          this.$modal.msgError('请选择需要优化的批次属性');
+          return;
+        }
+        if (this.form.asnSameLotatt2Flag === 'optimization' && this.form.asnSameLotatt2Value === '') {
+          this.$modal.msgError('请选择需要优化的批次属性');
+          return;
+        }
+        if (this.form.soSameLotatt1Flag === 'optimization' && this.form.soSameLotatt1Value === '') {
+          this.$modal.msgError('请选择需要优化的批次属性');
+          return;
+        }
         asnSoStrategySubmit(this.form).then(response => {
           if (response.code === 200) {
             this.$modal.msgSuccess("执行成功");

+ 1 - 1
ruoyi-ui/src/views/base/locationInfo/index.vue

@@ -437,7 +437,7 @@ export default {
         locationType: null,
         rackId: null,
         agvStation: null,
-        foldedTag: 'N',
+        foldedTag: '0',
         foldedCount: 0,
         userdefine1: null,
         userdefine2: null,

+ 15 - 16
warewms-ams/src/main/java/com/ruoyi/ams/business/BusinessServiceImpl.java

@@ -1,5 +1,6 @@
 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.LocationPriorityHeader;
@@ -171,8 +172,12 @@ public class BusinessServiceImpl implements IBusinessService {
                 List<BaseLocationInfo> locationInfoList = new ArrayList<>();
                 if (asnSoStrategy.getAsnSameSku().equals("force")) {
                     List<String> colNo = baseLocationInfoMapper.selectSameSkuColNo(baseSku.getSku(), null, lotattMap);
-                    List<BaseLocationInfo> locs = baseLocationInfoMapper.selectLocationByColNos(colNo);
-                    locationInfoList.addAll(locs);
+                    for (String s : colNo) {
+                        List<BaseLocationInfo> locs = baseLocationInfoService.selectNeighborLocation(s, null);
+                        locationInfoList.addAll(locs);
+                    }
+                    System.out.println(JSON.toJSONString(locationInfoList));
+                    // List<BaseLocationInfo> locs = baseLocationInfoMapper.selectLocationByColNos(colNo);
                 } else if (asnSoStrategy.getAsnSameSku().equals("optimization") || asnSoStrategy.getAsnSameSkuType().equals("optimization")) {
                     List<String> skuColNo = baseLocationInfoMapper.selectSameSkuColNo(baseSku.getSku(), null, lotattMap);
                     List<String> skuTypeColNo = baseLocationInfoMapper.selectSameSkuColNo(baseSku.getSkuType(), null, lotattMap);
@@ -184,14 +189,13 @@ public class BusinessServiceImpl implements IBusinessService {
                 } else {
                     locationInfoList = baseLocationInfoMapper.selectLocationBindSku(baseSku.getSkuType());
                 }
-
+                return locationAllocationStrategy.filterLockLocation(locationInfoList, inWarehouseDTO, asnSoStrategy);
             } else {
                 // 指定区域的
                 List<BaseLocationInfo> locationInfoList = baseLocationInfoService.selectSortedLocatinListByZoneId(Long.parseLong(inWarehouseDTO.getLocationZoneTo()), inWarehouseDTO.getWarehouseId());
                 return locationAllocationStrategy.filterLockLocation(locationInfoList);
             }
         }
-        return null;
     }
 
     @Transactional
@@ -214,19 +218,14 @@ public class BusinessServiceImpl implements IBusinessService {
                     zoneIdList.add(vo.getZoneId());
                 }
             }
-
-            for (Long zoneId : zoneIdList) {
-                LocationPriorityHeader query = new LocationPriorityHeader();
-                query.setLocationZone(zoneId.toString());
-                List<LocationPriorityHeaderVO> list = locationPriorityHeaderService.selectLocationPriorityHeaderList(query);
-                LocationPriorityHeaderVO vo = null;
-                if (list != null && list.size() > 0) {
-                    vo = list.get(0);
-                }
-                return locationAllocationStrategy.filterLockInv(zoneId, outWarehouseDTO, vo);
-            }
+            //TODO 查询条件
+            BaseLocationInfo query = new BaseLocationInfo();
+            //query.setWarehouseId();
+            //query.setZoneId();
+            List<BaseLocationLotattVO> locationInfoList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneId(query);
+            AsnSoStrategy asnSoStrategy = asnSoStrategyMapper.selectAsnSoStrategy();
+            return locationAllocationStrategy.filterLockInv(locationInfoList, outWarehouseDTO, asnSoStrategy);
         }
-        return null;
     }
 
     @Transactional

+ 19 - 83
warewms-ams/src/main/java/com/ruoyi/ams/config/service/LocationAllocationStrategy.java

@@ -2,6 +2,7 @@ package com.ruoyi.ams.config.service;
 
 import com.ruoyi.ams.business.domain.LocationSortComparator;
 import com.ruoyi.ams.business.domain.LocationSortDTO;
+import com.ruoyi.ams.config.domain.AsnSoStrategy;
 import com.ruoyi.ams.config.domain.dto.InWarehouseDTO;
 import com.ruoyi.ams.config.domain.dto.LotattDTO;
 import com.ruoyi.ams.config.domain.dto.OutWarehouseDTO;
@@ -82,47 +83,19 @@ public class LocationAllocationStrategy {
     /**
      * 根据策略过滤锁定库位
      *
-     * @param zoneId                   入库区域
-     * @param inWarehouseDTO           入库信息
-     * @param locationPriorityHeaderVO 出入库策略
+     * @param baseLocationInfoList 入库区域
+     * @param inWarehouseDTO       入库信息
+     * @param asnSoStrategy        出入库策略
      * @return
      */
-    public BaseLocationInfo filterLockLocation(Long zoneId, InWarehouseDTO inWarehouseDTO, LocationPriorityHeaderVO locationPriorityHeaderVO) {
-        BaseLocationInfo query = new BaseLocationInfo();
-        query.setWarehouseId(inWarehouseDTO.getWarehouseId());
-        query.setZoneId(zoneId);
-        List<BaseLocationLotattVO> locationLotattVOList = baseLocationInfoMapper.selectSortedLocationLotattListByZoneId(query);
-        List<LocationPriorityDetailsVO> locationPriorityDetails = locationPriorityHeaderMapper.selectLocationPriorityDetailsList(locationPriorityHeaderVO.getId());
-        //批次属性
-        LinkedHashMap<String, String> lotatt = new LinkedHashMap<>();
-        if (locationPriorityDetails != null && locationPriorityDetails.size() > 0) {
-            for (LocationPriorityDetailsVO vo : locationPriorityDetails) {
-                lotatt.put(vo.getLotattId(), vo.getLotattValue());
-            }
-        }
-        //如果策略配置了入库的属性那么选择相同属性的库位进行存放
-        if (lotatt.size() > 0 && inWarehouseDTO.getLotattDTO() != null) {
-            LotattDTO lotattDTO = inWarehouseDTO.getLotattDTO();
-            lotattDTO.getAttr();
-            boolean isSame = true;
-            for (Map.Entry<String, String> attEntry : lotatt.entrySet()) {
-                if (lotattDTO.getAttr().get(attEntry.getKey()) != null) {
-                    if (!lotattDTO.getAttr().get(attEntry.getKey()).equals(attEntry.getValue())) {
-                        isSame = false;
-                    }
-                }
-            }
-            if (isSame == false) {
-                return null;
-            }
-        }
+    public BaseLocationInfo filterLockLocation(List<BaseLocationInfo> baseLocationInfoList, InWarehouseDTO inWarehouseDTO, AsnSoStrategy asnSoStrategy) {
 
         //将同一列的库位排序好
         Integer parallelCount = 0;
         LinkedHashMap<String, Boolean> taskingFlag = new LinkedHashMap<>();
-        LinkedHashMap<String, List<BaseLocationLotattVO>> map = new LinkedHashMap<>();
-        for (BaseLocationLotattVO info : locationLotattVOList) {
-            List<BaseLocationLotattVO> infoList;
+        LinkedHashMap<String, List<BaseLocationInfo>> map = new LinkedHashMap<>();
+        for (BaseLocationInfo info : baseLocationInfoList) {
+            List<BaseLocationInfo> infoList;
             if (map.containsKey(info.getColNo())) {
                 infoList = map.get(info.getColNo());
             } else {
@@ -142,38 +115,19 @@ public class LocationAllocationStrategy {
 
         //过滤出每列可以用的库位并进行分配
         BaseLocationInfo currentLocation = null;
-        for (Map.Entry<String, List<BaseLocationLotattVO>> entry : map.entrySet()) {
-            List<BaseLocationLotattVO> locationInfoList = entry.getValue();
-            for (BaseLocationLotattVO b : locationInfoList) {
+        for (Map.Entry<String, List<BaseLocationInfo>> entry : map.entrySet()) {
+            List<BaseLocationInfo> locationInfoList = entry.getValue();
+            for (BaseLocationInfo b : locationInfoList) {
                 //如果允许并行则跳过已经分配过的列
-                if (locationPriorityHeaderVO.getParallelFlag().equals("Y")) {
+                if (asnSoStrategy.getAsnLocationAverage().equals("Y")) {
                     //如果达到并行数量,则当前区域不再进行分配
-                    if (parallelCount + 1 > locationPriorityHeaderVO.getParallelCount()) {
+                    /*if (parallelCount + 1 > locationPriorityHeaderVO.getParallelCount()) {
                         return null;
-                    }
+                    }*/
                     if (taskingFlag.get(b.getColNo())) {
                         continue;
                     }
                 }
-                // TODO 如果库存中已存在批次属性那么存放相同批次属性的物料
-                /*if (lotatt.size() > 0) { //指定了批次属性的需要对相同批次属性的库存进行匹配
-                    //如果没有批次属性查询是否有待搬运的属性
-                    if (b.getLotattVO() == null) {
-                        LotattVO lotattVO = baseLocationInfoMapper.selectInvLotattById(b.getId());
-                        b.setLotattVO(lotattVO);
-                    }
-                    b.initLotatt();
-                    boolean isSame = true;
-                    for (Map.Entry<String, String> attEntry : lotatt.entrySet()) {
-                        if (!b.getAttMap().get(attEntry.getKey()).equals(attEntry.getValue())) {
-                            isSame = false;
-                        }
-                    }
-                    if (isSame == false) {
-                        continue;
-                    }
-                }*/
-
                 if (currentLocation == null) {
                     if (b.getIsEmpty().equals("Y") && b.getStockStatus().equals("00")) {
                         BaseLocationInfo locationInfo = new BaseLocationInfo();
@@ -199,23 +153,13 @@ public class LocationAllocationStrategy {
     /**
      * 过滤出库
      *
-     * @param zoneId
      * @param outWarehouseDTO
-     * @param locationPriorityHeaderVO
+     * @param asnSoStrategy   出入库策略
      * @return
      */
-    public BaseLocationInfo filterLockInv(Long zoneId, OutWarehouseDTO outWarehouseDTO, LocationPriorityHeaderVO locationPriorityHeaderVO) {
-        List<BaseLocationLotattVO> locationLotattVOList = invLotLocIdMapper.selectInvLocationList(zoneId, outWarehouseDTO.getSku(), outWarehouseDTO.getSkuType(), 0D, "", outWarehouseDTO.getLotattDTO());
-        List<LocationPriorityDetailsVO> locationPriorityDetails = null;
-        LinkedHashMap<String, String> lotatt = new LinkedHashMap<>();
-        if (locationPriorityHeaderVO != null) {
-            locationPriorityDetails = locationPriorityHeaderMapper.selectLocationPriorityDetailsList(locationPriorityHeaderVO.getId());
-            //批次属性
-            if (locationPriorityDetails != null && locationPriorityDetails.size() > 0) {
-                for (LocationPriorityDetailsVO vo : locationPriorityDetails) {
-                    lotatt.put(vo.getLotattId(), vo.getLotattValue());
-                }
-            }
+    public BaseLocationInfo filterLockInv(List<BaseLocationLotattVO> locationLotattVOList, OutWarehouseDTO outWarehouseDTO, AsnSoStrategy asnSoStrategy) {
+        if (asnSoStrategy.getSoSameLotatt1Flag().equals("Y")) {
+            //TODO 同批次属性出库
         }
 
         //将同一列的库位排序好
@@ -244,7 +188,7 @@ public class LocationAllocationStrategy {
 
         //过滤出每列可以用的库位并进行分配
         BaseLocationInfo currentLocation = null;
-        if (locationPriorityHeaderVO.getPeriodFlag().equals("Y")) { //近效期
+        if (asnSoStrategy.getSoPeriodFlag().equals("Y")) { //近效期
             list.sort(new LocationSortComparator());
             for (LocationSortDTO locationSortDTO : list) {
                 List<BaseLocationLotattVO> locationInfoList = map.get(locationSortDTO.getColNo());
@@ -272,14 +216,6 @@ public class LocationAllocationStrategy {
             for (Map.Entry<String, List<BaseLocationLotattVO>> entry : map.entrySet()) {
                 List<BaseLocationLotattVO> locationInfoList = entry.getValue();
                 for (BaseLocationLotattVO b : locationInfoList) {
-                    if (locationPriorityHeaderVO.getSameLotattFlag().equals("N")) {
-                        //如果外围优先则跳过当前出
-                        if (locationPriorityHeaderVO.getOuterFlag().equals("Y")) {
-                            if (taskingFlag.get(b.getColNo())) {
-                                continue;
-                            }
-                        }
-                    }
                     if (currentLocation == null) {
                         if (b.getIsEmpty().equals("N") && b.getStockStatus().equals("00")) {
                             BaseLocationInfo locationInfo = new BaseLocationInfo();

+ 2 - 0
warewms-ams/src/main/resources/mapper/ams/InvLotLocIdMapper.xml

@@ -241,6 +241,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         left join base_location_info b on inv.location_id = b.id
         left join base_sku sk on inv.sku = sk.sku
         left join base_sku_type skt on sk.sku_type = skt.item_code
+        left join base_location_zone bz on b.zone_id = bz.zone_id
         <where>
             <if test="sku != null  and sku != ''"> and sk.sku = #{sku}</if>
             <if test="skuType != null  and skuType != ''"> and skt.item_code = #{skuType}</if>
@@ -263,6 +264,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="lotattDTO.lotatt17 != null  and lotattDTO.lotatt17 != ''"> and att.lotatt17 = #{lotattDTO.lotatt17}</if>
             <if test="lotattDTO.lotatt18 != null  and lotattDTO.lotatt18 != ''"> and att.lotatt18 = #{lotattDTO.lotatt18}</if>
         </where>
+        and bz.userdefine1 = 'INV'
     </select>
 
     <select id="selectInvLocIdLotattList" resultMap="InvLotLocIdLotattResult">

+ 42 - 26
warewms-base/src/main/java/com/ruoyi/base/mapper/BaseLocationInfoMapper.java

@@ -10,138 +10,154 @@ import org.apache.ibatis.annotations.Param;
 
 /**
  * 库位信息Mapper接口
- * 
+ *
  * @author andy
  * @date 2022-02-18
  */
-public interface BaseLocationInfoMapper 
-{
+public interface BaseLocationInfoMapper {
     /**
      * 查询库位信息
-     * 
+     *
      * @param id 库位信息主键
      * @return 库位信息
      */
-     BaseLocationInfo selectBaseLocationInfoById(Long id);
+    BaseLocationInfo selectBaseLocationInfoById(Long id);
 
     /**
      * 根据库位编号查询库位信息
+     *
      * @param locationNo
      * @param wrehouseId
      * @return
      */
-     BaseLocationInfo selectBaseLocationInfoByLocationNo(@Param("locationNo") String locationNo,@Param("warehouseId") Long wrehouseId);
+    BaseLocationInfo selectBaseLocationInfoByLocationNo(@Param("locationNo") String locationNo, @Param("warehouseId") Long wrehouseId);
 
     /**
      * 查询库位信息列表
-     * 
+     *
      * @param baseLocationInfo 库位信息
      * @return 库位信息集合
      */
-     List<BaseLocationInfo> selectBaseLocationInfoList(BaseLocationInfo baseLocationInfo);
+    List<BaseLocationInfo> selectBaseLocationInfoList(BaseLocationInfo baseLocationInfo);
 
     /**
      * 新增库位信息
-     * 
+     *
      * @param baseLocationInfo 库位信息
      * @return 结果
      */
-     int insertBaseLocationInfo(BaseLocationInfo baseLocationInfo);
+    int insertBaseLocationInfo(BaseLocationInfo baseLocationInfo);
 
     /**
      * 修改库位信息
-     * 
+     *
      * @param baseLocationInfo 库位信息
      * @return 结果
      */
-     int updateBaseLocationInfo(BaseLocationInfo baseLocationInfo);
+    int updateBaseLocationInfo(BaseLocationInfo baseLocationInfo);
 
     /**
      * 删除库位信息
-     * 
+     *
      * @param id 库位信息主键
      * @return 结果
      */
-     int deleteBaseLocationInfoById(Long id);
+    int deleteBaseLocationInfoById(Long id);
 
     /**
      * 批量删除库位信息
-     * 
+     *
      * @param ids 需要删除的数据主键集合
      * @return 结果
      */
-     int deleteBaseLocationInfoByIds(Long[] ids);
+    int deleteBaseLocationInfoByIds(Long[] ids);
 
     /**
      * 根据zoneId查询库位信息
      * 返回结果会根据排列层进行排序
+     *
      * @param baseLocationInfo
      * @return
      */
-     List<BaseLocationInfo> selectSortedLocationListByZoneId(BaseLocationInfo baseLocationInfo);
+    List<BaseLocationInfo> selectSortedLocationListByZoneId(BaseLocationInfo baseLocationInfo);
 
     /**
      * 根据zoneId查询库位信息带批次属性
+     *
      * @param baseLocationInfo
      * @return
      */
-     List<BaseLocationLotattVO> selectSortedLocationLotattListByZoneId(BaseLocationInfo baseLocationInfo);
+    List<BaseLocationLotattVO> selectSortedLocationLotattListByZoneId(BaseLocationInfo baseLocationInfo);
+
+    /**
+     * 根据zoneId和批次属性查询库位信息带批次属性
+     * @param zoneId
+     * @param lotatt
+     * @return
+     */
+    List<BaseLocationLotattVO> selectSortedLocationLotattListByZoneIdList(@Param("zoneId") List<Long> zoneId,@Param("lotatt") Map<String, String> lotatt);
 
-     LotattVO selectInvLotattById(@Param("id") Long id);
+    LotattVO selectInvLotattById(@Param("id") Long id);
 
     /**
-     *
      * @param id
      * @param status
      * @return
      */
-     int updateLocationStockStatus(@Param("id") Long id,@Param("status") String status);
+    int updateLocationStockStatus(@Param("id") Long id, @Param("status") String status);
 
     /**
      * 查询重复的库位(库位编号、列号)
+     *
      * @param baseLocationInfo
      * @return
      */
-     List<BaseLocationInfo> checkIsRepeat(BaseLocationInfo baseLocationInfo);
+    List<BaseLocationInfo> checkIsRepeat(BaseLocationInfo baseLocationInfo);
 
     /**
      * 查询已经绑定sku分类的库位
+     *
      * @param skuType
      * @return
      */
-     List<BaseLocationInfo> selectLocationBindSku(String skuType);
+    List<BaseLocationInfo> selectLocationBindSku(String skuType);
 
     /**
      * 查询存放相同物料的列
+     *
      * @param sku
      * @param zoneId
      * @return
      */
-     List<String> selectSameSkuColNo(@Param("sku") String sku,@Param("zoneId") Long zoneId,@Param("lotatt") Map<String,String> lotatt);
+    List<String> selectSameSkuColNo(@Param("sku") String sku, @Param("zoneId") Long zoneId, @Param("lotatt") Map<String, String> lotatt);
 
     /**
      * 存放相同物料类型的列
+     *
      * @param skuType
      * @param zoneId
      * @return
      */
-     List<String> selectSameSkuTypeColNo(@Param("skuType") String skuType,@Param("zoneId") Long zoneId);
+    List<String> selectSameSkuTypeColNo(@Param("skuType") String skuType, @Param("zoneId") Long zoneId);
 
     /**
      * 查询所有存储区的列
+     *
      * @return
      */
     List<BaseLocationInfo> selectAllColNo();
 
     /**
      * 查询列下面所有库位
+     *
      * @param colNo
      * @return
      */
-     List<BaseLocationInfo> selectLocationByColNo(String colNo);
+    List<BaseLocationInfo> selectLocationByColNo(String colNo);
 
     /**
      * 查询列下面所有库位
+     *
      * @param colNos
      * @return
      */

+ 2 - 4
warewms-base/src/main/java/com/ruoyi/base/service/impl/BaseLocationInfoServiceImpl.java

@@ -186,6 +186,7 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
             }
             if (colNoList.get(i).getColNo().equals(colNo)) {
                 currentLocation = colNoList.get(i);
+                preColNo = colNoList.get(i - 1).getColNo();
                 if (i + 1 < colNoList.size()) {
                     nextColNo = colNoList.get(i + 1).getColNo();
                 }
@@ -203,12 +204,9 @@ public class BaseLocationInfoServiceImpl implements IBaseLocationInfoService {
                 }
             }
         }
-        System.out.println("pre------>" + preColNo);
-        System.out.println("current---->" + colNo);
-        System.out.println("next----->" + nextColNo);
+        resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(colNo));
         resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(preColNo));
         resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(nextColNo));
-        resultList.addAll(baseLocationInfoMapper.selectLocationByColNo(colNo));
         return resultList;
     }
 }

+ 33 - 2
warewms-base/src/main/resources/mapper/base/BaseLocationInfoMapper.xml

@@ -288,7 +288,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="checkIsRepeat" parameterType="BaseLocationInfo" resultMap="BaseLocationInfoResult">
         select * from base_location_info b
         where
-        (location_no = #{locationNo} or col_no = #{colNo})
+        location_no = #{locationNo}
     </select>
 
     <select id="selectLocationBindSku" parameterType="string" resultMap="BaseLocationInfoResult">
@@ -327,16 +327,36 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="lotatt.lotatt16 != null and lotatt.lotatt16 != ''"> and att.lotatt16 = #{lotatt.lotatt16}</if>
         <if test="lotatt.lotatt17 != null and lotatt.lotatt17 != ''"> and att.lotatt17 = #{lotatt.lotatt17}</if>
         <if test="lotatt.lotatt18 != null and lotatt.lotatt18 != ''"> and att.lotatt18 = #{lotatt.lotatt18}</if>
-        order by lpad(b.row_no, 11, '0'),b.row_index,lpad(b.shift_no, 11, '0'),b.shift_index,lpad(b.col_no, 11, '0'),b.col_index
+        group by b.col_no
+        order by lpad(b.col_no, 11, '0')
     </select>
 
     <select id="selectSameSkuTypeColNo" resultType="string">
         select b.col_no
         from base_location_info b
         left join inv_lot_loc_id i on b.id = i.location_id
+        left join inv_lot_att att on i.lotnum = att.lotnum
         left join base_sku s on i.sku = s.sku
         where s.sku_type = #{sku}
         and bz.userdefine1 = 'INV'
+        <if test="lotatt.lotatt01 != null and lotatt.lotatt01 != ''"> and att.lotatt01 = #{lotatt.lotatt01}</if>
+        <if test="lotatt.lotatt02 != null and lotatt.lotatt02 != ''"> and att.lotatt02 = #{lotatt.lotatt02}</if>
+        <if test="lotatt.lotatt03 != null and lotatt.lotatt03 != ''"> and att.lotatt03 = #{lotatt.lotatt03}</if>
+        <if test="lotatt.lotatt04 != null and lotatt.lotatt04 != ''"> and att.lotatt04 = #{lotatt.lotatt04}</if>
+        <if test="lotatt.lotatt05 != null and lotatt.lotatt05 != ''"> and att.lotatt05 = #{lotatt.lotatt05}</if>
+        <if test="lotatt.lotatt06 != null and lotatt.lotatt06 != ''"> and att.lotatt06 = #{lotatt.lotatt06}</if>
+        <if test="lotatt.lotatt07 != null and lotatt.lotatt07 != ''"> and att.lotatt07 = #{lotatt.lotatt07}</if>
+        <if test="lotatt.lotatt08 != null and lotatt.lotatt08 != ''"> and att.lotatt08 = #{lotatt.lotatt08}</if>
+        <if test="lotatt.lotatt09 != null and lotatt.lotatt09 != ''"> and att.lotatt09 = #{lotatt.lotatt09}</if>
+        <if test="lotatt.lotatt10 != null and lotatt.lotatt10 != ''"> and att.lotatt10 = #{lotatt.lotatt10}</if>
+        <if test="lotatt.lotatt11 != null and lotatt.lotatt11 != ''"> and att.lotatt11 = #{lotatt.lotatt11}</if>
+        <if test="lotatt.lotatt12 != null and lotatt.lotatt12 != ''"> and att.lotatt12 = #{lotatt.lotatt12}</if>
+        <if test="lotatt.lotatt13 != null and lotatt.lotatt13 != ''"> and att.lotatt13 = #{lotatt.lotatt13}</if>
+        <if test="lotatt.lotatt14 != null and lotatt.lotatt14 != ''"> and att.lotatt14 = #{lotatt.lotatt14}</if>
+        <if test="lotatt.lotatt15 != null and lotatt.lotatt15 != ''"> and att.lotatt15 = #{lotatt.lotatt15}</if>
+        <if test="lotatt.lotatt16 != null and lotatt.lotatt16 != ''"> and att.lotatt16 = #{lotatt.lotatt16}</if>
+        <if test="lotatt.lotatt17 != null and lotatt.lotatt17 != ''"> and att.lotatt17 = #{lotatt.lotatt17}</if>
+        <if test="lotatt.lotatt18 != null and lotatt.lotatt18 != ''"> and att.lotatt18 = #{lotatt.lotatt18}</if>
         order by lpad(b.row_no, 11, '0'),b.row_index,lpad(b.shift_no, 11, '0'),b.shift_index,lpad(b.col_no, 11, '0'),b.col_index
     </select>
 
@@ -357,4 +377,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <foreach item="item" collection="colNos" separator="," open="(" close=")" index="">  #{item, jdbcType=VARCHAR}
         </foreach>
     </select>
+
+    <select id="selectSortedLocationLotattListByZoneIdList" parameterType="BaseLocationInfo" resultMap="BaseLocationInfoLotattResult">
+        select b.id, b.warehouse_id, b.zone_id, b.location_no, b.location_barcode, b.row_no, b.row_index, b.col_no, b.col_index, b.shift_no,
+        b.shift_index, b.stock_status, b.is_empty, b.bind_sku, b.location_type,  b.rack_id,  b.agv_station,  b.folded_tag,  b.folded_count,
+        b.userdefine1, b.userdefine2, b.userdefine3, b.userdefine4,  b.userdefine5,  b.userdefine6,  b.userdefine7,  b.userdefine8,
+        b.userdefine9, b.userdefine10, b.create_by, b.create_time,  b.update_by,  b.update_time,  b.remark, inv.sku, inv.qty, att.*
+        from base_location_info b left join inv_lot_loc_id inv on b.id = inv.location_id
+        left join inv_lot_att att on inv.lotnum = att.lotnum
+        where warehouse_id = #{warehouseId} and zone_id = #{zoneId}
+        order by lpad(row_no, 11, '0'),row_index,lpad(shift_no, 11, '0'),shift_index,lpad(col_no, 11, '0'),col_index
+    </select>
 </mapper>