自动化立体仓库 - WMS系统
skyouc
2 天以前 5a77719594f0a2c9ef17b3a6d5c1e2f4e5d4e092
出库根据机台号分别任务类型
3个文件已修改
335 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OutController.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 293 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java
@@ -15,6 +15,7 @@
import com.zy.common.model.TaskDto;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
@@ -140,30 +141,7 @@
                        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
                        locDto.setFrozen(locDetl.getFrozen());
                        locDto.setFrozenLoc(locMast.getFrozen());
                        List<Integer> staNos;
                        if (!Objects.isNull(orderDetl.getStandby1())) {
                            BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper<BasDevice>().eq("dev_no", orderDetl.getStandby1()));
                            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 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"));
                            staNos =  staDescService.queryOutStaNosByLocNo(locMasts.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                        } else {
                            staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                        }
                        List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                        locDto.setStaNos(staNos);
                        locDto.setBrand(orderDetl.getBrand());
                        locDto.setStandby1(orderDetl.getStandby1());
@@ -199,6 +177,7 @@
    @PostMapping("/out/pakout/auth")
    @ManagerAuth(memo = "订单出库")
    @Transactional
    public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
        if (Cools.isEmpty(locDtos)) {
            return R.parse(BaseRes.PARAM);
@@ -243,7 +222,12 @@
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            if (!Objects.isNull(taskDto.getDeviceNo())) {
                //生成出库任务
                workService.stockOut(staNo, taskDto, taskDto.getDeviceNo(), getUserId());
                //生成匹配的入库(出库)任务
                workService.genInStock(staNo, taskDto, taskDto.getDeviceNo(), getUserId());
            } else  {
                workService.stockOut(staNo, taskDto, null, getUserId());
            }
        }
        return R.ok();
src/main/java/com/zy/asrs/service/WorkService.java
@@ -102,4 +102,14 @@
    void turnMatLocDetl(EmptyPlateOutParam param, Long userId);
    /**
     * 生成出库匹配的入库任务
     * @author Ryan
     * @date 2026/1/9 17:38
     * @param staNo
     * @param taskDto
     * @param deviceNo
     * @param userId
     */
    void genInStock(BasDevp staNo, TaskDto taskDto, String deviceNo, Long userId);
}
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -12,6 +12,7 @@
import com.zy.asrs.entity.param.FullStoreParam;
import com.zy.asrs.entity.param.LocDetlAdjustParam;
import com.zy.asrs.entity.param.StockOutParam;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.service.*;
@@ -91,8 +92,13 @@
    @Resource
    private LocMastMapper locMastMapper;
    @Autowired
    private LocAroundBindService locAroundBindService;
    @Resource
    private OrderPakoutService orderPakOutService;
    @Autowired
    private BasDeviceServiceImpl basDeviceService;
    @Override
    @Transactional
@@ -391,7 +397,7 @@
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, TaskDto taskDto, String deviceNo ,Long userId) {
    public void stockOut(BasDevp staNo, TaskDto taskDto, String deviceNo, Long userId) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
        for (LocDto locDto : locDtos) {
@@ -409,86 +415,118 @@
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        String wrkCode = null;
        //TODO 如果机台号不为空,判断当前机台与当前出库库位是否在同一库区或同一台堆垛机(相同站点)
        //TODO 1. 如果是同一台堆垛机,生成移库(出库)任务  2. 如果不是,生成出库任务,再生成入库任务
        if (!Objects.isNull(deviceNo)) {
            wrkCode = wrkCode + "-1";
        }
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        //用于工作站,任务分解
        wrkMast.setWrkCode(wrkCode);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
        wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(userId); // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:" + taskDto.getLocNo());
        }
        // 生成工作档明细
        for (LocDto locDto : taskDto.getLocDtos()) {
            if (locDto.getAnfme() == null || locDto.getAnfme() <= 0.0D) {
                continue;
            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";
            }
        } else {
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            //用于工作站,任务分解
            wrkMast.setWrkCode(wrkCode);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
            wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
            wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(userId); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(userId);
            wrkMast.setModiTime(now);
            if (!wrkMastService.insert(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:" + taskDto.getLocNo());
            }
            // 生成工作档明细
            for (LocDto locDto : taskDto.getLocDtos()) {
                if (locDto.getAnfme() == null || locDto.getAnfme() <= 0.0D) {
                    continue;
                }
//            OrderDetl orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch());
            OrderDetl orderDetl = OrderInAndOutUtil.selectItem(Boolean.FALSE, locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(), locDto.getBrand()
                    , locDto.getStandby1(), locDto.getStandby2(), locDto.getStandby3(), locDto.getBoxType1(), locDto.getBoxType2(), locDto.getBoxType3());
                OrderDetl orderDetl = OrderInAndOutUtil.selectItem(Boolean.FALSE, locDto.getOrderNo(), locDto.getMatnr(), locDto.getBatch(), locDto.getBrand()
                        , locDto.getStandby1(), locDto.getStandby2(), locDto.getStandby3(), locDto.getBoxType1(), locDto.getBoxType2(), locDto.getBoxType3());
//            if (orderDetl == null) {
////                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
//                orderDetl = OrderInAndOutUtil.selectItem(Boolean.FALSE, locDto.getOrderNo(), locDto.getMatnr(), null);
//
//            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(orderDetl);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setBatch(locDto.getBatch());
            wrkDetl.setOrderNo(locDto.getOrderNo());
            wrkDetl.setAnfme(locDto.getAnfme()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(userId);
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(userId);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(orderDetl);
                wrkDetl.setZpallet(wrkMast.getBarcode());
                wrkDetl.setIoTime(now);
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setBatch(locDto.getBatch());
                wrkDetl.setOrderNo(locDto.getOrderNo());
                wrkDetl.setAnfme(locDto.getAnfme()); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(userId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(userId);
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
//            // 修改订单明细
//            if (!orderDetlService.increaseWorkQty(orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(), locDto.getAnfme())) {
//                throw new CoolException("修改订单明细数量失败");
//            }
//            orderService.updateSettle(orderDetl.getOrderId(), 2L, userId);
            OrderInAndOutUtil.increaseWorkQty(Boolean.FALSE, orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(),
                    orderDetl.getBrand(), orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(),
                    orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3()
                    , locDto.getAnfme());
            OrderInAndOutUtil.updateOrder(Boolean.FALSE, orderDetl.getOrderId(), 2L, userId);
        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        locMast = locMastService.selectById(taskDto.getLocNo());
        if (locMast.getLocSts().equals("F")) {
            locMast.setLocSts(ioType == 101 ? "R" : "P");
            locMast.setModiUser(userId);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("预约库位状态失败,库位号:" + taskDto.getLocNo());
                OrderInAndOutUtil.increaseWorkQty(Boolean.FALSE, orderDetl.getOrderId(), orderDetl.getMatnr(), orderDetl.getBatch(),
                        orderDetl.getBrand(), orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(),
                        orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3()
                        , locDto.getAnfme());
                OrderInAndOutUtil.updateOrder(Boolean.FALSE, orderDetl.getOrderId(), 2L, userId);
            }
        } else {
            throw new CoolException(taskDto.getLocNo() + "库位不是在库状态");
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            locMast = locMastService.selectById(taskDto.getLocNo());
            if (locMast.getLocSts().equals("F")) {
                locMast.setLocSts(ioType == 101 ? "R" : "P");
                locMast.setModiUser(userId);
                locMast.setModiTime(now);
                if (!locMastService.updateById(locMast)) {
                    throw new CoolException("预约库位状态失败,库位号:" + taskDto.getLocNo());
                }
            } else {
                throw new CoolException(taskDto.getLocNo() + "库位不是在库状态");
            }
        }
    }
    @Override
@@ -1416,4 +1454,127 @@
        }
    }
    /**
     * 生成出库匹配的工作站入库任务
     *
     * @param staNo
     * @param taskDto
     * @param deviceNo
     * @param userId
     * @author Ryan
     * @date 2026/1/9 17:39
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void genInStock(BasDevp staNo, TaskDto taskDto, String deviceNo, Long userId) {
        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()));
        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)
                .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("当前机台,无可用工作台!!");
        }
        staNos =  staDescService.queryOutStaNosByLocNo(locMasts.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
        WrkMast wrkMast = new WrkMast();
        StartupDto dto = commonService.getLocNo(1, sourceStaNo.getDevNo(), findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        wrkMast.setWrkNo(workNo);
        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.setIoPri(13D); // 优先级
        wrkMast.setBarcode(pakin.getZpallet()); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setModiUser(userId);
        wrkMast.setAppeUser(userId);
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            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")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.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("更新通知档失败");
        }
    }
    // 生成工作档明细
        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("保存工作明细失败");
        }
    });
}
}