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>