自动化立体仓库 - WMS系统
#
Administrator
6 小时以前 4f45f8f3ec334a73ba24fc5d16017b5c044168aa
src/main/java/com/zy/common/web/WcsController.java
@@ -9,6 +9,7 @@
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
@@ -31,7 +32,8 @@
@RestController
@RequestMapping("/rpc")
public class WcsController {
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
@@ -45,7 +47,7 @@
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private  LocDetlService locDetlService;
    private LocDetlService locDetlService;
    @Autowired
    private RowLastnoService rowLastnoService;
    @Autowired
@@ -55,32 +57,65 @@
    @ResponseBody
    public synchronized R getLocNo(@RequestBody SearchLocParam param) {
        log.info("收到WCS入库接口请求====>>入参:{}", param);
        if (Cools.isEmpty(param.getIoType())) {
            return R.error("入出库类型不能为空");
        }
        if (Cools.isEmpty(param.getSourceStaNo())) {
            return R.error("源站编号不能为空");
        }
        List<WaitPakin> waitPakins = null;
        if (param.getIoType() == 1) {
            if (Cools.isEmpty(param.getBarcode())) {
                return R.error("条码不能为空");
            }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
                if (wrkMast != null && wrkMast.getIoType() == 103) {
                    return R.parse(CodeRes.PICK_600);
                }
                return R.parse(CodeRes.NO_COMB_700);
            }
            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(CodeRes.EXIST_500);
            }
        if (Cools.isEmpty(param.getBarcode())) {
            return R.error("条码不能为空");
        }
        if (Cools.isEmpty(param.getLocType1())){
        WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
        if (!Cools.isEmpty(wrkMast1) && wrkMast1.getWrkSts() == 2) {
            StartupDto dto1 = new StartupDto();
            dto1.setBarcode(param.getBarcode());
            dto1.setStaNo(Integer.valueOf(wrkMast1.getStaNo()));
            String wcsLoc = Utils.WMSLocToWCSLoc(wrkMast1.getLocNo());
            dto1.setLocNo(wcsLoc);
            dto1.setCrnNo(wrkMast1.getCrnNo());
            dto1.setWorkNo(wrkMast1.getWrkNo());
            dto1.setTaskNo(wrkMast1.getWrkNo() + "");
//            dto1.setTaskPri((int) Math.round(wrkMast1.getIoPri()));
            return R.ok(dto1);
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 1));
        if (!Cools.isEmpty(wrkMasts) && wrkMasts.size() > 10) {
            return R.error("限行");
        }
        waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
        if (Cools.isEmpty(waitPakins)) {
            return R.error("请先添加入库通知档");
//            WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
//            if (wrkMast != null && wrkMast.getIoType() == 103) {
//                return R.parse(CodeRes.PICK_600);
//            }
//            Date now = new Date();
//            WaitPakin waitPakin = new WaitPakin();
//            waitPakin.setMatnr("emptyPallet");
//            waitPakin.setBatch("");
//            waitPakin.setAnfme(1D);
//            waitPakin.setZpallet(param.getBarcode());
//            waitPakin.setIoStatus("N");
//            waitPakin.setStatus("Y");
//            waitPakin.setAppeUser(9999L);
//            waitPakin.setAppeTime(now);
//            waitPakin.setModiUser(9999L);
//            waitPakin.setModiTime(now);
//            if (!waitPakinService.insert(waitPakin)) {
//                return R.error("自动生成入库通知档失败");
//            }
//            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
//            if (Cools.isEmpty(waitPakins)) {
//                return R.error("自动生成入库通知档后未查询到数据");
//            }
//            log.info("WCS入库接口自动生成入库通知档, zpallet:{}, matnr:{}, anfme:{}", param.getBarcode(), "32149", 1D);
        }
        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(CodeRes.EXIST_500);
        }
        if (Cools.isEmpty(param.getLocType1())) {
            return R.error("高低检测信号不能为空");
        }
@@ -89,15 +124,45 @@
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        StartupDto dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins, param.getRow());
        log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarcode());
        return R.ok().add(dto);
    }
    @PostMapping("/pakin/agv/loc/v1")
    @ResponseBody
    public synchronized R getLocNoAgv(@RequestBody SearchLocParam param) {
        log.info("收到WCS入库接口请求====>>入参:{}", param);
        if (Cools.isEmpty(param.getIoType())) {
            return R.error("入出库类型不能为空");
        }
        if (Cools.isEmpty(param.getSourceStaNo())) {
            return R.error("源站编号不能为空");
        }
        if (param.getIoType() == 1) {
            if (Cools.isEmpty(param.getBarcode())) {
                return R.error("条码不能为空");
            }
        }
        if (Cools.isEmpty(param.getLocType1())) {
            return R.error("高低检测信号不能为空");
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.selectById(param.getSourceStaNo());
        if (sourceStaNo.getWrkNo() == 0 && sourceStaNo.getDevNo() != 2033) {
            return R.error("站点工作号不存在");
        }
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        param.setIoType(10);
        StartupDto dto = null;
        switch (param.getIoType()) {
            case 1://满托盘入库
                assert waitPakins != null;
                dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins);
                break;
            case 10://空托盘入库
                dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode());
                dto = startupFullPutStoreAgv(param.getSourceStaNo(), param.getBarcode(), locTypeDto, param.getOutArea());
                break;
//                dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode());
//                break;
            default:
                break;
        }
@@ -107,20 +172,23 @@
    @PostMapping("/auto/emptyIn/v1")
    @ResponseBody
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto){
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(1038, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, 1038, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, 1038, findLocNoAttributeVo, locTypeDto);
        if (dto == null) {
            throw new CoolException("查询库位失败");
        }
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(dto.getWorkNo());
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(1L);
        wrkMast.setWrkSts(2L);
        wrkMast.setIoPri(13D);
        wrkMast.setIoType(10);
        wrkMast.setCrnNo(dto.getCrnNo());
@@ -137,12 +205,31 @@
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setMemo("自动空托入库");
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
        // 更新源站点信息
        sourceStaNo.setWrkNo(dto.getWorkNo());
        sourceStaNo.setModiUser(9999L);
        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.setModiUser(9999L);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动空托入库成功,工作号:" + wrkMast.getWrkNo()).add(wrkMast.getWrkNo()) : R.error("生成自动空托入库失败");
    }
    @PostMapping("auto/emptyOut/v1")
    @ResponseBody
    public R autoEmptyOut(@RequestBody LocTypeDto locTypeDto){
    public R autoEmptyOut(@RequestBody LocTypeDto locTypeDto) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_sts", "D"));
        if (Cools.isEmpty(locMast)) {
@@ -150,28 +237,75 @@
        }
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(locTypeDto.getSiteId());
        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}});
        emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
            add(locMast.getLocNo() + "");
        }});
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam);
        return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
        return R.ok(!Cools.isEmpty(wrkMast) ? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
    }
    /**
     * 生成工作号
     *
     * @param wrkMk
     * @return workNo(工作号)
     */
    public int getWorkNo(Integer wrkMk) {
        WrkLastno wrkLastno = wrkLastnoService.selectById(wrkMk);
        if (Cools.isEmpty(wrkLastno)) {
            throw new CoolException("数据异常,请联系管理员");
        }
        int workNo = wrkLastno.getWrkNo();
        int sNo = wrkLastno.getSNo();
        int eNo = wrkLastno.getENo();
        workNo = workNo >= eNo ? sNo : workNo + 1;
        while (true) {
            WrkMast wrkMast = wrkMastService.selectById(workNo);
            if (null != wrkMast) {
                workNo = workNo >= eNo ? sNo : workNo + 1;
            } else {
                break;
            }
        }
        // 修改序号记录
        if (workNo > 0) {
            wrkLastno.setWrkNo(workNo);
            wrkLastnoService.updateById(wrkLastno);
        }
        // 检验
        if (workNo == 0) {
            throw new CoolException("生成工作号失败,请联系管理员");
        } else {
            if (wrkMastService.selectById(workNo) != null) {
                throw new CoolException("生成工作号" + workNo + "在工作档中已存在");
            }
        }
        return workNo;
    }
    @PostMapping("/auto/TransplantingOut/v1")
    @ResponseBody
    public R autoTransplantingOut(@RequestBody TransplantWork transplantWork){
    public R autoTransplantingOut(@RequestBody TransplantWork transplantWork) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(),transplantWork.getBarcode());
        if(sourceStaNo ==null ){
            return R.error("该站点盘点移栽许可,请查看源站点状态检测");
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(), transplantWork.getBarcode());
//        if(sourceStaNo ==null )hnagbao1{
//            return R.error("该站点盘点移栽许可,请查看源站点状态检测");
//        }
        if (wrkMast1 == null) {
            return R.error("无该盘点移栽任务");
        }
        if(wrkMast1== null){
            return  R.error("无该盘点移栽任务");
        WrkMast wrkMast2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", 9997));
        if (wrkMast2 != null) {
            throw new CoolException("存在9997盘点移栽任务");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(transplantWork.getWorkNo());
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        int workNo = getWorkNo(0);
        wrkMast.setWrkNo(9997);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L);
@@ -179,7 +313,7 @@
        wrkMast.setIoType(12);
        wrkMast.setCrnNo(3);
        wrkMast.setBarcode(transplantWork.getBarcode());
        wrkMast.setSourceStaNo(1015);
        wrkMast.setSourceStaNo(transplantWork.getSourceStaNo());
        wrkMast.setStaNo(transplantWork.getStaNo());
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -201,20 +335,24 @@
                throw new CoolException("保存工作明细失败");
            }
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
    }
    @PostMapping("/auto/TransplantingIn/v1")
    @ResponseBody
    public R autoTransplantingIn(@RequestBody TransplantWork transplantWork){
    public R autoTransplantingIn(@RequestBody TransplantWork transplantWork) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(),transplantWork.getBarcode());
        if(sourceStaNo == null){
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(), transplantWork.getBarcode());
//        if(sourceStaNo == null){
//
//        }
        if (wrkMast1 == null) {
            return R.error("无该盘点移栽任务");
        }
        if(wrkMast1== null){
            return  R.error("无该盘点移栽任务");
        WrkMast wrkMast2 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", 9996));
        if (wrkMast2 != null) {
            throw new CoolException("存在9996盘点移栽任务");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(transplantWork.getWorkNo());
        Date now = new Date();
@@ -223,7 +361,7 @@
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(9996);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(2L);
        wrkMast.setWrkSts(11L);
        wrkMast.setIoPri(14D);
        wrkMast.setIoType(12);
        wrkMast.setCrnNo(3);
@@ -250,7 +388,39 @@
                throw new CoolException("保存工作明细失败");
            }
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:"+wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
    }
    /**
     * 全板入库AGV
     */
    @Transactional
    public StartupDto startupFullPutStoreAgv(Integer devpNo, String barcode, LocTypeDto locTypeDto, Integer outArea) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        findLocNoAttributeVo.setOutArea(outArea);
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
        StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
        // 更新目标库位状态
        Date now = new Date();
        if (dto == null) {
            throw new CoolException("未找到库位");
        }
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setBarcode(barcode);
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }
@@ -258,7 +428,7 @@
     * 全板入库
     */
    @Transactional
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins) {
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins, List<Integer> recommendRows) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
@@ -266,7 +436,7 @@
        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.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto, recommendRows);
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
@@ -316,23 +486,26 @@
        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")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        String wcsLoc = Utils.WMSLocToWCSLoc(dto.getLocNo());
        dto.setLocNo(wcsLoc);
        dto.setTaskNo(workNo + "");
        return dto;
    }
@@ -343,7 +516,7 @@
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -373,19 +546,19 @@
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)){
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)){
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo()+"目标库位已被占用");
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        return dto;
    }