自动化立体仓库 - WMS系统
pjb
2025-06-28 53bbc5731dd8c78490a27211aea331ff1360ed4e
wms功能完善
10个文件已修改
239 ■■■■■ 已修改文件
license.lic 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkMastService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 100 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/license.lic 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
license.lic
Binary files differ
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -143,12 +143,12 @@
            return R.error();
        }
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                .eq("source_loc_no", locMast.getLocNo())
                .or().eq("loc_no", locMast.getLocNo()));
        if(!Cools.isEmpty(wrkMast)){
            return  R.error("该库位正在作业,请先处理工作档");
        }
//        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
//                .eq("source_loc_no", locMast.getLocNo())
//                .or().eq("loc_no", locMast.getLocNo()));
//        if(!Cools.isEmpty(wrkMast)){
//            return  R.error("该库位正在作业,请先处理工作档");
//        }
        LocMast oldLocMast = locMastService.selectById(locMast.getLocNo());
        if (locMast.getLocSts().equals("F") && (oldLocMast.getLocSts().equals("D") || oldLocMast.getLocSts().equals("O"))) {
src/main/java/com/zy/asrs/service/WrkMastService.java
@@ -17,6 +17,11 @@
    WrkMast selectByBarcode(String barcode);
    /**
     * 补尾托信号
     */
    void updateCtnType(WrkMast wrkMast);
    /**
     * 从工作档得到站点入库暂存数
     * @param crnNo
     * @return
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -555,16 +555,16 @@
            throw new CoolException(firstFrozenLocNo + "库位已被冻结!");
        }
        if (Cools.isEmpty(param.getOutSite())) {
            throw new CoolException("站点不存在");
        }
        for (String locNo : param.getLocNos()) {
            // 获取工作号
            int workNo = commonService.getWorkNo(WorkNoType.PAKOUT.type);
            int workNo = commonService.getWorkNo(2);
            // 获取库位
            LocMast locMast = locMastService.selectById(locNo);
            if (Cools.isEmpty(locMast)) {
                throw new CoolException(locNo+"库位不存在");
            }
            if (!locMast.getLocSts().equals("D")){
                throw new CoolException("所选库位存在状态不为D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$());
            }
            // 获取源站
            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
@@ -582,8 +582,8 @@
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setIoType(110); // 入出库状态
            wrkMast.setIoPri(14D);
            wrkMast.setSourceStaNo(sourceStaNo); // 源站
            wrkMast.setStaNo(param.getOutSite()); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
@@ -602,7 +602,7 @@
                throw new CoolException("保存工作档失败");
            }
            // 更新库位状态 D.空板 -> R.出库预约
            if (locMast.getLocSts().equals("D")){
            if (locMast.getLocSts().equals("M") || locMast.getLocSts().equals("Z")){
                locMast.setLocSts("R");
                locMast.setModiUser(userId);
                locMast.setModiTime(now);
@@ -1244,17 +1244,19 @@
        // 修改库位状态
        if(locNo != null) {
            LocMast locMast = locMastService.selectById(locNo);
            if (Cools.isEmpty(locMast)) {
                throw new CoolException("取消工作档失败,库位不存在:"+ locNo);
            }
            locMast.setLocSts(locSts);
            locMast.setModiTime(now);
            locMast.setModiUser(userId);
            boolean locMastRes = locMastService.updateById(locMast);
            if (!wrkMastRes || !locMastRes) {
                throw new CoolException("保存数据失败");
        if (locNo != null) {
            if (wrkMast.getIoType() != 3) {
                LocMast locMast = locMastService.selectById(locNo);
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消工作档失败,库位不存在:" + locNo);
                }
                locMast.setLocSts(locSts);
                locMast.setModiTime(now);
                locMast.setModiUser(userId);
                boolean locMastRes = locMastService.updateById(locMast);
                if (!wrkMastRes || !locMastRes) {
                    throw new CoolException("保存数据失败");
                }
            }
        }
    }
src/main/java/com/zy/asrs/service/impl/WrkMastServiceImpl.java
@@ -9,6 +9,8 @@
import com.zy.asrs.service.WrkMastService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@@ -41,6 +43,16 @@
    }
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateCtnType(WrkMast wrkMast) {
        if (wrkMast.getCtnType() == 0) {
            wrkMast.setCtnType(1);
            this.updateById(wrkMast);
            log.info("自动补尾桶信号成功,任务号:{}",wrkMast.getCrnNo());
        }
    }
    @Override
    public int getStoreCount(Integer crnNo) {
        return selectCount(new EntityWrapper<WrkMast>().eq("crn_no", crnNo)
                .last(" and (wrk_sts in (1,2) or (wrk_sts=3 and wrk_no in (select wrk_no from asr_bas_devp)))"));
src/main/java/com/zy/common/service/CommonService.java
@@ -316,11 +316,7 @@
                              locMast = locMastList.get(0);
                          } else { // 奇数,不可以入库
                              // 自动给前面任务补尾桶信号
                              if (wrkMast.getCtnType() == 0) {
                                  wrkMast.setCtnType(1);
                                  wrkMastService.updateById(wrkMast);
                                  log.info("自动补尾桶信号成功,任务号:{}",wrkMast.getCtnType());
                              }
                              wrkMastService.updateCtnType(wrkMast);
                              log.error("-----与前面桶类型不一样,前面桶不是尾桶,前面该桶类型任务数不是偶数,不能入库----");
                              throw new CoolException("与前面桶类型不一样,前面桶不是尾桶,前面该桶类型任务数不是偶数,不能入库");
                          }
@@ -338,31 +334,54 @@
                throw new CoolException("入库请求库位失败,没有联机堆垛机或堆垛机异常");
            }
            List<Integer> crnList = basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList());
            List<BasCrnp> basCrnpList = new ArrayList<>();
            for(BasCrnp basCrnp: basCrnps) {
                Integer count = locMastMapper.selectCount(new EntityWrapper<LocMast>().eq("crn_no", basCrnp.getCrnNo()).eq("loc_sts", "S"));
                basCrnp.setWrkNo(count);
                basCrnpList.add(basCrnp);
            }
            basCrnpList = basCrnpList.stream().sorted(Comparator.comparing(BasCrnp::getWrkNo)).collect(Collectors.toList());
            // 入库桶型
            String model = findLocNoAttributeVo.getModel();
            Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>().eq("loc_sts", 'O')
                    .in("crn_no", crnList).orderBy("lev1").orderBy("bay1").orderBy("row1");
            // 入库桶型是不是208L
            if (model == null || !model.equals("208L")) {
                wrapper.ne("lev1", 11);
            }
            locMast = locMastService.selectOne(wrapper.in("row1", 1, 4, 5, 6, 7, 8));
            // 深库位没有了则获取一个浅库位
            if (locMast == null) {
                locMast = locMastService.selectOne(wrapper.in("row1", 2, 3));
                if (locMast == null) {
                    log.error("-----库位不足----");
                    throw new CoolException("库位不足");
                } else {
                    int count = locMastService.selectCount(wrapper.in("row1", 2, 3));
                    if (count <= 10) {
                        log.error("-----库位不足,预留10个库位用来库位转移----");
                        throw new CoolException("库位不足,预留10个库位用来库位转移");
            locMast = null;
            for(BasCrnp basCrnp:basCrnpList) {
                Integer crnNo = basCrnp.getCrnNo();
                Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>().eq("loc_sts", 'O')
                        .eq("crn_no", crnNo).orderBy("lev1").orderBy("bay1").orderBy("row1");
                // 入库桶型是不是208L
                if (model == null || !model.equals("208L")) {
                    wrapper.ne("lev1", 11);
                }
                if (crnNo == 1) {
                    wrapper.in("row1", 1, 4);
                }
                locMast = locMastService.selectOne(wrapper);
                if (locMast != null) {
                    break;
                }
                // 深库位没有了则获取一个浅库位
                if (crnNo == 1) {
                    locMast = locMastService.selectOne(wrapper.in("row1", 2, 3));
                    if (locMast != null) {
                        int count = locMastService.selectCount(wrapper);
                        if (count <= 10) {
                            locMast = null;
                        } else {
                            break;
                        }
                    }
                }
            }
            if (locMast == null) {
                List<Integer> collect = basCrnps.stream().map(BasCrnp::getCrnNo).collect(Collectors.toList());
                log.error("-----{}堆垛机库位不足----",collect.toString());
                throw new CoolException(collect.toString() + "堆垛机库位不足");
            }
        } else {
            log.error("入库类型错误,staDescId={}", staDescId);
            throw new CoolException("入库类型错误,staDescId=" + staDescId);
src/main/java/com/zy/common/web/WcsController.java
@@ -248,52 +248,52 @@
        StartupDto dto;
        // 判断贴标异常,复检重量异常的,不分配库位,去往异常口1090
//        if ( !param.isTbFlag() || !param.isReinspection()) {
//
//            // 生成工作档 ------------------------------------------------------
//            WrkMast wrkMast = new WrkMast();
//            wrkMast.setWrkNo(commonService.getWorkNo(0));
//            wrkMast.setIoTime(now);
//            wrkMast.setIoType(3); // 入出库类型3.站到站
//            wrkMast.setWrkSts(2L);
//            wrkMast.setIoPri(13D); // 优先级
////            wrkMast.setCrnNo(dto.getCrnNo());
//            wrkMast.setSourceStaNo(param.getSourceStaNo());
//            wrkMast.setStaNo(1090);
////            wrkMast.setLocNo(dto.getLocNo());
//            wrkMast.setBarcode(wrkMast1.getBarcode()); // 托盘码
//            wrkMast.setFullPlt("Y"); // 满板:Y
////            wrkMast.setPicking("N"); // 拣料
////            wrkMast.setExitMk("N"); // 退出
////            wrkMast.setEmptyMk("N"); // 空板
////            wrkMast.setLinkMis("Y");
////            wrkMast.setCtnType(wrkMast1.getCtnType()); // 尾托标识
//            wrkMast.setPdcType(wrkMast1.getPdcType()); // 空桶类型
//            wrkMast.setAppeTime(now);
//            wrkMastService.insert(wrkMast);
//
//            // 生成工作档明细----------------------------------------------------
//            WrkDetl wrkDetl = new WrkDetl();
//            wrkDetl.sync(mat);
//            wrkDetl.setWrkNo(wrkMast.getWrkNo());
//            wrkDetl.setAnfme(wrkDetl1.getAnfme());
//            wrkDetl.setZpallet(wrkMast1.getBarcode());
//            wrkDetl.setBatch(param.getBatch());
//            wrkDetl.setManuDate(param.getManuDate());
//            wrkDetl.setWeight(param.getWeight());
//            wrkDetl.setManLength(param.getGrossWeight());
//            wrkDetl.setVolume(param.getCannedVolume()); // 罐装量
//            wrkDetl.setInspect(param.isTbFlag()?1:0); // 贴标成功
//            wrkDetl.setIoTime(now);
//            wrkDetl.setAppeTime(now);
//            wrkDetl.setModel(wrkDetl1.getMaktx()); // 保存空桶名称
//            wrkDetlService.insert(wrkDetl);
//
//            dto = new StartupDto();
//            dto.setWorkNo(wrkMast.getWrkNo());
//            dto.setSourceStaNo(wrkMast.getSourceStaNo());
//            dto.setStaNo(wrkMast.getStaNo());
//        } else
        if ( !param.isTbFlag() || !param.isReinspection()) {
            // 生成工作档 ------------------------------------------------------
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(commonService.getWorkNo(0));
            wrkMast.setIoTime(now);
            wrkMast.setIoType(3); // 入出库类型3.站到站
            wrkMast.setWrkSts(2L);
            wrkMast.setIoPri(13D); // 优先级
//            wrkMast.setCrnNo(dto.getCrnNo());
            wrkMast.setSourceStaNo(param.getSourceStaNo());
            wrkMast.setStaNo(1090);
//            wrkMast.setLocNo(dto.getLocNo());
            wrkMast.setBarcode(wrkMast1.getBarcode()); // 托盘码
            wrkMast.setFullPlt("Y"); // 满板:Y
//            wrkMast.setPicking("N"); // 拣料
//            wrkMast.setExitMk("N"); // 退出
//            wrkMast.setEmptyMk("N"); // 空板
//            wrkMast.setLinkMis("Y");
//            wrkMast.setCtnType(wrkMast1.getCtnType()); // 尾托标识
            wrkMast.setPdcType(wrkMast1.getPdcType()); // 空桶类型
            wrkMast.setAppeTime(now);
            wrkMastService.insert(wrkMast);
            // 生成工作档明细----------------------------------------------------
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setAnfme(wrkDetl1.getAnfme());
            wrkDetl.setZpallet(wrkMast1.getBarcode());
            wrkDetl.setBatch(param.getBatch());
            wrkDetl.setManuDate(param.getManuDate());
            wrkDetl.setWeight(param.getWeight());
            wrkDetl.setManLength(param.getGrossWeight());
            wrkDetl.setVolume(param.getCannedVolume()); // 罐装量
            wrkDetl.setInspect(param.isTbFlag()?1:0); // 贴标成功
            wrkDetl.setIoTime(now);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModel(wrkDetl1.getMaktx()); // 保存空桶名称
            wrkDetlService.insert(wrkDetl);
            dto = new StartupDto();
            dto.setWorkNo(wrkMast.getWrkNo());
            dto.setSourceStaNo(wrkMast.getSourceStaNo());
            dto.setStaNo(wrkMast.getStaNo());
        } else
        if(fhFlag) { // 直接发货
            // 生成工作档 ------------------------------------------------------
            WrkMast wrkMast = new WrkMast();
@@ -456,8 +456,14 @@
        if(!param.isTbFlag()) { //下线出库
            wrkMast.setSourceStaNo(1090);
            wrkMast.setStaNo(1024); // 异常下线默认入库站点为1016
            wrkMast.setStaNo(1024); // 异常下线默认入库站点为1024
            // 获取系统配置,看成品罐装完成是否直接出到发货口
            Config config = configService.selectConfigByCode("gzxfh" + param.getSourceStaNo());
            if (config != null && config.getStatus() == 1 && !Cools.isEmpty(config.getValue())) {
                wrkMast.setStaNo(Integer.parseInt(config.getValue()));
            }
            wrkMastService.updateById(wrkMast);
            log.info("WCS异常口入库接口返参:{},目标站点:{}", "下线出库", wrkMast.getStaNo());
            return R.ok();
        }
src/main/resources/application.yml
@@ -10,7 +10,7 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://192.168.2.201:1433;databasename=mdqzasrs
    url: jdbc:sqlserver://192.168.2.203:1433;databasename=mdqzasrs
    username: sa
    password: sa@123
  mvc:
src/main/resources/license.lic
Binary files differ
src/main/resources/mapper/LocDetlMapper.xml
@@ -342,6 +342,9 @@
        <if test="specs!=null and specs!='' ">
            and a.specs like '%' + #{specs} + '%'
        </if>
        <if test="model!=null and model!='' ">
            and a.specs like '%' + #{model} + '%'
        </if>
    </sql>
    <select id="getStockOutPage" resultMap="BaseResultMap">