自动化立体仓库 - WMS系统
zwl
2025-10-27 8aaf98abf54109252764f9c7f8bd5bf28c073241
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -1,37 +1,46 @@
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.plugins.Page;
import com.core.annotations.ManagerAuth;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.MobileService;
import com.zy.asrs.service.OrderService;
import com.zy.common.model.MobileLocDetlVo;
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.asrs.service.impl.MatServiceImpl;
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 com.zy.third.entity.ExdvYanbu;
import com.zy.third.mapper.ExdMaterialMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
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  {
public class MobileController extends BaseController {
    @Autowired
    private MobileService mobileService;
@@ -41,14 +50,75 @@
    private LocDetlService locDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    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;
    @Autowired
    private ExdMaterialMapper exdMaterialMapper;
    @Autowired
    private MatServiceImpl matService;
    // 商品上架
    @RequestMapping("/mat/onSale/auth")
    @ManagerAuth
    public R matOnSale(@RequestBody CombParam combParam) {
        mobileService.onSale(combParam);
        return R.ok("上架成功");
    }
    // 商品下架
    @RequestMapping("/mat/offSale/auth")
    //@ManagerAuth
    public R matOffSale(@RequestBody OffSaleParam offSaleParam) {
        mobileService.offSale(offSaleParam);
        return R.ok("下架成功");
    }
    // 组托 ----------------------------------------------------------------------------------------------------
    /**
     * 根据单号检索单据数据
     * http://localhost:8081/jkwms/mobile/order/serach/orderNo/auth?orderNo=123123
     */
    @RequestMapping("/order/search/orderNo/auth")
    @ManagerAuth
    public R orderSearchByBarcode(@RequestParam String orderNo){
    public R orderSearchByBarcode(@RequestParam String orderNo) {
        Order order = orderService.selectByNo(orderNo);
        if (order == null) {
            return R.ok();
        }
        DocType docType = docTypeService.selectById(order.getDocType());
        if (docType.getPakin() == null || docType.getPakin() != 1) {
            return R.ok();
        }
        if (order.getSettle() > 2) {
            return R.ok();
        }
@@ -59,58 +129,898 @@
        return R.ok().add(orderDetls);
    }
    /**
     * 组托
     */
    @RequestMapping("/comb/auth")
    @ManagerAuth(memo = "组托")
    public R comb(@RequestBody CombParam combParam){
        mobileService.comb(combParam, getUserId());
    public R comb(@RequestBody CombParam combParam) {
        log.info("组托数据:{}", combParam.toString());
        mobileService.comb(combParam, getUserId(), getUser().getEmail());
        return R.ok("组托成功");
    }
    @RequestMapping("/pack/get/auth")
    @ManagerAuth
    public R packGet(@RequestParam String barcode) {
        Pack pack = packService.selectByBarcode(barcode);
        if (pack == null) {
            return R.ok();
        }
        if (pack.getSettle() == 1L) {
            return R.ok().add(pack);
        }
        return R.ok("组托成功");
    }
    @RequestMapping("/pack/comb/auth")
    @ManagerAuth(memo = "下线组托")
    public R packComb(@RequestBody CombParam combParam) {
        mobileService.packComb(combParam, getUserId());
        return R.ok("组托成功");
    }
    // 出库 ---------------------------------------------------------------------------------------------------
    @RequestMapping("/pakout/query/auth")
    @ManagerAuth
    @Deprecated
    public R pakoutQuery(@RequestParam(required = false) String barcode,
                         @RequestParam(required = false) Integer staNo,
                         @RequestParam(required = false) String matnr) {
        if (Cools.isEmpty(barcode) && Cools.isEmpty(matnr)) {
            return R.ok();
        }
        if (!Cools.isEmpty(barcode)) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("zpallet", barcode));
            return R.ok().add(wrkDetls);
        }
        if (!Cools.isEmpty(matnr)) {
            if (!Cools.isEmpty(staNo)) {
                List<WrkDetl> wrkDetls = wrkDetlService.selectPakoutQuery(staNo, matnr);
                return R.ok().add(wrkDetls);
            }
        }
        return R.ok();
    }
    /**
     * 出库确认 - 扫托盘码
     * 1.全板 返回 101
     * 2.拣料 返回 103
     */
    @RequestMapping("/pakout/confirm/barcode/auth")
    @ManagerAuth
    public R pakoutQueryByBarcode(@RequestParam(required = false) String barcode) {
        if (Cools.isEmpty(barcode)) {
            return R.ok();
        }
        WrkMast wrkMast = wrkMastService.selectByBarcode(barcode);
        if (wrkMast != null) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
            // 去除已出库确认的明细
            wrkDetls.removeIf(wrkDetl -> wrkDetl.getInspect() != null && wrkDetl.getInspect() != 0);
            return R.ok().add(Cools.add("wrkNo", wrkMast.getWrkNo()).add("ioType", wrkMast.getIoType()).add("list", wrkDetls));
        }
        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));
    }
    /**
     *  根据库位号查找库存明细
     * 出库确认 - 拣料出库 - 选择具体条码商品
     */
    @RequestMapping("/locDetl")
    @RequestMapping("/pakout/confirm/pick/auth")
    @ManagerAuth
    public R getLocDetl(@RequestParam(required = false)String locNo,
                        @RequestParam(required = false)String matNo){
        if (!Cools.isEmpty(locNo)) {
            LocMast locMast = locMastService.selectById(locNo);
            if (null == locMast || !"F".equals(locMast.getLocSts())) {
                return R.parse(BaseRes.EMPTY);
    public R pakoutQueryByBarcode(@RequestParam(required = false) Integer wrkNo
            , @RequestParam(required = false) String matnr) {
        if (Cools.isEmpty(wrkNo)) {
            return R.ok();
        }
        if (Cools.isEmpty(matnr)) {
            return R.ok();
        }
        WrkMast wrkMast = wrkMastService.selectById(wrkNo);
        if (wrkMast == null) {
            return R.ok();
        }
        String orderNo = null;
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
        for (WrkDetl wrkDetl : wrkDetls) {
            if (Cools.isEmpty(orderNo)) {
                orderNo = wrkDetl.getOrderNo();
            }
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                    .eq("loc_no", locNo).orderBy("appe_time", false));
            List<MobileLocDetlVo> res = new ArrayList<>();
            locDetls.forEach(locDetl -> {
                MobileLocDetlVo vo = new MobileLocDetlVo();
                vo.setLocNo(locDetl.getLocNo());
                vo.setMatnr(locDetl.getMatnr());
                vo.setMaktx(locDetl.getMaktx());
                vo.setCount(locDetl.getAnfme());
                res.add(vo);
            });
            return R.ok().add(res);
            if ((wrkDetl.getMatnr() + "-" + wrkDetl.getBatch()).equals(matnr)) {
                return R.ok().add(wrkDetl);
            }
        }
        if (!Cools.isEmpty(matNo)) {
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
                    .eq("matnr", matNo).orderBy("appe_time", false));
            List<MobileLocDetlVo> res = new ArrayList<>();
            locDetls.forEach(locDetl -> {
                MobileLocDetlVo vo = new MobileLocDetlVo();
                vo.setLocNo(locDetl.getLocNo());
                vo.setMatnr(locDetl.getMatnr());
                vo.setMaktx(locDetl.getMaktx());
                vo.setCount(locDetl.getAnfme());
                res.add(vo);
            });
            return R.ok().add(res);
        // 替换 明细
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getSourceLocNo()));
        for (LocDetl locDetl : locDetls) {
            if ((locDetl.getMatnr() + "-" + locDetl.getBatch()).equals(matnr)) {
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(locDetl);
                wrkDetl.setOrderNo(orderNo);
                wrkDetl.setIoTime(wrkMast.getIoTime());
                wrkDetl.setWrkNo(wrkNo);
                return R.ok().add(wrkDetl);
            }
        }
        return R.parse(BaseRes.PARAM);
        return R.error("系统错误,条码不存在");
    }
    @RequestMapping("/pakout/confirm/auth")
    @ManagerAuth
    @Transactional
    public R pakoutConfirm(@RequestBody List<WrkDetl> list) {
        if (Cools.isEmpty(list)) {
            return R.ok();
        }
        Set<Integer> wrkNos = new HashSet<>();
        List<WrkDto> dtos = new ArrayList<>();
        for (WrkDetl wrkDetl : list) {
            if (wrkNos.contains(wrkDetl.getWrkNo())) {
                for (WrkDto dto : dtos) {
                    if (dto.getWrkNo().equals(wrkDetl.getWrkNo())) {
                        dto.getWrkDetls().add(wrkDetl);
                        break;
                    }
                }
            } else {
                wrkNos.add(wrkDetl.getWrkNo());
                dtos.add(new WrkDto(wrkDetl.getWrkNo(), wrkDetl));
            }
        }
        for (WrkDto dto : dtos) {
            WrkMast wrkMast = wrkMastService.selectById(dto.getWrkNo());
            if (wrkMast != null) {
                for (WrkDetl wrkDetl : dto.getWrkDetls()) {
                    wrkDetlService.updateInspect(wrkDetl.getWrkNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                }
                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() == 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("完成确认");
    }
    // 盘点 ----------------------------------------------------------------------------------------------------
    @RequestMapping("/checkDetl/auth")
    @ManagerAuth
    public synchronized R getCheckDetl(@RequestParam(required = false) Integer staNo) {
        if (null == staNo || staNo == 0) {
            return R.ok();
        }
        BasDevp basDevp = basDevpService.selectById(staNo);
        if (null != basDevp && basDevp.getWrkNo() != null) {
            WrkMast wrkMast = wrkMastService.selectById(basDevp.getWrkNo());
            if (wrkMast != null && wrkMast.getIoType() == 107) {
                List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
                if (!Cools.isEmpty(wrkDetls)) {
                    MobileAdjustResult result = new MobileAdjustResult();
                    result.setStaNo(staNo);
                    result.setWrkNo(wrkMast.getWrkNo());
                    result.setWrkDetls(wrkDetls);
                    return R.ok().add(result);
                }
            }
        }
        return R.ok();
    }
    @RequestMapping("/adjust/auth")
    @ManagerAuth(memo = "盘点")
    public R adjust(@RequestBody MobileAdjustParam combParam) {
        mobileService.adjust(combParam, getUserId());
        return R.ok("盘点成功");
    }
    @PostMapping("/order/out/pakout/auth")
    @ManagerAuth(memo = "订单出库")
    public synchronized R pakoutByOrder(@RequestBody JSONObject param) {
        if (!param.containsKey("staNo") || !param.containsKey("orderNo")) {
            return R.parse(BaseRes.PARAM);
        }
        mobileService.pakoutByOrder(param, getUserId());
        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";
        if (barcode.substring(0, 1).equals("9")) {
            String type = "ZONE"; //区域
            if (barcode.substring(0, 1).equals("9")) {
                rStaNo = "E9";
            }
            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);
            } else {
                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();
            }
        }
        return R.error();
    }
    /**
     * 执行移库任务--点到点
     *
     * @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);
    }
    @RequestMapping(value = "/mat/tiaoma/auth")
    @ManagerAuth
    public R find(@RequestParam("barcode") String barcode) {
        ExdvYanbu barcode1 = exdMaterialMapper.getBacode(barcode);
        if (barcode1 == null) {
            return R.error("批次对应的验布数据不存在");
        }
        Mat mat = matService.selectByMatnr(barcode1.getItemnumber());
        mat.setAnfme(barcode1.getQty());
        mat.setBc(barcode);
        mat.setBatch(barcode1.getBatchno());
        return R.ok(mat);
    }
    @RequestMapping(value = "/getOrderNo/auth")
    @ManagerAuth
    public R findOrderNo(@RequestParam("orderNo") String orderNo) {
        Page<Order> orderPage = orderService.selectPage(new Page<>(0, 10), new EntityWrapper<Order>().like("order_no", "%" + orderNo + "%"));
        List<String> objects = new ArrayList<>();
        for (Order record : orderPage.getRecords()) {
            objects.add(record.getOrderNo());
        }
        return R.ok(objects);
    }
}