#
Junjie
2025-07-06 0d04bc5d8080b82338302fba0a59fccff2eaedfc
zy-asrs-wcs/src/main/java/com/zy/asrs/wcs/core/service/impl/MainServiceImpl.java
@@ -15,10 +15,7 @@
import com.zy.asrs.wcs.core.entity.*;
import com.zy.asrs.wcs.core.kernel.AnalyzeService;
import com.zy.asrs.wcs.core.model.MapNode;
import com.zy.asrs.wcs.core.model.enums.DeviceCtgType;
import com.zy.asrs.wcs.core.model.enums.MotionStsType;
import com.zy.asrs.wcs.core.model.enums.TaskCtgType;
import com.zy.asrs.wcs.core.model.enums.TaskStsType;
import com.zy.asrs.wcs.core.model.enums.*;
import com.zy.asrs.wcs.core.service.*;
import com.zy.asrs.wcs.core.utils.RedisUtil;
import com.zy.asrs.wcs.core.utils.ShuttleDispatcher;
@@ -85,6 +82,8 @@
    private BasConveyorPathService basConveyorPathService;
    @Autowired
    private BasLedService basLedService;
    @Autowired
    private DeviceBarcodeService deviceBarcodeService;
    /**
     * 组托
@@ -421,6 +420,48 @@
    // 解析入库工作档
    public synchronized void analyzeInBoundTask() {
        for (Task task : taskService.selectWaitAnalyzeInBoundTask()) {
            BasConveyorSta basConveyorSta = basConveyorStaService.getOne(new LambdaQueryWrapper<BasConveyorSta>().eq(BasConveyorSta::getSiteNo, task.getDestSite()));
            if (basConveyorSta == null) {
                log.error("解析入库任务退出,输送");
                continue;
            }
            BasConveyor basConveyor = basConveyorService.getById(basConveyorSta.getConveyorId());
            if (basConveyor == null) {
                log.error("解析入库任务退出,输送2");
                continue;
            }
            DeviceBarcode deviceBarcode = deviceBarcodeService.getById(basConveyorSta.getBarcodeId());
            if (deviceBarcode == null) {
                log.error("解析入库任务退出,条码");
                continue;
            }
            BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, Integer.parseInt(deviceBarcode.getDeviceId()));
            if (barcodeThread == null) {
                log.error("解析入库任务退出,条码线程");
                continue;
            }
            if (!barcodeThread.getBarcode().equals(task.getZpallet())) {
                log.error("解析入库任务退出,条码不符合,任务条码:"+task.getZpallet()+",线程条码:"+barcodeThread.getBarcode());
                continue;
            }
            DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Conveyor, basConveyor.getDeviceId().intValue());
            if (devpThread == null) {
                log.error("解析入库任务退出,输送线程");
                continue;
            }
            StaProtocol staProtocol = devpThread.getStation().get(basConveyorSta.getSiteNo());
            if (staProtocol == null) {
                log.error("解析入库任务退出,输送站点");
                continue;
            }
            if (!(staProtocol.isAutoing()
                    && staProtocol.isLoading()
                    && staProtocol.isInEnable())) {
                log.error("解析入库任务退出,输送信号不符合:"+staProtocol.isAutoing()+","+staProtocol.isLoading()+","+staProtocol.isInEnable());
                continue;
            }
            if (Cools.isEmpty(task.getShuttleNo())) {
                //分配小车
                //搜索空闲车
@@ -439,8 +480,16 @@
            }
            // generate motion list
            List<Motion> motionList = analyzeService.generateMotion(task);
            List<Motion> motionList = null;
            try {
                motionList = analyzeService.generateMotion(task);
            }catch (Exception e) {
                log.error("motion解析出错:"+e.getMessage());
                continue;
            }
            if (motionList.isEmpty()) {
                log.error("motion为空退出");
                continue;
            }
            motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
@@ -450,6 +499,38 @@
            task.setUpdateTime(new Date());
            if (!taskService.updateById(task)) {
                News.error("更新工作档失败!!! [工作号:{}]", task.getTaskNo());
            }else {
                try {
                    if ("0601".equals(task.getMemo().substring(0, 4))) {
                        String response = "";
                        Map<String, Object> headers = new HashMap<>();
                        headers.put("Content-Type", "application/json;charset=UTF-8");
                        headers.put("X-lr-request-id", task.getWmsTaskNo());
                        headers.put("X-lr-version", 4.1);
                        headers.put("X-lr-trace-id", "{{$guid}}");
                        Map<String, Object> map = new HashMap<>();
                        map.put("carrierCode", task.getZpallet());
                        map.put("siteCode", "06YZ0001");
                        map.put("extra", null);
                        try {
                            response = new HttpHandler.Builder()
                                    .setHeaders(headers)
                                    .setUri("172.18.16.248:443")
                                    .setHttps(true)
                                    .setPath("/rcs/rtas/api/robot/controller/carrier/unbind")
                                    .setJson(JSONObject.toJSONString(map))
                                    .build()
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            log.info("agv解绑箱号,请求体:" + JSONObject.toJSONString(map) + ",返回:" + response);
                        } catch (Exception e) {
                            log.info("agv解绑箱号请求报错" + e.getMessage());
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
@@ -464,6 +545,11 @@
        }
        for (Task task : tasks) {
            List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().in(Task::getTaskSts, TaskStsType.ANALYZE_OUTBOUND.sts, TaskStsType.EXECUTE_OUTBOUND.sts));
            if (!list.isEmpty()) {
                continue;//存在正在解析,正在执行任务
            }
            BasConveyorSta originStaObj = basConveyorStaService.selectBySiteNo(task.getOriginSite());//获取源站
            if (originStaObj == null) {
                continue;
@@ -570,18 +656,46 @@
        }
    }
    // 解析小车载货移动工作档
    public synchronized void analyzeLadenMoveTask() {
        for (Task task : taskService.selectWaitAnalyzeLadenMoveTask()) {
            if (Cools.isEmpty(task.getShuttleNo())) {
                //分配小车
                //搜索空闲车
                ShuttleThread shuttleThread = shuttleDispatcher.searchIdleShuttle(task);
                if (shuttleThread == null) {
                    News.info("{}任务未找到空闲穿梭车", task.getTaskNo());
                    continue;
                }
                task.setShuttleNo(Integer.valueOf(shuttleThread.getDevice().getDeviceNo()));//保存穿梭车号
                task.setUpdateTime(new Date());
                if (!taskService.updateById(task)) {
                    News.info("{}任务更新穿梭车号失败", task.getTaskNo());
                }
                continue;
            }
            // generate motion list
            List<Motion> motionList = analyzeService.generateShuttleLadenMoveMotion(task);
            if (motionList.isEmpty()) {
                continue;
            }
            motionService.batchInsert(motionList, task.getUuid(), Integer.valueOf(task.getTaskNo()), task.getHostId());
            // 更新工作主档
            task.setTaskSts(TaskStsType.ANALYZE_LADEN_MOVE.sts); // 工作状态
            task.setUpdateTime(new Date());
            if (!taskService.updateById(task)) {
                News.error("更新工作档失败!!! [工作号:{}]", task.getTaskNo());
            }
        }
    }
    /**
     * 四向穿梭车电量检测 ===>> 发起充电
     */
    public synchronized void loopShuttleCharge() {
        // 获取充电桩库位类型
        LocCtg locCtg = locCtgService.getOne(new LambdaQueryWrapper<LocCtg>()
                .eq(LocCtg::getFlag, "CHARGE")
                .eq(LocCtg::getStatus, 1));
        if (locCtg == null) {
            return;
        }
        //获取充电任务类型
        TaskCtg taskCtg = taskCtgService.getOne(new LambdaQueryWrapper<TaskCtg>()
                .eq(TaskCtg::getFlag, String.valueOf(TaskCtgType.CHARGE))
@@ -613,12 +727,26 @@
                continue;
            }
            List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>()
                    .in(Task::getTaskSts
                            , TaskStsType.NEW_INBOUND.sts
                            , TaskStsType.ANALYZE_INBOUND.sts
                            , TaskStsType.EXECUTE_INBOUND.sts
                            , TaskStsType.NEW_OUTBOUND.sts
                            , TaskStsType.ANALYZE_OUTBOUND.sts
                            , TaskStsType.EXECUTE_OUTBOUND.sts)
            );
            if (!taskList.isEmpty()) {
                News.info("{}号小车,系统存在正在执行任务,暂停充电任务", shuttleProtocol.getShuttleNo());
                continue;//正在执行任务,不执行充电
            }
            String currentLocNo = shuttleProtocol.getCurrentLocNo();
            int lev = Utils.getLev(currentLocNo);//获取小车楼层
            //搜索小车当前楼层充电桩
            ArrayList<Loc> allChargeLoc = new ArrayList<>();
            List<Loc> list1 = locService.list(new LambdaQueryWrapper<Loc>()
                    .eq(Loc::getLocCtg, locCtg.getId())
                    .eq(Loc::getLocSts, LocStsType.C.val())
                    .eq(Loc::getStatus, 1)
                    .eq(Loc::getLev, lev));
            if (!list1.isEmpty()) {
@@ -627,7 +755,7 @@
            //搜索其他楼层充电桩
            List<Loc> list2 = locService.list(new LambdaQueryWrapper<Loc>()
                    .eq(Loc::getLocCtg, locCtg.getId())
                    .eq(Loc::getLocSts, LocStsType.C.val())
                    .eq(Loc::getStatus, 1)
                    .notIn(Loc::getLev, lev));
            if (!list2.isEmpty()) {