#
Junjie
2025-05-10 2a7fd275313003968fc186ee4617aec4eca90266
#
9个文件已修改
3个文件已添加
414 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/GenerateAgvTaskParam.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/TaskCreateParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvTaskLogScheduler.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AssignAgvTaskScheduler.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -7,6 +7,7 @@
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.*;
@@ -53,14 +54,33 @@
        add("ea1f0459efc02a79f046f982767939ae");
    }};
    //agv上报
    //AGV上报
    @PostMapping("/agvReport")
    public R agvReport(@RequestBody HashMap<String, Object> param) {
        String taskCode = param.get("taskCode").toString();
        System.out.println(JSON.toJSONString(param));
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskCode);
        if(taskWrk == null) {
            return R.error("任务不存在");
        }
        taskWrk.setStatus(TaskStatusType.COMPLETE.id);
        taskWrk.setModiTime(new Date());
        taskWrkService.updateById(taskWrk);
        return R.ok();
    }
    //生成AGV任务
    @PostMapping("/generateAgvTask")
    public R generateAgvTask(@RequestBody GenerateAgvTaskParam param) {
        boolean generated = openService.generateAgvTask(param);
        if(generated) {
            return R.ok();
        }
        return R.error();
    }
    //创建任务
    @PostMapping("/taskCreate")
    @Transactional
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
@@ -11,38 +11,13 @@
    PICK(1),
    PAKOUT(2),
    OTHER(3),
    AGV(4),
    ;
    public Integer type;
    WorkNoType(Integer type) {
        this.type = type;
    }
    public static Integer getWorkNoType(Integer ioType) {
        switch (ioType) {
            case 1:
                return PAKIN.type;
            case 10:
                return PAKIN.type;
            case 11:
                return PICK.type;
            case 53:
            case 54:
            case 57:
                return PICK.type;
            case 101:
                return PAKOUT.type;
            case 103:
            case 104:
            case 107:
                return PICK.type;
            case 110:
                return PAKOUT.type;
            default:
                break;
        }
        throw new CoolException(ioType + "的任务类型无法生成工作号");
    }
}
src/main/java/com/zy/asrs/entity/param/GenerateAgvTaskParam.java
New file
@@ -0,0 +1,14 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class GenerateAgvTaskParam {
    //取货点
    private String originPoint;
    //放货点
    private String targetPoint;
}
src/main/java/com/zy/asrs/entity/param/TaskCreateParam.java
@@ -1,6 +1,5 @@
package com.zy.asrs.entity.param;
import io.swagger.models.auth.In;
import lombok.Data;
@Data
src/main/java/com/zy/asrs/service/OpenService.java
@@ -1,5 +1,6 @@
package com.zy.asrs.service;
import com.zy.asrs.entity.param.GenerateAgvTaskParam;
import com.zy.asrs.entity.param.TaskCreateParam;
import java.util.HashMap;
@@ -9,4 +10,6 @@
    //创建任务
    HashMap<String,Object> taskCreate(TaskCreateParam param);
    boolean generateAgvTask(GenerateAgvTaskParam param);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -6,6 +6,7 @@
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.GenerateAgvTaskParam;
import com.zy.asrs.mapper.*;
import com.zy.asrs.service.*;
import com.zy.common.utils.HttpHandler;
@@ -57,11 +58,104 @@
    private CommandInfoService commandInfoService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private OpenService openService;
    @Value("${wcs.urlWcs}")
    private String wcsUrl;
    @Value("${wcs.inboundTaskApplyPathWcs}")
    private String wcsInboundTaskApplyPath;
    public synchronized void demo() {
        boolean demoEnable = false;
        Config demoEnableConfig = configService.selectByCode("demoEnable");
        if(demoEnableConfig != null) {
            demoEnable = Boolean.parseBoolean(demoEnableConfig.getValue());
        }
        if (!demoEnable) {
            return;
        }
        //演示模式-AGV出库
        demoAgvOut();
        //演示模式-AGV入库
        demoAgvIn();
        //演示模式-四向库出库
        demoShuttleOut();
        //演示模式-四向库入库
        demoShuttleIn();
    }
    //演示模式-AGV出库
    private synchronized void demoAgvOut() {
        LocMast locMast = locMastService.selectByLocNo("1100601");
        if(locMast == null) {
            return;
        }
        if (!locMast.getLocSts().equals("O")) {
            return;
        }
        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                .eq("mk", "agv")
                .eq("loc_sts", "F")
                .notIn("loc_no", "0900601")
        );
        if (locMasts.isEmpty()) {
            return;
        }
        LocMast originLocMast = locMasts.get(0);
        //生成AGV出库任务
        GenerateAgvTaskParam param = new GenerateAgvTaskParam();
        param.setOriginPoint(originLocMast.getLocNo());
        param.setTargetPoint(locMast.getLocNo());
        openService.generateAgvTask(param);
    }
    //演示模式-AGV入库
    private synchronized void demoAgvIn() {
        LocMast locMast = locMastService.selectByLocNo("0900601");
        if(locMast == null) {
            return;
        }
        if (!locMast.getLocSts().equals("F")) {
            return;
        }
        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                .eq("mk", "agv")
                .eq("loc_sts", "O")
                .notIn("loc_no", "1100601")
        );
        if (locMasts.isEmpty()) {
            return;
        }
        LocMast targetLocMast = locMasts.get(0);
        //生成AGV出库任务
        GenerateAgvTaskParam param = new GenerateAgvTaskParam();
        param.setOriginPoint(locMast.getLocNo());
        param.setTargetPoint(targetLocMast.getLocNo());
        openService.generateAgvTask(param);
    }
    //演示模式-四向库出库
    private synchronized void demoShuttleOut() {
    }
    //演示模式-四向库入库
    private synchronized void demoShuttleIn() {
    }
    /**
     * 堆垛机站出库到出库站
     */
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -2,9 +2,11 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.domain.enums.WorkNoType;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.GenerateAgvTaskParam;
import com.zy.asrs.entity.param.TaskCreateParam;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
@@ -91,4 +93,54 @@
        return map;
    }
    @Override
    public boolean generateAgvTask(GenerateAgvTaskParam param) {
        Date now = new Date();
        String originPoint = param.getOriginPoint();
        String targetPoint = param.getTargetPoint();
        LocMast startLocMast = locMastService.selectByLocNo(originPoint);
        if(startLocMast == null){
            throw new CoolException("取货点库位不存在");
        }
        if (!startLocMast.getLocSts().equals("F")) {
            throw new CoolException("取货点不处于在库");
        }
        LocMast targetLocMast = locMastService.selectByLocNo(targetPoint);
        if(targetLocMast == null){
            throw new CoolException("放货点库位不存在");
        }
        if (!targetLocMast.getLocSts().equals("O")) {
            throw new CoolException("放货点不处于空库");
        }
        TaskWrk taskWrk = new TaskWrk();
        int workNo1 = commonService.getWorkNo(WorkNoType.AGV.type);//获取AGV工作号
        taskWrk.setTaskNo(String.valueOf(workNo1));//任务号
        taskWrk.setWrkNo(workNo1);
        taskWrk.setStatus(TaskStatusType.RECEIVE.id);//任务状态:接收
        taskWrk.setCreateTime(now);
        taskWrk.setWrkSts(11);
        taskWrk.setIoType(4);//AGV搬运
        taskWrk.setStartPoint(param.getOriginPoint());//取货点
        taskWrk.setTargetPoint(param.getTargetPoint());//放货点
        boolean insert = taskWrkService.insert(taskWrk);
        if (!insert) {
            throw new CoolException("任务生成失败");
        }
        startLocMast.setLocSts("R");
        startLocMast.setModiTime(now);
        locMastService.updateById(startLocMast);
        targetLocMast.setLocSts("S");
        targetLocMast.setModiTime(now);
        locMastService.updateById(targetLocMast);
        return true;
    }
}
src/main/java/com/zy/asrs/task/AgvTaskLogScheduler.java
New file
@@ -0,0 +1,77 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.TaskWrk;
import com.zy.asrs.entity.TaskWrkLog;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.TaskWrkLogService;
import com.zy.asrs.service.TaskWrkService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Slf4j
@Component
public class AgvTaskLogScheduler {
    @Autowired
    private TaskWrkService taskWrkService;
    @Autowired
    private TaskWrkLogService taskWrkLogService;
    @Autowired
    private LocMastService locMastService;
    /**
     * AGV任务转历史
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() {
        List<TaskWrk> taskWrkList = taskWrkService.selectList(new EntityWrapper<TaskWrk>()
                .eq("status", TaskStatusType.COMPLETE.id));
        for (TaskWrk taskWrk : taskWrkList) {
            Date now = new Date();
            String originPoint = taskWrk.getStartPoint();
            String targetPoint = taskWrk.getTargetPoint();
            LocMast startLocMast = locMastService.selectByLocNo(originPoint);
            if(startLocMast == null){
                throw new CoolException("取货点库位不存在");
            }
            if (!startLocMast.getLocSts().equals("R")) {
                throw new CoolException("取货点不处于出库预约");
            }
            LocMast targetLocMast = locMastService.selectByLocNo(targetPoint);
            if(targetLocMast == null){
                throw new CoolException("放货点库位不存在");
            }
            if (!targetLocMast.getLocSts().equals("S")) {
                throw new CoolException("放货点不处于入库预约");
            }
            startLocMast.setLocSts("O");
            startLocMast.setModiTime(now);
            locMastService.updateById(startLocMast);
            targetLocMast.setLocSts("F");
            targetLocMast.setModiTime(now);
            locMastService.updateById(targetLocMast);
            TaskWrkLog taskWrkLog = new TaskWrkLog(taskWrk);
            if (!taskWrkLogService.insert(taskWrkLog)) {
                throw new CoolException("转历史档失败" + taskWrkLog);
            }
            if (!taskWrkService.deleteById(taskWrk)) {
                throw new CoolException("任务档删除失败" + taskWrkLog);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/AssignAgvTaskScheduler.java
New file
@@ -0,0 +1,115 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.TaskWrk;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.TaskWrkService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Component
public class AssignAgvTaskScheduler {
    @Autowired
    private TaskWrkService taskWrkService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private LocMastService locMastService;
    @Value("${agv.url}")
    private String agvUrl;
    @Value("${agv.applyTask}")
    private String agvApplyTask;
    /**
     * 自动派发AGV搬运任务
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() {
        List<TaskWrk> taskWrks = taskWrkService.selectList(new EntityWrapper<TaskWrk>()
                .eq("status", TaskStatusType.RECEIVE.id).eq("io_type", 4));
        for (TaskWrk taskWrk : taskWrks) {
            String startPoint = taskWrk.getStartPoint();
            String targetPoint = taskWrk.getTargetPoint();
            LocMast startLocMast = locMastService.selectByLocNo(startPoint);
            if(startLocMast == null){
                continue;
            }
            if (!startLocMast.getLocSts().equals("R")) {
                continue;
            }
            LocMast targetLocMast = locMastService.selectByLocNo(targetPoint);
            if(targetLocMast == null){
                continue;
            }
            if (!targetLocMast.getLocSts().equals("S")) {
                continue;
            }
            HashMap<String, Object> requestParam = new HashMap<>();
            requestParam.put("reqCode", taskWrk.getTaskNo());
            requestParam.put("taskCode", taskWrk.getTaskNo());
            requestParam.put("taskTyp", "YK");
            ArrayList<HashMap<String, Object>> positionCodePathList = new ArrayList<>();
            HashMap<String, Object> startPointParam = new HashMap<>();
            startPointParam.put("positionCode", taskWrk.getStartPoint());
            startPointParam.put("type", "00");
            HashMap<String, Object> targetPointParam = new HashMap<>();
            targetPointParam.put("positionCode", taskWrk.getTargetPoint());
            targetPointParam.put("type", "00");
            positionCodePathList.add(startPointParam);
            positionCodePathList.add(targetPointParam);
            requestParam.put("positionCodePath", positionCodePathList);
            String response = null;
            boolean requestStatus = false;
            try {
                log.info("WCS派发任务给AGV={}", taskWrk);
                response = new HttpHandler.Builder()
                        .setUri(agvUrl)
                        .setPath(agvApplyTask)
                        .setJson(JSON.toJSONString(requestParam))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.get("code").equals("0")) {
                    taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);
                    taskWrkService.updateById(taskWrk);
                    requestStatus = true;
                }
            } catch (Exception e) {
                log.error("WCS派发任务给AGV失败{},返回值={}", taskWrk, response);
            } finally {
                apiLogService.save("WCS派发任务给AGV"
                        , agvUrl + agvApplyTask
                        , null
                        , "127.0.0.1"
                        , JSON.toJSONString(requestParam)
                        , response
                        , requestStatus
                );
            }
        }
    }
}
src/main/java/com/zy/core/MainProcess.java
@@ -48,6 +48,9 @@
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn();
                    //演示模式
                    mainService.demo();
                    //自动派发任务
   //                 mainService.autoDistribute();
                    //自动完成任务
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -322,6 +322,7 @@
            //外形检测
            OperateResultExOne<byte[]> resultErr1 = siemensS7Net.Read("DB101.810.0", (short) (barcodeSize*1));
            if (resultErr1.IsSuccess) {
            StaProtocol staProtocol1 = station.get(116);
            boolean[] status1 = siemensS7Net.getByteTransform().TransBool(resultErr1.Content, 0, 1);
            staProtocol1.setFrontErr(status1[0]);
@@ -331,6 +332,7 @@
            staProtocol1.setRightErr(status1[4]);
            staProtocol1.setWeightErr(status1[5]);
            staProtocol1.setBarcodeErr(status1[6]);
            }
            OperateResultExOne<byte[]> resultErr = siemensS7Net.Read("DB101.922.0", (short) (staNoSize * 4));
            if (resultErr.IsSuccess) {
src/main/resources/application.yml
@@ -69,3 +69,7 @@
  outboundTaskRequest : openapi/createOutTask
  # 移库申请接口
  movePathWcs: openapi/createLocMoveTask
agv:
  url: 10.10.20.160:8181
  applyTask: /rcms/services/rest/hikRpcService/genAgvSchedulingTask