自动化立体仓库 - WMS系统
chen.llin
2 天以前 2816415f539ef54839e331657edae7055c243ad8
src/main/java/com/zy/asrs/service/impl/LocCacheServiceImpl.java
@@ -17,6 +17,7 @@
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -98,4 +99,304 @@
            return R.error("初始化失败===>" + e.getMessage());
        }
    }
    /**
     * 锁定/解锁缓存库位(复用AGV搬货后的库位有货逻辑)
     * 锁定:满托设置为 "F"(在库),空托设置为 "D"(空桶/空栈板)
     * 解锁:统一设置为 "O"(空库位)
     * @param locNo 库位号
     * @param lock 是否锁定,true-锁定,false-解锁
     * @param fullPlt 是否满托,true-满托(设置为F),false-空托(设置为D),解锁时忽略此参数
     * @param userId 用户ID
     * @return 操作结果
     */
    @Override
    public R lockOrUnlockLocCache(String locNo, Boolean lock, Boolean fullPlt, Long userId) {
        try {
            if (Cools.isEmpty(locNo)) {
                return R.error("库位号不能为空");
            }
            // 根据库位号查询库位
            EntityWrapper<LocCache> wrapper = new EntityWrapper<>();
            wrapper.eq("loc_no", locNo);
            LocCache locCache = this.selectOne(wrapper);
            if (Cools.isEmpty(locCache)) {
                return R.error("库位不存在:" + locNo);
            }
            // 更新库位状态
            String locSts;
            if (lock) {
                // 锁定:满托设置为"F"(在库),空托设置为"D"(空桶/空栈板)
                if (fullPlt == null) {
                    return R.error("锁定操作时,满托参数不能为空");
                }
                locSts = fullPlt ? "F" : "D";
                locCache.setFullPlt(fullPlt ? "Y" : "N");
            } else {
                // 解锁:统一设置为"O"(空库位)
                locSts = "O";
                locCache.setFullPlt("N");
            }
            locCache.setLocSts(locSts);
            locCache.setModiUser(userId);
            locCache.setModiTime(new Date());
            boolean success = this.updateById(locCache);
            if (success) {
                String action = lock ? "锁定" : "解锁";
                String detail = lock ? (fullPlt ? "满托" : "空托") : "";
                log.info("{}库位成功:{},库位状态:{},{},操作人:{}", action, locNo, locCache.getLocSts(), detail, userId);
                return R.ok(action + "成功");
            } else {
                return R.error("操作失败");
            }
        } catch (Exception e) {
            log.error("锁定/解锁库位失败", e);
            return R.error("操作失败:" + e.getMessage());
        }
    }
    /**
     * 锁定/解锁当前排的所有库位
     * @param locNo 库位号(用于获取排号)
     * @param lock 是否锁定,true-锁定,false-解锁
     * @param userId 用户ID
     * @return 操作结果
     */
    @Override
    public R lockOrUnlockRowLocCache(String locNo, Boolean lock, Boolean fullPlt, Long userId) {
        try {
            if (Cools.isEmpty(locNo)) {
                return R.error("库位号不能为空");
            }
            // 根据库位号查询库位,获取排号
            EntityWrapper<LocCache> wrapper = new EntityWrapper<>();
            wrapper.eq("loc_no", locNo);
            LocCache locCache = this.selectOne(wrapper);
            if (Cools.isEmpty(locCache)) {
                return R.error("库位不存在:" + locNo);
            }
            Integer row = locCache.getRow1();
            if (Cools.isEmpty(row)) {
                return R.error("库位排号为空:" + locNo);
            }
            // 查询当前排的1、2、3列的所有库位(解锁整排时只清空1、2、3列)
            EntityWrapper<LocCache> rowWrapper = new EntityWrapper<>();
            rowWrapper.eq("row1", row)
                    .in("bay1", Arrays.asList(1, 2, 3)); // 只查询1、2、3列
            // 如果库位有库区ID,也加上库区条件
            if (!Cools.isEmpty(locCache.getAreaId())) {
                rowWrapper.eq("area_id", locCache.getAreaId());
            }
            List<LocCache> locCacheList = this.selectList(rowWrapper);
            if (Cools.isEmpty(locCacheList)) {
                return R.error("当前排没有找到库位");
            }
            // 批量更新库位状态
            Date now = new Date();
            int successCount = 0;
            String locSts;
            if (lock) {
                // 锁定:满托设置为"F"(在库),空托设置为"D"(空桶/空栈板)
                if (fullPlt == null) {
                    return R.error("锁定操作时,满托参数不能为空");
                }
                locSts = fullPlt ? "F" : "D";
            } else {
                // 解锁:统一设置为"O"(空库位)
                locSts = "O";
            }
            for (LocCache cache : locCacheList) {
                cache.setLocSts(locSts);
                if (lock) {
                    cache.setFullPlt(fullPlt ? "Y" : "N");
                } else {
                    cache.setFullPlt("N");
                }
                cache.setModiUser(userId);
                cache.setModiTime(now);
                if (this.updateById(cache)) {
                    successCount++;
                }
            }
            String action = lock ? "锁定" : "解锁";
            log.info("{}排{}所有库位成功,共{}个库位,操作人:{}", action, row, successCount, userId);
            return R.ok(String.format("%s成功,共处理 %d 个库位", action, successCount));
        } catch (Exception e) {
            log.error("锁定/解锁排库位失败", e);
            return R.error("操作失败:" + e.getMessage());
        }
    }
    /**
     * 锁定/解锁当前列的所有库位
     * @param locNo 库位号(用于获取列号bay1)
     * @param lock 是否锁定,true-锁定,false-解锁
     * @param fullPlt 是否满托,true-满托(设置为F),false-空托(设置为D),解锁时忽略此参数
     * @param userId 用户ID
     * @return 操作结果
     */
    @Override
    public R lockOrUnlockBayLocCache(String locNo, Boolean lock, Boolean fullPlt, Long userId) {
        try {
            if (Cools.isEmpty(locNo)) {
                return R.error("库位号不能为空");
            }
            // 根据库位号查询库位,获取列号
            EntityWrapper<LocCache> wrapper = new EntityWrapper<>();
            wrapper.eq("loc_no", locNo);
            LocCache locCache = this.selectOne(wrapper);
            if (Cools.isEmpty(locCache)) {
                return R.error("库位不存在:" + locNo);
            }
            Integer bay = locCache.getBay1();
            if (Cools.isEmpty(bay)) {
                return R.error("库位列号为空:" + locNo);
            }
            // 查询当前列的所有库位
            EntityWrapper<LocCache> bayWrapper = new EntityWrapper<>();
            bayWrapper.eq("bay1", bay);
            // 如果库位有库区ID,也加上库区条件
            if (!Cools.isEmpty(locCache.getAreaId())) {
                bayWrapper.eq("area_id", locCache.getAreaId());
            }
            List<LocCache> locCacheList = this.selectList(bayWrapper);
            if (Cools.isEmpty(locCacheList)) {
                return R.error("当前列没有找到库位");
            }
            // 批量更新库位状态
            Date now = new Date();
            int successCount = 0;
            String locSts;
            if (lock) {
                // 锁定:满托设置为"F"(在库),空托设置为"D"(空桶/空栈板)
                if (fullPlt == null) {
                    return R.error("锁定操作时,满托参数不能为空");
                }
                locSts = fullPlt ? "F" : "D";
            } else {
                // 解锁:统一设置为"O"(空库位)
                locSts = "O";
            }
            for (LocCache cache : locCacheList) {
                cache.setLocSts(locSts);
                if (lock) {
                    cache.setFullPlt(fullPlt ? "Y" : "N");
                } else {
                    cache.setFullPlt("N");
                }
                cache.setModiUser(userId);
                cache.setModiTime(now);
                if (this.updateById(cache)) {
                    successCount++;
                }
            }
            String action = lock ? "锁定" : "解锁";
            log.info("{}列{}所有库位成功,共{}个库位,操作人:{}", action, bay, successCount, userId);
            return R.ok(String.format("%s成功,共处理 %d 个库位", action, successCount));
        } catch (Exception e) {
            log.error("锁定/解锁列库位失败", e);
            return R.error("操作失败:" + e.getMessage());
        }
    }
    /**
     * 清空整排的所有库位(所有列)
     * @param locNo 库位号(用于获取排号row1)
     * @param lock 是否锁定,true-锁定,false-解锁(清空)
     * @param fullPlt 是否满托,true-满托(设置为F),false-空托(设置为D),解锁时忽略此参数
     * @param userId 用户ID
     * @return 操作结果
     */
    @Override
    public R clearAllColumnsInRow(String locNo, Boolean lock, Boolean fullPlt, Long userId) {
        try {
            if (Cools.isEmpty(locNo)) {
                return R.error("库位号不能为空");
            }
            // 根据库位号查询库位,获取排号
            EntityWrapper<LocCache> wrapper = new EntityWrapper<>();
            wrapper.eq("loc_no", locNo);
            LocCache locCache = this.selectOne(wrapper);
            if (Cools.isEmpty(locCache)) {
                return R.error("库位不存在:" + locNo);
            }
            Integer row = locCache.getRow1();
            if (Cools.isEmpty(row)) {
                return R.error("库位排号为空:" + locNo);
            }
            // 查询当前排的所有库位(所有列,不限制bay1)
            EntityWrapper<LocCache> rowWrapper = new EntityWrapper<>();
            rowWrapper.eq("row1", row);
            // 如果库位有库区ID,也加上库区条件
            if (!Cools.isEmpty(locCache.getAreaId())) {
                rowWrapper.eq("area_id", locCache.getAreaId());
            }
            List<LocCache> locCacheList = this.selectList(rowWrapper);
            if (Cools.isEmpty(locCacheList)) {
                return R.error("当前排没有找到库位");
            }
            // 批量更新库位状态
            Date now = new Date();
            int successCount = 0;
            String locSts;
            if (lock) {
                // 锁定:满托设置为"F"(在库),空托设置为"D"(空桶/空栈板)
                if (fullPlt == null) {
                    return R.error("锁定操作时,满托参数不能为空");
                }
                locSts = fullPlt ? "F" : "D";
            } else {
                // 解锁:统一设置为"O"(空库位)
                locSts = "O";
            }
            for (LocCache cache : locCacheList) {
                cache.setLocSts(locSts);
                if (lock) {
                    cache.setFullPlt(fullPlt ? "Y" : "N");
                } else {
                    cache.setFullPlt("N");
                }
                cache.setModiUser(userId);
                cache.setModiTime(now);
                if (this.updateById(cache)) {
                    successCount++;
                }
            }
            String action = lock ? "锁定" : "清空";
            log.info("{}排{}所有库位(所有列)成功,共{}个库位,操作人:{}", action, row, successCount, userId);
            return R.ok(String.format("%s成功,共处理 %d 个库位", action, successCount));
        } catch (Exception e) {
            log.error("清空整排库位失败", e);
            return R.error("操作失败:" + e.getMessage());
        }
    }
}