自动化立体仓库 - WMS系统
zhangc
2025-01-03 1e1e9bb19e595f65e35de48d91ae436a89147ec9
添加AGV告警处理及回调接口
15个文件已添加
523 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvWarnController.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/AgvWarn.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/AgvWarnLog.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/AgvWarnBody.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/AgvWarnCallBackParam.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvWarnLogMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvWarnMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWarnLogService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWarnService.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWarnLogServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWarnServiceImpl.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AgvWarnScheduler.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWarnHandler.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/AgvWarnLogMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/AgvWarnMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWarnController.java
New file
@@ -0,0 +1,123 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.AppAuth;
import com.core.common.Cools;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.param.AgvWarnBody;
import com.zy.asrs.entity.param.AgvWarnCallBackParam;
import com.zy.asrs.service.AgvWarnService;
import com.zy.asrs.service.AgvWrkMastService;
import com.zy.asrs.service.ApiLogService;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
 * 上报事件类型(eventType):
 *  task:上报任务状态。
 *  task_allocated: 上报任务分配给机器人。
 *  tote_load:上报取箱状态。
 *  tote_unload:上报放箱状态。
 *  robot_reach:机器人到达工作站。
 *  weight:称重事件回调。
 *  rfid:RFID识别事件回调。
 *
 * 任务状态(status):
 *  success:成功。
 *  fail:失败。
 *  cancel:取消。
 *  suspend:挂起。
 */
@Slf4j
@RestController
public class AgvWarnController extends BaseController {
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private AgvWarnService agvWarnService;
    @Autowired
    private AgvWrkMastService agvWrkMastService;
    @PostMapping("/service/rest/agvCallbackService/warnCallback")
    @AppAuth(memo = "AGV告警回调")
    public Object taskEventStaus(@RequestBody AgvWarnCallBackParam param, HttpServletRequest request) {
        log.info("AGV告警回调:{}", JSON.toJSONString(param));
        List<AgvWarnBody> data = param.getData();
        AgvWarn agvWarn = null;
        List<AgvWarn> agvWarns = new ArrayList<>();
        List<AgvWarn> updates = new ArrayList<>();
        for (AgvWarnBody body : data) {
            List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().eq("robot_code", body.getRobotCode()).eq("begin_time", body.getBeginTime()));
            if (Cools.isEmpty(agvWarnList)) {
                agvWarn = new AgvWarn();
                agvWarn.setBeginTime(body.getBeginTime());
                agvWarn.setAppeTime(new Date());
                agvWarn.setTimes(0);
                agvWarn.setRobotCode(body.getRobotCode());
                agvWarn.setWarnContent(body.getWarnContent());
                if (body.getTaskCode() != null) {
                    AgvWrkMast agvWrkMast = agvWrkMastService.selectById(body.getTaskCode());
                    if (agvWrkMast != null) {
                        agvWarn.setLocNo(agvWrkMast.getLocNo());
                        agvWarn.setSourceLocNo(agvWrkMast.getSourceLocNo());
                    }
                }
                agvWarns.add(agvWarn);
            } else {
                agvWarn = agvWarnList.get(0);
                agvWarn.setWarnContent(agvWarn.getWarnContent().contains(body.getWarnContent()) ? body.getWarnContent() : agvWarn.getWarnContent() + "、" + body.getWarnContent());
                agvWarn.setModiTime(new Date());
                if (body.getTaskCode() != null) {
                    AgvWrkMast agvWrkMast = agvWrkMastService.selectById(body.getTaskCode());
                    if (agvWrkMast != null) {
                        agvWarn.setLocNo(agvWrkMast.getLocNo());
                        agvWarn.setSourceLocNo(agvWrkMast.getSourceLocNo());
                    }
                }
                updates.add(agvWarn);
            }
        }
        if (!Cools.isEmpty(agvWarns)) {
            agvWarnService.insertBatch(agvWarns);
        }
        if (!Cools.isEmpty(updates)) {
            agvWarnService.updateBatchById(updates);
        }
        Map<String, Object> result = new HashMap<>();
        logPost(param, JSONObject.toJSONString(result), true);
        result.put("code", 0);
        result.put("message", "成功");
        result.put("reqCode", param.getReqCode());
        return result;
    }
    private void logPost(AgvWarnCallBackParam param, String response, boolean success) {
        apiLogService.save(
                "ESS任务回调",
                "/phyzwms/agv/task/event/status",
                null,
                null,
                JSONObject.toJSONString(param),
                response,
                success
        );
    }
}
src/main/java/com/zy/asrs/entity/AgvWarn.java
New file
@@ -0,0 +1,50 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("agv_warn")
public class AgvWarn implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableField("id")
    @TableId
    private Long id;
    /**
     * 上报次数
     */
    @TableField("times")
    private Integer times;
    @TableField("robot_code")
    private String robotCode;
    @TableField("begin_time")
    private String beginTime;
    @TableField("warn_content")
    private String warnContent;
    @TableField("task_code")
    private String taskCode;
    @TableField("loc_no")
    private String locNo;
    @TableField("source_locNo")
    private String sourceLocNo;
    @TableField("appe_time")
    private Date appeTime;
    @TableField("modi_time")
    private Date modiTime;
}
src/main/java/com/zy/asrs/entity/AgvWarnLog.java
New file
@@ -0,0 +1,42 @@
package com.zy.asrs.entity;
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
@Data
@TableName("agv_warn_log")
public class AgvWarnLog implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableField("id")
    private Long id;
    @TableField("robot_code")
    private String robotCode;
    @TableField("begin_time")
    private String beginTime;
    @TableField("warnContent")
    private String warn_content;
    @TableField("task_code")
    private String taskCode;
    @TableField("loc_no")
    private String locNo;
    @TableField("source_locNo")
    private String sourceLocNo;
    @TableField("appe_time")
    private Date appeTime;
    @TableField("modi_time")
    private Date modiTime;
}
src/main/java/com/zy/asrs/entity/param/AgvWarnBody.java
New file
@@ -0,0 +1,19 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.io.Serializable;
@Data
public class AgvWarnBody implements Serializable {
    private static final long serialVersionUID = 1L;
    private String robotCode;
    private String beginTime;
    private String warnContent;
    private String taskCode;
}
src/main/java/com/zy/asrs/entity/param/AgvWarnCallBackParam.java
New file
@@ -0,0 +1,22 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class AgvWarnCallBackParam implements Serializable {
    private static final long serialVersionUID = 1L;
    private String reqCode;
    private String reqTime;
    private String clientCode;
    private String tokenCode;
    private List<AgvWarnBody> data;
}
src/main/java/com/zy/asrs/mapper/AgvWarnLogMapper.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.AgvWarnLog;
import com.zy.asrs.entity.AgvWrkDetlLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface AgvWarnLogMapper extends BaseMapper<AgvWarnLog>  {
}
src/main/java/com/zy/asrs/mapper/AgvWarnMapper.java
New file
@@ -0,0 +1,16 @@
package com.zy.asrs.mapper;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.entity.AgvWrkDetlLog;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface AgvWarnMapper extends BaseMapper<AgvWarn> {
}
src/main/java/com/zy/asrs/service/AgvWarnLogService.java
New file
@@ -0,0 +1,10 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.AgvWarnLog;
import com.zy.asrs.entity.ManLocDetl;
public interface AgvWarnLogService extends IService<AgvWarnLog> {
}
src/main/java/com/zy/asrs/service/AgvWarnService.java
New file
@@ -0,0 +1,9 @@
package com.zy.asrs.service;
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.AgvWarn;
public interface AgvWarnService extends IService<AgvWarn> {
}
src/main/java/com/zy/asrs/service/impl/AgvWarnLogServiceImpl.java
New file
@@ -0,0 +1,21 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.AgvWarnLog;
import com.zy.asrs.mapper.AgvWarnLogMapper;
import com.zy.asrs.service.AgvWarnLogService;
import com.zy.asrs.service.AgvWarnService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * Created by vincent on 2020/6/11
 */
@Slf4j
@Service
@Transactional
public class AgvWarnLogServiceImpl extends ServiceImpl<AgvWarnLogMapper, AgvWarnLog> implements AgvWarnLogService {
}
src/main/java/com/zy/asrs/service/impl/AgvWarnServiceImpl.java
New file
@@ -0,0 +1,21 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.mapper.AgvWarnMapper;
import com.zy.asrs.service.AgvWarnLogService;
import com.zy.asrs.service.AgvWarnService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * Created by vincent on 2020/6/11
 */
@Slf4j
@Service
@Transactional
public class AgvWarnServiceImpl extends ServiceImpl<AgvWarnMapper, AgvWarn> implements AgvWarnService {
}
src/main/java/com/zy/asrs/task/AgvWarnScheduler.java
New file
@@ -0,0 +1,124 @@
package com.zy.asrs.task;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.service.AgvWarnService;
import com.zy.asrs.task.handler.AgvWarnHandler;
import com.zy.common.utils.HttpHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
/**
 * Created by vincent on 2020/7/7
 */
@Component
public class AgvWarnScheduler {
    private static final Logger log = LoggerFactory.getLogger(AgvWarnScheduler.class);
    @Autowired
    private AgvWarnHandler agvWarnHandler;
    @Autowired
    private AgvWarnService agvWarnService;
    @Autowired
    private ConfigService configService;
    /**
     * 超过
     */
    @Scheduled(fixedDelay = 30000)
    private void del() {
        String format = DateUtil.format(DateUtil.offsetMinute(new Date(), -3), "yyyy-MM-dd HH:mm:ss");
        List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>().ge("modi_time", format));
        for (AgvWarn agvWarn : agvWarnList) {
            agvWarnHandler.start(agvWarn);
        }
    }
    @Scheduled(fixedDelay = 10000)
    private void report() {
        List<Config> config = configService.selectList(new EntityWrapper<Config>().eq("code", "AGV_WARN_REPORT_URL"));
        List<AgvWarn> agvWarnList = agvWarnService.selectList(new EntityWrapper<AgvWarn>());
        StringBuffer buffer;
        for (AgvWarn agvWarn : agvWarnList) {
            Integer warnTime = getWarnTime(agvWarn.getTimes());
            DateTime begin = DateUtil.parse(agvWarn.getBeginTime(), "yyyy-MM-dd HH:mm:ss");
            if (DateUtil.offsetMinute(begin, warnTime).after(new Date())) {
                buffer = new StringBuffer();
                buffer.append(agvWarn.getRobotCode() + "号AGV小车报警:");
                buffer.append(agvWarn.getWarnContent());
                HashMap<String, Object> param = new HashMap<>();
                HashMap<String, Object> data = new HashMap<>();
                data.put("content", buffer.toString());
                param.put("msgtype", "text");
                param.put("text", data);
                String response = null;
                try {
                    response = new HttpHandler.Builder()
                            .setUri(config.get(0).getValue())
                            .setJson(JSON.toJSONString(param))
                            .setHttps(true)
                            .build()
                            .doPost();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.get("errmsg").equals("ok")) {
                    return;//发送成功
                }
            }
        }
    }
    /**
     * 若未配置数据,则5分钟一次
     * @param times
     * @return
     */
    private Integer getWarnTime(Integer times) {
        try {
            List<Config> config = configService.selectList(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE1"));
            if (!Cools.isEmpty(config)) {
                String value = config.get(0).getValue();
                if (Cools.isEmpty(value)) {
                    return 5;
                } else {
                    String[] split = value.split(",");
                    if (split.length < times + 1) {
                        Config config2 = configService.selectOne(new EntityWrapper<Config>().eq("code", "AGV_WARN_RATE2"));
                        int t = 0;
                        for (String s : split) {
                            t = t + Integer.parseInt(s);
                        }
                        return t + Integer.parseInt(config2.getValue());
                    } else {
                        return Integer.parseInt(split[times]);
                    }
                }
            }
            return 5;
        } catch (Exception e) {
            return 5;
        }
    }
}
src/main/java/com/zy/asrs/task/handler/AgvWarnHandler.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.task.handler;
import cn.hutool.core.bean.BeanUtil;
import com.zy.asrs.entity.AgvWarn;
import com.zy.asrs.entity.AgvWarnLog;
import com.zy.asrs.mapper.AgvWarnLogMapper;
import com.zy.asrs.mapper.AgvWarnMapper;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
 * Created by vincent on 2020/7/7
 */
@Service
public class AgvWarnHandler extends AbstractHandler<String> {
    @Autowired
    private AgvWarnMapper agvWarnMapper;
    @Autowired
    private AgvWarnLogMapper agvWarnLogMapper;
    @Transactional
    public ReturnT<String> start(AgvWarn agvWarn) {
        AgvWarnLog agvWarnLog = new AgvWarnLog();
        BeanUtil.copyProperties(agvWarn, agvWarnLog);
        agvWarnLog.setId(null);
        agvWarnMapper.deleteById(agvWarn.getId());
        agvWarnLogMapper.insert(agvWarnLog);
        return SUCCESS;
    }
}
src/main/resources/mapper/AgvWarnLogMapper.xml
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.AgvWarnLogMapper">
</mapper>
src/main/resources/mapper/AgvWarnMapper.xml
New file
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zy.asrs.mapper.AgvWarnMapper">
</mapper>