diff --git a/ruoyi-admin/src/main/java/com/ruoyi/api/labour/controller/AiBoxApiController.java b/ruoyi-admin/src/main/java/com/ruoyi/api/labour/controller/AiBoxApiController.java index a3a4ab20..28973593 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/api/labour/controller/AiBoxApiController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/api/labour/controller/AiBoxApiController.java @@ -1,5 +1,7 @@ package com.ruoyi.api.labour.controller; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.api.base.PubTokenReqVo; import com.ruoyi.api.labour.domain.AiBoxApiReqVo; import com.ruoyi.common.annotation.Anonymous; @@ -16,6 +18,7 @@ import com.ruoyi.common.enums.*; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.sign.Md5Utils; import com.ruoyi.framework.web.service.SysLoginService; import com.ruoyi.system.domain.SysApplyConfig; import com.ruoyi.system.service.ISysUserService; @@ -170,4 +173,27 @@ public class AiBoxApiController extends BaseController { } return getDataTable(list); } + + private static final String baseUrl = "http://localhost:8090/jhapi"; + + public static void main(String[] args) { + String appId = "jhcf17140956314490N6VSHsPjx008"; + String AppSecret = "xx+UsVJ9cIJ8PTWpWU5GcNx+x+chJBQIDAQAB"; + Long time = System.currentTimeMillis(); + String sign = Md5Utils.hash(appId+AppSecret+time); + System.out.println(time); + System.out.println(sign); + String url = baseUrl + "/api/aiboxs/v1/getToken"; + Map body = new HashMap<>(); + body.put("appId",appId); + body.put("sign",sign); + body.put("timestamp",time); + String result = HttpUtil.post(url, body); + JSONObject jsonObject = JSONObject.parseObject(result); + if(jsonObject.getInteger("code")==200){ + // 获取到存入redis,设置30分钟有效期 + String token = jsonObject.getString("Authorization"); + + } + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java index 4300a612..d5db54ed 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java @@ -52,6 +52,11 @@ public class CacheConstants */ public static final String YANZHU_DEVICE_TOWER = "device.tower_cfg:"; + /** + * yanzhu设备塔吊检测 redis key + */ + public static final String YANZHU_DEVICE_AI = "device.aibox_cfg:"; + /** * 微信公众号模板消息 redis key */ diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/publics/AIBoxController.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/publics/AIBoxController.java index a0d0880a..c0fcf551 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/publics/AIBoxController.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/publics/AIBoxController.java @@ -6,6 +6,7 @@ import com.ruoyi.common.annotation.RateLimiter; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.enums.LimitType; import com.yanzhu.jh.video.domain.DevAiProjectDataVO; +import com.yanzhu.jh.video.domain.DevBwAiProjectDataVo; import com.yanzhu.jh.video.service.IDevAiProjectDataService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,11 +35,11 @@ public class AIBoxController extends BaseController { private static final Logger logger = LoggerFactory.getLogger("AIBoxController"); /** - * aibox推送预警数据 + * aibox推送预警数据【博观】 */ @PostMapping("/v1/push") @RateLimiter(count = 10, limitType = LimitType.IP) - public void push(@RequestBody Map dataMap) + public void boGuanPush(@RequestBody Map dataMap) { try{ List> list = (List>)dataMap.get("BehaviorResults"); @@ -46,10 +47,24 @@ public class AIBoxController extends BaseController { devAiProjectDataService.insertHttpDevAiProjectData(devAiProjectDataVO); }catch (Exception e){ logger.info("AiBox解析参数失败!!!"); - logger.info(dataMap.toString()); e.printStackTrace(); } } + /** + * aibox推送预警数据【博瓦】 + */ + @PostMapping("/v2/push") + public void boWaPush(@RequestBody DevBwAiProjectDataVo data) + { + try{ + logger.info("BOWAN...{}"); + devAiProjectDataService.insertHttpBwDevAiProjectData(data); + }catch (Exception e){ + logger.info("BW...AiBox解析参数失败!!!"); + e.printStackTrace(); + } + } + } diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/DevBwAiProjectDataVo.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/DevBwAiProjectDataVo.java new file mode 100644 index 00000000..a138f03b --- /dev/null +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/domain/DevBwAiProjectDataVo.java @@ -0,0 +1,23 @@ +package com.yanzhu.jh.video.domain; + +import lombok.Data; + +import java.util.Map; + +/** + * 博瓦盒子数据集 + */ +@Data +public class DevBwAiProjectDataVo { + + private String device_sn; + private String device_version; + private String date; + private Long timestamp; + private String label; + private String alias; + private String count; + private String img; + private Map extend; + +} diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectConfigService.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectConfigService.java index 08baa7aa..c65ed7fe 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectConfigService.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectConfigService.java @@ -11,6 +11,12 @@ import com.yanzhu.jh.video.domain.DevAiProjectConfig; */ public interface IDevAiProjectConfigService { + + /** + * 加载注册设备 + */ + public void loadingDevAiConfigCache(); + /** * 查询设备配置 * diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectDataService.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectDataService.java index 49ae2e41..e1c8480a 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectDataService.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/IDevAiProjectDataService.java @@ -5,6 +5,7 @@ import java.util.Map; import com.yanzhu.jh.video.domain.DevAiProjectData; import com.yanzhu.jh.video.domain.DevAiProjectDataVO; +import com.yanzhu.jh.video.domain.DevBwAiProjectDataVo; /** * 设备数据Service接口 @@ -46,6 +47,14 @@ public interface IDevAiProjectDataService */ public void insertHttpDevAiProjectData(DevAiProjectDataVO devAiProjectDataVO); + /** + * 新增设备数据 + * + * @param devBwAiProjectDataVo 设备数据 + * @return 结果 + */ + public void insertHttpBwDevAiProjectData(DevBwAiProjectDataVo devBwAiProjectDataVo); + /** * 修改设备数据 * diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectConfigServiceImpl.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectConfigServiceImpl.java index 4ee35cd2..cb675d15 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectConfigServiceImpl.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectConfigServiceImpl.java @@ -3,8 +3,11 @@ package com.yanzhu.jh.video.service.impl; import java.util.Arrays; import java.util.List; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.enums.PublicStateEnum; import com.ruoyi.common.utils.DateUtils; +import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -15,6 +18,9 @@ import com.yanzhu.jh.video.mapper.DevAiProjectConfigMapper; import com.yanzhu.jh.video.domain.DevAiProjectConfig; import com.yanzhu.jh.video.service.IDevAiProjectConfigService; import com.ruoyi.common.utils.SecurityUtils; + +import javax.annotation.PostConstruct; + /** * 设备配置Service业务层处理 * @@ -24,9 +30,35 @@ import com.ruoyi.common.utils.SecurityUtils; @Service public class DevAiProjectConfigServiceImpl implements IDevAiProjectConfigService { + @Autowired + private RedisCache redisCache; + @Autowired private DevAiProjectConfigMapper devAiProjectConfigMapper; + /** + * 项目启动时,初始化注册应用到缓存 + */ + @PostConstruct + public void init() + { + loadingDevAiConfigCache(); + } + + /** + * 加载注册设备 + */ + @Override + public void loadingDevAiConfigCache() + { + List configList = devAiProjectConfigMapper.selectDevAiProjectConfigList(new DevAiProjectConfig()); + if(CollectionUtils.isNotEmpty(configList)){ + for (DevAiProjectConfig devConfig : configList) { + redisCache.setCacheObject(CacheConstants.YANZHU_DEVICE_AI + devConfig.getSerialNumber(), devConfig); + } + } + } + /** * 查询设备配置 * @@ -71,6 +103,9 @@ public class DevAiProjectConfigServiceImpl implements IDevAiProjectConfigService devAiProjectConfig.setCreateTime(DateUtils.getNowDate()); int rows = devAiProjectConfigMapper.insertDevAiProjectConfig(devAiProjectConfig); insertDevAiProjectConfigPassage(devAiProjectConfig); + if(rows>0){ + this.loadingDevAiConfigCache(); + } return rows; } @@ -88,7 +123,11 @@ public class DevAiProjectConfigServiceImpl implements IDevAiProjectConfigService devAiProjectConfig.setUpdateTime(DateUtils.getNowDate()); devAiProjectConfigMapper.deleteDevAiProjectConfigPassageByAiboxId(devAiProjectConfig.getId()); insertDevAiProjectConfigPassage(devAiProjectConfig); - return devAiProjectConfigMapper.updateDevAiProjectConfig(devAiProjectConfig); + int rows = devAiProjectConfigMapper.updateDevAiProjectConfig(devAiProjectConfig); + if(rows>0){ + this.loadingDevAiConfigCache(); + } + return rows; } /** @@ -102,7 +141,11 @@ public class DevAiProjectConfigServiceImpl implements IDevAiProjectConfigService public int deleteDevAiProjectConfigByIds(Long[] ids) { devAiProjectConfigMapper.deleteDevAiProjectConfigPassageByAiboxIds(ids); - return devAiProjectConfigMapper.deleteDevAiProjectConfigByIds(ids); + int rows = devAiProjectConfigMapper.deleteDevAiProjectConfigByIds(ids); + if(rows>0){ + this.loadingDevAiConfigCache(); + } + return rows; } /** @@ -116,7 +159,11 @@ public class DevAiProjectConfigServiceImpl implements IDevAiProjectConfigService public int deleteDevAiProjectConfigById(Long id) { devAiProjectConfigMapper.deleteDevAiProjectConfigPassageByAiboxId(id); - return devAiProjectConfigMapper.deleteDevAiProjectConfigById(id); + int rows = devAiProjectConfigMapper.deleteDevAiProjectConfigById(id); + if(rows>0){ + this.loadingDevAiConfigCache(); + } + return rows; } /** diff --git a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectDataServiceImpl.java b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectDataServiceImpl.java index 3dcff9af..45c9b2f6 100644 --- a/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectDataServiceImpl.java +++ b/yanzhu-jh/src/main/java/com/yanzhu/jh/video/service/impl/DevAiProjectDataServiceImpl.java @@ -3,14 +3,20 @@ package com.yanzhu.jh.video.service.impl; import java.util.Date; import java.util.List; import java.util.Map; +import java.util.Objects; import com.ruoyi.common.config.RuoYiConfig; +import com.ruoyi.common.constant.CacheConstants; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.core.text.Convert; import com.ruoyi.common.enums.PublicStateEnum; +import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.MultipartFileUtils; import com.yanzhu.jh.video.domain.DevAiProjectConfig; import com.yanzhu.jh.video.domain.DevAiProjectDataVO; +import com.yanzhu.jh.video.domain.DevBwAiProjectDataVo; import com.yanzhu.jh.video.mapper.DevAiProjectConfigMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,6 +38,9 @@ public class DevAiProjectDataServiceImpl implements IDevAiProjectDataService { private static final Logger logger = LoggerFactory.getLogger("DevAiProjectDataServiceImpl"); + @Autowired + private RedisCache redisCache; + @Autowired private DevAiProjectDataMapper devAiProjectDataMapper; @@ -84,6 +93,11 @@ public class DevAiProjectDataServiceImpl implements IDevAiProjectDataService @Override public void insertHttpDevAiProjectData(DevAiProjectDataVO devAiProjectDataVO) { + //根据设备配置查询设备绑定的项目和单位信息 + DevAiProjectConfig config = redisCache.getCacheObject(CacheConstants.YANZHU_DEVICE_AI+devAiProjectDataVO.getSerialNumber()); + if(Objects.isNull(config)){ + throw new ServiceException("设备信息未注册..."); + } logger.info("AiBox消息解析成功!!开始转换实体!!!"); DevAiProjectData devAiProjectData = new DevAiProjectData(); devAiProjectData.setDeviceId(devAiProjectDataVO.getDeviceId()); @@ -150,18 +164,101 @@ public class DevAiProjectDataServiceImpl implements IDevAiProjectDataService } devAiProjectData.setCreateTime(DateUtils.getNowDate()); devAiProjectData.setIsDel(PublicStateEnum.OK.getCode()); - //根据设备配置查询设备绑定的项目和单位信息 - DevAiProjectConfig devAiProjectConfig = new DevAiProjectConfig(); - devAiProjectConfig.setSerialNumber(devAiProjectData.getSerialNumber()); - List devAiProjectConfigList = devAiProjectConfigMapper.selectDevAiProjectConfigList(devAiProjectConfig); - if(devAiProjectConfigList!=null && devAiProjectConfigList.size()>0){ - devAiProjectData.setProjectId(devAiProjectConfigList.get(0).getProjectId()); - devAiProjectData.setDeptId(devAiProjectConfigList.get(0).getDeptId()); - } + devAiProjectData.setProjectId(config.getProjectId()); + devAiProjectData.setDeptId(config.getDeptId()); logger.info("新增AI设备数据成功"); devAiProjectDataMapper.insertDevAiProjectData(devAiProjectData); } + /** + * 新增设备数据 + * + * @param devBwAiProjectDataVo 设备数据 + * @return 结果 + */ + @Override + public void insertHttpBwDevAiProjectData(DevBwAiProjectDataVo devBwAiProjectDataVo){ + //根据设备配置查询设备绑定的项目和单位信息 + DevAiProjectConfig config = redisCache.getCacheObject(CacheConstants.YANZHU_DEVICE_AI+devBwAiProjectDataVo.getDevice_sn()); + if(Objects.isNull(config)){ + throw new ServiceException("设备信息未注册..."); + } + Map extendMap = devBwAiProjectDataVo.getExtend(); + logger.info("AiBox消息解析成功!!开始转换实体!!!"); + DevAiProjectData devAiProjectData = new DevAiProjectData(); + devAiProjectData.setDeviceName(config.getDeviceName()); + /** 设备的序列号 */ + devAiProjectData.setSerialNumber(devBwAiProjectDataVo.getDevice_sn()); + /** 相机的序列号 */ + devAiProjectData.setIpcSerialNum(devBwAiProjectDataVo.getDevice_sn()); + if(Objects.nonNull(extendMap)){ + devAiProjectData.setChannelId(Convert.toLong(extendMap.get("ch"))); + devAiProjectData.setChannelName(Convert.toStr(extendMap.get("source_name"))); + } + /** 报警类型 */ + String type = this.switchAlarmType(devBwAiProjectDataVo.getLabel()); + if(!type.equals("-1")){ + devAiProjectData.setAlarmType(Convert.toLong(type)); + /** 采集时间 */ + devAiProjectData.setTimestamp(new Date(devBwAiProjectDataVo.getTimestamp())); + logger.info("实体转换成功!!Base64开始转换图片!!!"); + String objImg64 = devBwAiProjectDataVo.getImg(); + try { + MultipartFile file = MultipartFileUtils.base64ToMultipartFile("data:image/png;base64,"+objImg64); + // 上传文件路径 + String filePath = RuoYiConfig.getUploadPath(); + // 上传并返回新文件名称 + String profileFile = FileUploadUtils.upload(filePath, file); + devAiProjectData.setImageUrl(profileFile); + logger.info("Base64上传图片成功!!!"); + } catch (Exception e) { + e.printStackTrace(); + } + devAiProjectData.setCreateTime(DateUtils.getNowDate()); + devAiProjectData.setIsDel(PublicStateEnum.OK.getCode()); + devAiProjectData.setProjectId(config.getProjectId()); + devAiProjectData.setDeptId(config.getDeptId()); + logger.info("新增AI设备数据成功"); + devAiProjectDataMapper.insertDevAiProjectData(devAiProjectData); + } + } + + /** + * 转换博瓦预警类型 + * @return + */ + private String switchAlarmType(String aliasLabel){ + String alarmType; + switch (aliasLabel){ + case "nohelmet" : alarmType="4";break; + case "head" : alarmType="4";break; + case "helmet" : alarmType="4";break; + case "fire" : alarmType="8";break; + case "vest" : alarmType="65";break; + case "smoke" : alarmType="7";break; + case "smoking" : alarmType="8";break; + case "calling" : alarmType="6";break; + case "face" : alarmType="face";break; + case "mask" : alarmType="mask";break; + case "garbage" : alarmType="garbage";break; + case "tricycle" : alarmType="tricycle";break; + case "person" : alarmType="person";break; + case "clothes" : alarmType="65";break; + case "down" : alarmType="62";break; + case "phone" : alarmType="6";break; + case "body" : alarmType="body";break; + case "ponding" : alarmType="ponding";break; + case "car" : alarmType="car";break; + case "bicycle" : alarmType="bicycle";break; + case "motorcycle" : alarmType="motorcycle";break; + case "bus" : alarmType="bus";break; + case "truck" : alarmType="truck";break; + case "van" : alarmType="van";break; + default : alarmType="0"; + } + return alarmType; + } + /** * 修改设备数据 *