自动化立体仓库 - WMS系统
zwl
8 天以前 b6681bc12173c1179d0185805ba461211472ac18
1.完善出库任务呼叫agv
2.完善agv任务下发
3.等等
2个文件已添加
38个文件已修改
1949 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/DigitalTwinController.java 275 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/LocMastController.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MesController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 262 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 178 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocMast.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Task.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastLog.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/digitaltwin/DtOrderVo.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/digitaltwin/LocPicDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/TransTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CombParam.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/rcs/RcsTaskSubmit.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderPakinServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java 274 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkMastLogServiceImpl.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java 195 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 135 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/DetlDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/TaskDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/properties/StationProperties.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/ViewDigitalTwinMapper.xml 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastLogMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/stoMan/stoQue.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/stoMan/stoQue.html 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/DigitalTwinController.java
@@ -31,16 +31,16 @@
//    @ManagerAuth
    public R overview(@RequestParam(required = false) String areaId){
        //digitalTwinService.overview(areaId);
        DtOverviewVo dtOverviewVo = digitalTwinService.overview(areaId);
        DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
                .totalLoc(999)
                .useLoc(900)
                .idleLoc(99)
                .todayOutbound(160)
                .todayWarehousing(170)
                .remainingStock(180)
                .build();
//        DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
//                .totalLoc(999)
//                .useLoc(900)
//                .idleLoc(99)
//                .todayOutbound(160)
//                .todayWarehousing(170)
//                .remainingStock(180)
//                .build();
        return R.ok().add(dtOverviewVo);
    }
@@ -57,19 +57,19 @@
    public R recentOrder(@RequestParam(required = false) String startDate,
                         @RequestParam(required = false) String endDate){
//        digitalTwinService.order(startDate, endDate);
        List<DtOrderVo> orderVoList = digitalTwinService.order(startDate, endDate);
        DtOrderVo dtOrderVo = DtOrderVo.builder()
                .orderDate("2025-10-22")
                .orderNum(156)
                .build();
        DtOrderVo dtOrderVo2 = DtOrderVo.builder()
                .orderDate("2025-10-23")
                .orderNum(166)
                .build();
        List<DtOrderVo> orderVoList = new ArrayList<>();
        orderVoList.add(dtOrderVo);
        orderVoList.add(dtOrderVo2);
//        DtOrderVo dtOrderVo = DtOrderVo.builder()
//                .orderDate("2025-10-22")
//                .orderNum(156)
//                .build();
//        DtOrderVo dtOrderVo2 = DtOrderVo.builder()
//                .orderDate("2025-10-23")
//                .orderNum(166)
//                .build();
//        List<DtOrderVo> orderVoList = new ArrayList<>();
//        orderVoList.add(dtOrderVo);
//        orderVoList.add(dtOrderVo2);
        return R.ok().add(orderVoList);
    }
@@ -86,21 +86,21 @@
//    @ManagerAuth
    public R recentIdleLoc(@RequestParam(required = false) String areaId,
                           @RequestParam(required = false) String startDate,
                         @RequestParam(required = false) String endDate){
                           @RequestParam(required = false) String endDate){
//        digitalTwinService.recentLoc(areaId, startDate, endDate);
        List<DtLocVo> locVoList = digitalTwinService.recentLoc(areaId, startDate, endDate);
        DtLocVo dtLocVo = DtLocVo.builder()
                .locDate("2025-10-22")
                .idleNum(208)
                .build();
        DtLocVo dtLocVo2 = DtLocVo.builder()
                .locDate("2025-10-23")
                .idleNum(177)
                .build();
        List<DtLocVo> locVoList = new ArrayList<>();
        locVoList.add(dtLocVo);
        locVoList.add(dtLocVo2);
//        DtLocVo dtLocVo = DtLocVo.builder()
//                .locDate("2025-10-22")
//                .idleNum(208)
//                .build();
//        DtLocVo dtLocVo2 = DtLocVo.builder()
//                .locDate("2025-10-23")
//                .idleNum(177)
//                .build();
//        List<DtLocVo> locVoList = new ArrayList<>();
//        locVoList.add(dtLocVo);
//        locVoList.add(dtLocVo2);
        return R.ok().add(locVoList);
    }
@@ -116,24 +116,25 @@
    @RequestMapping(value = "/recentInAndOutBound")
//    @ManagerAuth
    public R recentInAndOutBound(@RequestParam(required = false) String areaId,
                           @RequestParam(required = false) String startDate,
                           @RequestParam(required = false) String endDate){
                                 @RequestParam(required = false) String startDate,
                                 @RequestParam(required = false) String endDate){
//        digitalTwinService.inAndOutBound(areaId, startDate, endDate);
        List<DtInAndOutBoundVo> inAndOutBoundVoList = digitalTwinService.inAndOutBound(areaId, startDate, endDate);
        DtInAndOutBoundVo dtInAndOutBoundVo = DtInAndOutBoundVo.builder()
                .boundDate("2025-10-22")
                .inBoundNum(237)
                .outBoundNum(487)
                .build();
        DtInAndOutBoundVo dtInAndOutBoundVo2 = DtInAndOutBoundVo.builder()
                .boundDate("2025-10-23")
                .inBoundNum(187)
                .outBoundNum(287)
                .build();
        List<DtInAndOutBoundVo> inAndOutBoundVoList = new ArrayList<>();
        inAndOutBoundVoList.add(dtInAndOutBoundVo);
        inAndOutBoundVoList.add(dtInAndOutBoundVo2);
//        DtInAndOutBoundVo dtInAndOutBoundVo = DtInAndOutBoundVo.builder()
//                .boundDate("2025-10-22")
//                .inBoundNum(237)
//                .outBoundNum(487)
//                .build();
//        DtInAndOutBoundVo dtInAndOutBoundVo2 = DtInAndOutBoundVo.builder()
//                .boundDate("2025-10-23")
//                .inBoundNum(187)
//                .outBoundNum(287)
//                .build();
//        List<DtInAndOutBoundVo> inAndOutBoundVoList = new ArrayList<>();
//        inAndOutBoundVoList.add(dtInAndOutBoundVo);
//        inAndOutBoundVoList.add(dtInAndOutBoundVo2);
        return R.ok().add(inAndOutBoundVoList);
    }
@@ -152,31 +153,31 @@
                             @RequestParam(required = false) Integer pageIndex,
                             @RequestParam(required = false) Integer pageSize){
//        digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize);
        List<DtDetainMatVo> detainMatVoList = digitalTwinService.recentDetainMat(areaId, overDayNum, pageIndex, pageSize);
        DtDetainMatVo dtDetainMatVo = DtDetainMatVo.builder()
                .belongAreaId("A1")
                .belongAreaName("刀具库")
                .matId("mat10001")
                .matName("道具把")
                .lokId("loc1001")
                .lokName("库位10001")
                .detainTime(765)
                .inBoundTime("2025-10-11T11:15:16")
                .build();
        DtDetainMatVo dtDetainMatVo2 = DtDetainMatVo.builder()
                .belongAreaId("A1")
                .belongAreaName("刀具库")
                .matId("mat10002")
                .matName("道具把")
                .lokId("loc1002")
                .lokName("库位10002")
                .detainTime(665)
                .inBoundTime("2025-10-10T11:15:16")
                .build();
        List<DtDetainMatVo> detainMatVoList = new ArrayList<>();
        detainMatVoList.add(dtDetainMatVo);
        detainMatVoList.add(dtDetainMatVo2);
//        DtDetainMatVo dtDetainMatVo = DtDetainMatVo.builder()
//                .belongAreaId("A1")
//                .belongAreaName("刀具库")
//                .matId("mat10001")
//                .matName("道具把")
//                .lokId("loc1001")
//                .lokName("库位10001")
//                .detainTime(765)
//                .inBoundTime("2025-10-11T11:15:16")
//                .build();
//        DtDetainMatVo dtDetainMatVo2 = DtDetainMatVo.builder()
//                .belongAreaId("A1")
//                .belongAreaName("刀具库")
//                .matId("mat10002")
//                .matName("道具把")
//                .lokId("loc1002")
//                .lokName("库位10002")
//                .detainTime(665)
//                .inBoundTime("2025-10-10T11:15:16")
//                .build();
//        List<DtDetainMatVo> detainMatVoList = new ArrayList<>();
//        detainMatVoList.add(dtDetainMatVo);
//        detainMatVoList.add(dtDetainMatVo2);
        return R.ok().add(detainMatVoList);
    }
@@ -231,76 +232,74 @@
    @RequestMapping(value = "/warehouseDetail")
//    @ManagerAuth
    public R warehouseDetail(@RequestParam(required = false) String areaId){
        List<DtLocDetailVo> dtLocDetailVoList = digitalTwinService.warehouseDetail(areaId);
//        digitalTwinService.warehouseDetail(areaId);
        List<DtLocDetailVo> dtLocDetailVoList = new ArrayList<>();
        DtLocDetailVo dtLocDetailVo = new DtLocDetailVo();
        dtLocDetailVo.setLocNo("CA0100202");
        dtLocDetailVo.setLocSts("O");
        dtLocDetailVo.setAreaId(10010L);
        dtLocDetailVo.setAreaName("刀具库");
        dtLocDetailVo.setRow1(1);
        dtLocDetailVo.setBay1(2);
        dtLocDetailVo.setLev1(2);
        LocMast locMast = new LocMast();
        locMast.setLocNo("CA0100202");
        locMast.setLocSts("O");
        locMast.setRow1(1);
        locMast.setBay1(2);
        locMast.setLev1(2);
        dtLocDetailVo.setLocMast(locMast);
        LocDetl locDetl = new LocDetl();
        locDetl.setLocNo("CA0100202");
        locDetl.setAreaId(10010L);
        locDetl.setAreaName("刀具库");
        locDetl.setMatnr("mat10001");
        locDetl.setMaktx("刀把");
        dtLocDetailVo.setLocDetl(locDetl);
        dtLocDetailVoList.add(dtLocDetailVo);
        DtLocDetailVo dtLocDetailVo2 = new DtLocDetailVo();
        dtLocDetailVo2.setLocNo("CA0100202");
        dtLocDetailVo2.setLocSts("O");
        dtLocDetailVo2.setAreaId(10010L);
        dtLocDetailVo2.setAreaName("刀具库");
        dtLocDetailVo2.setRow1(1);
        dtLocDetailVo2.setBay1(2);
        dtLocDetailVo2.setLev1(2);
        LocMast locMast2 = new LocMast();
        locMast2.setLocNo("CA0100203");
        locMast2.setLocSts("O");
        locMast2.setRow1(1);
        locMast2.setBay1(2);
        locMast2.setLev1(3);
        dtLocDetailVo2.setLocMast(locMast2);
        LocDetl locDetl2 = new LocDetl();
        locDetl2.setLocNo("CA0100203");
        locDetl2.setAreaId(10010L);
        locDetl2.setAreaName("刀具库");
        locDetl2.setMatnr("mat10001");
        locDetl2.setMaktx("刀把");
        dtLocDetailVo2.setLocDetl(locDetl2);
        dtLocDetailVoList.add(dtLocDetailVo2);
        return R.ok().add(dtLocDetailVoList);
    }
//        List<DtLocDetailVo> dtLocDetailVoList = new ArrayList<>();
//        DtLocDetailVo dtLocDetailVo = new DtLocDetailVo();
//        dtLocDetailVo.setLocNo("CA0100202");
//        dtLocDetailVo.setLocSts("O");
//        dtLocDetailVo.setAreaId(10010L);
//        dtLocDetailVo.setAreaName("刀具库");
//        dtLocDetailVo.setRow1(1);
//        dtLocDetailVo.setBay1(2);
//        dtLocDetailVo.setLev1(2);
//
//        LocMast locMast = new LocMast();
//        locMast.setLocNo("CA0100202");
//        locMast.setLocSts("O");
//        locMast.setRow1(1);
//        locMast.setBay1(2);
//        locMast.setLev1(2);
//        dtLocDetailVo.setLocMast(locMast);
//
//        LocDetl locDetl = new LocDetl();
//        locDetl.setLocNo("CA0100202");
//        locDetl.setAreaId(10010L);
//        locDetl.setAreaName("刀具库");
//        locDetl.setMatnr("mat10001");
//        locDetl.setMaktx("刀把");
//        dtLocDetailVo.setLocDetl(locDetl);
//        dtLocDetailVoList.add(dtLocDetailVo);
//
//
//        DtLocDetailVo dtLocDetailVo2 = new DtLocDetailVo();
//        dtLocDetailVo2.setLocNo("CA0100202");
//        dtLocDetailVo2.setLocSts("O");
//        dtLocDetailVo2.setAreaId(10010L);
//        dtLocDetailVo2.setAreaName("刀具库");
//        dtLocDetailVo2.setRow1(1);
//        dtLocDetailVo2.setBay1(2);
//        dtLocDetailVo2.setLev1(2);
//
//        LocMast locMast2 = new LocMast();
//        locMast2.setLocNo("CA0100203");
//        locMast2.setLocSts("O");
//        locMast2.setRow1(1);
//        locMast2.setBay1(2);
//        locMast2.setLev1(3);
//        dtLocDetailVo2.setLocMast(locMast2);
//
//        LocDetl locDetl2 = new LocDetl();
//        locDetl2.setLocNo("1001");
//        locDetl2.setLocNo("CA0100203");
//        locDetl2.setAreaId(10010L);
//        locDetl2.setAreaName("刀具库");
//        locDetl2.setMatnr("mat10001");
//        locDetl2.setMaktx("刀把");
//        dtLocDetailVo2.setLocDetl(locDetl2);
//        dtLocDetailVoList.add(dtLocDetailVo2);
//
////        List<LocDetl> locDetlList = new ArrayList<>();
////        locDetlList.add(locDetl);
////        locDetlList.add(locDetl2);
        return R.ok().add(dtLocDetailVoList);
    }
//
////        LocDetl locDetl2 = new LocDetl();
////        locDetl2.setLocNo("1001");
////        locDetl2.setAreaId(10010L);
////        locDetl2.setAreaName("刀具库");
////        locDetl2.setMatnr("mat10001");
////        locDetl2.setMaktx("刀把");
////
//////        List<LocDetl> locDetlList = new ArrayList<>();
//////        locDetlList.add(locDetl);
//////        locDetlList.add(locDetl2);
}
src/main/java/com/zy/asrs/controller/LocMastController.java
@@ -1,5 +1,6 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
@@ -12,6 +13,7 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.digitaltwin.LocPicDto;
import com.zy.asrs.entity.param.LocMastInitParam;
import com.zy.asrs.mapper.LocDetlMapper;
import com.zy.asrs.service.*;
@@ -20,6 +22,7 @@
import com.zy.common.service.CommonService;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -46,6 +49,8 @@
    private WrkMastLogService wrkMastLogService;
    @Resource
    private WrkDetlLogService wrkDetlLogService;
    @Value("${wcs.url}")
    private String WCS_URL;
    @RequestMapping(value = "/locMast/init/pwd")
    public R locMastInitPwd(@RequestParam(required = false) String pwd) {
@@ -335,4 +340,39 @@
            return R.error("初始化失败===>" + e.getMessage());
        }
    }
    @GetMapping("/locMast/picUrl")
    @ManagerAuth
    public R getPicUrl(@RequestParam String locNo) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                .eq("loc_no", locNo));
        if (locMast == null) {
            return R.error();
        }
        List<LocPicDto> list = new ArrayList<>();
        String picStr = locMast.getPic();
        if (Cools.isEmpty(picStr)) {
            return R.ok().add(list);
        }
        List<String> pics = JSON.parseArray(picStr, String.class);
        for (String pic : pics) {
            List<String> picList = new ArrayList<>();
            String[] split = pic.split("_");
            String picPath = split[0];
            String locNoStr = "";
            if (split.length > 1) {
                locNoStr = split[1];
                picPath += "_" + locNoStr;
            }
            picList.add("http://" + WCS_URL + "/image/" + picPath + "-1.jpg");
            picList.add("http://" + WCS_URL + "/image/" + picPath + "-2.jpg");
            LocPicDto locPicDto = new LocPicDto();
            locPicDto.setLocNo(locNoStr);
            locPicDto.setPics(picList);
            list.add(locPicDto);
        }
        return R.ok().add(list);
    }
}
src/main/java/com/zy/asrs/controller/MesController.java
@@ -41,14 +41,14 @@
        return mesReturn;
    }
//    // 出库申请
//    @PostMapping("/api/mes/outBoundOrder")
//    public MesReturn outBoundOrder(@RequestBody MesOutApply param){
//
//        MesReturn mesReturn = new MesReturn();
//        mesReturn.setSuccess(mesService.outBoundOrder(param) == 1 ? "1" : "2");
//        return mesReturn;
//    }
    // 出库申请
    @PostMapping("/api/mes/outBoundOrder")
    public MesReturn outBoundOrder(@RequestBody MesOutApply param){
        MesReturn mesReturn = new MesReturn();
        mesReturn.setSuccess(mesService.outBoundOrder(param) == 1 ? "1" : "2");
        return mesReturn;
    }
//    // 出库入库订单申请
    @PostMapping("/api/mes/callOutBoundOrder")
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -14,16 +14,23 @@
import com.zy.asrs.entity.result.MobileAdjustResult;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.OrderDetlPakinServiceImpl;
import com.zy.asrs.service.impl.OrderDetlPakoutServiceImpl;
import com.zy.asrs.service.impl.OrderPakinServiceImpl;
import com.zy.asrs.service.impl.OrderPakoutServiceImpl;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.model.WrkDto;
import com.zy.common.utils.HttpHandler;
import com.zy.common.web.BaseController;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@@ -61,6 +68,18 @@
    @Resource
    private StaDescService staDescService;
    @Autowired
    private OrderPakinServiceImpl orderPakinService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private OrderDetlPakinServiceImpl orderDetlPakinService;
    @Autowired
    private OrderPakoutServiceImpl orderPakoutService;
    @Autowired
    private OrderDetlPakoutServiceImpl orderDetlPakoutService;
    @Value("${wcs.url}")
    private String WCS_URL;
    @RequestMapping("/pda/WarehouseOut/v1")
    @ManagerAuth(memo = "并板途中拣料-参考念初")
@@ -209,48 +228,50 @@
    @RequestMapping("/order/search/orderNo/auth")
    @ManagerAuth
    public R orderSearchByBarcode(@RequestParam String orderNo){
        if (Cools.isEmpty(orderNo)){
            orderNo=null;
        }
//        List<Order> orders = orderService.selectorderNoL(orderNo);
        List<Order> orders = OrderInAndOutUtil.selectOrderNoL(null, orderNo);
        if (Cools.isEmpty(orders)){
        OrderPakin orderPakin = orderPakinService.selectByNo(orderNo);
        if (orderPakin == null) {
            return R.ok();
        }
        LinkedList<CombParam> combParams = new LinkedList<>();
        if (!Cools.isEmpty(orders)){
            for (Order order:orders){
                CombParam combParam=new CombParam();
                if (order == null) {
                    continue;
                }
                DocType docType = docTypeService.selectById(order.getDocType());
                if (docType.getPakin() == null || docType.getPakin() != 1) {
                    continue;
                }
                if (order.getSettle() > 2) {
                    continue;
                }
//                List<OrderDetl> orderDetls = orderService.selectWorkingDetls(order.getId());
                List<OrderDetl> orderDetls = OrderInAndOutUtil.selectWorkingDetls(order.getPakinPakoutStatus$(), order.getId());
                if (!Cools.isEmpty(orderDetls)) {
                    LinkedList<CombParam.CombMat> combMats = new LinkedList<>();
                    for (OrderDetl orderDetl:orderDetls){
                        CombParam.CombMat combMat = new CombParam.CombMat();
                        combMat.setMatnr(orderDetl.getMatnr());
                        combMat.setBatch(orderDetl.getBatch());
                        combMat.setAnfme(orderDetl.getAnfme()-orderDetl.getWorkQty());
                        combMat.setMaktx(orderDetl.getMaktx());
                        combMat.setSpecs(orderDetl.getSpecs());
                        combMats.add(combMat);
                    }
                    combParam.setCombMats(combMats);
                }
                combParam.setOrderNo(order.getOrderNo());
                combParams.add(combParam);
            }
        DocType docType = docTypeService.selectById(orderPakin.getDocType());
        if (docType.getPakin() != 1) {
            return R.ok();
        }
        return R.ok().add(combParams);
        List<OrderDetlPakin> orderDetlPakins = orderPakinService.selectWorkingDetls(orderPakin.getId());
        if (Cools.isEmpty(orderDetlPakins)) {
            return R.ok();
        }
        List<OrderDetlPakin> orderDetls1= new ArrayList<>();
        for (OrderDetlPakin orderDetl : orderDetlPakins) {
            if(orderDetl.getAnfme()-orderDetl.getWorkQty()>0){
                orderDetls1.add(orderDetl);
            }
        }
        return R.ok().add(orderDetls1);
    }
    @RequestMapping("/order/search/orderNo/out/auth")
    @ManagerAuth
    public R orderSearchByBarcodeOut(@RequestParam String orderNo){
        OrderPakout orderPakout = orderPakoutService.selectByNo(orderNo);
        if (orderPakout == null) {
            return R.ok();
        }
        DocType docType = docTypeService.selectById(orderPakout.getDocType());
        List<OrderDetlPakout> orderDetlPakouts = orderPakoutService.selectWorkingDetls(orderPakout.getId());
        if (Cools.isEmpty(orderDetlPakouts)) {
            return R.ok();
        }
        List<OrderDetlPakout> orderDetls1= new ArrayList<>();
        for (OrderDetlPakout orderDetl : orderDetlPakouts) {
            if(orderDetl.getAnfme()-orderDetl.getWorkQty()>0){
                orderDetls1.add(orderDetl);
            }
        }
        return R.ok().add(orderDetls1);
    }
    @RequestMapping("/comb/auth")
@@ -377,7 +398,7 @@
    @RequestMapping("/pakout/confirm/pick/auth")
    @ManagerAuth
    public R pakoutQueryByBarcode(@RequestParam(required = false) Integer wrkNo
                                , @RequestParam(required = false) String matnr){
            , @RequestParam(required = false) String matnr){
        if (Cools.isEmpty(wrkNo)) {
            return R.ok();
        }
@@ -549,4 +570,165 @@
        return mobileService.callEmptyBinOutBound(locNo,size,getUserId());
    }
    /**
     * 空板回库或者拣料回库
     *
     * @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("源站点和托盘码不能为空");
        }
        List<Task> tasks = taskService.selectList(new EntityWrapper<Task>().eq("source_sta_no", sourceStaNo).eq("barcode", staNo));
        if (tasks.size() > 0) {
            return R.error("该托盘="+staNo+"已经存在搬运任务,请不要重复下发");
        }
        String barcode = staNo.substring(0,1);
        if(barcode.equals("3")){
            taskNo = "307";
        }else if(barcode.equals("4")){
            taskNo = "402";
        }else if(barcode.equals("5")){
            taskNo = "401";
        }
        R r = R.ok();
        //生成AGV搬运出库任务
        // 保存工作档
        Task task = new Task();
        Date date = new Date();
        String TaskNo = 555555 + "aa" + date.getTime();
        task.setWrkNo((int) date.getTime())
                .setTaskNo(TaskNo)
                .setIoTime(date)
                .setWrkSts(301L) // 工作状态:301.任务下发
                .setIoType(3) // 入出库状态: 3.站到站  4.站到区域
                .setTaskType("agv")
                .setIoPri(10D)
                .setFullPlt("Y") // 满板:Y
                .setPicking("N") // 拣料
                .setExitMk("N")// 退出
                .setStaNo(taskNo)
                .setSourceStaNo(sourceStaNo)//agv取货站点
                .setEmptyMk("N")// 空板
                .setBarcode(staNo)// 托盘码
                .setLinkMis("N")
                .setAppeUser(9945L)
                .setAppeTime(date)
                .setModiUser(9945L)
                .setModiTime(date);
        if (!taskService.insert(task)) {
            throw new CoolException("保存工作档失败");
        }
        return r;
    }
    @RequestMapping("/orderIn")
    public synchronized R AGVOrderInReturn() {
        List<OrderPakin> settle = orderPakinService.selectList(new EntityWrapper<OrderPakin>().in("settle", 1, 2));
        List<String> list = new ArrayList<>();
        for (OrderPakin orderPakin : settle) {
            if (orderPakin.getSettle()==2){
                List<OrderDetlPakin> orderId = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_id", orderPakin.getId()));
                Boolean boo=true;
                for (OrderDetlPakin orderDetlPakin : orderId) {
                    if (orderDetlPakin.getAnfme()>orderDetlPakin.getWorkQty()){
                        boo=false;
                        break;
                    }
                }
                if (boo) {
                    settle.remove(orderPakin);
                }else {
                    list.add(orderPakin.getOrderNo());
                }
            }else {
                list.add(orderPakin.getOrderNo());
            }
        }
        return R.ok(list);
    }
    @RequestMapping("/orderOut")
    public synchronized R AGVOrderOutReturn() {
        List<OrderPakout> settle = orderPakoutService.selectList(new EntityWrapper<OrderPakout>().in("settle", 1, 2).eq("doc_type",11));
        List<String> list = new ArrayList<>();
        for (OrderPakout orderPakout: settle) {
            if (orderPakout.getSettle()==2){
                List<OrderDetlPakout> orderId = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_id", orderPakout.getId()));
                Boolean boo=true;
                for (OrderDetlPakout orderDetlPakout: orderId) {
                    if (orderDetlPakout.getAnfme()>orderDetlPakout.getWorkQty()){
                        boo=false;
                        break;
                    }
                }
                if (boo) {
                    settle.remove(orderPakout);
                }else {
                    list.add(orderPakout.getOrderNo());
                }
            }else {
                list.add(orderPakout.getOrderNo());
            }
        }
        return R.ok(list);
    }
    /**
     * 输送线任务下发
     * @return
     */
    @RequestMapping("/toInSta")
    public synchronized R AGVOrderOutReturn(@RequestParam(required = false) Integer staNo) {
        BasDevp devNo = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", staNo));
        if (Cools.isEmpty(devNo)) {
            return R.error("没有该站点");
        }
        //查看是否已经下发任务,或者已经有出库任务正在运行禁止给输送下下发任务
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().in("io_type", 101, 103).eq("wrk_sts",12));
        if (!Cools.isEmpty(wrkMast)) {
            return R.error("当前输送线有堆垛机正在作业禁止入库");
        }
        Integer wrkNo = 0;
        switch (staNo) {
            case 301: wrkNo = 9991; break;
            case 302: wrkNo = 9992; break;
            case 303: wrkNo = 9993; break;
            case 304: wrkNo = 9994; break;
            case 305: wrkNo = 9995; break;
            case 306: wrkNo = 9996; break;
            case 307: wrkNo = 9997; break;
        }
        try {
            HashMap<String,Object> hashMap=new HashMap<>();
            hashMap.put("staNo",staNo);
            hashMap.put("wrkNo",wrkNo);
            String response = new HttpHandler.Builder()
                    .setUri(WCS_URL)
                    .setPath("/open/toInSta")
                    .setJson(JSON.toJSONString(hashMap))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("code").equals(200)) {
            } else {
                return  R.error(jsonObject.getString("msg"));
            }
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
        return R.ok(staNo);
    }
}
src/main/java/com/zy/asrs/controller/OutController.java
@@ -11,6 +11,7 @@
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.web.BaseController;
import lombok.Synchronized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -81,8 +82,8 @@
                if (issued <= 0.0D) {
                    continue;
                }
                List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist,orderDetl.getMatnr(), orderDetl.getBatch(),
                        orderDetl.getBrand(),orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3());
                List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(),
                        orderDetl.getBrand(), orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3());
                for (LocDetl locDetl : locDetls) {
                    if (issued > 0) {
                        LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
@@ -128,8 +129,8 @@
                    continue;
                }
                List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist,orderDetl.getMatnr(), orderDetl.getBatch(),
                        orderDetl.getBrand(),orderPakOut.getDocType()==11?null:orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3());
                List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(),
                        orderDetl.getBrand(), orderPakOut.getDocType() == 11 ? null : orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3());
                for (LocDetl locDetl : locDetls) {
                    if (issued > 0) {
                        LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
@@ -172,15 +173,16 @@
        return R.ok().add(locDtos);
    }
    @Synchronized
    @PostMapping("/out/pakout/auth")
    @ManagerAuth(memo = "订单出库")
    public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
    public R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
        if (Cools.isEmpty(locDtos)) {
            return R.parse(BaseRes.PARAM);
        }
        List<LocDto> locDtoArrayList = new ArrayList<>();
        for (LocDto locDto : locDtos){
            if (locDto.getFrozen()!=1 && locDto.getFrozenLoc()!=1){
        for (LocDto locDto : locDtos) {
            if (locDto.getFrozen() != 1 && locDto.getFrozenLoc() != 1) {
                locDtoArrayList.add(locDto);
            }
        }
@@ -204,7 +206,9 @@
        List<TaskDto> taskDtos = new ArrayList<>();
        // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务
        for (LocDto locDto : locDtos) {
            if (locDto.isLack()) { continue; }
            if (locDto.isLack()) {
                continue;
            }
            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto);
            if (TaskDto.has(taskDtos, taskDto)) {
                TaskDto dto = TaskDto.find(taskDtos, taskDto);
@@ -223,28 +227,35 @@
        //优先级
        int ioPri = 50;
        //已下空板出库任务数量
        int j=1;
        int j = 1;
        // -----------------------------------------------------------------------------------------------
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(staNo, taskDto, getUserId(),ioPri);
            workService.stockOut(staNo, taskDto, getUserId(), ioPri);
            ioPri--;
            i++;
            //配盘出库单使用,下发需要出的空板任务
            if (orderPakout.getDocType() == 11) {
                if (size<5&&i==size){
                    for (;j<=orderPakout.getPayType();j++){
                        String bar="";
                        if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){
                            bar = "A01";
                if (i == size) {
                    for (; j <= orderPakout.getPayType(); j++) {
                        LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", taskDto.getLocNo()));
                        Integer locType = Integer.valueOf(locMast1.getLocType2());
                        //配盘 出库单出库区域时Q-L4时,出大托盘空板
                        if(!Cools.isEmpty(orderPakout.getCstmrName())&&orderPakout.getCstmrName().equals("Q-L4")){
                            locType = 2;
                        }
                        LocMast locMast = new  LocMast();
                        if(Cools.isEmpty(bar)){
                            locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_sts", "D"));
                        }else {
                            locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_sts", "D").like("barcode", bar));
                        String bar = "";
                        //具体待定
//                        if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){
//                            bar = "A01";
//                        }
                        LocMast locMast = new LocMast();
                        if (Cools.isEmpty(bar)) {
                            locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_sts", "D").eq("loc_type2", locType).orderBy("row1",false));
                        } else {
                            locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_sts", "D").eq("loc_type2", locType).like("barcode", bar).orderBy("row1",false));
                        }
                        if (Cools.isEmpty(locMast)) {
@@ -253,23 +264,40 @@
                        String locNo = locMast.getLocNo();
                        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
                        emptyPlateOutParam.setOutSite(303);
                        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locNo);}});
                        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri);
                        emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
                            add(locNo);
                        }});
                        String agvSta = "";
                        if (locMast.getLocType3() == 2) {
                            agvSta = "Z-LZP26";
                        }else if(locType ==2){
                        } else {
                            agvSta = orderPakout.getCstmrName();//agv目标站点位置
                        }
                        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam, ioPri, agvSta);
                        ioPri--;
                    }
                }else if(i == 5){
                    String bar="";
                    if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){
                } else if (i == 4) {
                    LocMast locMast1 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", taskDto.getLocNo()));
                    Integer locType = Integer.valueOf(locMast1.getLocType2());
                    //配盘 出库单出库区域时Q-L4时,出大托盘空板
                    if(orderPakout.getCstmrName().equals("Q-L4")){
                        locType = 2;
                    }
                    String bar = "";
                    if (!Cools.isEmpty(orderPakout.getShipCode()) && orderPakout.getShipCode().equals("A01")) {
                        bar = "A01";
                    }
                    LocMast locMast = null;
                    if(Cools.isEmpty(bar)){
                        locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_sts", "D"));
                    }else {
                        locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_sts", "D").like("barcode", bar));
                    if (Cools.isEmpty(bar)) {
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_sts", "D").eq("loc_type2", locType).orderBy("row1",false));
                    } else {
                        locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_sts", "D").eq("loc_type2", locType).like("barcode", bar).orderBy("row1",false));
                    }
                    if (Cools.isEmpty(locMast)) {
@@ -278,13 +306,93 @@
                    String locNo = locMast.getLocNo();
                    EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
                    emptyPlateOutParam.setOutSite(303);
                    emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locNo);}});
                    WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri);
                    emptyPlateOutParam.setLocNos(new ArrayList<String>() {{
                        add(locNo);
                    }});
                    String agvSta = "";
                    if (locMast.getLocType3() == 2) {
                        agvSta = "Z-LZP26";
                    }else if(locType ==2){
                    } else {
                        agvSta = orderPakout.getCstmrName();//agv目标站点位置
                    }
                    WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam, ioPri, agvSta);
                    ioPri--;
                    j++;
                }
            }
        }
        return R.ok();
    }
    @PostMapping("/out/pakout/preview/auth1")
    @ManagerAuth
    public R pakoutPreview1(@RequestBody String orderNo) throws InterruptedException {
        if (Cools.isEmpty(orderNo)) {
            return R.parse(BaseRes.PARAM);
        }
        List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_no", orderNo));
        if (orderDetlPakouts.size() == 0) {
            return R.parse("订单明细为空");
        }
        List<LocDto> locDtos = new ArrayList<>();
        Set<String> exist = new HashSet<>();
        // 获取订单主表
        OrderPakout orderPakOut = orderPakOutService.selectByNo(orderDetlPakouts.get(0).getOrderNo());
        for (OrderDetlPakout orderDetl : orderDetlPakouts) {
            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D);
            if (issued <= 0.0D) {
                continue;
            }
            List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(),
                    orderDetl.getBrand(), orderPakOut.getDocType() == 11 ? null : orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3());
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
                    LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
                    locDto.setFrozen(locDetl.getFrozen());
                    locDto.setFrozenLoc(locMast.getFrozen());
                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                    locDto.setStaNos(staNos);
                    locDto.setBrand(orderDetl.getBrand());
                    locDto.setStandby1(orderDetl.getStandby1());
                    locDto.setStandby2(orderDetl.getStandby2());
                    locDto.setStandby3(orderDetl.getStandby3());
                    locDto.setBoxType1(orderDetl.getBoxType1());
                    locDto.setBoxType2(orderDetl.getBoxType2());
                    locDto.setBoxType3(orderDetl.getBoxType3());
                    locDtos.add(locDto);
                    exist.add(locDetl.getLocNo());
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                } else {
                    break;
                }
            }
            if (issued > 0) {
                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
                locDto.setBrand(orderDetl.getBrand());
                locDto.setStandby1(orderDetl.getStandby1());
                locDto.setStandby2(orderDetl.getStandby2());
                locDto.setStandby3(orderDetl.getStandby3());
                locDto.setBoxType1(orderDetl.getBoxType1());
                locDto.setBoxType2(orderDetl.getBoxType2());
                locDto.setBoxType3(orderDetl.getBoxType3());
                locDto.setLack(Boolean.TRUE);
                locDtos.add(locDto);
            }
        }
        R pakout = pakout(locDtos);
        return R.ok().add(pakout);
    }
}
src/main/java/com/zy/asrs/entity/LocMast.java
@@ -209,6 +209,9 @@
    @TableField("frozen_memo")
    private String frozenMemo;
    @ApiModelProperty(value= "拍照图片")
    private String pic;
    public String getWhsType$(){
        BasWhsTypeService service = SpringUtils.getBean(BasWhsTypeService.class);
src/main/java/com/zy/asrs/entity/Task.java
@@ -135,6 +135,10 @@
    @ApiModelProperty(value= "料架号")
    private String packed;
    @ApiModelProperty(value= "下发AGV任务计数")
    @TableField("ctn_type")
    private Integer ctnType=0;
    /**
     * 拣料
     */
@@ -173,10 +177,6 @@
    @ApiModelProperty(value= "工作时间")
    @TableField("io_time")
    private Date ioTime;
    @ApiModelProperty(value= "")
    @TableField("ctn_type")
    private Integer ctnType;
    @ApiModelProperty(value= "")
    @TableField("ove_mk")
@@ -398,10 +398,16 @@
    public String getTaskType$(){
        if (Cools.isEmpty(this.taskType)){return  null;}
        if (taskType.equals("AGV")) {
        if (taskType.equals("AGV") || taskType.equals("agv")) {
            return "AGV任务";
        }if(taskType.equals("AGV补空料架")){
            return "AGV补空料架任务";
        }if(taskType.equals("AGV空料架回缓存区")){
            return "AGV空料架回缓存区任务";
        }if(taskType.equals("ZX-AGV")){
            return "转序搬运任务";
        } else {
            return "堆垛机任务";
            return "其他搬运任务";
        }
    }
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -332,6 +332,9 @@
    @TableField("task_no")
    private String taskNo;
    @ApiModelProperty(value= "拍照图片")
    private String pic;
    public WrkMast() {}
    public String getYmd$(){
src/main/java/com/zy/asrs/entity/WrkMastLog.java
@@ -327,6 +327,9 @@
    @TableField("take_none")
    private String takeNone;
    @ApiModelProperty(value= "拍照图片")
    private String pic;
    public WrkMastLog() {
    }
src/main/java/com/zy/asrs/entity/digitaltwin/DtOrderVo.java
@@ -6,10 +6,10 @@
// 数字孪生:按天订单数量
@Data
@Builder
// DtOrderVo.java
public class DtOrderVo {
    // 日期
    private String orderDate;
    // 订单数量
    private String orderDate;  // 或 LocalDate
    private Integer orderNum;
}
src/main/java/com/zy/asrs/entity/digitaltwin/LocPicDto.java
New file
@@ -0,0 +1,12 @@
package com.zy.asrs.entity.digitaltwin;
import lombok.Data;
import java.util.List;
@Data
public class LocPicDto {
    private String locNo;
    private List<String> pics;
}
src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
@@ -41,7 +41,7 @@
    // 空托盘数量
    @JsonProperty("EmptyCount")
    @JSONField(name = "EmptyCount")
    private List<MesOutApplyItem> EmptyCount;
    private String EmptyCount;
    // (sfc_shop_route_consume)mes中配盘表名
    @Data
@@ -74,4 +74,5 @@
        private String rackNumber;
    }
}
src/main/java/com/zy/asrs/entity/mes/TransTask.java
@@ -62,7 +62,7 @@
    // 指定AGV厂家,1 海康;2 华晓;华晓与海康AGV运载能力不同,MES可按需求指定
//    @JsonProperty("AgvFactory")
//    @JSONField(name = "AgvFactory")
    private Integer agvFactory;
    private Integer agvFactory =1;
    //托盘码
    private String barcode;
src/main/java/com/zy/asrs/entity/param/CombParam.java
@@ -19,6 +19,9 @@
    // 库位编号
    private String locNo;
    //agv原站点
    private String rsta;
    private List<CombMat> combMats;
    @Data
src/main/java/com/zy/asrs/entity/rcs/RcsTaskSubmit.java
@@ -9,7 +9,7 @@
public class RcsTaskSubmit {
    // 任务类型,枚举值:TRANSPORT搬运。
    private String taskType = "TRANSPORT";
    private String taskType = "PP";
    // 执行步骤集合。本次任务机器人需要执行的关键路径,序号0代表起点,序号1代表终点。
    private List<RcsTaskTargetRoute> targetRoute;
    // 任务唯一编号,如果为空,系统生成任务号并返回。
src/main/java/com/zy/asrs/service/WorkService.java
@@ -58,7 +58,7 @@
     * @param param
     * @return
     */
    public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri);
    public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri,String agvSta);
    /**
     * 盘点出库
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
@@ -48,23 +48,23 @@
        if (station == null){
            throw new CoolException(devpNo+"站点不存在");
        }
        if (pakin) {
            if(station.getAutoing()==null || !station.getAutoing().equals("Y")) {
                throw new CoolException(devpNo+"站点不是自动状态");
            }
            if(station.getLoading()==null || !station.getLoading().equals("Y")) {
                throw new CoolException(devpNo+"站点无物");
            }
            if(station.getWrkNo()!=null && station.getWrkNo()>0 && station.getWrkNo() < 9990) {
                throw new CoolException(devpNo+"站点已有工作号");
            }
//            if(!station.getInEnable().equals("Y")) {
//                throw new CoolException(devpNo+"站点不是可入状态");
//        if (pakin) {
//            if(station.getAutoing()==null || !station.getAutoing().equals("Y")) {
//                throw new CoolException(devpNo+"站点不是自动状态");
//            }
            if(wrkMastService.getWorkingMast(devpNo)>0){
                throw new CoolException(devpNo+"站点不能同时生成两笔入库工作档");
            }
        }
//            if(station.getLoading()==null || !station.getLoading().equals("Y")) {
//                throw new CoolException(devpNo+"站点无物");
//            }
//            if(station.getWrkNo()!=null && station.getWrkNo()>0 && station.getWrkNo() < 9990) {
//                throw new CoolException(devpNo+"站点已有工作号");
//            }
////            if(!station.getInEnable().equals("Y")) {
////                throw new CoolException(devpNo+"站点不是可入状态");
////            }
//            if(wrkMastService.getWorkingMast(devpNo)>0){
//                throw new CoolException(devpNo+"站点不能同时生成两笔入库工作档");
//            }
//        }
        return station;
    }
}
src/main/java/com/zy/asrs/service/impl/DigitalTwinServiceImpl.java
@@ -36,7 +36,7 @@
        List<Double> dbOverview = digitalTwinMapper.overview(areaId);
        if (dbOverview != null && !dbOverview.isEmpty()){
            DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
                .totalLoc((int)Math.round(dbOverview.get(0)))
                    .totalLoc((int)Math.round(dbOverview.get(0)))
                    .useLoc((int)Math.round(dbOverview.get(1)))
                    .remainingStock((int)Math.round(dbOverview.get(2)))
                    .todayWarehousing((int)Math.round(dbOverview.get(3)))
@@ -74,7 +74,9 @@
        endTime = endDate.substring(0, 4) + "-" + endDate.substring(4, 6) + "-" + endDate.substring(6, 8) + "00:00:00";
        List<DtOrderVo> dbOrder = digitalTwinMapper.recentOrder(startTime, endTime);
        // 空日期补全
        for (DtOrderVo dtOrderVo : dbOrder) {
            dtOrderVo.setOrderDate(dtOrderVo.getOrderDate());
        }
        return dbOrder;
    }
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -239,7 +239,6 @@
            newMemo.put("itemdata", list);
            // 生成订单
            OrderPakin orderPakin = new OrderPakin();
            orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
@@ -260,8 +259,8 @@
                    // 生成明细
                    Mat mat = matService.selectByMatnr(mesMatInfo.getItemNo());
                    if(Cools.isEmpty(mat)){
                        log.error("该物料编号立库没有="+mesMatInfo.getItemNo());
                    if (Cools.isEmpty(mat)) {
                        log.error("该物料编号立库没有=" + mesMatInfo.getItemNo());
                        continue;
                    }
                    OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
@@ -967,6 +966,7 @@
            orderPakout.setUpdateTime(now);
            orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));
            orderPakout.setPakinPakoutStatus(2);
            orderPakout.setCstmrName(mesCallOutApply.getStationId());//agv目标站点
            if (!orderPakoutService.insert(orderPakout)) {
                log.error("MES保存出库订单(叫料)主档失败");
                throw new CoolException("保存出库订单(叫料)主档失败");
@@ -1003,9 +1003,9 @@
            }
            //有多少种不同的配盘号   只有配盘出库单需要知道
            if (mesCallOutApply.getTransType().equals("配盘出库单")){
            if (mesCallOutApply.getTransType().equals("配盘出库单")) {
                orderPakout.setPayType(set.size());
                String shipCode =mesCallOutApply.getItemdata().get(0).getTrayid().split("-")[2];
                String shipCode = mesCallOutApply.getItemdata().get(0).getTrayid().split("-")[2];
                orderPakout.setShipCode(shipCode);//区域  是否是特殊托盘
                orderPakoutService.updateById(orderPakout);
            }
@@ -1039,11 +1039,11 @@
            orderPakin.setPakinPakoutStatus(1);
            orderPakinService.insert(orderPakin);
            if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
                for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()){
                for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {
                    // 生成明细
                    Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
                    if(Cools.isEmpty(mat)){
                        log.error("该物料编号立库没有="+mesOutApplyItem.getItemno());
                    if (Cools.isEmpty(mat)) {
                        log.error("该物料编号立库没有=" + mesOutApplyItem.getItemno());
                        continue;
                    }
                    OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
@@ -1104,73 +1104,37 @@
            return result;
        }
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        rcsTaskSubmit.setRobotTaskCode(transTask.getTaskno());
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
        RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
        startRoute.setSeq(0);
        startRoute.setCode(transTask.getCurStationId());
        startRoute.setOperation("COLLECT");
        targetRouteList.add(startRoute);
        RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
        endRoute.setSeq(1);
        endRoute.setCode(transTask.getNextStationId());
        endRoute.setOperation("DELIVERY");
        targetRouteList.add(endRoute);
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
        Date now = new Date();
        Task task = new Task();
        task.setWrkNo(workNo);
        task.setTaskType("ZX-AGV");
        task.setWrkSts(301L);//301.AGV任务创建
        task.setIoType(3);//3.站到站
        task.setIoPri(10.00);
        task.setWrkDate(now);
        task.setBarcode(transTask.getBarcode());
        task.setSourceStaNo(transTask.getCurStationId());
        task.setStaNo(transTask.getNextStationId());
        task.setBarcode(transTask.getTuoPanId());
        task.setModiUser(defaultUserId);
        task.setModiTime(now);
        task.setAppeUser(defaultUserId);
        task.setAppeTime(now);
        task.setTaskNo(transTask.getTaskno());
        task.setMemo(JSONObject.toJSONString(transTask));
        task.setPltType(transTask.getAgvFactory());//华晓AGV
        task.setPacked(transTask.getRackNumber());//料架号
        task.setCtnType(1);
        // 转发给海康或华晓RCS
        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (success == 1) {
            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
            Date now = new Date();
            Task task = new Task();
            task.setWrkNo(workNo);
            task.setTaskType("ZX-AGV");
            task.setWrkSts(302L);//302.AGV任务执行中
            task.setIoType(3);//3.站到站
            task.setIoPri(10.00);
            task.setWrkDate(now);
            task.setBarcode(transTask.getBarcode());
            task.setSourceStaNo(transTask.getCurStationId());
            task.setStaNo(transTask.getNextStationId());
            task.setBarcode(transTask.getTuoPanId());
            task.setModiUser(defaultUserId);
            task.setModiTime(now);
            task.setAppeUser(defaultUserId);
            task.setAppeTime(now);
            task.setTaskNo(transTask.getTaskno());
            task.setMemo(JSONObject.toJSONString(transTask));
            task.setPltType(transTask.getAgvFactory());//华晓AGV
            task.setPacked(transTask.getRackNumber());//料架号
            taskService.insert(task);
//            Mat mat = matService.selectByMatnr(transTask.getItemno());
//            TaskDetl taskDetl = new TaskDetl();
//            taskDetl.setWrkNo(task.getWrkNo());
//            taskDetl.setIoTime(task.getIoTime());
//            taskDetl.setMatnr(transTask.getItemno());
//            taskDetl.setAnfme(0.0);
//            taskDetl.setStandby1(String.valueOf(transTask.getQty()));
//            taskDetl.setMaktx(mat.getMaktx());
//            taskDetl.setSpecs(mat.getSpecs());
//            taskDetl.setOrderNo(transTask.getOrderNo());
//            taskDetl.setZpallet(transTask.getTuoPanId());
//            taskDetl.setMemo(JSONObject.toJSONString(transTask.getItemBarcode()));
//            taskDetl.setModiUser(defaultUserId);
//            taskDetl.setModiTime(now);
//            taskDetl.setAppeUser(defaultUserId);
//            taskDetl.setAppeTime(now);
//            taskDetlService.insert(taskDetl);
        if (taskService.insert(task)) {
            result.put("Success", "1");
            result.put("Message", "任务接收成功");
        } else {
        }else {
            result.put("Success", "2");
            result.put("Message", "任务下发给RCS失败");
        }
        return result;
    }
@@ -1266,13 +1230,17 @@
        mesReturn.setSuccess("2");
        if ("Y".equals(allow.getStatus())) {
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
            String TaskNo = allow.getTaskno();
            if(allow.getTaskno().contains("-")){
                TaskNo = allow.getTaskno().split("-")[0];
            }
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", TaskNo));
            if (Cools.isEmpty(task)) {
                mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务");
            } else {
                //查看申请站点的是海康还是华晓
                //海康
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) {
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1 || task.getPltType() == 0) {
                    RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                    rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
                    rcsTaskContinue.setTriggerType("TASK");
@@ -1354,13 +1322,17 @@
        mesReturn.setSuccess("2");
        if ("Y".equals(allow.getStatus())) {
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
            String TaskNo = allow.getTaskno();
            if(allow.getTaskno().contains("-")){
                TaskNo = allow.getTaskno().split("-")[0];
            }
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", TaskNo));
            if (Cools.isEmpty(task)) {
                mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务");
                mesReturn.setMessage("没有找个该任务编号=" + TaskNo + "的AGV移动任务");
            } else {
                //查看申请站点的是海康还是华晓
                //海康
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) {
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1 || task.getPltType() == 0) {
                    RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                    rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
                    rcsTaskContinue.setTriggerType("TASK");
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -22,6 +22,8 @@
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.impl.ConfigServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -114,6 +116,8 @@
    private BasStationService basStationService;
    @Autowired
    private BasContainerService basContainerService;
    @Autowired
    private ConfigServiceImpl configService;
    @Override
    @Transactional
@@ -606,9 +610,9 @@
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
                }
//                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
//                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
//                }
                WaitPakin waitPakin = new WaitPakin();
                BeanUtils.copyProperties(mat, waitPakin);
                waitPakin.setBatch(detlDto.getBatch());
@@ -704,6 +708,9 @@
//                if (suplus < 0) {
//                    throw new CoolException("物料:" + detlDto.getMatnr() + ", 超出当前托盘装载上限!!");
//                }
                OrderDetlPakin detls = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>()
                        .eq("order_no", param.getOrderNo())
                        .eq("matnr", detlDto.getMatnr()));
                WaitPakin waitPakin = new WaitPakin();
                BeanUtils.copyProperties(mat, waitPakin);
@@ -719,6 +726,7 @@
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                waitPakin.setStandby1(detls.getStandby1());//配盘号
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
@@ -729,7 +737,7 @@
                Order order = OrderInAndOutUtil.selectByNo(Boolean.TRUE, orderNo);
                OrderInAndOutUtil.updateOrder(Boolean.TRUE, order.getId(), 2L, userId);
            });
            if(!Cools.isEmpty(param.getLocNo())){
            if(!Cools.isEmpty(param.getRsta()) && param.getRsta().contains("-")){
                //生成AGV搬运任务
                //生成AGV搬运出库任务
                // 保存工作档
@@ -739,12 +747,12 @@
                if (param.getBarcode().charAt(0) == '3'){
                    s = "307";
                }else if (param.getBarcode().charAt(0) == '4'){
                    s = "401";
                }else if (param.getBarcode().charAt(0) == '5'){
                    s = "402";
                }else if (param.getBarcode().charAt(0) == '5'){
                    s = "401";
                }
                String TaskNo = param.getBarcode()+"-"+date.getTime();
                task.setWrkNo(Integer.getInteger(param.getBarcode()))
                String TaskNo = param.getBarcode()+"aa"+date.getTime();
                task.setWrkNo((int) date.getTime())
                        .setTaskNo(TaskNo)
                        .setIoTime(date)
                        .setWrkSts(301L) // 工作状态:301.任务下发
@@ -755,7 +763,7 @@
                        .setPicking("N") // 拣料
                        .setExitMk("N")// 退出
                        .setStaNo(s)
                        .setSourceStaNo(param.getLocNo())//空料架缓存区E1
                        .setSourceStaNo(param.getRsta())//agv取货位
                        .setEmptyMk("N")// 空板
                        .setBarcode(param.getBarcode())// 托盘码
                        .setLinkMis("N")
@@ -1330,8 +1338,9 @@
        //滑块库
        if(locMast.getLocType3()==1){
            if(locMast.getLocType2()==1){
                sta = "402";
            }else if(locMast.getLocType2()==2){
                sta = "401";
            }
        }else if(locMast.getLocType3()==2){
            sta="307";
src/main/java/com/zy/asrs/service/impl/OrderPakinServiceImpl.java
@@ -100,6 +100,7 @@
                    orderDetl.setCreateBy(order.getCreateBy());
                    orderDetl.setUpdateTime(order.getUpdateTime());
                    orderDetl.setUpdateBy(order.getUpdateBy());
                    orderDetl.setBarcode(wrkDetl.getZpallet());
                    if (!orderDetlPakinService.insert(orderDetl)) {
                        throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                    }
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -233,7 +233,7 @@
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())||"200".equals(rcsReturn.getCode())) {
                JSONObject data = rcsReturn.getData();
                String robotTaskCode = data.getString("RobotTaskCode");
                String robotTaskCode = data.getString("robotTaskCode");
                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
                    return 1;
                }
@@ -256,7 +256,7 @@
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("200".equals(rcsReturn.getCode())) {
            if("SUCCESS".equals(rcsReturn.getCode())||"200".equals(rcsReturn.getCode())) {
                return 1;
            }
        }
@@ -327,6 +327,8 @@
        String robotTaskCode = rcsReporterTask.getRobotTaskCode();
        String singleRobotCode = rcsReporterTask.getSingleRobotCode();
        String[] split = robotTaskCode.split("-");
        robotTaskCode = split[0];
        //华晓AGV状态反馈,及申请
        if(Cools.isEmpty(rcsReporterTask.getExtra())){
            if(Cools.isEmpty(rcsReporterTask.getMethod())){
@@ -445,41 +447,41 @@
            String slotCode = values.getString("slotCode");
            try {
                // q3,q8=1
                if ("1".equals(carrierType)) {    //AGV
                    EntityWrapper<Task> wrapper = new EntityWrapper<>();
                    wrapper.eq("task_no", robotTaskCode);
                    Task task = taskService.selectOne(wrapper);
                    if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                        rcsReturn.setCode("Err_RobotCodeNotMatch");
                        rcsReturn.setMessage("");
                        JSONObject data = new JSONObject();
                        data.put("robotTaskCode", robotTaskCode);
                        rcsReturn.setData(data);
                        return rcsReturn;
                    }
                    JSONObject memo = JSONObject.parseObject(task.getMemo());
                    switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                        case TASK_START: {
                            task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                            task.setModiTime(new Date());
                            task.setModiUser(defaultUserId);
                            taskService.updateById(task);
                        }
                        break;
                        case TASK_OUT_BIN: {
                            // TODO:立库出库一托,AGV开始运输后,给MES发送出库完成(一托发一次)
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                    rcsReturn.setCode("Err_RobotCodeNotMatch");
                    rcsReturn.setMessage("");
                    JSONObject data = new JSONObject();
                    data.put("robotTaskCode", robotTaskCode);
                    rcsReturn.setData(data);
                    return rcsReturn;
                }
                JSONObject memo = JSONObject.parseObject(task.getMemo());
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        taskService.updateById(task);
                    }
                    break;
                    case TASK_OUT_BIN: {
                        // TODO:立库出库一托,AGV开始运输后,给MES发送出库完成(一托发一次)
//                        JSONObject taskMemo = JSONObject.parseObject(task.getMemo());
//                        mesService.outFeedbackByTuo(taskMemo.getString("OrderNo"), task);
                        }
                        break;
                        case TASK_END: {
                            // 更新任务状态等内部逻辑
                            task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                            task.setModiTime(new Date());
                            task.setModiUser(defaultUserId);
                            taskService.updateById(task);
                            // 任务完成
                    }
                    break;
                    case TASK_END: {
                        // 更新任务状态等内部逻辑
                        task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        taskService.updateById(task);
                        // 任务完成
//                        mesService.reporterTask(rcsReporterTask);
//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
@@ -494,74 +496,74 @@
//                    taskService.completeWrkMast();
//                    taskDetlService.
                        }
                        break;
                        case APPLY_IN_STATION:
                        case APPLY_OFF_STATION:
                        case ARRIVE_OFF_STATION: {
                            TransParent apply = new TransParent();
                            apply.setTaskno(robotTaskCode);
                            apply.setTaskname(memo.getString("taskName"));
                            apply.setAgvCode(singleRobotCode);
                            String transType = memo.getString("TransType");
                            apply.setTransType(transType);
                            apply.setProductLineId(memo.getString("ProductLineId"));
                            if (transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                                apply.setStationId(task.getSourceStaNo());
                            } else {
                                apply.setStationId(task.getStaNo());
                            }
                            if (RcsRetMethodEnum.APPLY_IN_STATION.getCode().equals(method)) {
                                mesService.applyInStation(apply);
                            } else if (RcsRetMethodEnum.APPLY_OFF_STATION.getCode().equals(method)) {
                                mesService.applyOutStation(apply);
                            } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
                                mesService.outStation(apply);
                            }
                        }
                        break;
                        case ARRIVE_ON_STATION: {
                            // TODO: 如果产线是运输起点,则不发送到站完成,暂时调试使用lG,未实现判断
                            if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) {
                                break;
                            }
                            EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
                            wapper2.eq("wrk_no", task.getWrkNo())
                                    .eq("matnr", memo.getString("Itemno"))
                                    .eq("order_no", memo.getString("OrderNo"));
                            TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
                            TransArrivalStation arrivalStation = new TransArrivalStation();
                            arrivalStation.setTaskno(robotTaskCode);
                            arrivalStation.setTaskname(memo.getString("taskName"));
                            arrivalStation.setTuoPanId(taskDetl.getZpallet());  // memo.getString("TuoPanId")
                            arrivalStation.setProductLineId(memo.getString("ProductLineId"));
                            String transType = memo.getString("TransType");
                            arrivalStation.setDaotype(transType);
                            if (transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                                arrivalStation.setStationID(task.getSourceStaNo());
                            } else {
                                arrivalStation.setStationID(task.getStaNo());
                            }
                            arrivalStation.setOrderNo(memo.getString("OrderNo"));
                            arrivalStation.setAgvCode(singleRobotCode);
                            arrivalStation.setItemno(memo.getString("Itemno"));
                            String memo2 = taskDetl.getMemo();
                            List<String> itemBarCode = new ArrayList<>();
                            Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2);
                            while (matcher.find()) {
                                itemBarCode.add(matcher.group(1));
                            }
                            arrivalStation.setItemBarcode(itemBarCode);
                            mesService.arriveOnStation(arrivalStation);
                        }
                        break;
                        default: {
                        }
                        break;
                    }
                    break;
                    case APPLY_IN_STATION:
                    case APPLY_OFF_STATION:
                    case ARRIVE_OFF_STATION: {
                        TransParent apply = new TransParent();
                        apply.setTaskno(robotTaskCode);
                        apply.setTaskname(memo.getString("taskName"));
                        apply.setAgvCode(singleRobotCode);
                        String transType = memo.getString("TransType");
                        apply.setTransType(transType);
                        apply.setProductLineId(memo.getString("ProductLineId"));
                        if (transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                            apply.setStationId(task.getSourceStaNo());
                        } else {
                            apply.setStationId(task.getStaNo());
                        }
                        if (RcsRetMethodEnum.APPLY_IN_STATION.getCode().equals(method)) {
                            mesService.applyInStation(apply);
                        } else if (RcsRetMethodEnum.APPLY_OFF_STATION.getCode().equals(method)) {
                            mesService.applyOutStation(apply);
                        } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
                            mesService.outStation(apply);
                        }
                    }
                    break;
                    case ARRIVE_ON_STATION: {
                        // TODO: 如果产线是运输起点,则不发送到站完成,暂时调试使用lG,未实现判断
                        if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) {
                            break;
                        }
                        EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
                        wapper2.eq("wrk_no", task.getWrkNo())
                                .eq("matnr", memo.getString("Itemno"))
                                .eq("order_no", memo.getString("OrderNo"));
                        TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
                        TransArrivalStation arrivalStation = new TransArrivalStation();
                        arrivalStation.setTaskno(robotTaskCode);
                        arrivalStation.setTaskname(memo.getString("taskName"));
                        arrivalStation.setTuoPanId(taskDetl.getZpallet());  // memo.getString("TuoPanId")
                        arrivalStation.setProductLineId(memo.getString("ProductLineId"));
                        String transType = memo.getString("TransType");
                        arrivalStation.setDaotype(transType);
                        if (transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                            arrivalStation.setStationID(task.getSourceStaNo());
                        } else {
                            arrivalStation.setStationID(task.getStaNo());
                        }
                        arrivalStation.setOrderNo(memo.getString("OrderNo"));
                        arrivalStation.setAgvCode(singleRobotCode);
                        arrivalStation.setItemno(memo.getString("Itemno"));
                        String memo2 = taskDetl.getMemo();
                        List<String> itemBarCode = new ArrayList<>();
                        Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2);
                        while (matcher.find()) {
                            itemBarCode.add(matcher.group(1));
                        }
                        arrivalStation.setItemBarcode(itemBarCode);
                        mesService.arriveOnStation(arrivalStation);
                    }
                    break;
                    default: {
                    }
                    break;
                }
                // 返回RCS
                rcsReturn.setCode("SUCCESS");
                rcsReturn.setMessage("");
@@ -664,44 +666,44 @@
        String robotTaskCode = apply.getTaskno();
        String singleRobotCode = apply.getAgvCode();
        //华晓AGV申请
            if(Cools.isEmpty(apply.getMethod())){
                log.error("华晓AGV上报状态Method为空!");
                rcsReturn.setCode("Err_Internal");
                rcsReturn.setMessage("华晓AGV上报状态Method为空");
                JSONObject data = new JSONObject();
                data.put("robotTaskCode", robotTaskCode);
                rcsReturn.setData(data);
            }else {
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
                String method = apply.getMethod();
                JSONObject memo = Cools.isEmpty(task) ? null : JSONObject.parseObject(task.getMemo());
                switch (method) {
                    case "APPLY_IN_STATION":
                    case "APPLY_OFF_STATION":
                    case "ARRIVE_OFF_STATION": {
                        //agv入站申请
                        if ("APPLY_IN_STATION".equals(method)) {
                            mesService.applyInStation(apply);
                            //agv离站请求
                        } else if ("APPLY_OFF_STATION".equals(method)) {
                            mesService.applyOutStation(apply);
                            //agv离站完成
                        } else {
                            mesService.outStation(apply);
                        }
                    } break;
                    default: {} break;
                }
            }
            // 返回RCS
            rcsReturn.setCode("SUCCESS");
            rcsReturn.setMessage("");
        if(Cools.isEmpty(apply.getMethod())){
            log.error("华晓AGV上报状态Method为空!");
            rcsReturn.setCode("Err_Internal");
            rcsReturn.setMessage("华晓AGV上报状态Method为空");
            JSONObject data = new JSONObject();
            data.put("robotTaskCode", robotTaskCode);
            rcsReturn.setData(data);
            //海康AGV状态反馈,及申请
        }else {
            EntityWrapper<Task> wrapper = new EntityWrapper<>();
            wrapper.eq("task_no", robotTaskCode);
            Task task = taskService.selectOne(wrapper);
            String method = apply.getMethod();
            JSONObject memo = Cools.isEmpty(task) ? null : JSONObject.parseObject(task.getMemo());
            switch (method) {
                case "APPLY_IN_STATION":
                case "APPLY_OFF_STATION":
                case "ARRIVE_OFF_STATION": {
                    //agv入站申请
                    if ("APPLY_IN_STATION".equals(method)) {
                        mesService.applyInStation(apply);
                        //agv离站请求
                    } else if ("APPLY_OFF_STATION".equals(method)) {
                        mesService.applyOutStation(apply);
                        //agv离站完成
                    } else {
                        mesService.outStation(apply);
                    }
                } break;
                default: {} break;
            }
        }
        // 返回RCS
        rcsReturn.setCode("SUCCESS");
        rcsReturn.setMessage("");
        JSONObject data = new JSONObject();
        data.put("robotTaskCode", robotTaskCode);
        rcsReturn.setData(data);
        //海康AGV状态反馈,及申请
        return rcsReturn;
    }
@@ -749,7 +751,7 @@
            {
                result.append(line);
            }
            log.info("recv - {}", result);
            log.info("rec - {}", result);
        }
        catch (ConnectException e)
        {
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -105,7 +105,7 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getDevpNo(), true);
        // 检索库位
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,"");
//        List<String> matnrs = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = param.getList().stream().map(FullStoreParam.MatCodeStore::getBatch).distinct().collect(Collectors.toList());
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(param.getList().get(0));
@@ -411,9 +411,27 @@
        String orderNo = taskDto.getLocDtos().get(0).getOrderNo();
        OrderPakout orderPakout = orderPakOutService.selectByNo(orderNo);
        int ioType = orderPakout.getDocType() == 8 ? 107 : (taskDto.isAll() ? 101 : 103);
        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
//        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        //出库任务堆垛机出库站点指定
        String SourceStaNo = "";
        String StaNo = "";
        if(locMast.getLocType3()==2&&orderPakout.getDocType()==11){
            SourceStaNo = "301";
            StaNo = "303";
        }else if (locMast.getLocType3()==2&&!Cools.isEmpty(orderPakout.getCstmrName())){
            SourceStaNo = "307";
            StaNo = "307";
        }else if (locMast.getLocType3()==1&&locMast.getLocType2()==1){
            SourceStaNo = "402";
            StaNo = "402";
        }else if (locMast.getLocType3()==1&&locMast.getLocType2()==2){
            SourceStaNo = "401";
            StaNo = "401";
        }
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
@@ -422,8 +440,8 @@
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(ioPri+0.0); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
        wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
        wrkMast.setSourceStaNo(SourceStaNo); // 源站
        wrkMast.setStaNo(StaNo); // 目标站
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -435,6 +453,11 @@
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if(locMast.getLocType3()==2&&orderPakout.getDocType()==11){
        }else {
            wrkMast.setMemo(orderPakout.getCstmrName());//agv目标站点
        }
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:" + taskDto.getLocNo());
        }
@@ -502,7 +525,7 @@
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,"");
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
@@ -629,7 +652,7 @@
    @Override
    @Transactional
    public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri) {
    public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri,String agvSta) {
        WrkMast wrkMast = new WrkMast();
        if (Cools.isEmpty(param.getOutSite())) {
            throw new CoolException("站点不存在");
@@ -642,10 +665,21 @@
            if (Cools.isEmpty(locMast)) {
                throw new CoolException(locNo + "库位不存在");
            }
            //出库任务堆垛机出库站点指定
            String SourceStaNo = "";
            if(locMast.getLocType3()==2){
                SourceStaNo = "303";
            }else if (locMast.getLocType3()==1&&locMast.getLocType2()==1){
                SourceStaNo = "402";
            }else if (locMast.getLocType3()==1&&locMast.getLocType2()==2){
                SourceStaNo = "401";
            }
            // 获取源站
            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", 110)
                    .eq("stn_no", param.getOutSite())
                    .eq("stn_no", SourceStaNo)
                    .eq("crn_no", locMast.getCrnNo());
            StaDesc staDesc = staDescService.selectOne(wrapper);
            Integer sourceStaNo = staDesc.getCrnStn();
@@ -661,7 +695,7 @@
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(ioPri+0.0);
            wrkMast.setSourceStaNo(sourceStaNo + ""); // 源站
            wrkMast.setStaNo(param.getOutSite() + ""); // 目标站
            wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(locNo); // 源库位
            wrkMast.setFullPlt("N"); // 满板:Y
@@ -673,7 +707,7 @@
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(1L);
            wrkMast.setModiTime(now);
            wrkMast.setMemo("生成自动空板出库");
//            wrkMast.setMemo(agvSta);//agv目标站点
            boolean res = wrkMastService.insert(wrkMast);
            if (!res) {
                throw new CoolException("保存工作档失败");
src/main/java/com/zy/asrs/service/impl/WrkMastLogServiceImpl.java
@@ -16,6 +16,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.Map;
import java.util.Objects;
@@ -34,11 +35,33 @@
        if (Objects.isNull(mast)) {
            throw new CoolException("数据错误:任务不存在!!");
        }
        WrkMastLog mastLog = new WrkMastLog();
        BeanUtils.copyProperties(mast, mastLog);
        mastLog.setLogId(mast.getId());
        Date now = new Date();
        WrkMastLog wrkMastLog = new WrkMastLog();
        wrkMastLog.setWrkNo(mast.getWrkNo());
        wrkMastLog.setIoTime(now);
        wrkMastLog.setWrkSts(Math.toIntExact(mast.getWrkSts()));
        wrkMastLog.setIoType(mast.getIoType());
        wrkMastLog.setIoPri(mast.getIoPri()); // 优先级
        wrkMastLog.setCrnNo(mast.getCrnNo());
        wrkMastLog.setSourceLocNo(mast.getSourceLocNo());
        wrkMastLog.setLocNo(mast.getLocNo());
        wrkMastLog.setBarcode(mast.getBarcode()); // 托盘码
        wrkMastLog.setFullPlt(mast.getFullPlt()); // 满板:Y
        wrkMastLog.setPicking(mast.getPicking()); // 拣料
        wrkMastLog.setExitMk(mast.getExitMk()); // 退出
        wrkMastLog.setEmptyMk(mast.getEmptyMk()); // 空板
        wrkMastLog.setLinkMis(mast.getLinkMis());
        wrkMastLog.setWrkDate(mast.getWrkDate());
        wrkMastLog.setPic(mast.getPic());
        // 操作人员数据
        wrkMastLog.setAppeTime(now);
        wrkMastLog.setModiTime(now);
        wrkMastLog.setAppeUser(mast.getAppeUser());
        wrkMastLog.setModiUser(mast.getModiUser());
        wrkMastLog.setLogId(mast.getId());
        boolean res = wrkMastLogService.insert(wrkMastLog);
        if (!wrkMastLogService.insert(mastLog)) {
        if (!res) {
            throw new CoolException("任务日志保存失败!!");
        }
src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java
@@ -3,10 +3,12 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.TaskService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.BasDevpServiceImpl;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.AGVTaskReportHandler;
import org.slf4j.Logger;
@@ -31,58 +33,67 @@
    private Boolean switchErpReportOld;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private BasDevpServiceImpl basDevpService;
    /**
     * 满板和空板出库任务,出到输送线后创建AGV搬运任务
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void createAGVTask(){
        if (!switchErpReportOld){
    private void createAGVTask() {
        if (!switchErpReportOld) {
            return;
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 300));
        if (wrkMasts.isEmpty()){
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 30));
        if (wrkMasts.isEmpty()) {
            return;
        }
        for (WrkMast wrkMast : wrkMasts){
        for (WrkMast wrkMast : wrkMasts) {
            //查询是否有源站和目标站有一样的agv搬运任务
            //如果有则跳过本次agv搬运任务下发
            //mes给的agv目标站点需要解析 Q:区域 ; Z: 站点
            String[] split = wrkMast.getMemo().split("-");
            //入出库状态: 3.站到站  4.站到区域
            Integer ioType = split[0].equals("Q") ? 4 : 3;
            //agv目标站点
            String stnNo = split[1];
            Task task1 = taskService.selectOne(new EntityWrapper<Task>()
                    .in("source_sta_no", wrkMast.getSourceStaNo(), wrkMast.getMemo())
                    .in("sta_no", wrkMast.getSourceStaNo(), wrkMast.getMemo()));
            if (Cools.isEmpty(task1)) {
            //生成AGV搬运出库任务
            // 保存工作档
            Task task = new Task();
            Date date = new Date();
            String TaskNo = wrkMast.getWrkNo()+"-"+date.getTime();
            task.setWrkNo(wrkMast.getWrkNo())
                    .setTaskNo(TaskNo)
                    .setIoTime(date)
                    .setWrkSts(301L) // 工作状态:301.任务下发
                    .setIoType(3) // 入出库状态: 3.站到站
                    .setTaskType("agv")
                    .setIoPri(10D)
                    .setFullPlt("Y") // 满板:Y
                    .setPicking("N") // 拣料
                    .setExitMk("N")// 退出
                    .setStaNo(wrkMast.getMemo())
                    .setSourceStaNo(wrkMast.getSourceStaNo())//空料架缓存区E1
                    .setEmptyMk("N")// 空板
                    .setBarcode(wrkMast.getBarcode())// 托盘码
                    .setLinkMis("N")
                    .setAppeUser(9945L)
                    .setAppeTime(date)
                    .setModiUser(9945L)
                    .setModiTime(date);
            if (!taskService.insert(task)) {
                throw new CoolException("保存工作档失败");
            }else {
                wrkMast.setWrkSts(31L);//31.AGV搬运任务创建成功
                wrkMast.setModiTime(date);
                wrkMastService.updateById(wrkMast);
            }
                //生成AGV搬运出库任务
                // 保存工作档
                Task task = new Task();
                Date date = new Date();
                String TaskNo = wrkMast.getWrkNo() + "aa" + date.getTime();
                task.setWrkNo(wrkMast.getWrkNo())
                        .setTaskNo(TaskNo)
                        .setIoTime(date)
                        .setWrkSts(301L) // 工作状态:301.任务下发
                        .setIoType(ioType) // 入出库状态: 3.站到站  4.站到区域
                        .setTaskType("agv")
                        .setIoPri(10D)
                        .setFullPlt("Y") // 满板:Y
                        .setPicking("N") // 拣料
                        .setExitMk("N")// 退出
                        .setStaNo(wrkMast.getMemo())
                        .setSourceStaNo(wrkMast.getSourceStaNo())
                        .setEmptyMk("N")// 空板
                        .setBarcode(wrkMast.getBarcode())// 托盘码
                        .setLinkMis("N")
                        .setAppeUser(9945L)
                        .setAppeTime(date)
                        .setModiUser(9945L)
                        .setModiTime(date);
                if (!taskService.insert(task)) {
                    throw new CoolException("保存工作档失败");
                } else {
                    wrkMast.setWrkSts(31L);//31.AGV搬运任务创建成功
                    wrkMast.setModiTime(date);
                    wrkMastService.updateById(wrkMast);
                }
            }
        }
    }
@@ -91,32 +102,118 @@
     * AGV 任务下发接口,定时给AGV下发任务
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
        if (!switchErpReportOld){
    private void execute() {
        if (!switchErpReportOld) {
            return;
        }
        //查询所有agv待下发任务
        List<Task> wrkSts = taskService.selectList(new EntityWrapper<Task>().eq("wrk_sts", 301));
        if (wrkSts!=null&& !wrkSts.isEmpty()){
            for (Task task:wrkSts){
        List<Task> wrkSts = taskService.selectList(new EntityWrapper<Task>().eq("wrk_sts", 301).orderBy("appe_time"));
        if (wrkSts != null && !wrkSts.isEmpty()) {
            for (Task task : wrkSts) {
                //查询是否有正在作业的源站和目标站有一样的agv搬运任务
                //如果有则跳过本次agv搬运任务下发
                Task task1 = taskService.selectOne(new EntityWrapper<Task>()
                        .eq("wrk_sts", 302)
                        .andNew()
                        .in("source_sta_no", task.getSourceStaNo(), task.getStaNo())
                        .or()
                        .in("sta_no", task.getStaNo(), task.getSourceStaNo()));
                Boolean flag = true;
                if (Cools.isEmpty(task1)) {
                    //AGV任务下发
                    ReturnT<String> start = AGVTaskReportHandler.start(task);
                    if (!start.isSuccess()){
                        task.setUpdMk("X");
                        task.setErrorMemo(start.getMsg());
                        task.setModiTime(new Date());
                        if (!taskService.updateById(task)) {
                            log.error("工作档[workNo={}]标记待处理失败", task.getWrkNo());
                    //agv搬运移动任务下发时,搬运目标点是否是立库AGV和堆垛机接驳站点
                    //如果是接驳站点则需要判断接驳站点是否有空料架
                    //如果有空料架需要判断是否有出库任务
                    //有出库任务则禁止下发本次搬运任务
                    if (task.getStaNo().equals("401") || task.getStaNo().equals("402") || task.getStaNo().equals("307")) {
                        flag = false;
                        BasDevp basDevp = basDevpService.checkSiteStatus(Integer.parseInt(task.getStaNo()));
                        if (basDevp != null && !Cools.isEmpty(basDevp.getInreq1())
                                && basDevp.getInreq1().equals("Y")
                                && basDevp.getLoading().equals("N")
                                && basDevp.getWrkNo()!=9991
                                && basDevp.getWrkNo()!=9999) {
                            List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>()
                                    .in("io_type", 101, 110)
                                    .le("wrk_sts", 14)
                                    .eq("sta_no", task.getStaNo()));
                            List<WrkMast> wrkMasts1 = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 1).eq("sta_no", task.getStaNo()));
                            if (Cools.isEmpty(wrkMasts)&&Cools.isEmpty(wrkMasts1)) {
                                //判断是否已经生成空料架搬运回空料架补库区
                                //如果有的话,不在生成任务
                                Task task2 = taskService.selectOne(new EntityWrapper<Task>().eq("task_type","AGV空料架回缓存区").eq("source_sta_no", task.getStaNo()));
                                //有入库任务搬运,需要生成空料架搬运到空料架缓冲区AGV任务
                                if (Cools.isEmpty(task2)) {
                                    //生成AGV搬运出库任务
                                    // 保存工作档
                                    String SourceStaNo = "";
                                    if (task.getStaNo().equals("401")) {
                                        //大料架缓冲区
                                        SourceStaNo = "Q-E3";
                                    }else if (task.getStaNo().equals("402")) {
                                        SourceStaNo = "Q-E2";
                                    }else if (task.getStaNo().equals("307")) {
                                        SourceStaNo = "Q-E1";
                                    }
                                    Task task3 = new Task();
                                    Date date = new Date();
                                    String TaskNo = task.getTaskNo() + "bb" + date.getTime();
                                    task3.setWrkNo(999999)
                                            .setTaskNo(TaskNo)
                                            .setIoTime(date)
                                            .setWrkSts(301L) // 工作状态:301.任务下发
                                            .setIoType(4) // 入出库状态: 3.站到站  4.站到区域
                                            .setTaskType("AGV空料架回缓存区")
                                            .setIoPri(10D)
                                            .setFullPlt("Y") // 满板:Y
                                            .setPicking("N") // 拣料
                                            .setExitMk("N")// 退出
                                            .setStaNo(SourceStaNo)
                                            .setSourceStaNo(task.getStaNo())//空料架缓存区E1
                                            .setEmptyMk("N")// 空板
                                            .setBarcode("")// 托盘码
                                            .setLinkMis("N")
                                            .setAppeUser(9945L)
                                            .setAppeTime(date)
                                            .setModiUser(9945L)
                                            .setModiTime(date);
                                    if (!taskService.insert(task3)) {
                                        throw new CoolException("保存工作档失败");
                                    }
                                    break;
                                }
                            }
                        }else if(basDevp != null && !Cools.isEmpty(basDevp.getInreq1())
                                && basDevp.getInreq1().equals("N")
                                && basDevp.getLoading().equals("N")
                        ) {
                            flag = true;
                        }
                    }
                    if (flag || task.getTaskType().equals("AGV空料架回缓存区")) {
                        //AGV任务下发
                        ReturnT<String> start = AGVTaskReportHandler.start(task);
                        if (!start.isSuccess()) {
                            task.setUpdMk("X");
                            task.setErrorMemo(start.getMsg());
                            task.setCtnType(task.getCtnType()+1);//下发任务计数
                            task.setModiTime(new Date());
                            if (!taskService.updateById(task)) {
                                log.error("工作档[workNo={}]标记待处理失败", task.getWrkNo());
                            }
                            break;
                        }else {
                            task.setCtnType(task.getCtnType()+1);
                            task.setModiTime(new Date());
                            task.setWrkSts(302L);//任务执行中
                            if (!taskService.updateById(task)) {
                                log.error("工作档[workNo={}]标记待处理失败", task.getWrkNo());
                            }
                        }
                    }
                }
            }
        }
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -4,6 +4,8 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.controller.OutController;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.service.*;
@@ -12,6 +14,7 @@
import com.zy.asrs.task.handler.OrderSyncHandler;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.entity.Parameter;
import com.zy.common.model.LocDto;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -20,8 +23,7 @@
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -56,6 +58,18 @@
    @Value("${erp.switch.ErpReportOld}")
    private boolean ErpReportOld;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private OutController  outController;
    @Scheduled(cron = "0 0 1 * * ? ")
    public void clearApiLog() {
        try {
@@ -65,7 +79,7 @@
        }
    }
//    @Scheduled(cron = "0 1 * * * ? ")
    //    @Scheduled(cron = "0 1 * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReportOrderIssuedOnceMore() {
        List<Order> orderList = orderService.selectComplete99();
@@ -82,44 +96,44 @@
        }
    }
//    @Scheduled(cron = "0/30 * * * * ? ")
    //    @Scheduled(cron = "0/30 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReportOrderIssued() {
//        String erpReport = Parameter.get().getErpReport();
//        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<Order> orderList = orderService.selectComplete1();
        List<Order> orderList = orderService.selectComplete1();
//            List<Order> orderList = orderService.selectList(new EntityWrapper<Order>().eq("settle", 1L).eq("status", 1).orderBy("create_time", true));
            for (Order order : orderList) {
                try {
                    ReturnT<String> result = orderSyncHandler.startOrderIssued(order);
                    if (!result.isSuccess()) {
                        log.error("单据[orderNo={}]转执行表失败", order.getOrderNo());
                    }
                } catch (Exception e){
                    log.error(e.getMessage());
        for (Order order : orderList) {
            try {
                ReturnT<String> result = orderSyncHandler.startOrderIssued(order);
                if (!result.isSuccess()) {
                    log.error("单据[orderNo={}]转执行表失败", order.getOrderNo());
                }
            } catch (Exception e){
                log.error(e.getMessage());
                log.error("单据[orderNo={}]转执行表失败", order.getOrderNo());
            }
        }
//        }
    }
//    @Scheduled(cron = "0/5 * * * * ? ")
    //    @Scheduled(cron = "0/5 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReportOrderInAndOutUtil() {
//        String erpReport = Parameter.get().getErpReport();
//        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<Order> orders = OrderInAndOutUtil.selectComplete(null);
            for (Order order : orders) {
                try {
                    ReturnT<String> result = orderSyncHandler.startOrderInAndOutUtil(order);
                    if (!result.isSuccess()) {
                        log.error("单据[orderNo={}]转上报表失败", order.getOrderNo());
                    }
                } catch (Exception e){
                    log.error(e.getMessage());
        List<Order> orders = OrderInAndOutUtil.selectComplete(null);
        for (Order order : orders) {
            try {
                ReturnT<String> result = orderSyncHandler.startOrderInAndOutUtil(order);
                if (!result.isSuccess()) {
                    log.error("单据[orderNo={}]转上报表失败", order.getOrderNo());
                }
            } catch (Exception e){
                log.error(e.getMessage());
                log.error("单据[orderNo={}]转上报表失败", order.getOrderNo());
            }
        }
//        }
    }
@@ -179,7 +193,7 @@
    void otherInOrderCompleteReport() {
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            OrderPakin orderPakin = orderPakinService.selectOne(new EntityWrapper<OrderPakin>().eq("settle", 4)
            OrderPakin orderPakin = orderPakinService.selectOne(new EntityWrapper<OrderPakin>().ne("doc_type",1).eq("settle", 4)
                    .ne("doc_type", 1).orderBy("update_time"));
            if (orderPakin == null) {
                return;
@@ -228,7 +242,7 @@
                    }
                }
                String url = MES_URL + "loadComplete";
                String url = MES_URL + "issueCompleteFit";
                String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
                if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                    MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
@@ -242,7 +256,76 @@
        }
    }
//    @Scheduled(cron = "0/30 * * * * ? ")
    // 出库单上报
    @Scheduled(cron = "0/30 * * * * ? ")
    @Async("orderThreadPool")
    void AutoOutOrderPinOut() throws InterruptedException {
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<OrderPakout> orderPakouts = orderPakoutService.selectList(new EntityWrapper<OrderPakout>()
                    .eq("settle", 1)
                    .eq("doc_type", 12)
                    .orderBy("update_time"));
            if (orderPakouts.isEmpty()) {
                return;
            }
            for (OrderPakout orderPakout : orderPakouts) {
                List<LocDto> locDtos = new ArrayList<>();
                Boolean boo = false;
                Set<String> exist = new HashSet<>();
                List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_no", orderPakout.getOrderNo()));
                for (OrderDetlPakout orderDetl : orderDetlPakouts) {
                    double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D);
                    if (issued <= 0.0D) {
                        continue;
                    }
                    List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist, orderDetl.getMatnr(), orderDetl.getBatch(),
                            orderDetl.getBrand(), orderPakout.getDocType() == 11 ? null : orderDetl.getStandby1(), orderDetl.getStandby2(), orderDetl.getStandby3(), orderDetl.getBoxType1(), orderDetl.getBoxType2(), orderDetl.getBoxType3());
                    for (LocDetl locDetl : locDetls) {
                        if (issued > 0) {
                            LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
                                    issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
                            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
                            locDto.setFrozen(locDetl.getFrozen());
                            locDto.setFrozenLoc(locMast.getFrozen());
                            List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                            locDto.setStaNos(staNos);
                            locDto.setBrand(orderDetl.getBrand());
                            locDto.setStandby1(orderDetl.getStandby1());
                            locDto.setStandby2(orderDetl.getStandby2());
                            locDto.setStandby3(orderDetl.getStandby3());
                            locDto.setBoxType1(orderDetl.getBoxType1());
                            locDto.setBoxType2(orderDetl.getBoxType2());
                            locDto.setBoxType3(orderDetl.getBoxType3());
                            locDtos.add(locDto);
                            exist.add(locDetl.getLocNo());
                            // 剩余待出数量递减
                            issued = issued - locDetl.getAnfme();
                        } else {
                            break;
                        }
                    }
                    if (issued > 0) {
                        boo = true;
                        continue;
                    }
                }
                if (boo){
                    continue;
                }
                R pakout = outController.pakout(locDtos);
                break;
            }
        }
    }
    //    @Scheduled(cron = "0/30 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReportOrderReport() {
src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java
@@ -7,7 +7,10 @@
import com.zy.asrs.service.RcsService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.properties.StationProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -23,6 +26,8 @@
    @Resource
    private RcsService rcsService;
    @Autowired
    private StationProperties stationProperties;
    public ReturnT<String> start(Task task) {
@@ -37,21 +42,49 @@
        }else if(task.getIoType()==5){
            SourceStaNoType = "ZONE";
        }
        String taskType = "PP";
        Boolean flag1 = false;
        Boolean flag2 = false;
        if(stationProperties.getStation().contains(task.getStaNo())){
            taskType = "YLIN";
            flag1 = true;
        }
        if (stationProperties.getStation().contains(task.getSourceStaNo())){
            taskType = "YLOUT";
            flag2 = true;
        }
        if(flag1&&flag2){
            taskType = "YLBOTH";
        }
        //AGV区域中无法用-
        String StaNo = task.getStaNo();
        String SourceStaNo = task.getSourceStaNo();
        if (task.getStaNo().split("-")[0].equals("Q")) {
            String[] split = task.getStaNo().split("-");
            StaNo = split[0]+split[1];
        }
        if (task.getSourceStaNo().split("-")[0].equals("Q")) {
            String[] split = task.getSourceStaNo().split("-");
            SourceStaNo = split[0]+split[1];
        }
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        rcsTaskSubmit.setRobotTaskCode(task.getTaskNo());
        rcsTaskSubmit.setTaskType(taskType);
        rcsTaskSubmit.setRobotTaskCode(task.getTaskNo()+"-"+task.getCtnType());
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
        RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
        startRoute.setSeq(0);
        startRoute.setType(SourceStaNoType);
        startRoute.setCode(task.getSourceStaNo());
        startRoute.setCode(SourceStaNo);
        startRoute.setOperation("COLLECT");
        targetRouteList.add(startRoute);
        RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
        endRoute.setSeq(1);
        endRoute.setType(TargetStaNoType);
        endRoute.setCode(task.getStaNo());
        endRoute.setCode(StaNo);
        endRoute.setOperation("DELIVERY");
        targetRouteList.add(endRoute);
        rcsTaskSubmit.setTargetRoute(targetRouteList);
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -93,6 +93,7 @@
                        locMast.setLocSts("D");
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        locMast.setPic(wrkMast.getPic());
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("空板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -177,6 +178,7 @@
                        locMast.setBarcode(wrkMast.getBarcode());
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        locMast.setPic(wrkMast.getPic());
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("全板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -244,9 +246,9 @@
                    for (WrkDetl wrkDetl : wrkDetls53) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand()
                                , wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                                , null, wrkDetl.getStandby2(), wrkDetl.getStandby3(), wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(), wrkDetl.getStandby1(), wrkDetl.getStandby2(), wrkDetl.getStandby3()
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getBrand(),null, wrkDetl.getStandby2(), wrkDetl.getStandby3()
                                    , wrkDetl.getBoxType1(), wrkDetl.getBoxType2(), wrkDetl.getBoxType3())) {
//                                exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -285,6 +287,7 @@
                        locMast.setBarcode(wrkMast.getBarcode());
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        locMast.setPic(wrkMast.getPic());
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("拣料入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -354,6 +357,7 @@
                        locMast.setBarcode(wrkMast.getBarcode());
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        locMast.setPic(wrkMast.getPic());
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("并板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -391,6 +395,7 @@
                        locMast.setBarcode(wrkMast.getBarcode());
                        locMast.setIoTime(now);
                        locMast.setModiTime(now);
                        locMast.setPic(wrkMast.getPic());
                        if (!locMastService.updateById(locMast)) {
//                            exceptionHandle("盘点入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -413,8 +418,10 @@
                        }
                    }
                    // 修改源库位状态 ==> O
                    String picUrl = "";
                    LocMast sourceLoc = locMastService.selectById(wrkMast.getSourceLocNo());
                    if (null != sourceLoc) {
                        picUrl = sourceLoc.getPic();
                        sourceLoc.setBarcode("");
                        sourceLoc.setLocSts("O");
                        sourceLoc.setModiTime(now);
@@ -430,6 +437,7 @@
                    locMast.setBarcode(wrkMast.getBarcode());
                    locMast.setIoTime(now);
                    locMast.setModiTime(now);
                    locMast.setPic(picUrl);
                    if (!locMastService.updateById(locMast)) {
//                        exceptionHandle("库位移转 ===>> 修改目标库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -604,10 +612,12 @@
        //查询是否有关联的WrkMast任务
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", task.getWrkNo()));
        if (wrkMast != null) {
            if (wrkMast.getIoType()==110){
            if (wrkMast.getIoType()==110&& wrkMast.getWrkSts()>12){
                wrkMast.setWrkSts(32L);//32.等待组托
            }else if (wrkMast.getIoType()==101){
                wrkMast.setWrkSts(15L);//15.出库更新完成
            }else if (wrkMast.getIoType()==103 && wrkMast.getWrkSts()>12){
                wrkMast.setWrkSts(20L);//20.等待回库
            }
            wrkMast.setModiTime(new Date());
            wrkMastService.updateById(wrkMast);
src/main/java/com/zy/common/model/DetlDto.java
@@ -227,9 +227,9 @@
        if (Cools.isEmpty(matnr)) {
            return null;
        }
        for (DetlDto detlDto : detlDtos) {
        for (DetlDto detlDto : detlDtos) {//&& standby1.equals(detlDto.getStandby1())
            if (matnr.equals(detlDto.getMatnr()) && Cools.eq(batch, detlDto.getBatch())
                    && brand.equals(detlDto.getBrand()) && standby1.equals(detlDto.getStandby1())
                    && brand.equals(detlDto.getBrand())
                    && standby2.equals(detlDto.getStandby2()) && standby3.equals(detlDto.getStandby3())
                    && boxType1.equals(detlDto.getBoxType1()) && boxType2.equals(detlDto.getBoxType2())
                    && boxType3.equals(detlDto.getBoxType3())) {
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -1,6 +1,7 @@
package com.zy.common.model;
import com.alibaba.fastjson.JSON;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasDevp;
import lombok.Data;
@@ -25,15 +26,20 @@
    public LocTypeDto() {
    }
    public LocTypeDto(BasDevp basDevp) {
        if (basDevp.getLocType2() == null || basDevp.getLocType2() == 0) {
    public LocTypeDto(BasDevp basDevp,String barcode) {
        if (basDevp.getLocType1() == null || basDevp.getLocType1() == 0) {
            throw new CoolException("plc高低检测异常");
        }
        if (basDevp.getLocType2() == 1) {
        if (basDevp.getLocType1() == 1) {
            this.locType1 = 1; // 低库位
        } else {
            this.locType1 = 2; // 高库位
        }
        if (!Cools.isEmpty(barcode)&&barcode.substring(0,1).equals("4")){
            this.locType2 = 1;
        }else if (!Cools.isEmpty(barcode)&&barcode.substring(0,1).equals("5")){
            this.locType2 = 2;
        }
        log.info(JSON.toJSONString(this));
    }
src/main/java/com/zy/common/model/TaskDto.java
@@ -71,14 +71,14 @@
        // 汇总不考虑序列码
        List<DetlDto> detlDtos = new ArrayList<>();
        for (LocDto locDto : this.getLocDtos()) {
            DetlDto dto = new DetlDto(locDto.getMatnr(), locDto.getBatch(),locDto.getBrand(),locDto.getStandby1(),locDto.getStandby2(),locDto.getStandby3(),locDto.getBoxType1(),locDto.getBoxType2(),locDto.getBoxType3(), locDto.getAnfme());
            DetlDto dto = new DetlDto(locDto.getMatnr(), locDto.getBatch(),locDto.getBrand(),null,locDto.getStandby2(),locDto.getStandby3(),locDto.getBoxType1(),locDto.getBoxType2(),locDto.getBoxType3(), locDto.getAnfme());
            if (DetlDto.has(detlDtos, dto)) {
                DetlDto detlDto = DetlDto.find(detlDtos, locDto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getStandby1(),dto.getStandby2(),dto.getStandby3(),dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
                DetlDto detlDto = DetlDto.find(detlDtos, locDto.getMatnr(), dto.getBatch(),dto.getBrand(),null,dto.getStandby2(),dto.getStandby3(),dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + locDto.getAnfme());
            } else {
                detlDtos.add(new DetlDto(locDto.getMatnr(), locDto.getBatch()
                        ,locDto.getBrand(),locDto.getStandby1(),locDto.getStandby2(),locDto.getStandby3(),locDto.getBoxType1(),locDto.getBoxType2(),locDto.getBoxType3()
                        ,locDto.getBrand(),null,locDto.getStandby2(),locDto.getStandby3(),locDto.getBoxType1(),locDto.getBoxType2(),locDto.getBoxType3()
                        , locDto.getAnfme()));
            }
        }
src/main/java/com/zy/common/properties/StationProperties.java
New file
@@ -0,0 +1,16 @@
package com.zy.common.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
@Data
@Configuration
@ConfigurationProperties(prefix = "hik")
public class StationProperties {
    // 双深库位排号
    private List<String> station = new ArrayList<>();
}
src/main/java/com/zy/common/web/WcsController.java
@@ -66,6 +66,9 @@
        if (Cools.isEmpty(param.getSourceStaNo())) {
            return R.error("源站编号不能为空");
        }
        if (Cools.isEmpty(param.getSourceStaNo())||param.getBarcode().length()==8) {
            return R.error("托盘不能为空或者托盘码不为八位");
        }
        List<WaitPakin> waitPakins = null;
        if (param.getIoType() == 1) {
            if (Cools.isEmpty(param.getBarcode())) {
@@ -89,10 +92,17 @@
            return R.error("高低检测信号不能为空");
        }
        //入库时对空板出库任务进行完成
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("barcode", param.getBarcode()).eq("wrk_sts",110));
        if (!Cools.isEmpty(wrkMast)) {
            wrkMast.setWrkSts(15L);//空板出库任务转历史档
            wrkMastService.updateById(wrkMast);
        }
        // 源站点状态检测
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
//        sourceStaNo.setLocType2(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto();
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo,param.getBarcode());
        StartupDto dto = null;
        switch (param.getIoType()) {
@@ -156,7 +166,7 @@
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(12);
        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}});
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,50);
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,50,"");
        return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
    }
@@ -250,7 +260,7 @@
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo( 10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto =commonService.getLocNoNew(10,devpNo,locTypeDto);
        int workNo = dto.getWorkNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -311,23 +321,31 @@
        if (!tasks.isEmpty()){
            return R.error("有对堆垛机接驳站点的AGV搬运任务,暂时无法生成AGV搬运任务");
        }
        String sourceStaNo = "Q-";
        if(wrkMast.getStaNo().equals("401")){
            sourceStaNo = sourceStaNo + "E3";
        }else if(wrkMast.getStaNo().equals("402")){
            sourceStaNo = sourceStaNo + "E2";
        }else if(wrkMast.getStaNo().equals("307")){
            sourceStaNo = sourceStaNo + "E1";
        }
        //生成AGV搬运空料架任务
        // 保存工作档
        Task task = new Task();
        Date date = new Date();
        String TaskNo = wrkMast.getWrkNo()+"-"+date.getTime();
        String TaskNo = wrkMast.getWrkNo()+"aa"+date.getTime();
        task.setWrkNo(wrkMast.getWrkNo())
                .setTaskNo(TaskNo)
                .setIoTime(date)
                .setWrkSts(301L) // 工作状态:301.任务下发
                .setIoType(5) // 入出库状态: 5.区域到站
                .setTaskType("agv")
                .setTaskType("AGV补空料架")
                .setIoPri(10D)
                .setFullPlt("N") // 满板:Y
                .setPicking("N") // 拣料
                .setExitMk("N")// 退出
                .setStaNo(wrkMast.getStaNo())
                .setSourceStaNo("E1")//空料架缓存区E1
                .setSourceStaNo(sourceStaNo)//空料架缓存区
                .setEmptyMk("Y")// 空板
                .setBarcode("")// 托盘码
                .setLinkMis("N")
src/main/resources/application-dev.yml
@@ -79,6 +79,9 @@
  # 自动移库功能开关 穿梭
  autoLocMoveUnilateralBoolean: false
wcs:
  url: 127.0.0.1:9093/wcs
comb:
  limit: 5000
@@ -132,14 +135,15 @@
#mes对接
mes:
  url: http://172.26.160.5:80/dev-api/basicmodel/WmsFit/Api/
  url: http://192.9.100.173:8088/prod-api/basicmodel/WmsFit/Api/
  #默认接口操作人员id
  defaultUserId: 30
#海康对接
hik:
  switch: false
  url: http://172.26.11.98:80/
  switch: true
  url: http://172.26.11.98:80/rcs/rtas/
  station: 402,401,307,Z-LZL41,Z-LZL42
#华晓对接
hx:
src/main/resources/mapper/LocMastMapper.xml
@@ -36,6 +36,7 @@
        <result column="ctn_no" property="ctnNo" />
        <result column="frozen" property="frozen" />
        <result column="frozen_memo" property="frozenMemo" />
        <result column="pic" property="pic" />
    </resultMap>
    <select id="queryFreeLocMast" resultMap="BaseResultMap">
src/main/resources/mapper/ViewDigitalTwinMapper.xml
@@ -3,12 +3,19 @@
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.DigitalTwinMapper">
    <resultMap id="dtOrderMap" type="com.zy.asrs.entity.digitaltwin.DtOrderVo">
        <constructor>
            <arg column="orderDate" javaType="java.util.Date"/>
            <arg column="orderNum" javaType="java.lang.Integer"/>
        </constructor>
    </resultMap>
    <!--总览:总库位、已用库位、今日库存、今日出库、今日入库-->
    <select id="overview" resultType="Double">
        SELECT COUNT(*) FROM asr_loc_mast WHERE loc_sts != 'Z'
            <if test="areaId != null">
                and area_id = #{areaId}
            </if>
        <if test="areaId != null">
            and area_id = #{areaId}
        </if>
        UNION ALL
        SELECT COUNT(*) FROM asr_loc_mast WHERE loc_sts = 'F' or loc_sts = 'P' or loc_sts = 'Q' or loc_sts = 'R' or loc_sts = 'S' or loc_sts = 'X'
        <if test="areaId != null">
@@ -32,10 +39,26 @@
    </select>
    <select id="recentOrder" resultType="com.zy.asrs.entity.digitaltwin.DtOrderVo">
        SELECT CONVERT(VARCHAR, order_time, 23) as orderDate, COUNT(*) AS orderNum
        FROM man_order
        WHERE order_time BETWEEN #{startTime} AND #{endTime}
        GROUP BY CONVERT(VARCHAR, order_time, 23)
        SELECT
            FORMAT(orderDate, 'yyyyMMdd') as orderDate,
            COUNT(*) as orderNum
        FROM (
                 SELECT
                     CAST(order_time AS DATE) as orderDate
                 FROM man_order_pakin
                 WHERE order_time BETWEEN #{startTime} AND #{endTime}
                 UNION ALL
                 SELECT
                     CAST(order_time AS DATE) as orderDate
                 FROM man_order_pakout
                 WHERE order_time BETWEEN #{startTime} AND #{endTime}
             ) combined
        GROUP BY orderDate
        ORDER BY orderDate
    </select>
    <select id="recentInBound" resultType="com.zy.asrs.entity.digitaltwin.DtInAndOutBoundVo">
@@ -62,17 +85,17 @@
        select
        *
        from (
            select
                ROW_NUMBER() OVER(Order by t.io_time desc) as row , *
            from (
                SELECT area_id AS belongAreaId, area_name AS belongAreaName, matnr AS matId, maktx AS matName,
                       loc_no AS lokId, '' AS lokName,
                       DATEDIFF(MINUTE, appe_time, GETDATE()) AS detainTime, appe_time AS inBoundTime
                    FROM asr_loc_detl WHERE appe_time &lt; #{startTime}
                <if test="areaId != null">
                    and area_id = #{areaId}
                </if>
                ) t
        select
        ROW_NUMBER() OVER(Order by t.io_time desc) as row , *
        from (
        SELECT area_id AS belongAreaId, area_name AS belongAreaName, matnr AS matId, maktx AS matName,
        loc_no AS lokId, '' AS lokName,
        DATEDIFF(MINUTE, appe_time, GETDATE()) AS detainTime, appe_time AS inBoundTime
        FROM asr_loc_detl WHERE appe_time &lt; #{startTime}
        <if test="areaId != null">
            and area_id = #{areaId}
        </if>
        ) t
        ) a where 1=1 and a.row between ((#{pageIndex}-1)*#{pageSize}+1) and (#{pageIndex}*#{pageSize})
    </select>
src/main/resources/mapper/WrkMastLogMapper.xml
@@ -61,6 +61,7 @@
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
        <result column="take_none" property="takeNone" />
        <result column="pic" property="pic" />
    </resultMap>
    <sql id="queryWhere">
        <where>
src/main/resources/mapper/WrkMastMapper.xml
@@ -60,10 +60,11 @@
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
        <result column="take_none" property="takeNone" />
        <result column="pic" property="pic" />
    </resultMap>
    <select id="selectToBeCompleteData" resultMap="BaseResultMap">
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 )  and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
    </select>
    <select id="selectToBeHistoryData" resultMap="BaseResultMap">
src/main/webapp/static/js/stoMan/stoQue.js
@@ -56,7 +56,7 @@
            ,{field: 'locType3$', align: 'center',title: '轻重类型', hide:true}
            ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true}
            ,{field: 'modiTime$', align: 'center',title: '修改时间', width: 180, hide:false}
            ,{ fixed: 'right', title:'操作', align: 'center', toolbar: '#operate'}
            ,{ fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 180}
        ]],
        request: {
            pageName: 'curr',
@@ -181,6 +181,46 @@
                }
                locDetlToLayer(data.locNo);
                break;
            case 'showPic':
                let imgHtml = '<div style="height:100%;display: flex;justify-content: space-around;align-items: center;flex-wrap: wrap;">';
                $.ajax({
                    url: baseUrl+"/locMast/picUrl",
                    headers: {'token': localStorage.getItem('token')},
                    data: {
                        locNo: data.locNo
                    },
                    method: 'GET',
                    traditional:true,
                    success: function (res) {
                        if (res.code === 200){
                            res.data.forEach((item) => {
                                let locNo = item.locNo;
                                let pics = item.pics;
                                pics.forEach((pic) => {
                                    let tmp = '<div><div><img width="600" src="' + pic + '" /></div><div>' + locNo + '</div></div>';
                                    imgHtml += tmp;
                                })
                            })
                            imgHtml += "</div>";
                            layer.open({
                                type: 1,
                                title: '查看图片',
                                area: [top.detailWidth, top.detailHeight],
                                shadeClose: true,
                                content: imgHtml,
                                success: function(layero, index){
                                }
                            });
                        } else if (res.code === 403){
                            top.location.href = baseUrl+"/";
                        } else {
                            layer.msg(res.msg)
                        }
                    }
                });
                break;
        }
    });
src/main/webapp/views/stoMan/stoQue.html
@@ -105,6 +105,7 @@
<script type="text/html" id="operate">
    <a class="layui-btn layui-btn-xs loc-detl" lay-event="locDetl">查看明细</a>
    <a class="layui-btn layui-btn-xs loc-detl" lay-event="showPic">查看图片</a>
</script>
<!--明细表-->