自动化立体仓库 - WMS系统
#
zjj
2025-03-27 681d5587c0d926711861269047d38e3502ff5fa3
#
14个文件已修改
554 ■■■■■ 已修改文件
license.lic 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 281 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkMastScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/ExistDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocDto.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 213 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/license.lic 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/out.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
license.lic
Binary files differ
pom.xml
@@ -124,7 +124,7 @@
    </dependencies>
    <build>
        <finalName>gtSxkWms</finalName>
        <finalName>fyxcwms</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
src/main/java/com/zy/asrs/controller/OutController.java
@@ -7,6 +7,7 @@
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
@@ -58,6 +59,286 @@
        return R.ok().add(orderDetlService.selectByOrderId(orderId).stream().map(OrderDetl::getId).distinct().collect(Collectors.toList()));
    }
    @PostMapping("/out/pakout/OrderOutGetLoc/auth")
    @ManagerAuth
    public R OrderOutGetLoc(@RequestBody List<Long> ids) {
        if (Cools.isEmpty(ids)) {
            return R.parse(BaseRes.PARAM);
        }
        // 获取订单明细并处理
        List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids);
        Set<String> processedLocs = new HashSet<>(); // 已处理货位缓存
        Set<ExistDto> processedStock = new HashSet<>(); // 已处理库存缓存
        List<LocDto> result = new ArrayList<>();
        for (OrderDetl detl : orderDetls) {
            result.addAll(processOrderDetl(detl, null, processedLocs, processedStock));
        }
        return R.ok().add(result);
    }
    /** 处理订单出库货位分配
     * @param jsonObject 请求参数(包含订单明细ID列表和出库数量)
     */
    @PostMapping("/out/pakout/OrderOutGetLoc.number/auth")
    @ManagerAuth
    public R OrderOutGetLocNumber(@RequestBody JSONObject jsonObject) {
        // 参数校验
        if (!jsonObject.containsKey("ids") || !jsonObject.containsKey("amount")) {
            return R.parse(BaseRes.PARAM);
        }
        // 提取并转换参数
        List<Long> ids = jsonObject.getJSONArray("ids").toJavaList(Long.class);
        Double amount = jsonObject.getDouble("amount");
        // 获取订单明细并处理
        List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids);
        Set<String> processedLocs = new HashSet<>(); // 已处理货位缓存
        Set<ExistDto> processedStock = new HashSet<>(); // 已处理库存缓存
        List<LocDto> result = new ArrayList<>();
        for (OrderDetl detl : orderDetls) {
            result.addAll(processOrderDetl(detl, amount, processedLocs, processedStock));
        }
        return R.ok().add(result);
    }
    /**
     * 处理单个订单明细的货位分配
     * @param orderDetl 订单明细
     * @param requiredAmount 需求出库量
     * @param processedLocs 已处理的货位集合(用于去重)
     * @param processedStock 已处理的库存记录集合(用于去重)
     */
    private List<LocDto> processOrderDetl(OrderDetl orderDetl, Double requiredAmount,
                                            Set<String> processedLocs, Set<ExistDto> processedStock) {
        List<LocDto> result = new ArrayList<>();
        double remaining = Optional.ofNullable(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D);
        // 调整校验逻辑:当requiredAmount不为null时才校验
        if (requiredAmount != null) {
            if (requiredAmount <= 0) {
                throw new CoolException("出库数量必须大于0");
            }
            if (requiredAmount > remaining) {
                throw new CoolException("订单"+orderDetl.getOrderNo()+"请求数量超过可出库数量,剩余可出:" + remaining);
            }
            // 当指定数量时,使用指定数量覆盖剩余量
            remaining = Math.min(requiredAmount, remaining);
        }
        // 获取可用库存记录
        List<LocDetl> stocks = locDetlService.queryStock(
            orderDetl.getMatnr(), orderDetl.getBatch(), null,
            processedLocs, orderDetl.getSupp(),
            orderDetl.getTemp1(), orderDetl.getTemp2()
        );
        // 遍历处理每个库存记录
        for (LocDetl stock : stocks) {
            if (remaining <= 0) break;
            LocMast locMast = locMastService.selectOne(
                new EntityWrapper<LocMast>().eq("loc_no", stock.getLocNo()));
            // 非7号堆垛机处理逻辑
            if (locMast.getCrnNo() != 7) {
                processNormalLocation(stock, orderDetl, remaining, processedStock, result);
            }
            // 7号堆垛机特殊处理
            else {
                processCrn7Location(locMast, stock, orderDetl, remaining, processedStock, result);
            }
            remaining -= stock.getAnfme();
        }
        // 处理缺量情况
        if (remaining > 0) {
            result.add(createShortageDto(orderDetl, remaining));
        }
        return result;
    }
    /** 创建缺量DTO */
    private LocDto createShortageDto(OrderDetl orderDetl, double qty) {
        LocDto dto = new LocDto(null, orderDetl.getMatnr(),
                              orderDetl.getMaktx(), orderDetl.getBatch(),
                              orderDetl.getOrderNo(), qty);
        dto.setLack(true);
        return dto;
    }
    /** 处理普通货位 */
    private void processNormalLocation(LocDetl stock, OrderDetl orderDetl, double remaining,
                                      Set<ExistDto> processedStock, List<LocDto> result) {
        ExistDto exist = new ExistDto()
            .setLocNo(stock.getLocNo())
            .setMatnr(stock.getMatnr())
            .setBatch(stock.getBatch());
        if (processedStock.add(exist)) {
            double allocateQty = Math.min(remaining, stock.getAnfme());
            result.add(buildLocDto(stock, orderDetl, allocateQty));
        }
    }
    /** 处理7号堆垛机货位 */
    private void processCrn7Location(LocMast baseLoc, LocDetl stock, OrderDetl orderDetl,
                                    double remaining, Set<ExistDto> processedStock,
                                    List<LocDto> result) {
        // 构建查询条件
        EntityWrapper<LocMast> wrapper = (EntityWrapper<LocMast>) new EntityWrapper<LocMast>()
            .eq("gro1", baseLoc.getGro1())
            .eq("crn_no", 7)
            .eq("loc_type1", baseLoc.getLocType1())
            .orderBy("bay1", (baseLoc.getBay1() == 6 || baseLoc.getBay1() == 5));
        // 获取同组货位并处理
        locMastService.selectList(wrapper).stream()
            .filter(loc -> "F".equals(loc.getLocSts()))
            .forEach(loc -> processCrn7SubLocation(loc, stock, orderDetl, remaining, processedStock, result));
    }
    /** 处理7号堆垛机子货位 */
    private void processCrn7SubLocation(LocMast loc, LocDetl stock, OrderDetl orderDetl,
                                       double remaining, Set<ExistDto> processedStock,
                                       List<LocDto> result) {
        LocDetl subStock = locDetlService.selectOne(
            new EntityWrapper<LocDetl>()
                .eq("loc_No", loc.getLocNo())
                .eq("matnr", stock.getMatnr())
                .eq("batch", stock.getBatch()));
        if (!Cools.isEmpty(subStock)) {
            ExistDto exist = new ExistDto()
                .setLocNo(subStock.getLocNo())
                .setMatnr(subStock.getMatnr())
                .setBatch(subStock.getBatch());
            if (processedStock.add(exist) && remaining > 0) {
                double allocateQty = Math.min(remaining, subStock.getAnfme());
                result.add(buildLocDto(subStock, orderDetl, allocateQty));
            }
        }
    }
    /** 构建货位DTO通用方法 */
    private LocDto buildLocDto(LocDetl stock, OrderDetl orderDetl, double qty) {
        LocDto dto = new LocDto(
            stock.getLocNo(), stock.getMatnr(), stock.getMaktx(),
            stock.getBatch(), orderDetl.getOrderNo(), qty
        );
        // 获取工作站并转换
        List<Integer> staNos = staDescService.queryOutStaNosByLocNo(
            stock.getLocNo(), qty >= stock.getAnfme() ? 101 : 103);
        List<LocDto.staListDto> staList = staNos.stream()
            .map(staNo -> new LocDto.staListDto()
                 .setStaNo(staNo)
                 .setStaName(Utils.getStaName(staNo)))
            .collect(Collectors.toList());
        dto.setStaNos(staList);
        return dto;
    }
    // 新增方法
//    private List<LocDto> processOrderDetl(OrderDetl orderDetl, Double amount, Set<String> exist, Set<ExistDto> existDtos) {
//        List<LocDto> result = new ArrayList<>();
//        double issued = Optional.ofNullable(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D);
//
//        if (amount != null && amount > issued) {
//            throw new CoolException("数量高于可出库数量");
//        }
//
//        List<LocDetl> locDetls = locDetlService.queryStockCrn(orderDetl.getMatnr(), orderDetl.getBatch(), null, exist, orderDetl.getSupp(), orderDetl.getTemp1(), orderDetl.getTemp2());
//        for (LocDetl locDetl : locDetls) {
//            if (issued <= 0) break;
//            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
//            if (locMast.getCrnNo() != 7) {
//                ExistDto existDto = new ExistDto();
//                existDto.setLocNo(locDetl.getLocNo());
//                existDto.setMatnr(locDetl.getMatnr());
//                existDto.setBatch(locDetl.getBatch());
//                if (existDtos.add(existDto)) {
//                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
//                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
//                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
//                    List<LocDto.staListDto> maps = new ArrayList<>();
//                    for (Integer staNo : staNos) {
//                        LocDto.staListDto staListDto = new LocDto.staListDto();
//                        staListDto.setStaNo(staNo);
//                        staListDto.setStaName(Utils.getStaName(staNo));
//                        maps.add(staListDto);
//                    }
//                    locDto.setStaNos(maps);
//                    result.add(locDto);
//                    // 剩余待出数量递减
//                    issued = issued - locDetl.getAnfme();
//                }
//            }else {
//                List<LocMast> locMasts = new ArrayList<>();
//                if (locMast.getBay1() ==6 || locMast.getBay1()==5){
//                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                            .eq("gro1", locMast.getGro1())
//                            .eq("crn_no", 7)
//                            .eq("loc_type1",locMast.getLocType1())
//                            .orderBy("bay1", true));
//                }else{
//                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
//                            .eq("gro1", locMast.getGro1())
//                            .eq("crn_no", 7)
//                            .eq("loc_type1",locMast.getLocType1())
//                            .orderBy("bay1", false));
//                }
//                for (LocMast locMast1 : locMasts){
//                    if (locMast1.getLocSts().equals("F")){
//                        LocDetl locDetl1 = locDetlService.selectOne(new EntityWrapper<LocDetl>()
//                                .eq("loc_No", locMast1.getLocNo())
//                                .eq("matnr", locDetl.getMatnr()).eq("batch", locDetl.getBatch()));
//                        if (!Cools.isEmpty(locDetl1)) {
//                            ExistDto existDto = new ExistDto();
//                            existDto.setLocNo(locDetl1.getLocNo());
//                            existDto.setMatnr(locDetl1.getMatnr());
//                            existDto.setBatch(locDetl1.getBatch());
//                            if (existDtos.add(existDto)){
//                                if (issued <= 0) break;
//                                LocDto locDto = new LocDto(locDetl1.getLocNo(), locDetl1.getMatnr(), locDetl1.getMaktx(), locDetl1.getBatch(), orderDetl.getOrderNo(),
//                                        issued >= locDetl1.getAnfme() ? locDetl1.getAnfme() : issued);
//                                List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl1.getLocNo(), issued >= locDetl1.getAnfme() ? 101 : 103);
//                                List<LocDto.staListDto> maps = new ArrayList<>();
//                                for (Integer staNo : staNos) {
//                                    LocDto.staListDto staListDto = new LocDto.staListDto();
//                                    staListDto.setStaNo(staNo);
//                                    staListDto.setStaName(Utils.getStaName(staNo));
//                                    maps.add(staListDto);
//                                }
//                                locDto.setStaNos(maps);
//                                result.add(locDto);
//                                // 剩余待出数量递减
//                                issued = issued - locDetl.getAnfme();
//
//                            }
//                        }
//                    }
//                }
//            }
//        }
//        if (issued > 0) {
//            LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
//            locDto.setLack(Boolean.TRUE);
//            result.add(locDto);
//        }
//        return result;
//    }
    /** 四向库订单出库 **/
    @PostMapping("/out/pakout/previewCustomQuantity/auth/sxk")
src/main/java/com/zy/asrs/service/WorkService.java
@@ -37,6 +37,7 @@
    void stockOut(BasDevp staNo, TaskDto taskDto, Long userId);
    void stockOutSxk(BasDevp staNo, TaskDto taskDto, Long userId);
    void stockOutLibraryType(BasDevp staNo, TaskDto taskDto, Long userId);
    /**
     * 空板入库
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -419,6 +419,12 @@
    @Override
    @Transactional
    public void stockOutLibraryType(BasDevp staNo, TaskDto taskDto, Long userId) {
    }
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -154,7 +154,7 @@
    }
    @Scheduled(cron = "0/3 * * * * ? ") //移库任务下发
//    @Scheduled(cron = "0/3 * * * * ? ") //移库任务下发
    private void ShuttleMoveTaskSend(){
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 11).eq("io_type",11));
        if (wrkMasts.isEmpty()) {
src/main/java/com/zy/asrs/utils/Utils.java
@@ -40,7 +40,7 @@
        map.put(3010,"堆垛机库南三楼出入库口");map.put(3012,"堆垛机库南三楼出库口");
        return map.get(sta);
        return map.get(sta)==null?sta.toString():map.get(sta);
    }
    public static boolean isNorth(Integer sourceStaNo){
@@ -527,34 +527,24 @@
        //满板正常入库
        switch (curRow){
            case 1:
                necessaryParameters[1] = 4;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 3;    //nearRow  最浅库位排
                break;
            case 4:
                necessaryParameters[1] = 5;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 4;    //nearRow  最浅库位排
                necessaryParameters[3] = 6;    //nearRow  最浅库位排
                break;
            case 5:
                necessaryParameters[1] = 6;    //curRow   最深库位排
                necessaryParameters[1] = 8;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 7;    //nearRow  最浅库位排
                necessaryParameters[3] = 8;    //nearRow  最浅库位排
                break;
            case 6:
                necessaryParameters[1] = 10;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 9;    //nearRow  最浅库位排
                break;
            case 10:
                necessaryParameters[1] = 11;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 12;    //nearRow  最浅库位排
                break;
            case 11:
                necessaryParameters[1] = 14;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 14;    //nearRow  最浅库位排
                break;
            case 14:
            case 8:
                necessaryParameters[1] = 1;    //curRow   最深库位排
                necessaryParameters[2] = sCrnNo;     //crnNo     堆垛机号
                necessaryParameters[3] = 2;    //nearRow  最浅库位排
                necessaryParameters[3] = 1;    //nearRow  最浅库位排
                break;
            default:
                throw new CoolException("库位排号异常:排号:" + curRow);
src/main/java/com/zy/common/model/ExistDto.java
@@ -1,8 +1,10 @@
package com.zy.common.model;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class ExistDto {
    private String locNo;
    private String matnr;
src/main/java/com/zy/common/model/LocDto.java
@@ -2,6 +2,7 @@
import com.core.common.Cools;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
@@ -10,6 +11,7 @@
 * Created by vincent on 2022/3/28
 */
@Data
@Accessors(chain = true)
public class LocDto {
    private String locNo;
@@ -48,7 +50,6 @@
        this.orderNo = orderNo;
        this.anfme = anfme;
    }
    public LocDto(String locNo, String matnr, String maktx, String batch, String orderNo, Double anfme) {
        this.locNo = locNo;
        this.matnr = matnr;
src/main/java/com/zy/common/service/CommonService.java
@@ -127,7 +127,7 @@
            RowLastno rowLastno = rowLastnoService.selectById(whsType);
            RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
            /**
             * 库型 1: 标准堆垛机库  2: 平库  3: 穿梭板  4: 四向车  5: AGV  0: 未知
             * 库型 1: 标准堆垛机库  2: 平库  3: 穿梭板  4: 四向车混载  5: AGV 6:四向车不混载 0: 未知
             */
            switch (rowLastnoType.getType()){
                case 1:
@@ -142,6 +142,8 @@
                    return getLocNoRun4(whsType,staDescId,sourceStaNo,matnr,batch,grade,4,locTypeDto,0,mixture);
                case 5:
                    return getLocNoRun5(whsType,staDescId,sourceStaNo,matnr,batch,grade,0,locTypeDto,0);
                case 6:
                    return getLocNoRun6(whsType,staDescId,sourceStaNo,matnr,batch,grade,4,locTypeDto,0,mixture);
                default:
                    log.error("站点={} 未查询到对应的规则",sourceStaNo);
                    break;
@@ -472,6 +474,9 @@
    }
    public StartupDto getLocNoRun4(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times,boolean mixture) {
        if (mixture){
            throw new CoolException("混载禁止入库");
        }
        if (Cools.isEmpty(matnr)) {  //物料号
            matnr = "";
        }
@@ -811,6 +816,212 @@
        return startupDto;
    }
    public StartupDto getLocNoRun6(Integer whsType, Integer staDescId, Integer sourceStaNo, String matnr, String batch, String grade, Integer moveCrnNo, LocTypeDto locTypeDto, int times,boolean mixture) {
        if (Cools.isEmpty(matnr)) {  //物料号
            matnr = "";
        }
        if (Cools.isEmpty(batch)) {  //批次
            batch = "";
        }
        if (Cools.isEmpty(grade)) {  //备用
            grade = "";
        }
        // 初始化参数
        int crnNo = 0;      //堆垛机号
        int nearRow = 0;    //最浅库位排
        int curRow = 0;     //最深库位排
        int rowCount = 0;   //轮询轮次
        LocMast locMast = null;     // 目标库位
        StartupDto startupDto = new StartupDto();
        RowLastno rowLastno = rowLastnoService.selectById(whsType);
        if (Cools.isEmpty(rowLastno)) {
            throw new CoolException("数据异常,请联系管理员===>库位规则未知");
        }
        RowLastnoType rowLastnoType = rowLastnoTypeService.selectById(rowLastno.getTypeId());
        if (Cools.isEmpty(rowLastnoType)) {
            throw new CoolException("数据异常,请联系管理员===》库位规则类型未知");
        }
        int sRow = rowLastno.getsRow();
        int eRow = rowLastno.geteRow();
        int crnNumber = rowLastno.getCrnQty();
        // ===============>>>> 开始执行
        curRow = rowLastno.getCurrentRow();
        if (!Cools.isEmpty(moveCrnNo) && moveCrnNo!=0){
            crnNumber = moveCrnNo;
        }
        //此程序用于优化堆垛机异常时的运行时间
        for (int i = times; i < crnNumber*2; i++) {
            int[] locNecessaryParameters = Utils.LocNecessaryParameters(rowLastno, curRow, crnNumber,whsType);
            rowCount =  locNecessaryParameters[0];
            curRow = locNecessaryParameters[1];
            crnNo = locNecessaryParameters[2];
            nearRow = locNecessaryParameters[3];
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("crn_no", crnNo).eq("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue()));
            if (locMasts.size()<=5){
                times++;
                continue;
            }
            break;
        }
        if (crnNo == 0) {
            throw new CoolException("无可用库位");
        }
        // 相似工作档案 --- 同天同规格物料
        if (!Cools.isEmpty(matnr) && (staDescId == 1 || staDescId == 11 || staDescId == 111) && !mixture ) {
            //查询相似工作档案
            List<WrkMast> wrkMasts = wrkMastService.selectWrkMastWrkDetlMatnrBatch(staDescId, matnr, batch,grade, crnNo);
            int nearbay = 0;    //相似工作档案 目标库位列
            int nearlev = 0;    //相似工作档案 目标库位层
            for (WrkMast wrkMast:wrkMasts){
                LocMast locMastWrk = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", wrkMast.getLocNo()));
                List<LocMast> locMasts = new ArrayList<>();
                if (locMastWrk.getBay1() >=5 && locMastWrk.getBay1()<=6){
                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("gro1", locMastWrk.getGro1())
                            .eq("crn_no", 7)
                            .eq("loc_type1",locTypeDto.getLocType1())
                            .orderBy("bay1", true));
                }else {
                    locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                            .eq("gro1", locMastWrk.getGro1())
                            .eq("crn_no", 7)
                            .eq("loc_type1",locTypeDto.getLocType1())
                            .orderBy("bay1", false));
                }
                if (Cools.isEmpty(locMasts)) {
                    continue;
                }
                for (LocMast locMastGro1 : locMasts) {
                    if (locMastGro1.getLocSts().equals("P") || locMastGro1.getLocSts().equals("Q") || locMastGro1.getLocSts().equals("R") || locMastGro1.getLocSts().equals("X")) {
                        break;
                    }
                    if (locMastGro1.getLocSts().equals("O")){
                        locMast = locMastGro1;
                        break;
                    }
                }
            }
        }
        Wrapper<StaDesc> wrapper = null;
        StaDesc staDesc = null;
        BasDevp staNo = null;
        if (Utils.BooleanWhsTypeSta(rowLastno, staDescId)) {
            // 获取目标站
            wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", staDescId)
                    .eq("stn_no", sourceStaNo)
                    .eq("crn_no", crnNo);
            staDesc = staDescService.selectOne(wrapper);
            if (Cools.isEmpty(staDesc)) {
                log.error("入库路径不存在:type_no={},stn_no={},crn_no={}", staDescId, sourceStaNo, crnNo);
                crnNo = 0;
            }else {
                staNo = basDevpService.selectById(staDesc.getCrnStn());
                if (!staNo.getAutoing().equals("Y")) {
                    log.error("目标站"+staDesc.getCrnStn()+"不可用");
                    crnNo = 0;
                }
                startupDto.setStaNo(staNo.getDevNo());
            }
        }
        // 更新库位排号
        if (Utils.BooleanWhsTypeSta(rowLastno, staDescId) && Cools.isEmpty(locMast)) {
            rowLastno.setCurrentRow(curRow);
            rowLastnoService.updateById(rowLastno);
        }
        // 开始查找库位 ==============================>>
        // 1.按规则查找库位
        if (Cools.isEmpty(locMast) && crnNo != 0) {
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("bay1", nearRow)
                    .in("loc_sts", "O").eq("whs_type",rowLastnoType.getType().longValue())
                    .eq("crn_no",7)
                    .eq("loc_type1",locTypeDto.getLocType1())
                    .orderBy("lev1",true).orderBy("row1",false));//最浅库位
            for (LocMast locMast1 : locMasts) {
                if (locMast != null){
                    break;
                }
                if (!VersionUtils.locMoveCheckLocTypeComplete(locMast1, locTypeDto)) {
                    continue;
                }
                if (Utils.BooleanWhsTypeStaIoType(rowLastno)){
                    List<LocMast> locMasts1 = null;
                    if (nearRow == 6){
                        locMasts1 = locMastService.selectList(new EntityWrapper<LocMast>()
                                .eq("gro1", locMast1.getGro1())
                                .eq("crn_no",7)
                                .eq("loc_type1",locTypeDto.getLocType1())
                                .orderBy("bay1",true));
                    }else {
                        locMasts1 = locMastService.selectList(new EntityWrapper<LocMast>()
                                .eq("gro1", locMast1.getGro1())
                                .eq("crn_no",7)
                                .eq("loc_type1",locTypeDto.getLocType1())
                                .orderBy("bay1",false));
                    }
                    if (Cools.isEmpty(locMasts1)) {
                        continue;
                    }
                    for (LocMast locMastGro1 : locMasts1) {
                        if (locMastGro1.getLocSts().equals("F")){
                            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_No", locMastGro1.getLocNo()));
                            if (!locDetl.getMatnr().equals(matnr) || !locDetl.getBatch().equals(batch)){
                                break;
                            }
                        }
                        if (locMastGro1.getLocSts().equals("P") || locMastGro1.getLocSts().equals("Q") || locMastGro1.getLocSts().equals("R")) {
                            break;
                        }
                        if (locMastGro1.getLocSts().equals("O")){
                            locMast = locMastGro1;
                            break;
                        }
                    }
                }
            }
        }
        // 递归查询
        if (Cools.isEmpty(locMast) || !locMast.getLocSts().equals("O")) {
            // 当前巷道无空库位时,递归调整至下一巷道,检索全部巷道无果后,跳出递归
            if (times < rowCount*2) {
                times = times + 1;
                return getLocNoRun6(whsType, staDescId, sourceStaNo, matnr, batch, grade,moveCrnNo, locTypeDto, times,mixture);
            }
            log.error("系统没有空库位!!! 尺寸规格: {}, 轮询次数:{}", JSON.toJSONString(locTypeDto), times);
            throw new CoolException("没有空库位");
        }
        String locNo = locMast.getLocNo();
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
        return startupDto;
    }
    public static String zerofill(String msg, Integer count) {
        if (msg.length() == count) {
            return msg;
src/main/resources/application.yml
@@ -10,7 +10,7 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jxgtasrs
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=fyxcasrs
    username: sa
    password: sa@123
  mvc:
@@ -39,7 +39,7 @@
#License相关配置
license:
  subject: jxgtwms
  subject: fyxcwms
  publicAlias: publicCert
  storePass: public_zhongyang_123456789
  licensePath: license.lic
src/main/resources/license.lic
Binary files differ
src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/gtSxkWms";
var baseUrl = "/fyxcwms";
// 详情窗口-高度
var detailHeight = '80%';
src/main/webapp/static/js/order/out.js
@@ -164,7 +164,7 @@
    function pakoutPreview(ids,amount) {
        let loadIndex = layer.load(2);
        $.ajax({
            url: baseUrl + "/out/pakout/preview/auth/sxk",
            url: baseUrl + "/out/pakout/OrderOutGetLoc/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(ids),
@@ -324,7 +324,7 @@
        json.ids = ids
        json.amount = amount
        $.ajax({
            url: baseUrl + "/out/pakout/previewCustomQuantity/auth/sxk",
            url: baseUrl + "/out/pakout/OrderOutGetLoc.number/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(json),
@@ -479,7 +479,7 @@
        // let loadIndex = layer.load(2);
        notice.msg('正在生成出库任务......', {icon: 4});
        $.ajax({
            url: baseUrl + "/out/pakout/auth/sxk",
            url: baseUrl + "/out/pakout/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(tableCache),