自动化立体仓库 - WMS系统
zwl
2025-12-31 b187814d7cfa5ace1ed9c203372524c69fe56553
src/main/java/com/zy/common/web/WcsController.java
@@ -6,10 +6,13 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.service.*;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
@@ -17,6 +20,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -43,10 +47,19 @@
    private WaitPakinService waitPakinService;
    @Autowired
    private  LocDetlService locDetlService;
    @Autowired
    private RowLastnoService rowLastnoService;
    @Autowired
    private WorkService workService;
    @Autowired
    private TaskService taskService;
    // TODO:称重、拍照上报存储,CTU料箱运转
    @PostMapping("/pakin/loc/v1")
    @ResponseBody
    public synchronized R getLocNo(@RequestBody SearchLocParam param) {
        log.info("收到WCS入库接口请求====>>入参:{}", param);
        if (Cools.isEmpty(param.getIoType())) {
            return R.error("入出库类型不能为空");
        }
@@ -69,16 +82,24 @@
            int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
            int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
            if (countLoc > 0 || countWrk > 0) {
                return R.error("工作档/库存条码数据已存在");
                return R.error(CodeRes.EXIST_500);
            }
        }
        if (Cools.isEmpty(param.getLocType1())){
            return R.error("高低检测信号不能为空");
        }
        //入库时对空板出库任务进行完成
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode()).eq("wrk_sts",110));
        if (!Cools.isEmpty(wrkMast)) {
            wrkMast.setWrkSts(15L);//空板出库任务转历史档
            wrkMastService.updateById(wrkMast);
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,param.getBarcode());
        StartupDto dto = null;
        switch (param.getIoType()) {
@@ -92,10 +113,59 @@
            default:
                break;
        }
        log.info("/pakin/loc/v1:"+dto + "======托盘码:"+param.getBarcode());
        log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarcode());
        return R.ok().add(dto);
    }
    @PostMapping("/auto/emptyIn/v1")
    @ResponseBody
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto){
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(12, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, 12, findLocNoAttributeVo, locTypeDto);
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(dto.getWorkNo());
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(1L);
        wrkMast.setIoPri(13D);
        wrkMast.setIoType(10);
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo() + "");
        wrkMast.setStaNo(dto.getStaNo() + "");
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setFullPlt("N"); // 满板:N
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("Y"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setMemo("自动空托入库");
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
    }
    @PostMapping("auto/emptyOut/v1")
    @ResponseBody
    public R autoEmptyOut(){
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_sts", "D"));
        if (Cools.isEmpty(locMast)) {
            return R.error("库存没有空板");
        }
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(12);
        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}});
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,50,"");
        return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
    }
    /**
     * 全板入库
@@ -103,10 +173,14 @@
    @Transactional
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        List<String> matNos = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
        StartupDto dto = commonService.getLocNo(1, 1, devpNo, matNos, locTypeDto,0);
//        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
//        StartupDto dto = commonService.getLocNo( 1, devpNo,findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNoNew(1,devpNo,locTypeDto);
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
@@ -117,8 +191,8 @@
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo());
        wrkMast.setStaNo(dto.getStaNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo() + "");
        wrkMast.setStaNo(dto.getStaNo() + "");
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setBarcode(barcode); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
@@ -126,7 +200,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        wrkMast.setCtnType(1); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
@@ -150,17 +224,18 @@
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                .eq("zpallet", barcode);
        WaitPakin setParam = new WaitPakin();
        setParam.setLocNo(dto.getLocNo());
        setParam.setIoStatus("Y");
        setParam.setModiTime(now);
        if (!waitPakinService.update(setParam, wrapper)) {
            throw new CoolException("更新通知档失败");
        }
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)){
            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")){
@@ -180,7 +255,9 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        StartupDto dto = commonService.getLocNo(1, 10, devpNo, null, locTypeDto,0);
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -190,8 +267,8 @@
        wrkMast.setIoType(10); // 入出库状态:10.空板入库
        wrkMast.setIoPri(13D); // 优先级
        wrkMast.setCrnNo(dto.getCrnNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo());
        wrkMast.setStaNo(dto.getStaNo());
        wrkMast.setSourceStaNo(dto.getSourceStaNo() + "");
        wrkMast.setStaNo(dto.getStaNo() + "");
        wrkMast.setLocNo(dto.getLocNo());
        wrkMast.setFullPlt("N"); // 满板
        wrkMast.setPicking("N"); // 拣料
@@ -227,4 +304,56 @@
        return dto;
    }
    @PostMapping("/createAGVMoveTask")
    @ResponseBody
    public synchronized R createAGVMoveTask(@RequestBody WrkMast wrkMast){
        if (Cools.isEmpty(wrkMast)){
            return R.error("出库时创建AGV搬运空料架任务不能为空");
        }
        //查看是否有相关的AGV搬运任务存在
        List<Task> tasks = taskService.selectList(new EntityWrapper<Task>()
                .in("sta_no", wrkMast.getStaNo(),wrkMast.getMemo())
                .or()
                .in("source_sta_no", wrkMast.getStaNo(),wrkMast.getMemo()));
        if (!tasks.isEmpty()){
            return R.error("有对堆垛机接驳站点的AGV搬运任务,暂时无法生成AGV搬运任务");
        }
        String sourceStaNo = "Q-";
        if(wrkMast.getStaNo().equals("401")){
            sourceStaNo = sourceStaNo + "E3";
        }else if(wrkMast.getStaNo().equals("402")){
            sourceStaNo = sourceStaNo + "E2";
        }else if(wrkMast.getStaNo().equals("307")){
            sourceStaNo = sourceStaNo + "E1";
        }
        //生成AGV搬运空料架任务
        // 保存工作档
        Task task = new Task();
        Date date = new Date();
        String TaskNo = wrkMast.getWrkNo()+"aa"+date.getTime();
        task.setWrkNo(wrkMast.getWrkNo())
                .setTaskNo(TaskNo)
                .setIoTime(date)
                .setWrkSts(301L) // 工作状态:301.任务下发
                .setIoType(5) // 入出库状态: 5.区域到站
                .setTaskType("AGV补空料架")
                .setIoPri(10D)
                .setFullPlt("N") // 满板:Y
                .setPicking("N") // 拣料
                .setExitMk("N")// 退出
                .setStaNo(wrkMast.getStaNo())
                .setSourceStaNo(sourceStaNo)//空料架缓存区
                .setEmptyMk("Y")// 空板
                .setBarcode("")// 托盘码
                .setLinkMis("N")
                .setAppeUser(9945L)
                .setAppeTime(date)
                .setModiUser(9945L)
                .setModiTime(date);
        if (!taskService.insert(task)) {
            throw new CoolException("保存工作档失败");
        }
        return R.ok();
    }
}