自动化立体仓库 - WMS系统
#
Administrator
9 小时以前 4f45f8f3ec334a73ba24fc5d16017b5c044168aa
src/main/java/com/zy/common/web/WcsController.java
@@ -6,7 +6,10 @@
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.asrs.utils.Utils;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
@@ -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;
@@ -28,7 +32,8 @@
@RestController
@RequestMapping("/rpc")
public class WcsController {
    @Autowired
    private WrkLastnoService wrkLastnoService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
@@ -42,40 +47,75 @@
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private  LocDetlService locDetlService;
    private LocDetlService locDetlService;
    @Autowired
    private RowLastnoService rowLastnoService;
    @Autowired
    private WorkService workService;
    @PostMapping("/pakin/loc/v1")
    @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("高低检测信号不能为空");
        }
@@ -84,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;
        }
@@ -102,18 +172,23 @@
    @PostMapping("/auto/emptyIn/v1")
    @ResponseBody
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto){
    public R autoEmptyIn(@RequestBody LocTypeDto locTypeDto) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(12, true);
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(1038, true);
        // 检索库位
        StartupDto dto = commonService.getLocNo(rowLastnoService.selectNextWhsType(), 10, 15, null, locTypeDto,0);
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        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());
@@ -130,19 +205,238 @@
        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) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_sts", "D"));
        if (Cools.isEmpty(locMast)) {
            return R.error("库存没有空板");
        }
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(locTypeDto.getSiteId());
        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("生成自动空托出库失败"));
    }
    /**
     * 生成工作号
     *
     * @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) {
        // 源站点状态检测
//        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("无该盘点移栽任务");
        }
        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);
        wrkMast.setIoPri(14D);
        wrkMast.setIoType(12);
        wrkMast.setCrnNo(3);
        wrkMast.setBarcode(transplantWork.getBarcode());
        wrkMast.setSourceStaNo(transplantWork.getSourceStaNo());
        wrkMast.setStaNo(transplantWork.getStaNo());
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setMemo("自动3号堆垛机移栽");
        for (WrkDetl item : wrkDetls) {
            WrkDetl newDetl = new WrkDetl();
            newDetl.sync(item);
            newDetl.setWrkNo(wrkMast.getWrkNo());
            newDetl.setIoTime(wrkMast.getIoTime());
            newDetl.setAppeTime(now);
            newDetl.setModiTime(now);
            if (!wrkDetlService.insert(newDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        }
        return wrkMastService.insert(wrkMast) ? R.ok("自动3号堆垛机移栽成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动3号堆垛机移栽失败");
    }
    @PostMapping("/auto/TransplantingIn/v1")
    @ResponseBody
    public R autoTransplantingIn(@RequestBody TransplantWork transplantWork) {
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(transplantWork.getStaNo(), true);
        WrkMast wrkMast1 = wrkMastService.selectWrkMast(transplantWork.getWorkNo(), transplantWork.getBarcode());
//        if(sourceStaNo == null){
//
//        }
        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();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(9996);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L);
        wrkMast.setIoPri(14D);
        wrkMast.setIoType(12);
        wrkMast.setCrnNo(3);
        wrkMast.setBarcode(transplantWork.getBarcode());
        wrkMast.setSourceStaNo(4001);
        wrkMast.setStaNo(transplantWork.getStaNo());
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setMemo("自动3号堆垛机移栽");
        for (WrkDetl item : wrkDetls) {
            WrkDetl newDetl = new WrkDetl();
            newDetl.sync(item);
            newDetl.setWrkNo(wrkMast.getWrkNo());
            newDetl.setIoTime(wrkMast.getIoTime());
            newDetl.setAppeTime(now);
            newDetl.setModiTime(now);
            if (!wrkDetlService.insert(newDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        }
        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;
    }
    /**
     * 全板入库
     */
    @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);
        // 检索库位
        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, recommendRows);
        int workNo = dto.getWorkNo();
        Date now = new Date();
        // 生成工作档
@@ -192,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;
    }
@@ -217,7 +514,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();
@@ -247,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;
    }