自动化立体仓库 - WMS系统
#
zwl
2025-10-13 b6aece51dd963be4daf6090a9a9f6af0717a2832
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -1,5 +1,6 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -13,21 +14,30 @@
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.entity.result.MobileAdjustResult;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.model.WrkDto;
import com.zy.common.utils.HttpHandler;
import com.zy.common.web.BaseController;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * 移动端接口控制器
 * Created by vincent on 2020/6/10
 */
@Slf4j
@RestController
@RequestMapping("mobile")
public class MobileController extends BaseController  {
@@ -52,7 +62,23 @@
    private BasDevpService basDevpService;
    @Autowired
    private PackService packService;
    @Autowired
    private ManLocDetlMapper manLocDetlMapper;
    @Autowired
    private ApiLogService apiLogService;
    @Resource
    private StaDescService staDescService;
    @Value("${rcs.address.URL}")
    private String url;
    @Value("${rcs.address.reportTask}")
    private String attrcs;
    @Value("${rcs.address.siteBindAndUnbing}")
    private String siteBindAndUnbing;
    @Autowired
    private ConfigService configService;
    // 商品上架
    @RequestMapping("/mat/onSale/auth")
@@ -68,6 +94,9 @@
        mobileService.offSale(offSaleParam);
        return R.ok("下架成功");
    }
    // 组托 ----------------------------------------------------------------------------------------------------
    /**
@@ -168,6 +197,16 @@
        return R.ok();
    }
    // 根据库位码和商品码搜索商品
    @RequestMapping("/mat/find/auth")
    public R find(@RequestParam(required = false) String locNo
            , @RequestParam(required = false) String matnr){
        //List<ManLocDetl> manLocDetls = manLocDetlMapper.selectItem0(locNo, matnr);
        ManLocDetl manLocDetl = manLocDetlMapper.selectLocNo0(locNo, matnr);
        return R.ok(manLocDetl);
        //return R.ok(manLocDetlMapper.selectItem0(locNo, matnr));
    }
    /**
     * 出库确认 - 拣料出库 - 选择具体条码商品
     */
@@ -237,47 +276,39 @@
        for (WrkDto dto : dtos) {
            WrkMast wrkMast = wrkMastService.selectById(dto.getWrkNo());
            if (wrkMast != null) {
                // 101
                if (wrkMast.getIoType() == 101) {
                    for (WrkDetl wrkDetl : dto.getWrkDetls()) {
                        wrkDetlService.updateInspect(wrkDetl.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                    }
                for (WrkDetl wrkDetl : dto.getWrkDetls()) {
                    wrkDetlService.updateInspect(wrkDetl.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                }
                // 103
                if (wrkMast.getIoType() == 103) {
                    if (!wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()))) {
                        throw new CoolException("拣料出库确认失败");
                    }
                    for (WrkDetl wrkDetl : dto.getWrkDetls()) {
                        wrkDetl.setInspect(1);
                        if (!wrkDetlService.insert(wrkDetl)) {
                            throw new CoolException("拣料出库确认失败");
                        }
                    }
                if(wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
                    wrkMast.setWrkSts(34L);//下架完成等待回库
                }else {
                    wrkMast.setWrkSts(15L);
                }
                wrkMastService.updateById(wrkMast);
            }
        }
        for (Integer wrkNo : wrkNos) {
            WrkMast wrkMast = wrkMastService.selectById(wrkNo);
            if (wrkMast.getWrkSts() == 14 && (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N"))) {
                List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkNo);
                boolean complete = true;
                for (WrkDetl wrkDetl : wrkDetls) {
                    if (wrkDetl.getInspect() == null || wrkDetl.getInspect() == 0) {
                        complete = false;
                        break;
                    }
                }
                if (complete) {
                    wrkMast.setInvWh("Y");
                    wrkMast.setModiTime(new Date());
                    if (!wrkMastService.updateById(wrkMast)) {
                        throw new CoolException("修改工作档" + wrkNo + "失败");
                    }
                }
            }
        }
//        for (Integer wrkNo : wrkNos) {
//            WrkMast wrkMast = wrkMastService.selectById(wrkNo);
//            if (wrkMast.getWrkSts() == 15 && (Cools.isEmpty(wrkMast.getInvWh()) || wrkMast.getInvWh().equals("N"))) {
//                List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkNo);
//                boolean complete = true;
//                for (WrkDetl wrkDetl : wrkDetls) {
//                    if (wrkDetl.getInspect() == null || wrkDetl.getInspect() == 0) {
//                        complete = false;
//                        break;
//                    }
//                }
//                if (complete) {
//                    wrkMast.setInvWh("Y");
//                    wrkMast.setModiTime(new Date());
//                    if (!wrkMastService.updateById(wrkMast)) {
//                        throw new CoolException("修改工作档" + wrkNo + "失败");
//                    }
//                }
//            }
//        }
        return R.ok("完成确认");
    }
@@ -286,7 +317,7 @@
    @RequestMapping("/checkDetl/auth")
    @ManagerAuth
    public R getCheckDetl(@RequestParam(required = false) Integer staNo) {
    public synchronized R getCheckDetl(@RequestParam(required = false) Integer staNo) {
        if (null == staNo || staNo == 0) {
            return R.ok();
        }
@@ -324,4 +355,616 @@
        return R.ok("出库成功");
    }
    //------------------------------------------------------------------------------agv调度--------------------------------------------------
    /**
     * 补空板   区域到点
     * @param locNo 目标站点
     * @param size  托盘大小 1:小托盘  2:大托盘
     * @return
     */
    @RequestMapping("/FillEmptyPallets")
    public synchronized R FillEmptyPallets(@RequestParam(required = false) String locNo
            ,@RequestParam(required = false) String size){
        if (Cools.isEmpty(locNo) || Cools.isEmpty(size)) {
            return R.error("站点或者大小不能为空");
        }
        //空托盘缓冲区 小:E8  大:E9
        String rStaNo ="E8";
        if(size.equals("2")){
            rStaNo = "E9";
        }
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("taskType", "PF-FMR-COMMON");
        List<LinkedHashMap<String,Object>> targetRoutes=new ArrayList<>();
        LinkedHashMap<String,Object> t1=new LinkedHashMap<>();
        LinkedHashMap<String,Object> t2=new LinkedHashMap<>();
        t1.put("seq", 0);
        t1.put("type","ZONE");
        t1.put("code", rStaNo);
        t1.put("autoStart",0);
        t1.put("operation","COLLECT");
        t2.put("seq", 0);
        t2.put("type","SITE");
        t2.put("code", locNo);
        t2.put("autoStart",0);
        t2.put("operation","DELIVERY");
        targetRoutes.add(t1);
        targetRoutes.add(t2);
        rcsParam.put("targetRoute", targetRoutes);
        rcsParam.put("initPriority", 100);
        String response ="";
        Boolean bool =false;
        String msg = "";
        HashMap<String,Object> map = new HashMap<>();
        Date date = new Date();
        String time = date.getTime()+"";
        map.put("X-LR-REQUEST-ID", time);
        try {
            log.info("wms派发搬运任务给AGV搬运={}", rcsParam);
            response = new HttpHandler.Builder()
                     .setHeaders(map)
                    .setUri(url)
                    .setHttps(true)
                    .setPath(attrcs)
                    .setJson(JSON.toJSONString(rcsParam))
                    .build()
                    .doPostCloseSSL();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getString("code").equals("SUCCESS")){
                bool = true;
            }else{
                msg=jsonObject.getString("message");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("wms派发搬运任务给AGV搬运失败返回值={}", response);
        } finally {
            apiLogService.save("wms派发搬运任务给AGV搬运"
                    , url + attrcs
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
        }else {
            return R.error(msg);
        }
    }
    /**
     * 空托盘回库
     * @param sourceStaNo 原站点
     * @param barcode  托盘大小 1:小托盘  2:大托盘  目标区或者巷道
     * @return
     */
    @RequestMapping("/FillEmptyPalletsStack")
    public synchronized R FillEmptyPalletsStack(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String barcode){
        if (Cools.isEmpty(sourceStaNo) || Cools.isEmpty(barcode)) {
            return R.error("站点或者大小不能为空");
        }
        //空托盘缓冲区 小:E8  大:E9
        String rStaNo ="E8";
        String type ="ZONE"; //区域
        if(barcode.substring(0,1).equals("9")){
            rStaNo = "E9";
        }else{
            Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "autoE").eq("status", "1"));
            if (config != null) {
                type ="STACK"; //巷道
                if (Cools.isEmpty(config.getValue())) {
                    rStaNo = rStaNo + "01";
                    config.setValue("2");
                }else if (config.getValue().equals("1")) {
                    rStaNo = rStaNo + "01";
                    config.setValue("2");
                }else if (config.getValue().equals("2")) {
                    rStaNo = rStaNo + "02";
                    config.setValue("3");
                }else if (config.getValue().equals("3")) {
                    rStaNo = rStaNo + "03";
                    config.setValue("1");
                }
                configService.updateById(config);
            }
        }
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("taskType", "PF-FMR-COMMON");
        List<LinkedHashMap<String,Object>> targetRoutes=new ArrayList<>();
        LinkedHashMap<String,Object> t1=new LinkedHashMap<>();
        LinkedHashMap<String,Object> t2=new LinkedHashMap<>();
        t1.put("seq", 0);
        t1.put("type","SITE");
        t1.put("code", sourceStaNo);
        t1.put("autoStart",0);
        t1.put("operation","COLLECT");
        t2.put("seq", 0);
        t2.put("type",type);
        t2.put("code", rStaNo);
        t2.put("autoStart",0);
        t2.put("operation","DELIVERY");
        targetRoutes.add(t1);
        targetRoutes.add(t2);
        rcsParam.put("targetRoute", targetRoutes);
        rcsParam.put("initPriority", 100);
        String response ="";
        Boolean bool =false;
        String msg = "";
        HashMap<String,Object> map = new HashMap<>();
        Date date = new Date();
        String time = date.getTime()+"";
        map.put("X-LR-REQUEST-ID", time);
        try {
            log.info("wms派发搬运任务给AGV搬运={}", rcsParam);
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(url)
                    .setHttps(true)
                    .setPath(attrcs)
                    .setJson(JSON.toJSONString(rcsParam))
                    .build()
                    .doPostCloseSSL();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getString("code").equals("SUCCESS")){
                bool = true;
            }else{
                msg=jsonObject.getString("message");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("wms派发搬运任务给AGV搬运失败返回值={}", response);
        } finally {
            apiLogService.save("wms派发搬运任务给AGV搬运"
                    , url + attrcs
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
        }else {
            return R.error(msg);
        }
    }
    /**
     * 执行移库任务--点到点
     * @param sourceStaNo
     * @param staNo
     * @return
     */
    @RequestMapping("/SITESITEAGVMove")
    public synchronized R SITESITEAGVMove(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String staNo
            ,@RequestParam(required = false) String taskNo){
        if (Cools.isEmpty(sourceStaNo) || Cools.isEmpty(staNo)) {
            return R.error("源站点和目标站点不能为空");
        }
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("taskType", "PF-FMR-COMMON");
        if(!Cools.isEmpty(taskNo)){
            rcsParam.put("robotTaskCode", taskNo);
        }
        List<LinkedHashMap<String,Object>> targetRoutes=new ArrayList<>();
        LinkedHashMap<String,Object> t1=new LinkedHashMap<>();
        LinkedHashMap<String,Object> t2=new LinkedHashMap<>();
        t1.put("seq", 0);
        t1.put("type","SITE");
        t1.put("code", sourceStaNo);
        t1.put("autoStart",0);
        t1.put("operation","COLLECT");
        t2.put("seq", 0);
        t2.put("type","SITE");
        t2.put("code", staNo);
        t2.put("autoStart",0);
        t2.put("operation","DELIVERY");
        targetRoutes.add(t1);
        targetRoutes.add(t2);
        rcsParam.put("targetRoute", targetRoutes);
        rcsParam.put("initPriority", 100);
        String response ="";
        Boolean bool =false;
        String msg = "";
        HashMap<String,Object> map = new HashMap<>();
        Date date = new Date();
        String time = date.getTime()+"";
        map.put("X-LR-REQUEST-ID", time);
        try {
            log.info("wms派发点到点搬运任务给AGV搬运={}", rcsParam);
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(url)
                    .setHttps(true)
                    .setPath(attrcs)
                    .setJson(JSON.toJSONString(rcsParam))
                    .build()
                    .doPostCloseSSL();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getString("code").equals("SUCCESS")){
                bool = true;
            }else{
                msg=jsonObject.getString("message");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("wms派发点到点搬运任务给AGV搬运失败返回值={}", response);
        } finally {
            apiLogService.save("wms派发点到点搬运任务给AGV搬运"
                    , url + attrcs
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
        }else {
            return R.error(msg);
        }
    }
    /**
     * 执行移库任务--点到区域
     * @param sourceStaNo
     * @param staNo
     * @return
     */
    @RequestMapping("/SITEZONEAGVMove")
    public synchronized R SITEZONEAGVMove(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String staNo
            ,@RequestParam(required = false) String taskNo){
        if (Cools.isEmpty(sourceStaNo) || Cools.isEmpty(staNo)) {
            return R.error("源站点和目标站点不能为空");
        }
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("taskType", "PF-FMR-COMMON");
        if(!Cools.isEmpty(taskNo)){
            rcsParam.put("robotTaskCode", taskNo);
        }
        List<LinkedHashMap<String,Object>> targetRoutes=new ArrayList<>();
        LinkedHashMap<String,Object> t1=new LinkedHashMap<>();
        LinkedHashMap<String,Object> t2=new LinkedHashMap<>();
        t1.put("seq", 0);
        t1.put("type","SITE");
        t1.put("code", sourceStaNo);
        t1.put("autoStart",0);
        t1.put("operation","COLLECT");
        t2.put("seq", 0);
        t2.put("type","ZONE");
        t2.put("code", staNo);
        t2.put("autoStart",0);
        t2.put("operation","DELIVERY");
        targetRoutes.add(t1);
        targetRoutes.add(t2);
        rcsParam.put("targetRoute", targetRoutes);
        rcsParam.put("initPriority", 100);
        String response ="";
        Boolean bool =false;
        String msg = "";
        HashMap<String,Object> map = new HashMap<>();
        Date date = new Date();
        String time = date.getTime()+"";
        map.put("X-LR-REQUEST-ID", time);
        try {
            log.info("wms派发点到区域搬运任务给AGV搬运={}", rcsParam);
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(url)
                    .setHttps(true)
                    .setPath(attrcs)
                    .setJson(JSON.toJSONString(rcsParam))
                    .build()
                    .doPostCloseSSL();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getString("code").equals("SUCCESS")){
                bool = true;
            }else{
                msg=jsonObject.getString("message");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("wms派发点到区域搬运任务给AGV搬运失败返回值={}", response);
        } finally {
            apiLogService.save("wms派发点到区域搬运任务给AGV搬运"
                    , url + attrcs
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
        }else {
            return R.error(msg);
        }
    }
    /**
     * 执行移库任务--区域到点
     * @param sourceStaNo
     * @param staNo
     * @return
     */
    @RequestMapping("/ZONESITEAGVMove")
    public synchronized R ZONESITEAGVMove(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String staNo
            ,@RequestParam(required = false) String taskNo){
        if (Cools.isEmpty(sourceStaNo) || Cools.isEmpty(staNo)) {
            return R.error("源站点和目标站点不能为空");
        }
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("taskType", "PF-FMR-COMMON");
        if(!Cools.isEmpty(taskNo)){
            rcsParam.put("robotTaskCode", taskNo);
        }
        List<LinkedHashMap<String,Object>> targetRoutes=new ArrayList<>();
        LinkedHashMap<String,Object> t1=new LinkedHashMap<>();
        LinkedHashMap<String,Object> t2=new LinkedHashMap<>();
        t1.put("seq", 0);
        t1.put("type","ZONE");
        t1.put("code", sourceStaNo);
        t1.put("autoStart",0);
        t1.put("operation","COLLECT");
        t2.put("seq", 0);
        t2.put("type","SITE");
        t2.put("code", staNo);
        t2.put("autoStart",0);
        t2.put("operation","DELIVERY");
        targetRoutes.add(t1);
        targetRoutes.add(t2);
        rcsParam.put("targetRoute", targetRoutes);
        rcsParam.put("initPriority", 100);
        String response ="";
        Boolean bool =false;
        String msg = "";
        HashMap<String,Object> map = new HashMap<>();
        Date date = new Date();
        String time = date.getTime()+"";
        map.put("X-LR-REQUEST-ID", time);
        try {
            log.info("wms派发点到区域搬运任务给AGV搬运={}", rcsParam);
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(url)
                    .setHttps(true)
                    .setPath(attrcs)
                    .setJson(JSON.toJSONString(rcsParam))
                    .build()
                    .doPostCloseSSL();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getString("code").equals("SUCCESS")){
                bool = true;
            }else{
                msg=jsonObject.getString("message");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("wms派发点到区域搬运任务给AGV搬运失败返回值={}", response);
        } finally {
            apiLogService.save("wms派发点到区域搬运任务给AGV搬运"
                    , url + attrcs
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
        }else {
            return R.error(msg);
        }
    }
    /**
     * AGV站点绑定和解绑
     * @param sourceStaNo   //站点
     * @param barcodeType   //托盘码
     * @param invoke        //BIND为绑定    UNBIND为解绑
     * @return
     */
    @RequestMapping("/siteBindAndUnbind")
    public synchronized R siteBindAndUnbind(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String barcodeType
            ,@RequestParam(required = false) String invoke){
        if (Cools.isEmpty(sourceStaNo) || Cools.isEmpty(barcodeType)) {
            return R.error("站点和托盘类型不能为空");
        }
        if(barcodeType.substring(0,1).equals("8")){
            barcodeType="11";
        }else if(barcodeType.substring(0,1).equals("9")){
            barcodeType="21";
        }
        LinkedHashMap<String,Object> rcsParam=new LinkedHashMap<>();
        rcsParam.put("slotCategory", "SITE");
        rcsParam.put("slotCode", sourceStaNo);
        rcsParam.put("carrierCategory", "PALLET");
        rcsParam.put("carrierType", barcodeType);//11为小托盘   21为大托盘
if(sourceStaNo.equals("101")){
    rcsParam.put("carrierDir","0");
}else  if(sourceStaNo.equals("R01")||sourceStaNo.equals("R03")){
    rcsParam.put("carrierDir","-90");
    }else  if(sourceStaNo.equals("R02")){
    rcsParam.put("carrierDir","90");
}else {
    rcsParam.put("carrierDir","180");
}
        rcsParam.put("temporary", "");
        rcsParam.put("invoke", invoke);
        String response ="";
        Boolean bool =false;
        String msg = "";
        HashMap<String,Object> map = new HashMap<>();
        Date date = new Date();
        String time = date.getTime()+"";
        map.put("X-LR-REQUEST-ID", time);
        try {
            log.info("WMS完成"+invoke+"agv站点={},上报参数为={}",sourceStaNo,rcsParam);
            response = new HttpHandler.Builder()
                    .setHeaders(map)
                    .setUri(url)
                    .setHttps(true)
                    .setPath(siteBindAndUnbing)
                    .setJson(JSON.toJSONString(rcsParam))
                    .build()
                    .doPostCloseSSL();
            JSONObject jsonObject = JSON.parseObject(response);
            if(jsonObject.getString("code").equals("SUCCESS")){
                bool = true;
            }else{
                msg=jsonObject.getString("message");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("WMS完成"+invoke+"agv站点失败={}", response);
        } finally {
            apiLogService.save("WMS完成"+invoke+"agv站点"+sourceStaNo
                    , url + siteBindAndUnbing
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(rcsParam)
                    , response
                    , bool
            );
        }
        if(bool){
            return R.ok();
        }else {
            return R.error(msg);
        }
    }
    /**
     * 空板回库或者拣料回库
     * @param sourceStaNo
     * @param staNo
     * @return
     */
    @RequestMapping("/AGVStartReturn")
    public synchronized R AGVStartReturn(@RequestParam(required = false) String sourceStaNo
            ,@RequestParam(required = false) String staNo
            ,@RequestParam(required = false) String taskNo){
        if (Cools.isEmpty(sourceStaNo) || Cools.isEmpty(staNo)) {
            return R.error("源站点和托盘码不能为空");
        }
        R r=R.ok();
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", staNo).in("io_type",103,105,107));
        if (wrkMast == null) {
            r=FillEmptyPalletsStack(sourceStaNo,staNo);
        }else {
            if (wrkMast.getWrkSts()>30){
                return R.error("该托盘={},没有下架,请下架后再回库!!!");
            }
            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("sta_no", wrkMast.getStaNo()).in("io_type",101,103,105,107).lt("wrk_sts", 33));
            if (!Cools.isEmpty(wrkMasts)){
                return R.error(wrkMast.getCrnNo()+"堆垛机,有出库任务,禁止回库!!!");
            }
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String format = sdf.format(new Date());
            String s = format+"-" + wrkMast.getWrkNo() + "-" + wrkMast.getBarcode();
            r=SITESITEAGVMove(sourceStaNo,wrkMast.getStaNo$(),s);
            if (r.get("code").equals(200)) {
                wrkMast.setPdcType(s);
                /**
                 * inv_wh
                 * 拣料回库输送线出发
                 * 0等待agv放货完成
                 * 1等待输送线入库
                 * 2输送线入库任务下发成功
                 */
                wrkMast.setInvWh("0");
                wrkMastService.updateById(wrkMast);
            }
        }
        return r;
    }
    /**
     * 获取仓库
     * @return
     */
    @RequestMapping("/ck")
    @PostMapping
    public R AGVStartReturn(){
        List<String> list=new ArrayList<>();
        list.add("半成品仓库");
        list.add("成品仓库");
        return R.ok(list);
    }
}