自动化立体仓库 - WMS系统
skyouc
1 天以前 075d19c410180b7cee4068ecc75ddcc09c8a49d8
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -24,7 +24,10 @@
import com.zy.common.properties.SlaveProperties;
import com.zy.common.service.CommonService;
import com.zy.common.web.WcsController;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -419,38 +422,8 @@
        //TODO 1. 如果是同一台堆垛机,生成移库(出库)任务  2. 如果不是,生成出库任务,再生成入库任务
        //TODO 另一种方案,不管是否当前巷道,统一出库,再入库
        if (!Objects.isNull(deviceNo)) {
            wrkCode = wrkCode + "-1";
//            BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper<BasDevice>()
//                    .eq("status", 1)
//                    .eq("dev_no", deviceNo));
//            if (Objects.isNull(basDevice)) {
//                throw new CoolException("机台信息不存在或已禁用!!");
//            }
//            List<LocAroundBind> binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>().eq("dev_no", basDevice.getDevNo()));
//            if (Objects.isNull(binds) || binds.isEmpty()) {
//                throw new CoolException("台机未绑定工作站台!!");
//            }
//            Set<String> locs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet());
//
//            LocMast mast = locMastService.selectOne(new EntityWrapper<LocMast>()
//                    .in("loc_no", locs)
//                    .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
//                    .eq("dev_no", basDevice.getDevNo())
//                    .orderAsc(Arrays.asList("loc_no"))
//                    .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
//
//            if (Objects.isNull(mast)) {
//                throw new CoolException("当前机台,无可用工作台!!");
//            }
//            //相同表示在同一个巷道
//            if (mast.getCrnNo().equals(locMast.getCrnNo())) {
//
//            } else {
//                wrkCode = wrkCode + "-1";
//
//            }
            wrkCode = workNo + "-1";
            generateOutStock(taskDto, userId, workNo, wrkCode, now, ioType, locMast, staDesc, deviceNo);
        } else {
            generateOutStock(taskDto, userId, workNo, wrkCode, now, ioType, locMast, staDesc, null);
        }
@@ -471,6 +444,51 @@
     * @date 2026/1/9 20:16
     */
    private void generateOutStock(TaskDto taskDto, Long userId, int workNo, String wrkCode, Date now, int ioType, LocMast locMast, StaDesc staDesc, String deviceNo) {
        if (Objects.isNull(deviceNo)) {
            throw new CoolException("机台号不能为空!!");
        }
        BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper<BasDevice>()
                .eq("status", 1)
                .eq("dev_no", deviceNo));
        if (Objects.isNull(basDevice)) {
            throw new CoolException("机台信息不存在或已禁用!!");
        }
        List<LocAroundBind> binds = locAroundBindService.selectList( new EntityWrapper<LocAroundBind>()
                .eq("dev_no", basDevice.getDevNo())
                .eq("is_default", 1));
        if (Objects.isNull(binds) || binds.isEmpty()) {
            throw new CoolException("机台未设置默认工作位!!");
        }
        Set<String> locs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet());
        LocMast locMasts = locMastService.selectOne(new EntityWrapper<LocMast>()
                .in("loc_no", locs)
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
                .orderAsc(Arrays.asList("loc_no"))
                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
        if (Objects.isNull(locMasts)) {
            binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>()
                    .eq("dev_no", basDevice.getDevNo()));
            Set<String> nlocs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet());
            locMasts = locMastService.selectOne(new EntityWrapper<LocMast>()
                    .in("loc_no", nlocs)
                    .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
                    .orderAsc(Arrays.asList("loc_no"))
                    .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
            if (Objects.isNull(locMasts)) {
                throw new CoolException("暂无可用工作位!!");
            }
        }
        List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locMasts.getLocNo(), 1);
        //TODO 1. 获取入库站点, 目标库位  3. 将出库明细添加至入库明细
        Integer staNo = staNos.stream().findFirst().get();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
@@ -482,7 +500,9 @@
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
        wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
//        wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
        wrkMast.setStaNo(staNo + ""); // 目标站
        wrkMast.setLocNo(locMasts.getLocNo());
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -515,6 +535,10 @@
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setBrand(orderDetl.getBrand());
            wrkDetl.setModel(orderDetl.getModel());
            wrkDetl.setUnit(orderDetl.getUnit());
            wrkDetl.setStandby1(locDto.getStandby1());
            wrkDetl.setBatch(locDto.getBatch());
            wrkDetl.setOrderNo(locDto.getOrderNo());
            wrkDetl.setAnfme(locDto.getAnfme()); // 数量
@@ -538,11 +562,10 @@
            OrderInAndOutUtil.updateOrder(Boolean.FALSE, orderDetl.getOrderId(), 2L, userId);
        }
        //todo 判断设备号,生成入库任务
        if (!Objects.isNull(deviceNo)) {
            genInStock(wrkMast, deviceNo, userId);
        }
//        //TODO 判断设备号,生成入库任务。没有机台号,说明是普通出库任务
//        if (!Objects.isNull(deviceNo)) {
//            genInStock(wrkMast, deviceNo, userId);
//        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        locMast = locMastService.selectById(taskDto.getLocNo());
        if (locMast.getLocSts().equals("F")) {
@@ -1300,25 +1323,37 @@
        if (Cools.isEmpty(wrkMast)) {
            throw new CoolException(workNo + "工作档不存在");
        }
        Integer ioType = wrkMast.getIoType() - 50;
        int wokNo = wrkMast.getWrkNo();
        // 入出库类型判断
        if (wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) {
            throw new CoolException("当前入出库类型无法进行操作");
        }
        // 工作状态判断
        if (wrkMast.getWrkSts() < 11 || wrkMast.getWrkSts() == 15) {
            throw new CoolException("当前工作状态无法进行操作");
        if (Objects.isNull(wrkMast.getWrkCode())) {
            if (wrkMast.getIoType() != 103 && wrkMast.getIoType() != 104 && wrkMast.getIoType() != 107) {
                throw new CoolException("当前入出库类型无法进行操作");
            }
            // 工作状态判断
            if (wrkMast.getWrkSts() < 11 || wrkMast.getWrkSts() == 15) {
                throw new CoolException("当前工作状态无法进行操作");
            }
        } else {
            if (wrkMast.getIoType() == 103) {
                ioType = 1;
            } else if (wrkMast.getIoType() == 101) {
                ioType = 10;
            }
            wokNo = commonService.getWorkNo(0);
        }
        // 保存工作明细档历史档
//        if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
//            throw new CoolException("保存工作明细档历史档失败");
////        }
//        // 保存工作主档历史档
//        if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
//            throw new CoolException("保存工作主档历史档失败");
//        }
        // 保存工作主档历史档
        if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
            throw new CoolException("保存工作主档历史档失败");
        }
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", wrkMast.getIoType() - 50)
                .eq("type_no", ioType)
                .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站
                .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
        StaDesc staDesc = staDescService.selectOne(wrapper);
@@ -1329,11 +1364,14 @@
        // 堆垛机站点(目标站)
        Integer staNo = staDesc.getCrnStn();
        // 更新工作档数据状态
        wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
        wrkMast.setIoType(ioType); // 入出库类型: 103->53,104->54,107->57
        wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
        wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站
        wrkMast.setStaNo(staNo + ""); // 目标站
        wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位
        //判断是否为领料出库
        if (Objects.isNull(wrkMast.getWrkCode())) {
            wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位
        }
        wrkMast.setSourceLocNo(""); // 源库位清空
        wrkMast.setModiTime(now);
        wrkMast.setModiUser(userId);
@@ -1349,6 +1387,81 @@
            throw new CoolException("修改库位状态失败");
        }
    }
    @Override
    @Transactional
    public void backLocOperation(String workNo, Long userId) {
        WrkMast wrkMast = wrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)) {
            throw new CoolException(workNo + "工作档不存在");
        }
        Integer ioType = wrkMast.getIoType() - 50;
        Integer wokNo;
        // 入出库类型判断
        if (wrkMast.getIoType() == 103) {
            ioType = 1;
        } else if (wrkMast.getIoType() == 101) {
            ioType = 10;
        }
        wokNo = commonService.getWorkNo(0);
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", ioType)
                .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站
                .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            throw new CoolException("入库路径不存在");
        }
        Date now = new Date();
        // 堆垛机站点(目标站)
        Integer staNo = staDesc.getCrnStn();
        WrkMast mast = new WrkMast();
        BeanUtils.copyProperties(wrkMast, mast);
        mast.setWrkNo(wokNo);
        // 更新工作档数据状态
        mast.setIoType(ioType); // 入出库类型: 103->53,104->54,107->57
        mast.setWrkSts(2L); // 工作状态: 2.设备上走
        mast.setSourceStaNo(wrkMast.getStaNo()); // 源站
        mast.setStaNo(staNo + ""); // 目标站
        //判断是否为领料出库
        if (Objects.isNull(mast.getWrkCode())) {
            mast.setLocNo(mast.getSourceLocNo()); // 目标库位 = 出库时的源库位
        }
//        mast.setSourceLocNo(""); // 源库位清空
        mast.setModiTime(now);
        mast.setModiUser(userId);
        if (!wrkMastService.insert(mast)) {
            throw new CoolException("更新工作档数据状态失败");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
        if (Cools.isEmpty(wrkDetls)) {
            throw new CoolException("数据错误,任务档明细不存在 !!");
        }
        wrkDetls.forEach(wrkDetl -> {
            WrkDetl wrkDetl1 = new WrkDetl();
            BeanUtils.copyProperties(wrkDetl, wrkDetl1);
            wrkDetl1.setWrkNo(wokNo);
            if (!wrkDetlService.insert(wrkDetl1)) {
                throw new CoolException("任务档明细保存失败!!");
            }
        });
        // 修改库位状态 Q.拣料/盘点/并板再入库
        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
        locMast.setLocSts("Q");
        locMast.setModiTime(now);
        locMast.setModiUser(userId);
        if (!locMastService.updateById(locMast)) {
            throw new CoolException("修改库位状态失败");
        }
    }
    @Override
    public StartupDto createWaitPainWrkMastStart(List<WaitPakin> list, Long userId) {
@@ -1505,36 +1618,48 @@
        }
        List<LocAroundBind> binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>().eq("dev_no", basDevice.getDevNo()));
        if (Objects.isNull(binds) || binds.isEmpty()) {
            throw new CoolException("台机未绑定工作站台!!");
            throw new CoolException("机台未绑定工作站台!!");
        }
        Set<String> locs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet());
        LocMast locMasts = locMastService.selectOne(new EntityWrapper<LocMast>()
                .in("loc_no", locs)
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
                .eq("dev_no", basDevice.getDevNo())
                .orderAsc(Arrays.asList("loc_no"))
                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
        if (Objects.isNull(locMasts)) {
            throw new CoolException("当前机台,无可用工作台!!");
        }
       List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locMasts.getLocNo(),1);
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(1));
        List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locMasts.getLocNo(), 1);
        //TODO 1. 获取入库站点, 目标库位  3. 将出库明细添加至入库明细
        Integer staNo = staNos.stream().findFirst().get();
        if (Objects.isNull(outMast.getWrkCode())) {
            throw new CoolException("数据错误,上级任务编码为空!!");
        }
        String wrkCode;
        int indexOf = outMast.getWrkCode().indexOf("-");
        if (indexOf != -1) {
            String substring = outMast.getWrkCode().substring(0, indexOf);
            wrkCode = substring + "-2";
        } else {
            throw new CoolException("数据错误,上级任务编码错误!!");
        }
        WrkMast wrkMast = new WrkMast();
        StartupDto dto = commonService.getLocNo(1, sourceStaNo.getDevNo(), findLocNoAttributeVo, locTypeDto);
//        int workNo = dto.getWorkNo();
        // 生成工作档
        wrkMast.setWrkNo(workNo);
        wrkMast.setWrkCode(wrkCode);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo() + "");
        wrkMast.setStaNo(dto.getStaNo() + "");
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setCrnNo(locMasts.getCrnNo());
        wrkMast.setSourceStaNo(outMast.getStaNo());
//        wrkMast.setStaNo(staNo + "");
        wrkMast.setLocNo(locMasts.getLocNo());
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setBarcode(pakin.getZpallet()); // 托盘码
        wrkMast.setBarcode(outMast.getBarcode()); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
@@ -1542,60 +1667,41 @@
        wrkMast.setLinkMis("Y");
        wrkMast.setModiUser(userId);
        wrkMast.setAppeUser(userId);
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        wrkMast.setCtnType(locMasts.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setAppeTime(new Date());
        wrkMast.setModiTime(new Date());
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
//        sourceStaNo.setModiTime(now);
//        if (!basDevpService.updateById(sourceStaNo)) {
//            throw new CoolException("更新源站失败");
//        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
//        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMasts.getLocSts().equals("O")) {
            locMasts.setLocSts("S"); // S.入库预约
            locMasts.setModiTime(new Date());
            if (!locMastService.updateById(locMasts)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
            throw new CoolException(locMasts.getLocNo() + "目标库位已被占用");
        }
        // 更新入库通知档 ioStatus ===>> Y
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                .eq("zpallet", pakin.getZpallet());
        WaitPakin setParam = new WaitPakin();
        setParam.setLocNo(dto.getLocNo());
        setParam.setIoStatus("Y");
        setParam.setModiTime(now);
        if (!waitPakinService.update(setParam, wrapper)) {
            throw new CoolException("更新通知档失败");
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", outMast.getWrkNo()));
        if (Objects.isNull(wrkDetls) || wrkDetls.isEmpty()) {
            throw new CoolException("任务明细为空!!");
        }
        wrkDetls.forEach(wrkDetl -> {
            WrkDetl detl = new WrkDetl();
            BeanUtils.copyProperties(wrkDetl, detl);
            detl.setWrkNo(wrkMast.getWrkNo());
            if (!wrkDetlService.insert(detl)) {
                throw new CoolException("任务明细保存失败!!");
            }
        });
    }
    // 生成工作档明细
        waitPakins.forEach(waitPakin ->
    {
        WrkDetl wrkDetl = new WrkDetl();
        wrkDetl.sync(waitPakin);
        wrkDetl.setWrkNo(wrkMast.getWrkNo());
        wrkDetl.setIoTime(wrkMast.getIoTime());
        double v = Math.round(waitPakin.getAnfme() * waitPakin.getVolume() * 100) / 100.0;
        wrkDetl.setAnfme(v);
        wrkDetl.setAppeTime(now);
        wrkDetl.setModiTime(now);
        if (!wrkDetlService.insert(wrkDetl)) {
            throw new CoolException("保存工作明细失败");
        }
    });
}
}