自动化立体仓库 - WMS系统
zhou zhou
1 天以前 d836c8366387ab7c44943a9abed29748355b280f
#出库单
6个文件已修改
168 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OutController.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskDetl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/TaskDto.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderPakout/agvOut.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java
@@ -110,7 +110,6 @@
                        LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", locDetl.getLocNo()));
                        locDto.setFrozen(locDetl.getFrozen());
                        locDto.setFrozenLoc(locCache.getFrozen());
                        List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                        List<BasStation> basStations = basStationService.selectList(new EntityWrapper<BasStation>().in("area_id", areaIds));
                        List<String> collect = basStations.stream().map(BasStation::getDevNo).collect(Collectors.toList());
                        locDto.setAgvStaNos(collect);
@@ -304,4 +303,56 @@
        return R.ok();
    }
    @PostMapping("/out/agvPakOut/auth")
    @ManagerAuth(memo = "订单出库")
    public synchronized R agvPakOut(@RequestBody List<LocDto> locDtos) throws InterruptedException {
        if (Cools.isEmpty(locDtos)) {
            return R.parse(BaseRes.PARAM);
        }
        List<LocDto> locDtoArrayList = new ArrayList<>();
        for (LocDto locDto : locDtos){
            if (locDto.getFrozen()!=1 && locDto.getFrozenLoc()!=1){
                locDtoArrayList.add(locDto);
            }
        }
        locDtos = locDtoArrayList;
        if (Cools.isEmpty(locDtos)) {
            return R.parse("库存/库位被冻结,请处理后出库!!!");
        }
        boolean lack = true;
        for (LocDto locDto : locDtos) {
            if (!locDto.isLack()) {
                lack = false;
                break;
            }
        }
        if (lack) {
            return R.error("库存不足");
        }
        Thread.sleep(1000L);
        List<TaskDto> taskDtos = new ArrayList<>();
        // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务
        for (LocDto locDto : locDtos) {
            if (locDto.isLack()) { continue; }
            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getAgvStaNo(), locDto);
            if (TaskDto.has(taskDtos, taskDto)) {
                TaskDto dto = TaskDto.find(taskDtos, taskDto);
                assert dto != null;
                dto.getLocDtos().addAll(taskDto.getLocDtos());
            } else {
                taskDtos.add(taskDto);
            }
        }
        // -----------------------------------------------------------------------------------------------
        for (TaskDto taskDto : taskDtos) {
//            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            BasStation station = basStationService.selectOne(new EntityWrapper<BasStation>().eq("dev_no", taskDto.getAgvStaNo()));
            workService.agvStockOut(station, taskDto, getUserId());
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/entity/TaskDetl.java
@@ -1,6 +1,7 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.enums.IdType;
import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableField;
import java.text.SimpleDateFormat;
import java.util.Date;
src/main/java/com/zy/asrs/service/WorkService.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasStation;
import com.zy.asrs.entity.WaitPakin;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
@@ -44,6 +45,8 @@
    void checkStockOut(BasDevp staNo, TaskDto taskDto, Long userId);
    void agvStockOut(BasStation staNo, TaskDto taskDto, Long userId);
    /**
     * 空板入库
     * @return 库位号
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -25,6 +25,7 @@
import com.zy.common.service.CommonService;
import com.zy.common.web.WcsController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -91,6 +92,12 @@
    @Autowired
    private CheckOrderDetlService checkOrderDetlService;
    @Autowired
    private LocCacheServiceImpl locCacheService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private TaskDetlService taskDetlService;
    @Override
    @Transactional
@@ -578,6 +585,98 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void agvStockOut(BasStation staNo, TaskDto taskDto, Long userId) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
        for (LocDto locDto : locDtos) {
            if (!taskDto.getLocNo().equals(locDto.getLocNo()) && !taskDto.getStaNo().equals(locDto.getStaNo())) {
                throw new CoolException("订单出库异常,请联系管理员");
            }
        }
        // 获取库位
        LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>().eq("loc_no", taskDto.getLocNo()));
        int ioType = (taskDto.isAll() ? 101 : 103);
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        Task task = new Task();
        task.setWrkNo(workNo)
                .setIoTime(new Date())
                .setWrkSts(11L) // 工作状态:11.生成出库ID
                .setIoType(ioType) // 入出库状态
                .setTaskType("agv")
                .setIoPri(10D)
                .setFullPlt("Y") // 满板:Y
                .setPicking("N") // 拣料
                .setExitMk("N")// 退出
                .setStaNo(staNo.getDevNo())
                .setSourceLocNo(locCache.getLocNo())
                .setEmptyMk("N")// 空板
                .setBarcode(locCache.getBarcode())// 托盘码
                .setLinkMis("N")
                .setAppeUser(userId)
                .setAppeTime(new Date())
                .setModiUser(userId)
                .setModiTime(new Date());
        if (!taskService.insert(task)) {
            throw new CoolException("保存工作档失败");
        }
        // 生成工作档明细
        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());
//            if (orderDetl == null) {
////                orderDetl = orderDetlService.selectItem(locDto.getOrderNo(), locDto.getMatnr(), null);
//                orderDetl = OrderInAndOutUtil.selectItem(Boolean.FALSE, locDto.getOrderNo(), locDto.getMatnr(), null);
//
//            }
            TaskDetl wrkDetl = new TaskDetl();
            BeanUtils.copyProperties(orderDetl, wrkDetl);
            wrkDetl.setWrkNo(workNo)
                    .setId(null)
                    .setIoTime(new Date())
                    .setOrderNo(locDto.getOrderNo())
                    .setAnfme(locDto.getAnfme())
                    .setZpallet(locCache.getBarcode())
                    .setBatch(locDto.getBatch())
                    .setAppeUser(userId)
                    .setAppeTime(new Date())
                    .setModiUser(userId);
            if (!taskDetlService.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.拣料/盘点/并板出库中
        if (locCache.getLocSts().equals("F")) {
            locCache.setLocSts(ioType == 101 ? "R" : "P");
            locCache.setModiUser(userId);
            locCache.setModiTime(now);
            if (!locCacheService.updateById(locCache)) {
                throw new CoolException("预约库位状态失败,库位号:" + taskDto.getLocNo());
            }
        } else {
            throw new CoolException(taskDto.getLocNo() + "库位不是在库状态");
        }
    }
    @Override
    @Transactional
    public String emptyPlateIn(Integer devpNo, Long userId) {
        // 源站点状态检测
src/main/java/com/zy/common/model/TaskDto.java
@@ -22,6 +22,10 @@
    private List<LocDto> locDtos;
    private String agvStaNo;
    {
        locDtos = new ArrayList<>();
    }
@@ -37,6 +41,12 @@
        this.locDtos.add(locDto);
    }
    public TaskDto(String locNo, String staNo, LocDto locDto) {
        this.locNo = locNo;
        this.agvStaNo = staNo;
        this.locDtos.add(locDto);
    }
    public TaskDto(String locNo, Integer staNo, List<LocDto> locDtos) {
        this.locNo = locNo;
        this.staNo = staNo;
src/main/webapp/static/js/orderPakout/agvOut.js
@@ -283,7 +283,7 @@
        // let loadIndex = layer.load(2);
        notice.msg('正在生成出库任务......', {icon: 4});
        $.ajax({
            url: baseUrl + "/out/pakout/auth",
            url: baseUrl + "/out/agvPakOut/auth",
            headers: {'token': localStorage.getItem('token')},
            contentType: 'application/json;charset=UTF-8',
            data: JSON.stringify(tableCache),