自动化立体仓库 - WMS系统
pang.jiabao
1 天以前 fc12e6bbc12d0346076fefe7320e99fd14d13193
wms初始化
16个文件已修改
451 ■■■■■ 已修改文件
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/StaDescController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WorkController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/StaDesc.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WcsScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WcsSchedulerHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/StartupDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 137 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 217 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/SearchLocParam.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -119,7 +119,7 @@
    </dependencies>
    <build>
        <finalName>wms</finalName>
        <finalName>nwswms</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
src/main/java/com/zy/asrs/controller/StaDescController.java
@@ -117,7 +117,7 @@
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
                wrapper.eq(entry.getKey(), val);
            }
        }
    }
src/main/java/com/zy/asrs/controller/WorkController.java
@@ -176,7 +176,7 @@
    @ManagerAuth(memo = "生成任务")
    public R createWaitPainWrkMastStart(@RequestBody List<WaitPakin> list) {
        StartupDto startupDto = workService.createWaitPainWrkMastStart(list, getUserId());
        return R.ok("任务号:" + startupDto.getTaskNo() + ";目标库位:" + startupDto.getLocNo());
        return R.ok("任务号:" + startupDto.getWorkNo() + ";目标库位:" + startupDto.getLocNo());
    }
    @RequestMapping("/deal/preHave/start")
src/main/java/com/zy/asrs/entity/StaDesc.java
@@ -27,7 +27,6 @@
     */
    @ApiModelProperty(value = "路径ID")
    @TableId(value = "type_id", type = IdType.AUTO)
    @TableField("type_id")
    private Long typeId;
    /**
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -66,4 +66,13 @@
    String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList);
    List<LocMast> selectLocByTypeAndRowsToList(@Param("locType") Integer locType,@Param("rows") List<Integer> rows);
    /**
     *
     * 根据库位类型来搜索空库位(站点的不同限制堆垛机)
     * @param locType1 0123
     * @param crnNo 堆垛机号
     * @return 库位集合
     */
    List<LocMast> selectLocByTypeToList(@Param("locType1") int locType1,@Param("crnNo") int crnNo);
}
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
@@ -49,24 +49,24 @@
            throw new CoolException(devpNo + "站点不存在");
        }
        if (pakin) {
            if(station.getCanining()==null || !station.getAutoing().equals("Y")) {
            if(station.getCanining()==null || !station.getCanining().equals("Y")) {
                throw new CoolException(devpNo+"站点不是能入状态");
            }
//            if (station.getAutoing() == null || !station.getAutoing().equals("Y")) {
//                throw new CoolException(devpNo + "站点不是自动状态");
//            }
//            if (station.getLoading() == null || !station.getLoading().equals("Y")) {
//                throw new CoolException(devpNo + "站点无物");
//            }
//            if (station.getWrkNo() != null && station.getWrkNo() > 0 && station.getWrkNo() < 9990) {
//                throw new CoolException(devpNo + "站点已有工作号");
//            }
//            if(!station.getInEnable().equals("Y")) {
//                throw new CoolException(devpNo+"站点不是可入状态");
//            }
//            if (wrkMastService.getWorkingMast(devpNo) > 0) {
//                throw new CoolException(devpNo + "站点不能同时生成两笔入库工作档");
//            }
            if (station.getAutoing() == null || !station.getAutoing().equals("Y")) {
                throw new CoolException(devpNo + "站点不是自动状态");
            }
            if (station.getLoading() == null || !station.getLoading().equals("Y")) {
                throw new CoolException(devpNo + "站点无物");
            }
            if (station.getWrkNo() != null && station.getWrkNo() > 0 && station.getWrkNo() < 9990) {
                throw new CoolException(devpNo + "站点已有工作号");
            }
            if(!station.getInEnable().equals("Y")) {
                throw new CoolException(devpNo+"站点不是可入状态");
            }
            if (wrkMastService.getWorkingMast(devpNo) > 0) {
                throw new CoolException(devpNo + "站点不能同时生成两笔入库工作档");
            }
        }
        return station;
    }
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -119,7 +119,7 @@
            throw new CoolException("查询库位失败!!==》startupFullPutStore ==》 commonService.getLocNo");
        }
        // 生成工作号
        int workNo = dto.getTaskNo();
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
@@ -184,7 +184,7 @@
    @Transactional
    public void startupFullTakeStore(StockOutParam param, Long userId) {
        // 目标站点状态检测
//        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
@@ -332,7 +332,7 @@
//            }
            // 获取路径
//            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            // 生成工作档
@@ -343,7 +343,7 @@
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo("0"); // 源站
            wrkMast.setSourceStaNo(staDesc.getCrnStn$()); // 源站
            wrkMast.setStaNo(String.valueOf(outSta)); // 目标站
            wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
@@ -494,7 +494,7 @@
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getTaskNo();
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -569,15 +569,15 @@
                throw new CoolException("所选库位存在状态不为D的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$());
            }
            // 获取源站
//            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//                    .eq("type_no", 110)
//                    .eq("stn_no", param.getOutSite())
//                    .eq("crn_no", locMast.getCrnNo());
//            StaDesc staDesc = staDescService.selectOne(wrapper);
//            Integer sourceStaNo = staDesc.getCrnStn();
//            if (Cools.isEmpty(sourceStaNo)) {
//                throw new CoolException("检索源站失败");
//            }
            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", 110)
                    .eq("stn_no", param.getOutSite())
                    .eq("crn_no", locMast.getCrnNo());
            StaDesc staDesc = staDescService.selectOne(wrapper);
            Integer sourceStaNo = staDesc.getCrnStn();
            if (Cools.isEmpty(sourceStaNo)) {
                throw new CoolException("检索源站失败");
            }
            Date now = new Date();
            // 保存工作档
            WrkMast wrkMast = new WrkMast();
@@ -586,7 +586,7 @@
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setSourceStaNo("0"); // 源站
            wrkMast.setSourceStaNo(staDesc.getCrnStn$()); // 源站
            wrkMast.setStaNo(param.getOutSite() + ""); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(locNo); // 源库位
src/main/java/com/zy/asrs/task/WcsScheduler.java
@@ -27,7 +27,7 @@
    /**
     * 定时任务读取出库任务派发给WCS
     */
    @Scheduled(cron = "0/10 * * * * ? ")
//    @Scheduled(cron = "0/10 * * * * ? ")
    private void outboundTaskDispatch() {
        List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 11, 101, 103, 107, 110).eq("wrk_sts", 11));
        for (WrkMast wrkMast : wrkMastList) {
src/main/java/com/zy/asrs/task/handler/WcsSchedulerHandler.java
@@ -41,7 +41,7 @@
    public void outboundTaskDispatch(WrkMast wrkMast) {
        StartupDto startupDto = new StartupDto();
        startupDto.setTaskNo(wrkMast.getWrkNo());
        startupDto.setWorkNo(wrkMast.getWrkNo());
        startupDto.setTaskPri(wrkMast.getIoPri());
src/main/java/com/zy/common/model/StartupDto.java
@@ -16,7 +16,7 @@
    private String locNo;
    private Integer taskNo;
    private Integer workNo;
    private Double taskPri;
src/main/java/com/zy/common/service/CommonService.java
@@ -20,8 +20,8 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 货架核心功能
@@ -448,7 +448,7 @@
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setTaskNo(workNo);
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
@@ -893,7 +893,7 @@
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setTaskNo(workNo);
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
@@ -1006,7 +1006,7 @@
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setTaskNo(workNo);
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
@@ -1034,56 +1034,113 @@
        // 寻找到的库位
        LocMast locMast = null;
        // 按库位类型获取库位
        List<LocMast> locMasts = locMastMapper.selectLocByTypeAndRowsToList(locType,rows);
        // todo 如果当前类型库位剩余不多,是一直放满,还是兼容到下一种库位类型
        // 考虑移库需要同类型库位,这里限制不能放满,兼容下一种库位类型
        if (locMasts.size() <= 4) {
            switch (locType) {
                case 0:
                    return getLocNoNew(ioType, sourceStaNo, 1,rows);
                case 1:
                    return getLocNoNew(ioType, sourceStaNo, 2,rows);
                case 2:
                    return getLocNoNew(ioType, sourceStaNo, 3,rows);
                case 3:
                    log.warn("当前库位排:{},剩余{}个用于移库,无法占用",rows,locMasts.size());
                    return null;
                default:
            }
        // 可用堆垛机
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("crn_err", 0).eq("in_enable","Y"));
        if (basCrnps.size() == 0) {
            log.error("入库请求库位失败,没有联机堆垛机或堆垛机异常");
            throw new CoolException("入库请求库位失败,没有联机堆垛机或堆垛机异常");
        }
        // 先取深库位
        Optional<LocMast> first = locMasts.stream().filter(o -> o.getRow1() == 1 || o.getRow1() == 4 || o.getRow1() == 5 || o.getRow1() == 8|| o.getRow1() == 9 || o.getRow1() == 12).findFirst();
        if (first.isPresent()) {
            locMast = first.get();
        } else {
            // 深库位里面没有从浅库位里面取
            Optional<LocMast> first2 = locMasts.stream().filter(o -> o.getRow1() == 2 || o.getRow1() == 3 || o.getRow1() == 6 || o.getRow1() == 7 || o.getRow1() == 10 || o.getRow1() == 11).findFirst();
            if(first2.isPresent()) {
                locMast = first2.get();
        // 一次查所有堆垛机任务数(group by)
        List<Map<String, Object>> countList = locMastMapper.selectMaps(
                new EntityWrapper<LocMast>()
                        .setSqlSelect("crn_no, COUNT(*) AS cnt")
                        .eq("loc_sts", "S")
                        .in("crn_no", basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()))
                        .groupBy("crn_no")
        );
        // 堆垛机对应任务数
        Map<Integer, Integer> countMap = countList.stream()
                .collect(Collectors.toMap(
                        m -> (Integer) m.get("crn_no"),
                        m -> ((Number) m.get("cnt")).intValue()
                ));
        // 所有满足条件的库位
        List<LocMast> allLocs = locMastMapper.selectList(
                new EntityWrapper<LocMast>()
                        .eq("loc_type1", locType)
                        .eq("loc_sts" ,'O')
                        .in("crn_no", basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList()))
                        .last("ORDER BY CASE WHEN row1 IN (1,4,5,8,9,12) THEN 0 ELSE 1 END, lev1, bay1, row1")
        );
        // 按堆垛机分组
        Map<Integer, List<LocMast>> locMap = allLocs.stream()
                .collect(Collectors.groupingBy(LocMast::getCrnNo));
        // 堆垛机对应库位类型的剩余库位数大于4个的堆垛机保留
        List<BasCrnp> availableCrn = basCrnps.stream()
                .filter(c -> locMap.containsKey(c.getCrnNo()) && locMap.get(c.getCrnNo()).size() > 4)
                .collect(Collectors.toList());
        if (availableCrn.isEmpty()) {
            // 递归兼容
            if (locType >= 3) return null;
            return getLocNoNew(ioType, sourceStaNo, locType + 1, rows);
        }
        availableCrn.sort(Comparator.comparing(c -> countMap.getOrDefault(c.getCrnNo(), 0)));
        for (BasCrnp crnp : availableCrn) {
            List<LocMast> locs = locMap.get(crnp.getCrnNo());
            if (locs == null || locs.isEmpty()) {
                continue;
            }
            Map<String, LocMast> locNoMap = locs.stream()
                    .collect(Collectors.toMap(LocMast::getLocNo, e -> e));
            for(LocMast locMast1: locs) {
                String locNo = locMast1.getLocNo();
                // 是深库位
                if(Utils.isDeepLoc(slaveProperties,locMast1.getLocNo())){
                    // 获取浅库位
                    String shallowLoc = Utils.getShallowLoc(slaveProperties, locNo);
                    LocMast shallow = locNoMap.get(shallowLoc);
                    // 浅库位无货
                    if (shallow == null) {
                        locMast = locMast1;
                        break;
                    }
                } else { // 是浅库位,判断深库位是否为空,是则放,不是则跳过
                    // 获取深库位
                    String deepLoc = Utils.getDeepLoc(slaveProperties, locNo);
                    LocMast deep = locNoMap.get(deepLoc);
                    // 深库位不空放深库位
                    if (deep != null) {
                        locMast = deep;
                        break;
                    } else {
                        locMast = locMast1;
                        break;
                    }
                }
            }
            if (locMast != null) {
                break;
            }
        }
        if (locMast == null) {
            return null;
            if (locType >= 3) return null;
            return getLocNoNew(ioType, sourceStaNo, locType + 1, rows);
        }
        // 根据入库类型和源站点获取工作路径
//        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("stn_no", sourceStaNo).eq("crn_no",locMast.getCrnNo()));
//        if (staDesc == null) {
//            log.error("获取工作路径异常,类型:{},源站点:{},库位:{}",ioType,sourceStaNo,locMast.getLocNo());
//            return null;
//        }
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("stn_no", sourceStaNo).eq("crn_no",locMast.getCrnNo()));
        if (staDesc == null) {
            log.error("获取工作路径异常,类型:{},源站点:{},库位:{}",ioType,sourceStaNo,locMast.getLocNo());
            throw new CoolException("获取工作路径异常");
        }
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setTaskNo(workNo);
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(locMast.getCrnNo());
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setStaNo(0);
        startupDto.setStaNo(staDesc.getCrnStn());
        startupDto.setLocNo(locMast.getLocNo());
        startupDto.setTaskPri(13D);
src/main/java/com/zy/common/web/WcsController.java
@@ -64,76 +64,57 @@
    @ResponseBody
    public synchronized R getLocNo(@RequestBody SearchLocParam param) {
        log.info("收到WCS入库接口请求====>>入参:{}", param);
//        if (Cools.isEmpty(param.getIoType())) {
//            return R.error("入出库类型不能为空");
//        }
        if (Cools.isEmpty(param.getIoType())) {
            return R.error("入出库类型不能为空");
        }
        if (Cools.isEmpty(param.getSourceStaNo())) {
            return R.error("源站编号不能为空");
        }
        if (param.getRow().length == 0) {
            return R.error("WCS上报无可用设备");
        }
//        //wcs调用此接口向组托表插入一条数据模拟组托
//        WaitPakin waitPakin = new WaitPakin();
//        waitPakin.setZpallet(param.getBarcode());
//        waitPakin.setBatch("20260305002");
//        waitPakin.setAnfme(100.0D);
//        waitPakin.setMatnr("YJ2026030509353203");
//        waitPakin.setMaktx("上拉杆_左前右后毛坯");
//        waitPakin.setSpecs("50001LR-71");
//        waitPakin.setModel("skv");
//        waitPakinService.insert(waitPakin);
//
//        WaitPakin waitPakin2 = new WaitPakin();
//        waitPakin2.setZpallet(param.getBarcode());
//        waitPakin2.setBatch("20260305002");
//        waitPakin2.setAnfme(100.0D);
//        waitPakin2.setMatnr("YJ2026030509494873");
//        waitPakin2.setMaktx("螺杆先");
//        waitPakin2.setSpecs("50001LR-71");
//        waitPakin2.setModel("skv");
//        waitPakinService.insert(waitPakin2);
//        if (param.getRow().length == 0) {
//            return R.error("WCS上报无可用设备");
//        }
        List<WaitPakin> waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
        if (param.getIoType() == 1) {
            if (Cools.isEmpty(param.getBarcode())) {
                return R.error("条码不能为空");
            }
            WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
            if (wrkMast1 != null) {
                Integer ioType = wrkMast1.getIoType();
                if ((ioType == 103 || ioType == 107) && wrkMast1.getWrkSts() == 14) {
                    // 转换工作档
                    if (!wrkMastLogService.save(wrkMast1.getWrkNo())) {
                        throw new CoolException("保存工作主档历史档失败");
                    }
                    Date now = new Date();
                    // 更新工作档数据状态
                    wrkMast1.setIoType(wrkMast1.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
                    wrkMast1.setWrkSts(2L); // 工作状态: 2.设备上走
                    wrkMast1.setSourceStaNo(String.valueOf(param.getSourceStaNo())); // 源站
                    wrkMast1.setStaNo("0"); // 目标站
                    wrkMast1.setLocNo(wrkMast1.getSourceLocNo());
                    wrkMast1.setSourceLocNo(""); // 源库位清空
                    wrkMast1.setModiTime(now);
                    if (!wrkMastService.updateById(wrkMast1)) {
                        throw new CoolException("更新工作档数据状态失败");
                    }
                    // 修改库位状态 Q.拣料/盘点/并板再入库
                    LocMast locMast = locMastService.selectById(wrkMast1.getLocNo());
                    locMast.setLocSts("Q");
                    locMast.setModiTime(now);
                    if (!locMastService.updateById(locMast)) {
                        throw new CoolException("修改库位状态失败");
                    }
                }
                StartupDto startupDto = new StartupDto();
                startupDto.setTaskNo(wrkMast1.getWrkNo());
                startupDto.setSourceStaNo(Integer.valueOf(wrkMast1.getSourceStaNo()));
                startupDto.setTaskPri(wrkMast1.getIoPri());
                startupDto.setCrnNo(wrkMast1.getCrnNo());
                startupDto.setLocNo(Utils.locToLocNo(wrkMast1.getLocNo()));
                return R.ok().add(startupDto);
            }
//            WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
//            if (wrkMast1 != null) {
//                Integer ioType = wrkMast1.getIoType();
//                if ((ioType == 103 || ioType == 107) && wrkMast1.getWrkSts() == 14) {
//                    // 转换工作档
//                    if (!wrkMastLogService.save(wrkMast1.getWrkNo())) {
//                        throw new CoolException("保存工作主档历史档失败");
//                    }
//                    Date now = new Date();
//                    // 更新工作档数据状态
//                    wrkMast1.setIoType(wrkMast1.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
//                    wrkMast1.setWrkSts(2L); // 工作状态: 2.设备上走
//                    wrkMast1.setSourceStaNo(String.valueOf(param.getSourceStaNo())); // 源站
//                    wrkMast1.setStaNo("0"); // 目标站
//                    wrkMast1.setLocNo(wrkMast1.getSourceLocNo());
//                    wrkMast1.setSourceLocNo(""); // 源库位清空
//                    wrkMast1.setModiTime(now);
//                    if (!wrkMastService.updateById(wrkMast1)) {
//                        throw new CoolException("更新工作档数据状态失败");
//                    }
//                    // 修改库位状态 Q.拣料/盘点/并板再入库
//                    LocMast locMast = locMastService.selectById(wrkMast1.getLocNo());
//                    locMast.setLocSts("Q");
//                    locMast.setModiTime(now);
//                    if (!locMastService.updateById(locMast)) {
//                        throw new CoolException("修改库位状态失败");
//                    }
//                }
//                StartupDto startupDto = new StartupDto();
//                startupDto.setTaskNo(wrkMast1.getWrkNo());
//                startupDto.setSourceStaNo(Integer.valueOf(wrkMast1.getSourceStaNo()));
//                startupDto.setTaskPri(wrkMast1.getIoPri());
//                startupDto.setCrnNo(wrkMast1.getCrnNo());
//                startupDto.setLocNo(Utils.locToLocNo(wrkMast1.getLocNo()));
//                return R.ok().add(startupDto);
//            }
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
                if (wrkMast != null && wrkMast.getIoType() == 103) {
@@ -152,15 +133,15 @@
        }
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
//        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto();
        locTypeDto.setLocType1(param.getLocType1());
        if(!waitPakins.isEmpty()) { // 判断是否是空托盘
            if (waitPakins.get(0).getMatnr().equals("1") ) {
                param.setIoType(10);
            }
        }
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
//        locTypeDto.setLocType1(param.getLocType1());
//        if(!waitPakins.isEmpty()) { // 判断是否是空托盘
//            if (waitPakins.get(0).getMatnr().equals("1") ) {
//                param.setIoType(10);
//            }
//        }
        StartupDto dto = null;
        switch (param.getIoType()) {
@@ -266,7 +247,7 @@
        Date now = new Date();
        // 获取工作号
        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
        dto.setTaskNo(workNo);
        dto.setWorkNo(workNo);
        // 保存工作档
        WrkMast wrkMast = new WrkMast();
@@ -353,7 +334,7 @@
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(dto.getTaskNo());
        wrkMast.setWrkNo(dto.getWorkNo());
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(1L);
        wrkMast.setIoPri(13D);
@@ -398,27 +379,28 @@
    @Transactional
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins, int[] row) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
//        StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = null;
        // 根据库位排映射堆垛机
        for(int i = 0; i < row.length/4 ; i ++) {
            ArrayList<Integer> rows = new ArrayList<>();
            rows.add(row[i * 4]);
            rows.add(row[i * 4 + 1]);
            rows.add(row[i * 4 + 2]);
            rows.add(row[i * 4 + 3]);
            dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows);
            if (dto != null) {
                break;
            }
        }
//        StartupDto dto = null;
//        // 根据库位排映射堆垛机
//        for(int i = 0; i < row.length/4 ; i ++) {
//            ArrayList<Integer> rows = new ArrayList<>();
//            rows.add(row[i * 4]);
//            rows.add(row[i * 4 + 1]);
//            rows.add(row[i * 4 + 2]);
//            rows.add(row[i * 4 + 3]);
//            dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows);
//            if (dto != null) {
//                break;
//            }
//        }
        StartupDto dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),null);;
        if (dto == null) {
            throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警");
        }
        int workNo = dto.getTaskNo();
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -468,11 +450,11 @@
            throw new CoolException("更新通知档失败");
        }
        // 更新源站点信息
//        sourceStaNo.setWrkNo(workNo);
//        sourceStaNo.setModiTime(now);
//        if (!basDevpService.updateById(sourceStaNo)) {
//            throw new CoolException("更新源站失败");
//        }
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")) {
@@ -484,35 +466,36 @@
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
//        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
        return dto;
    }
    @Transactional
    public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode, int[] row) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
//        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = null;
        // 根据库位排映射堆垛机
        for(int i = 0; i < row.length/4 ; i ++) {
            ArrayList<Integer> rows = new ArrayList<>();
            rows.add(row[i * 4]);
            rows.add(row[i * 4 + 1]);
            rows.add(row[i * 4 + 2]);
            rows.add(row[i * 4 + 3]);
            dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows);
            if (dto != null) {
                break;
            }
        }
//        StartupDto dto = null;
//        // 根据库位排映射堆垛机
//        for(int i = 0; i < row.length/4 ; i ++) {
//            ArrayList<Integer> rows = new ArrayList<>();
//            rows.add(row[i * 4]);
//            rows.add(row[i * 4 + 1]);
//            rows.add(row[i * 4 + 2]);
//            rows.add(row[i * 4 + 3]);
//            dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows);
//            if (dto != null) {
//                break;
//            }
//        }
        StartupDto dto = commonService.getLocNoNew(10, devpNo, Integer.valueOf(locTypeDto.getLocType1()),null);;
        if (dto == null) {
            throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警");
        }
        int workNo = dto.getTaskNo();
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -539,15 +522,11 @@
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 更新入库通知档 ioStatus ===>> Y
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                .eq("zpallet", barcode);
        WaitPakin setParam = new WaitPakin();
        setParam.setLocNo(dto.getLocNo());
        setParam.setIoStatus("Y");
        setParam.setModiTime(now);
        if (!waitPakinService.update(setParam, wrapper)) {
            throw new CoolException("更新通知档失败");
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
@@ -560,7 +539,7 @@
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
//        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
        return dto;
    }
src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -8,7 +8,7 @@
@Data
public class SearchLocParam {
    private Integer ioType = 1;
    private Integer ioType;
    private Integer sourceStaNo;
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -123,9 +123,9 @@
        //2. 然后校验自定义的License参数
        //License中可被允许的参数信息
        Object extra = content.getExtra();
        String text = ((String) extra).trim();
        LicenseCheck expectedCheckModel = JSON.parseObject(text, LicenseCheck.class);
//        Object extra = content.getExtra();
//        String text = ((String) extra).trim();
        LicenseCheck expectedCheckModel = (LicenseCheck) content.getExtra();;
        //当前服务器真实的参数信息
        LicenseCheck serverCheckModel = getServerInfos();
src/main/resources/mapper/LocMastMapper.xml
@@ -217,5 +217,8 @@
        </foreach>
        order by lev1, bay1, row1
    </select>
    <select id="selectLocByTypeToList" resultType="com.zy.asrs.entity.LocMast">
        select loc_no locNo,loc_type1 locType1,crn_no crnNo,row1 from asr_loc_mast where loc_sts = 'O' and loc_type1 = #{locType1} AND crn_no = #{crnNo} order by lev1,bay1,row1
    </select>
</mapper>
src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/wms";
var baseUrl = "/nwswms";
// 详情窗口-高度
var detailHeight = '80%';