This commit is contained in:
1378012178@qq.com 2025-03-17 13:53:37 +08:00
commit 6a7762f2d0
44 changed files with 6277 additions and 0 deletions

View File

@ -650,6 +650,38 @@ public class DateUtils extends PropertyEditorSupport {
return 0;
}
public static String dateDiff(Long startMillis, Long endMillis) {
long millisDiff = endMillis - startMillis;
String secondStr = "00";
int second = (int) (millisDiff / SECOND_IN_MILLIS);
second = second % 60;
if(second>=10){
secondStr = ""+second;
}else{
secondStr = "0"+second;
}
String minuteStr = "00";
int minute = (int) (millisDiff / MINUTE_IN_MILLIS);
minute = minute % 60;
if(minute>=10){
minuteStr = ""+minute;
}else{
minuteStr = "0"+minute;
}
String hourStr = "00";
int hour = (int) (millisDiff / HOUR_IN_MILLIS);
hour = hour % 60;
if(hour>=10){
hourStr = ""+hour;
}else{
hourStr = "0"+hour;
}
return hourStr+":"+minuteStr+":"+secondStr;
}
public static Long getCurrentTimestamp() {
return Long.valueOf(DateUtils.yyyymmddhhmmss.get().format(new Date()));
}

View File

@ -30,6 +30,12 @@
<artifactId>weixin4j</artifactId>
</dependency>
<dependency>
<groupId>com.tplink.ignite.libs</groupId>
<artifactId>tums-auth</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,187 @@
package com.nu.modules.tplink.alarm.controller;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
import org.jeecg.common.system.query.QueryRuleEnum;
import org.jeecg.common.util.oConvertUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import com.nu.modules.tplink.alarm.entity.AlarmLog;
import com.nu.modules.tplink.alarm.service.IAlarmLogService;
import org.jeecgframework.poi.excel.ExcelImportUtil;
import org.jeecgframework.poi.excel.def.NormalExcelConstants;
import org.jeecgframework.poi.excel.entity.ExportParams;
import org.jeecgframework.poi.excel.entity.ImportParams;
import org.jeecgframework.poi.excel.view.JeecgEntityExcelView;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSON;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.apache.shiro.authz.annotation.RequiresPermissions;
/**
* @Description: 护理单元-物联管理-TPLINK告警日志信息
* @Author: jeecg-boot
* @Date: 2025-01-23
* @Version: V1.0
*/
@Api(tags="护理单元-物联管理-TPLINK告警日志信息")
@RestController
@RequestMapping("/iot/alarmLog")
@Slf4j
public class AlarmLogController extends JeecgController<AlarmLog, IAlarmLogService> {
@Autowired
private IAlarmLogService alarmLogService;
/**
* 分页列表查询
*
* @param alarmLog
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "护理单元-物联管理-TPLINK告警日志信息-分页列表查询")
@ApiOperation(value="护理单元-物联管理-TPLINK告警日志信息-分页列表查询", notes="护理单元-物联管理-TPLINK告警日志信息-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<AlarmLog>> queryPageList(AlarmLog alarmLog,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
// 自定义查询规则
Map<String, QueryRuleEnum> customeRuleMap = new HashMap<>();
// 自定义多选的查询规则为LIKE_WITH_OR
customeRuleMap.put("alarmDeviceType", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("alarmType", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("alarmLevel", QueryRuleEnum.LIKE_WITH_OR);
customeRuleMap.put("readMark", QueryRuleEnum.LIKE_WITH_OR);
QueryWrapper<AlarmLog> queryWrapper = QueryGenerator.initQueryWrapper(alarmLog, req.getParameterMap(),customeRuleMap);
Page<AlarmLog> page = new Page<AlarmLog>(pageNo, pageSize);
IPage<AlarmLog> pageList = alarmLogService.page(page, queryWrapper);
return Result.OK(pageList);
}
/**
* 添加
*
* @param alarmLog
* @return
*/
@AutoLog(value = "护理单元-物联管理-TPLINK告警日志信息-添加")
@ApiOperation(value="护理单元-物联管理-TPLINK告警日志信息-添加", notes="护理单元-物联管理-TPLINK告警日志信息-添加")
@RequiresPermissions("iot:nu_iot_tplink_alarm_log:add")
@PostMapping(value = "/add")
public Result<String> add(@RequestBody AlarmLog alarmLog) {
alarmLogService.save(alarmLog);
return Result.OK("添加成功!");
}
/**
* 编辑
*
* @param alarmLog
* @return
*/
@AutoLog(value = "护理单元-物联管理-TPLINK告警日志信息-编辑")
@ApiOperation(value="护理单元-物联管理-TPLINK告警日志信息-编辑", notes="护理单元-物联管理-TPLINK告警日志信息-编辑")
@RequiresPermissions("iot:nu_iot_tplink_alarm_log:edit")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody AlarmLog alarmLog) {
alarmLogService.updateById(alarmLog);
return Result.OK("编辑成功!");
}
/**
* 通过id删除
*
* @param id
* @return
*/
@AutoLog(value = "护理单元-物联管理-TPLINK告警日志信息-通过id删除")
@ApiOperation(value="护理单元-物联管理-TPLINK告警日志信息-通过id删除", notes="护理单元-物联管理-TPLINK告警日志信息-通过id删除")
@RequiresPermissions("iot:nu_iot_tplink_alarm_log:delete")
@DeleteMapping(value = "/delete")
public Result<String> delete(@RequestParam(name="id",required=true) String id) {
alarmLogService.removeById(id);
return Result.OK("删除成功!");
}
/**
* 批量删除
*
* @param ids
* @return
*/
@AutoLog(value = "护理单元-物联管理-TPLINK告警日志信息-批量删除")
@ApiOperation(value="护理单元-物联管理-TPLINK告警日志信息-批量删除", notes="护理单元-物联管理-TPLINK告警日志信息-批量删除")
@RequiresPermissions("iot:nu_iot_tplink_alarm_log:deleteBatch")
@DeleteMapping(value = "/deleteBatch")
public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
this.alarmLogService.removeByIds(Arrays.asList(ids.split(",")));
return Result.OK("批量删除成功!");
}
/**
* 通过id查询
*
* @param id
* @return
*/
//@AutoLog(value = "护理单元-物联管理-TPLINK告警日志信息-通过id查询")
@ApiOperation(value="护理单元-物联管理-TPLINK告警日志信息-通过id查询", notes="护理单元-物联管理-TPLINK告警日志信息-通过id查询")
@GetMapping(value = "/queryById")
public Result<AlarmLog> queryById(@RequestParam(name="id",required=true) String id) {
AlarmLog alarmLog = alarmLogService.getById(id);
if(alarmLog==null) {
return Result.error("未找到对应数据");
}
return Result.OK(alarmLog);
}
/**
* 导出excel
*
* @param request
* @param alarmLog
*/
@RequiresPermissions("iot:nu_iot_tplink_alarm_log:exportXls")
@RequestMapping(value = "/exportXls")
public ModelAndView exportXls(HttpServletRequest request, AlarmLog alarmLog) {
return super.exportXls(request, alarmLog, AlarmLog.class, "护理单元-物联管理-TPLINK告警日志信息");
}
/**
* 通过excel导入数据
*
* @param request
* @param response
* @return
*/
@RequiresPermissions("iot:nu_iot_tplink_alarm_log:importExcel")
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
return super.importExcel(request, response, AlarmLog.class);
}
}

View File

@ -0,0 +1,157 @@
package com.nu.modules.tplink.alarm.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableLogic;
import org.jeecg.common.constant.ProvinceCityArea;
import org.jeecg.common.util.SpringContextUtils;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 护理单元-物联管理-TPLINK告警日志信息
* @Author: jeecg-boot
* @Date: 2025-01-23
* @Version: V1.0
*/
@Data
@TableName("nu_iot_tplink_alarm_log")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="nu_iot_tplink_alarm_log对象", description="护理单元-物联管理-TPLINK告警日志信息")
public class AlarmLog implements Serializable {
private static final long serialVersionUID = 1L;
/**ID*/
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "ID")
private Integer id;
/**消息ID*/
@Excel(name = "消息ID", width = 15)
@ApiModelProperty(value = "消息ID")
private String logId;
/**告警时间*/
@Excel(name = "告警时间", width = 15)
@ApiModelProperty(value = "告警时间")
private Long logTime;
/**告警时间*/
@Excel(name = "告警时间", width = 15)
@ApiModelProperty(value = "告警时间")
private String logTimeFm;
/**告警内容*/
@Excel(name = "告警内容", width = 15)
@ApiModelProperty(value = "告警内容")
private String content;
/**报警设备名称*/
@Excel(name = "报警设备名称", width = 15)
@ApiModelProperty(value = "报警设备名称")
private String alarmDeviceName;
/**报警设备类型*/
@Excel(name = "报警设备类型", width = 15, dicCode = "tplink_alarm_device_type")
@Dict(dicCode = "tplink_alarm_device_type")
@ApiModelProperty(value = "报警设备类型")
private Integer alarmDeviceType;
/**报警名称*/
@Excel(name = "报警名称", width = 15)
@ApiModelProperty(value = "报警名称")
private String alarmName;
/**消息类型*/
@Excel(name = "消息类型", width = 15, dicCode = "tplink_alarm_type")
@Dict(dicCode = "tplink_alarm_type")
@ApiModelProperty(value = "消息类型")
private Integer alarmType;
/**设备源类型*/
@Excel(name = "设备源类型", width = 15)
@ApiModelProperty(value = "设备源类型")
private String alarmSourceType;
/**报警等级*/
@Excel(name = "报警等级", width = 15, dicCode = "tplink_alarm_level")
@Dict(dicCode = "tplink_alarm_level")
@ApiModelProperty(value = "报警等级")
private Integer alarmLevel;
/**企业ID*/
@Excel(name = "企业ID", width = 15)
@ApiModelProperty(value = "企业ID")
private Integer enterpriseId;
/**项目ID*/
@Excel(name = "项目ID", width = 15)
@ApiModelProperty(value = "项目ID")
private Integer projectId;
/**项目名称*/
@Excel(name = "项目名称", width = 15)
@ApiModelProperty(value = "项目名称")
private String projectName;
/**分组ID*/
@Excel(name = "分组ID", width = 15)
@ApiModelProperty(value = "分组ID")
private Integer regionId;
/**分组名称*/
@Excel(name = "分组名称", width = 15)
@ApiModelProperty(value = "分组名称")
private String regionName;
/**报警设备ID*/
@Excel(name = "报警设备ID", width = 15)
@ApiModelProperty(value = "报警设备ID")
private String sourceId;
/**网页提醒 0关闭1开启*/
@Excel(name = "网页提醒 0关闭1开启", width = 15)
@ApiModelProperty(value = "网页提醒 0关闭1开启")
private Integer screenWarningMark;
/**是否已读 0未读1已读*/
@Excel(name = "是否已读 0未读1已读", width = 15, dicCode = "tplink_read_mark")
@Dict(dicCode = "tplink_read_mark")
@ApiModelProperty(value = "是否已读 0未读1已读")
private Integer readMark;
/**录像标记 0无录像1有录像*/
@Excel(name = "录像标记 0无录像1有录像", width = 15)
@ApiModelProperty(value = "录像标记 0无录像1有录像")
private Integer videoMark;
/**系统类型 “”,“客控”,“网络”,“监控”中的一个*/
@Excel(name = "系统类型 “”,“客控”,“网络”,“监控”中的一个", width = 15)
@ApiModelProperty(value = "系统类型 “”,“客控”,“网络”,“监控”中的一个")
private String systemType;
/**设备MAC地址*/
@Excel(name = "设备MAC地址", width = 15)
@ApiModelProperty(value = "设备MAC地址")
private String macAddr;
/**设备IP地址*/
@Excel(name = "设备IP地址", width = 15)
@ApiModelProperty(value = "设备IP地址")
private String ipAddr;
/**联动设备ID*/
@Excel(name = "联动设备ID", width = 15)
@ApiModelProperty(value = "联动设备ID")
private String unionDevId;
/**RAID报警的阵列信息*/
@Excel(name = "RAID报警的阵列信息", width = 15)
@ApiModelProperty(value = "RAID报警的阵列信息")
private String extend;
/**消息提示音 0表示无消息音、1表示普通、2表示重要、3表示紧急*/
@Excel(name = "消息提示音 0表示无消息音、1表示普通、2表示重要、3表示紧急", width = 15)
@ApiModelProperty(value = "消息提示音 0表示无消息音、1表示普通、2表示重要、3表示紧急")
private Integer promptAudio;
/**消息弹窗标记 0表示已处理1表示需要弹窗*/
@Excel(name = "消息弹窗标记 0表示已处理1表示需要弹窗", width = 15)
@ApiModelProperty(value = "消息弹窗标记 0表示已处理1表示需要弹窗")
private Integer popUpAlarmMark;
/**消息中携带的其他参数*/
@Excel(name = "消息中携带的其他参数", width = 15)
@ApiModelProperty(value = "消息中携带的其他参数")
private String alarmParams;
/**联动大屏消息标记 0否1是*/
@Excel(name = "联动大屏消息标记 0否1是", width = 15)
@ApiModelProperty(value = "联动大屏消息标记 0否1是")
private Integer linkageScreenMark;
}

View File

@ -0,0 +1,58 @@
package com.nu.modules.tplink.alarm.job;
import lombok.extern.slf4j.Slf4j;
import com.nu.modules.tplink.alarm.entity.AlarmLog;
import com.nu.modules.tplink.alarm.service.IAlarmLogService;
import com.nu.modules.tplink.utils.TumsApi;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
public class AlarmLogSyncJob implements Job {
@Autowired
IAlarmLogService service;
@Autowired
private TumsApi tumsApi;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
Long logTime = service.getMaxLogTime(null);
// String jsonRequest = "{\n" +
// " \"start\": 0,\n" +
// " \"limit\": 1000,\n" +
// " \"filterAnd\": {\n"+
// " \"logTimeGe\": "+logTime+"\n"+
// " },\n"+
// " \"sort\": [{\n"+
// " \"key\": \"logTime\",\n"+
// " \"value\": \"asc\"\n"+
// " }]\n"+
// "}";
// System.out.println(jsonRequest);
// String jsonResponse = tumsApi.getAlarmLog(jsonRequest);
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"start\"").append(":").append(0).append(",");
sb.append("\"limit\"").append(":").append(1000).append(",");
if(logTime!=null){
sb.append("\"filterAnd\"").append(":").append("{");
sb.append("\"logTimeGe\"").append(":").append(logTime);
sb.append("}").append(",");
}
sb.append("\"sort\"").append(":").append("[{");
sb.append("\"key\"").append(":").append("\"logTime\"").append(",");
sb.append("\"value\"").append(":").append("\"asc\"");
sb.append("}]");
sb.append("}");
// System.out.println(sb.toString());
String jsonResponse = tumsApi.getAlarmLog(sb.toString());
if(jsonResponse!=null&&!jsonResponse.equals("")){
service.sync(jsonResponse);
}
}
}

View File

@ -0,0 +1,16 @@
package com.nu.modules.tplink.alarm.mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nu.modules.tplink.alarm.entity.AlarmLog;
/**
* @Description: 护理单元-物联管理-TPLINK告警日志信息
* @Author: jeecg-boot
* @Date: 2025-01-23
* @Version: V1.0
*/
public interface AlarmLogMapper extends BaseMapper<AlarmLog> {
Long getMaxLogTime(AlarmLog alarmLog);
AlarmLog getByAlarmLogId(AlarmLog alarmLog);
}

View File

@ -0,0 +1,43 @@
<?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.nu.modules.tplink.alarm.mapper.AlarmLogMapper">
<select id="getByAlarmLogId" parameterType="com.nu.modules.tplink.alarm.entity.AlarmLog" resultType="com.nu.modules.tplink.alarm.entity.AlarmLog">
select id,
log_id as logId,
log_time as logTime,
log_time_fm as logTimeFm,
content as content,
alarm_device_name as alarmDeviceName,
alarm_device_type as alarmDeviceType,
alarm_name as alarmName,
alarm_type as alarmType,
alarm_source_type as alarmSourceType,
alarm_level as alarmLevel,
enterprise_id as enterpriseId,
project_id as projectId,
project_name as projectName,
region_id as regionId,
region_name as regionName,
source_id as sourceId,
screen_warning_mark as screenWarningMark,
read_mark as readMark,
video_mark as videoMark,
system_type as systemType,
mac_addr as macAddr,
ip_addr as ipAddr,
union_dev_id as unionDevId,
extend as extend,
prompt_audio as promptAudio,
pop_up_alarm_mark as popUpAlarmMark,
alarm_params as alarmParams,
linkage_screen_mark as linkageScreenMark
from nu_iot_tplink_alarm_log
where log_id = #{logId}
</select>
<select id="getMaxLogTime" parameterType="com.nu.modules.tplink.alarm.entity.AlarmLog" resultType="Long">
select max(log_time) as logTime
from nu_iot_tplink_alarm_log
</select>
</mapper>

View File

@ -0,0 +1,16 @@
package com.nu.modules.tplink.alarm.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nu.modules.tplink.alarm.entity.AlarmLog;
/**
* @Description: 护理单元-物联管理-TPLINK告警日志信息
* @Author: jeecg-boot
* @Date: 2025-01-23
* @Version: V1.0
*/
public interface IAlarmLogService extends IService<AlarmLog> {
Long getMaxLogTime(AlarmLog alarmLog);
void sync(String jsonResponse);
}

View File

@ -0,0 +1,62 @@
package com.nu.modules.tplink.alarm.service.impl;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nu.modules.tplink.alarm.entity.AlarmLog;
import com.nu.modules.tplink.alarm.mapper.AlarmLogMapper;
import com.nu.modules.tplink.alarm.service.IAlarmLogService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Description: 护理单元-物联管理-TPLINK告警日志信息
* @Author: jeecg-boot
* @Date: 2025-01-23
* @Version: V1.0
*/
@Service
public class AlarmLogServiceImpl extends ServiceImpl<AlarmLogMapper, AlarmLog> implements IAlarmLogService {
@Override
public Long getMaxLogTime(AlarmLog alarmLog){
return baseMapper.getMaxLogTime(alarmLog);
}
@Override
public void sync(String jsonResponse){
JSONObject jsonObject = new JSONObject(jsonResponse);
if(jsonObject.getInt("error_code").equals(0)){
JSONObject result = (JSONObject)jsonObject.get("result");
if(result.getInt("total")>0){
JSONArray list = result.getJSONArray("list");
for(int i=0;i<list.size();i++){
ObjectMapper mapper = new ObjectMapper();
String jsonString = list.get(i).toString();
try {
AlarmLog alarmLog = mapper.readValue(jsonString, AlarmLog.class);
long timestamp = alarmLog.getLogTime();
Date date = new Date(timestamp); // 将时间戳转换为Date对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 定义日期格式
String formattedDate = sdf.format(date); // 格式化日期
alarmLog.setLogTimeFm(formattedDate);
AlarmLog entity = baseMapper.getByAlarmLogId(alarmLog);
if(entity==null){
//新增
baseMapper.insert(alarmLog);
}else{
//修改
alarmLog.setId(entity.getId());
baseMapper.updateById(alarmLog);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}

View File

@ -0,0 +1,424 @@
/**
* Versionv1.0.0 ,
* DescriptionTP-LINK厂家摄像头相关操作
* CreateDate2025-01-17 09:00:00
* Author曹磊
*
* ModifyDate2025-02-19 14:00:00
* ModifyMode新增
* ModifyFunctiongetUploadToServerProcess
* ModifyDescription获取转存MP4上传任务进度
*/
package com.nu.modules.tplink.camera.controller;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import cn.hutool.json.JSONObject;
import org.jeecg.common.api.vo.Result;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import com.nu.modules.tplink.camera.service.ICameraInfoService;
import org.jeecg.common.system.base.controller.JeecgController;
import com.nu.modules.tplink.camera.entity.CameraInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.jeecg.common.aspect.annotation.AutoLog;
/**
* @Description: 护理单元-物联管理-摄像头信息
* @Author: jeecg-boot
* @Date: 2025-01-17
* @Version: V1.0
*/
@Api(tags="护理单元-物联管理-摄像头信息")
@RestController
@RequestMapping("/iot/cameraInfo")
@Slf4j
public class CameraInfoController extends JeecgController<CameraInfo, ICameraInfoService> {
@Autowired
private ICameraInfoService service;
/**
* 分页列表查询
*
* @param CameraInfo
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "护理单元-物联管理-摄像头信息-分页列表查询")
@ApiOperation(value="护理单元-物联管理-摄像头信息-分页列表查询", notes="护理单元-物联管理-摄像头信息-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<CameraInfo>> queryPageList(CameraInfo CameraInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
Page<CameraInfo> page = new Page<CameraInfo>(pageNo, pageSize);
IPage<CameraInfo> pageList = service.findPage(page, CameraInfo);
return Result.OK(pageList);
}
@ApiOperation(value="护理单元分页列表查询", notes="护理单元分页列表查询")
@GetMapping(value = "/nuList")
public Result<IPage<CameraInfo>> queryNuPageList(CameraInfo CameraInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
Page<CameraInfo> page = new Page<CameraInfo>(pageNo, pageSize);
IPage<CameraInfo> pageList = service.findNuPage(page, CameraInfo);
return Result.OK(pageList);
}
/**
* 编辑
*
* @param cameraInfo
* @return
*/
@AutoLog(value = "护理单元-物联管理-摄像头信息-编辑")
@ApiOperation(value="护理单元-物联管理-摄像头信息-编辑", notes="护理单元-物联管理-摄像头信息-编辑")
@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> edit(@RequestBody CameraInfo cameraInfo) {
service.edit(cameraInfo);
return Result.OK("编辑成功!");
}
/**
* 修改摄像头信息
*
* @param cameraInfo
* @return
*/
@RequestMapping(value = "/rebootDevice", method = {RequestMethod.PUT,RequestMethod.POST})
public Result<String> rebootDevice(@RequestBody CameraInfo cameraInfo) {
service.rebootDevice(cameraInfo);
return Result.OK("重启成功!");
}
/**
* 获取IPC设备能力集
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getIpcCapability")
public Result<JSONObject> getIpcCapability(CameraInfo cameraInfo) {
return service.getIpcCapability(cameraInfo);
}
/**
* 获取画面基本信息
*
* @param map
* @return
*/
@PostMapping(value = "/getImageCommon")
public Result<JSONObject> getImageCommon(@RequestBody Map<String,Object> map) {
return service.getImageCommon(map);
}
/**
* 设置画面基本信息
*
* @param map
* @return
*/
@PostMapping(value = "/setImageCommon")
public Result setImageCommon(@RequestBody Map<String,Object> map) {
return service.setImageCommon(map);
}
/**
* 获取OSD能力集
*
* @param map
* @return
*/
@PostMapping(value = "/getOsdCapability")
public Result<JSONObject> getOsdCapability(@RequestBody Map<String,Object> map) {
return service.getOsdCapability(map);
}
/**
* 获取OSD参数
*
* @param map
* @return
*/
@PostMapping(value = "/getOsd")
public Result<JSONObject> getOsd(@RequestBody Map<String,Object> map) {
return service.getOsd(map);
}
/**
* 设置OSD参数
*
* @param map
* @return
*/
@PostMapping(value = "/setOsd")
public Result<String> setOsd(@RequestBody Map<String,Object> map) {
return service.setOsd(map);
}
/**
* 获取码率参数
*
* @param map
* @return
*/
@PostMapping(value = "/getVideoParams")
public Result<JSONObject> getVideoParams(@RequestBody Map<String,Object> map) {
return service.getVideoParams(map);
}
/**
* 设置码率参数
*
* @param map
* @return
*/
@PostMapping(value = "/setVideoParams")
public Result setVideoParams(@RequestBody Map<String,Object> map) {
return service.setVideoParams(map);
}
/**
* 恢复画面默认值
*
* @param map
* @return
*/
@PostMapping(value = "/configRecovery")
public Result configRecovery(@RequestBody Map<String,Object> map) {
return service.configRecovery(map);
}
/**
* 获取摄像头实时播放地址
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getPreviewUrl")
public Result<Map<String,String>> getPreviewUrl(CameraInfo cameraInfo) {
return service.getPreviewUrl(cameraInfo);
}
/**
* 获取录像配置--暂无用
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getRecordCfgs")
public Result getRecordCfgs(CameraInfo cameraInfo) throws Exception{
return service.getRecordCfgs(cameraInfo);
}
/**
* 设置录像计划--暂无用
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/setRecordCfgs")
public Result setRecordCfgs(CameraInfo cameraInfo) throws Exception{
return service.setRecordCfgs(cameraInfo);
}
/**
* 获取批量操作录像计划进度--暂无用
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getBatchProgress")
public Result getBatchProgress(CameraInfo cameraInfo) throws Exception{
return service.getBatchProgress(cameraInfo);
}
/**
* 获取镜头遮挡参数
*
* @param map
* @return
*/
@PostMapping(value = "/getTamperDet")
public Result<JSONObject> getTamperDet(@RequestBody Map<String,Object> map) {
return service.getTamperDet(map);
}
/**
* 设置镜头遮挡参数
*
* @param map
* @return
*/
@PostMapping(value = "/setTamperDet")
public Result<String> setTamperDet(@RequestBody Map<String,Object> map) {
return service.setTamperDet(map);
}
/**
* 获取镜头遮挡处理方式
*
* @param map
* @return
*/
@PostMapping(value = "/getTamperNotif")
public Result<JSONObject> getTamperNotif(@RequestBody Map<String,Object> map) {
return service.getTamperNotif(map);
}
/**
* 设置镜头遮挡处理方式
*
* @param map
* @return
*/
@PostMapping(value = "/setTamperNotif")
public Result setTamperNotif(@RequestBody Map<String,Object> map) {
return service.setTamperNotif(map);
}
/**
* 报警声音试听
*
* @param map
* @return
*/
@PostMapping(value = "/testAudio")
public Result testAudio(@RequestBody Map<String,Object> map) {
return service.testAudio(map);
}
/**
* 获取白光/声音告警参数
*
* @param map
* @return
*/
@PostMapping(value = "/getAlarmInfo")
public Result<JSONObject> getAlarmInfo(@RequestBody Map<String,Object> map) {
return service.getAlarmInfo(map);
}
/**
* 设置白光/声音告警参数
*
* @param map
* @return
*/
@PostMapping(value = "/setAlarmInfo")
public Result<String> setAlarmInfo(@RequestBody Map<String,Object> map) {
return service.setAlarmInfo(map);
}
/**
* 获取白光/声音告警布防时间
*
* @param map
* @return
*/
@PostMapping(value = "/getAlarmPlan")
public Result<JSONObject> getAlarmPlan(@RequestBody Map<String,Object> map) {
return service.getAlarmPlan(map);
}
/**
* 设置白光/声音告警布防时间
*
* @param map
* @return
*/
@PostMapping(value = "/setAlarmPlan")
public Result setAlarmPlan(@RequestBody Map<String,Object> map) {
return service.setAlarmPlan(map);
}
/**
* 搜索某天的录像数据
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/searchVideo")
public Result<IPage<CameraInfo>> searchVideo(CameraInfo cameraInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
return service.searchVideo(pageNo, pageSize, cameraInfo);
}
/**
* 获取摄像头录像回放地址
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getPlaybackUrlList")
public Result<Map<String,Object>> getPlaybackUrlList(CameraInfo cameraInfo) {
return service.getPlaybackUrlList(cameraInfo);
}
/**
* 删除回放通道
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/deletePlaybackChn")
public Result<String> deletePlaybackChn(CameraInfo cameraInfo) {
return service.deletePlaybackChn(cameraInfo);
}
/**
* 获取摄像头录像回放地址
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getMultitransUrl")
public Result<Map<String,Object>> getMultitransUrl(CameraInfo cameraInfo) throws Exception{
return service.getMultitransUrl(cameraInfo);
}
/**
* 回放视频转mp4上传
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/uploadToServer")
public Result uploadToServer(CameraInfo cameraInfo) throws Exception{
return service.uploadToServer(cameraInfo);
}
/**
* 停止转存MP4上传任务
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/stopUploadToServer")
public Result<String> stopUploadToServer(CameraInfo cameraInfo) throws Exception{
return service.stopUploadToServer(cameraInfo);
}
/**
* 获取转存MP4上传任务进度
*
* @param cameraInfo
* @return
*/
@GetMapping(value = "/getUploadToServerProcess")
public Result getUploadToServerProcess(CameraInfo cameraInfo) throws Exception{
return service.getUploadToServerProcess(cameraInfo);
}
}

View File

@ -0,0 +1,281 @@
package com.nu.modules.tplink.camera.entity;
import java.io.Serializable;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 护理单元-物联管理-TPLINK摄像头信息
* @Author: jeecg-boot
* @Date: 2025-01-17
* @Version: V1.0
*/
@Data
@TableName("nu_iot_tplink_camera")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="nu_iot_tplink_camera对象", description="护理单元-物联管理-TPLINK摄像头信息")
public class CameraInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**ID*/
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "ID")
private Integer id;
/**设备序号*/
@Excel(name = "设备序号", width = 15)
@ApiModelProperty(value = "设备序号")
private String deviceIndex;
/**设备名称*/
@Excel(name = "设备名称", width = 15)
@ApiModelProperty(value = "设备名称")
private String deviceName;
/**设备类型*/
@Excel(name = "设备类型", width = 15)
@ApiModelProperty(value = "设备类型")
private String deviceType;
/**设备状态 0 离线 1 在线 2 重启中 3 升级中 4 配置中 5 同步中*/
@Excel(name = "设备状态 0 离线 1 在线 2 重启中 3 升级中 4 配置中 5 同步中", width = 15, dicCode = "tplink_status")
@Dict(dicCode = "tplink_status")
@ApiModelProperty(value = "设备状态 0 离线 1 在线 2 重启中 3 升级中 4 配置中 5 同步中")
private String deviceStatus;
/**设备型号*/
@Excel(name = "设备型号", width = 15)
@ApiModelProperty(value = "设备型号")
private String deviceModel;
/**IP地址*/
@Excel(name = "IP地址", width = 15)
@ApiModelProperty(value = "IP地址")
private String ip;
/**MAC地址*/
@Excel(name = "MAC地址", width = 15)
@ApiModelProperty(value = "MAC地址")
private String mac;
/**分组ID*/
@Excel(name = "分组ID", width = 15)
@ApiModelProperty(value = "分组ID")
private String regionId;
/**分组名称*/
@Excel(name = "分组名称", width = 15)
@ApiModelProperty(value = "分组名称")
private String regionName;
/**父设备ID*/
@Excel(name = "父设备ID", width = 15)
@ApiModelProperty(value = "父设备ID")
private String parentId;
/**父设备名称*/
@Excel(name = "父设备名称", width = 15)
@ApiModelProperty(value = "父设备名称")
private String parentDeviceName;
/**项目ID*/
@Excel(name = "项目ID", width = 15)
@ApiModelProperty(value = "项目ID")
private String projectId;
/**项目名称*/
@Excel(name = "项目名称", width = 15)
@ApiModelProperty(value = "项目名称")
private String projectName;
/**软件版本*/
@Excel(name = "软件版本", width = 15)
@ApiModelProperty(value = "软件版本")
private String firmwareVer;
/**硬件版本*/
@Excel(name = "硬件版本", width = 15)
@ApiModelProperty(value = "硬件版本")
private String hardwareVer;
/**用户权限类型 -1 无权限 0 可读 1 可控制 2 可配置 3 可控制/配置 4 所有*/
@Excel(name = "用户权限类型 -1 无权限 0 可读 1 可控制 2 可配置 3 可控制/配置 4 所有", width = 15, dicCode = "tplink_manager_auth_type")
@Dict(dicCode = "tplink_manager_auth_type")
@ApiModelProperty(value = "用户权限类型 -1 无权限 0 可读 1 可控制 2 可配置 3 可控制/配置 4 所有")
private String managerAuthType;
/**告警消息权限 1 有权限 -1 无权限*/
@Excel(name = "告警消息权限 1 有权限 -1 无权限", width = 15, dicCode = "tplink_msg_auth_type")
@Dict(dicCode = "tplink_msg_auth_type")
@ApiModelProperty(value = "告警消息权限 1 有权限 -1 无权限")
private String msgAuthType;
/**扩展信息*/
@Excel(name = "扩展信息", width = 15)
@ApiModelProperty(value = "扩展信息")
@TableField(exist = false)
private JSONObject extend;
/**国标编码*/
@Excel(name = "国标编码", width = 15)
@ApiModelProperty(value = "国标编码")
private String sipCode;
/**位置名称*/
@Excel(name = "位置名称", width = 15)
@ApiModelProperty(value = "位置名称")
private String locationName;
/**系统类型 public 通用 vms 监控 nms 网络 evcs 新能源充电桩 rms 客控 nbs 音箱 bas 楼控 ams 门禁 smart_agriculture 智慧农业 vps 停车管理 aaa 认证计费*/
@Excel(name = "系统类型 public 通用 vms 监控 nms 网络 evcs 新能源充电桩 rms 客控 nbs 音箱 bas 楼控 ams 门禁 smart_agriculture 智慧农业 vps 停车管理 aaa 认证计费", width = 15, dicCode = "tplink_system_type")
@Dict(dicCode = "tplink_system_type")
@ApiModelProperty(value = "系统类型 public 通用 vms 监控 nms 网络 evcs 新能源充电桩 rms 客控 nbs 音箱 bas 楼控 ams 门禁 smart_agriculture 智慧农业 vps 停车管理 aaa 认证计费")
private String systemType;
/**协议类型*/
@Excel(name = "协议类型", width = 15)
@ApiModelProperty(value = "协议类型")
private String protocol;
/**置顶的时间*/
@Excel(name = "用户设置置顶的时间,毫秒级时间戳", width = 15)
@ApiModelProperty(value = "用户设置置顶的时间,毫秒级时间戳")
@TableField(exist = false)
private String topTime;
/**护理单元*/
@ApiModelProperty(value = "护理单元ID")
@Dict(dictTable ="nu_base_info",dicText = "name",dicCode = "id")
private String nuId;
/**护理单元*/
@ApiModelProperty(value = "护理单元")
@TableField(exist = false)
private String nuName;
@ApiModelProperty(value = "码流类型 0 代表主码流1 代码子码流")
@TableField(exist = false)
private int streamType;
/**
* 能力集属性 ==>
*/
@ApiModelProperty(value = "运动检测")
@TableField(exist = false)
private String motionDetection;
@ApiModelProperty(value = "视频封面")
@TableField(exist = false)
private String videoCover;
@ApiModelProperty(value = "云台")
@TableField(exist = false)
private String ptz;
@ApiModelProperty(value = "motor")
@TableField(exist = false)
private String motor;
@ApiModelProperty(value = "smartCode")
@TableField(exist = false)
private String smartCode;
@ApiModelProperty(value = "强制在H.264编码过程中生成IDR帧的函数")
@TableField(exist = false)
private String forceIdrFrame;
@ApiModelProperty(value = "音频")
@TableField(exist = false)
private String audio;
@ApiModelProperty(value = "本地存储")
@TableField(exist = false)
private String localStorage;
@ApiModelProperty(value = "回放API本版")
@TableField(exist = false)
private String playbackApiVersionTwo;
@ApiModelProperty(value = "多变性")
@TableField(exist = false)
private String multitrans;
@ApiModelProperty(value = "客流")
@TableField(exist = false)
private String passengerFlow;
@ApiModelProperty(value = "获取预览缩略图")
@TableField(exist = false)
private String getPreviewThumbnail;
@ApiModelProperty(value = "JPG预览缩略图")
@TableField(exist = false)
private String previewThumbnailJpeg;
@ApiModelProperty(value = "走廊")
@TableField(exist = false)
private String corridorMod;
@ApiModelProperty(value = "背光共存")
@TableField(exist = false)
private String backlightCoexistence;
/**
* <== 能力集属性
*/
@ApiModelProperty(value = "查询日期")
@TableField(exist = false)
private String dataDate;
@ApiModelProperty(value = "设备索引")
@TableField(exist = false)
private String videoDevId;
@ApiModelProperty(value = "存储设备ID")
@TableField(exist = false)
private String storageDevId;
@ApiModelProperty(value = "存储设备名称")
@TableField(exist = false)
private String storageDevName;
@ApiModelProperty(value = "双摄IPC通道ID,双摄IPC的全景摄像头其值为0.双摄IPC的特写摄像头其值为1")
@TableField(exist = false)
private String channelId;
@ApiModelProperty(value = "当录像存在存储池中, 录像所属的nvs的ID")
@TableField(exist = false)
private String nvsIdInPoolList;
@ApiModelProperty(value = "录像开始时间. GMT时间即1970.1.1零时至今的秒数")
@TableField(exist = false)
private String startTime;
@ApiModelProperty(value = "录像结束时间. GMT时间即1970.1.1零时至今的秒数")
@TableField(exist = false)
private String endTime;
@ApiModelProperty(value = "录像开始时间,YYYY-MM-DD HH:MI:SS")
@TableField(exist = false)
private String startTimeFt;
@ApiModelProperty(value = "录像结束时间,YYYY-MM-DD HH:MI:SS")
@TableField(exist = false)
private String endTimeFt;
@ApiModelProperty(value = "录像时长,HH:MI:SS")
@TableField(exist = false)
private String duration;
@ApiModelProperty(value = "回放录像类型。1: 定时录像; 2: 移动侦测等")
@TableField(exist = false)
private String videoType;
@ApiModelProperty(value = "录像片段大小,单位字节")
@TableField(exist = false)
private String size;
@ApiModelProperty(value = "错误码")
@TableField(exist = false)
private String errorCode;
@ApiModelProperty(value = "错误描述")
@TableField(exist = false)
private String errorMsg;
@ApiModelProperty(value = "录像存储设备类型 -1未找到0:ipc1:nvr2nvs3server4vcs5storagePool")
@TableField(exist = false)
private String storageType;
@ApiModelProperty(value = "预览/回放url")
@TableField(exist = false)
private String url;
@ApiModelProperty(value = "预览/回放备用url")
@TableField(exist = false)
private String backupUrl;
@ApiModelProperty(value = "ws连接传输视频地址")
@TableField(exist = false)
private String wsUrl;
@ApiModelProperty(value = "wss接传输视频地址")
@TableField(exist = false)
private String wssUrl;
@ApiModelProperty(value = "预览/回放通道对应的sessionId")
@TableField(exist = false)
private String sessionId;
@ApiModelProperty(value = "双摄IPC通道ID")
@TableField(exist = false)
private String videoChannelId;
@ApiModelProperty(value = "回放速率")
@TableField(exist = false)
private String scale;
@ApiModelProperty(value = "回放api访问前缀")
@TableField(exist = false)
private String queryAddress;
@ApiModelProperty(value = "录像开关;枚举:[0:表示关,1:表示开]")
@TableField(exist = false)
private String recordSwitch;
@ApiModelProperty(value = "任务taskId")
@TableField(exist = false)
private String taskId;
@ApiModelProperty(value = "上传mp4文件名称")
@TableField(exist = false)
private String fileName;
@ApiModelProperty(value = "上传进度")
@TableField(exist = false)
private String process;
}

View File

@ -0,0 +1,50 @@
package com.nu.modules.tplink.camera.job;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import com.nu.modules.tplink.camera.entity.CameraInfo;
import com.nu.modules.tplink.camera.service.ICameraInfoService;
import com.nu.modules.tplink.utils.TumsApi;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* 摄像头能力集同步
*/
@Slf4j
public class CameraCapabilitySyncJob implements Job {
@Autowired
ICameraInfoService service;
@Autowired
private TumsApi tumsApi;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
List<CameraInfo> list = service.findAllList();
if(list!=null&&list.size()>0){
for(int i=0;i< list.size();i++){
CameraInfo cameraInfo = list.get(i);
String id = cameraInfo.getDeviceIndex();
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"devId\"").append(":").append("\"").append(id).append("\"");
sb.append("}");
String jsonResponse = tumsApi.getIpcCapability(sb.toString());
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
service.syncCapability(id,jsonResponse);
}else{
log.error("CameraCapabilitySyncJob:{}-{}", DateUtils.now(),"devId:"+id+","+jsonObject.getStr("msg"));
}
}
}
}
}

View File

@ -0,0 +1,63 @@
package com.nu.modules.tplink.camera.job;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import com.nu.modules.tplink.camera.service.ICameraInfoService;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.project.service.IProjectInfoService;
import com.nu.modules.tplink.utils.TumsApi;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* 摄像头设备信息同步
*/
@Slf4j
public class CameraDeviceSyncJob implements Job {
@Autowired
ICameraInfoService service;
@Autowired
IProjectInfoService pService;
@Autowired
private TumsApi tumsApi;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
ProjectInfo pi = new ProjectInfo();
pi.setStatus(1);//正常状态
List<ProjectInfo> projectList = pService.findList(pi);
if(projectList!=null&&projectList.size()>0){
for(int i=0;i< projectList.size();i++){
ProjectInfo projectInfo = projectList.get(i);
String jsonRequest = "{\n" +
" \"start\": 0,\n" +
" \"limit\": 1000,\n" +
" \"filterAnd\": {\n"+
" \"projectId\": \""+projectInfo.getProjectId()+"\",\n"+
" \"deviceTypeList\": [\"SURVEILLANCECAMERA\"]\n"+
" },\n"+
" \"sort\": [{\n"+
" \"key\": \"deviceIndex\",\n"+
" \"value\": \"asc\"\n"+
" }]\n"+
"}";
// System.out.println(jsonRequest);
String jsonResponse = tumsApi.getDeviceList(jsonRequest);
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
service.sync(jsonResponse);
}else{
log.error("CameraDeviceSyncJob:{}-{}", DateUtils.now(),jsonObject.getStr("msg"));
}
}
}
}
}

View File

@ -0,0 +1,28 @@
package com.nu.modules.tplink.camera.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.nu.modules.tplink.camera.entity.CameraInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import java.util.List;
/**
* @Description: 护理单元-物联管理-摄像头信息
* @Author: jeecg-boot
* @Date: 2025-01-17
* @Version: V1.0
*/
@Mapper
public interface CameraInfoMapper extends BaseMapper<CameraInfo> {
IPage<CameraInfo> findPage(Page<CameraInfo> page, @Param("params") CameraInfo cameraInfo);
List<CameraInfo> findAllList();
IPage<CameraInfo> findNuPage(Page<CameraInfo> page, @Param("params") CameraInfo cameraInfo);
CameraInfo getByDeviceId(CameraInfo cameraInfo);
CameraInfo getCapabilityByDeviceId(CameraInfo cameraInfo);
void insertCapability(CameraInfo cameraInfo);
void updateCapabilityById(CameraInfo cameraInfo);
}

View File

@ -0,0 +1,217 @@
<?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.nu.modules.tplink.camera.mapper.CameraInfoMapper">
<select id="findPage" parameterType="com.nu.modules.tplink.camera.entity.CameraInfo" resultType="com.nu.modules.tplink.camera.entity.CameraInfo">
select a.id,
a.device_index as deviceIndex,
device_name as deviceName,
device_type as deviceType,
device_status as deviceStatus,
device_model as deviceModel,
ip as ip,
mac as mac,
region_id as regionId,
region_name as regionName,
parent_id as parentId,
parent_device_name as parentDeviceName,
project_id as projectId,
project_name as projectName,
firmware_ver as firmwareVer,
hardware_ver as hardwareVer,
manager_auth_type as managerAuthType,
msg_auth_type as msgAuthType,
sip_code as sipCode,
location_name as locationName,
system_type as systemType,
protocol as protocol,
a.nu_id as nuId,
b.name as nuName,
ifnull(c.multitrans,0) as multitrans
from nu_iot_tplink_camera a left join nu_base_info b on a.nu_id = b.id
left join nu_iot_tplink_camera_capability c on a.device_index = c.device_index
<where>
<if test="params.deviceIndex != null and params.deviceIndex != ''">
AND a.device_index = #{params.deviceIndex}
</if>
<if test="params.deviceStatus != null and params.deviceStatus != ''">
AND a.device_status = #{params.deviceStatus}
</if>
<if test="params.deviceName != null and params.deviceName != ''">
AND a.device_name = #{params.deviceName}
</if>
<if test="params.projectName != null and params.projectName != ''">
AND a.project_name LIKE concat('%',#{params.projectName},'%')
</if>
<if test="params.regionName != null and params.regionName != ''">
AND a.region_name LIKE concat('%',#{params.regionName},'%')
</if>
<if test="params.nuName != null and params.nuName != ''">
AND b.name LIKE concat('%',#{params.nuName},'%')
</if>
<if test="params.projectId != null and params.projectId != ''">
AND a.project_id = #{params.projectId}
</if>
<if test="params.regionId != null and params.regionId != ''">
AND a.region_id = #{params.regionId}
</if>
</where>
</select>
<select id="findAllList" parameterType="com.nu.modules.tplink.camera.entity.CameraInfo" resultType="com.nu.modules.tplink.camera.entity.CameraInfo">
select a.id,
device_index as deviceIndex,
device_name as deviceName,
device_type as deviceType,
device_status as deviceStatus,
device_model as deviceModel,
ip as ip,
mac as mac,
region_id as regionId,
region_name as regionName,
parent_id as parentId,
parent_device_name as parentDeviceName,
project_id as projectId,
project_name as projectName,
firmware_ver as firmwareVer,
hardware_ver as hardwareVer,
manager_auth_type as managerAuthType,
msg_auth_type as msgAuthType,
sip_code as sipCode,
location_name as locationName,
system_type as systemType,
protocol as protocol,
nu_id as nuId
from nu_iot_tplink_camera a
</select>
<select id="findNuPage" parameterType="com.nu.modules.tplink.camera.entity.CameraInfo" resultType="com.nu.modules.tplink.camera.entity.CameraInfo">
select
id as nuId,
name as nuName
from nu_base_info b
<where>
<if test="params.nuId != null and params.nuId != ''">
AND b.id = #{params.nuId}
</if>
<if test="params.nuName != null and params.nuName != ''">
AND b.name LIKE concat('%',#{params.nuName},'%')
</if>
</where>
</select>
<select id="getByDeviceId" parameterType="com.nu.modules.tplink.camera.entity.CameraInfo" resultType="com.nu.modules.tplink.camera.entity.CameraInfo">
select a.id,
device_index as deviceIndex,
device_name as deviceName,
device_type as deviceType,
device_status as deviceStatus,
device_model as deviceModel,
ip as ip,
mac as mac,
region_id as regionId,
region_name as regionName,
parent_id as parentId,
parent_device_name as parentDeviceName,
project_id as projectId,
project_name as projectName,
firmware_ver as firmwareVer,
hardware_ver as hardwareVer,
manager_auth_type as managerAuthType,
msg_auth_type as msgAuthType,
sip_code as sipCode,
location_name as locationName,
system_type as systemType,
protocol as protocol,
nu_id as nuId,
b.id as nuName
from nu_iot_tplink_camera a left join nu_base_info b on a.nu_id = b.id
where device_index = #{deviceIndex}
</select>
<select id="getCapabilityByDeviceId" parameterType="com.nu.modules.tplink.camera.entity.CameraInfo" resultType="com.nu.modules.tplink.camera.entity.CameraInfo">
select a.id,
device_index as deviceIndex,
motion_detection as motionDetection,
video_cover as videoCover,
ptz,
motor,
smart_code as smartCode,
force_idr_frame as forceIdrFrame,
audio,
local_storage as localStorage,
playback_api_version_two as playbackApiVersionTwo,
multitrans,
passenger_flow as passengerFlow,
get_preview_thumbnail as getPreviewThumbnail,
preview_thumbnail_jpeg as previewThumbnailJpeg,
corridor_mod as corridorMod,
backlight_coexistence as backlightCoexistence
from nu_iot_tplink_camera_capability a
where device_index = #{deviceIndex}
</select>
<insert id="insertCapability">
insert into nu_iot_tplink_camera_capability (
id,
device_index,
motion_detection,
video_cover,
ptz,
motor,
smart_code,
force_idr_frame,
audio,
local_storage,
playback_api_version_two,
multitrans,
passenger_flow,
get_preview_thumbnail,
preview_thumbnail_jpeg,
corridor_mod,
backlight_coexistence
)
values (
#{id},
#{deviceIndex},
#{motionDetection},
#{videoCover},
#{ptz},
#{motor},
#{smartCode},
#{forceIdrFrame},
#{audio},
#{localStorage},
#{playbackApiVersionTwo},
#{multitrans},
#{passengerFlow},
#{getPreviewThumbnail},
#{previewThumbnailJpeg},
#{corridorMod},
#{backlightCoexistence}
)
</insert>
<update id="updateCapabilityById">
UPDATE nu_iot_tplink_camera_capability
SET
device_index = #{deviceIndex},
motion_detection = #{motionDetection},
video_cover = #{videoCover},
ptz = #{ptz},
motor = #{motor},
smart_code = #{smartCode},
force_idr_frame = #{forceIdrFrame},
audio = #{audio},
local_storage = #{localStorage},
playback_api_version_two = #{playbackApiVersionTwo},
multitrans = #{multitrans},
passenger_flow = #{passengerFlow},
get_preview_thumbnail = #{getPreviewThumbnail},
preview_thumbnail_jpeg = #{previewThumbnailJpeg},
corridor_mod = #{corridorMod},
backlight_coexistence = #{backlightCoexistence}
where id = #{id}
</update>
</mapper>

View File

@ -0,0 +1,56 @@
package com.nu.modules.tplink.camera.service;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.common.api.vo.Result;
import com.nu.modules.tplink.camera.entity.CameraInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* @Description: 护理单元-物联管理-摄像头信息
* @Author: jeecg-boot
* @Date: 2025-01-17
* @Version: V1.0
*/
public interface ICameraInfoService extends IService<CameraInfo> {
IPage<CameraInfo> findPage(Page<CameraInfo> page, CameraInfo cameraInfo);
List<CameraInfo> findAllList();
IPage<CameraInfo> findNuPage(Page<CameraInfo> page, CameraInfo cameraInfo);
void edit(CameraInfo cameraInfo);
void rebootDevice(CameraInfo cameraInfo);
void sync(String jsonResponse);
void syncCapability(String deviceIndex,String jsonResponse);
Result<JSONObject> getIpcCapability(CameraInfo cameraInfo);
Result<JSONObject> getImageCommon(Map<String,Object> map);
Result setImageCommon(Map<String,Object> map);
Result<JSONObject> getOsdCapability(Map<String,Object> map);
Result<JSONObject> getOsd(Map<String,Object> map);
Result<String> setOsd(Map<String,Object> map);
Result<JSONObject> getVideoParams(Map<String,Object> map);
Result setVideoParams(Map<String,Object> map);
Result configRecovery(Map<String,Object> map);
Result<Map<String,String>> getPreviewUrl(CameraInfo cameraInfo);
Result getRecordCfgs(CameraInfo cameraInfo) throws Exception;
Result setRecordCfgs(CameraInfo cameraInfo) throws Exception;
Result getBatchProgress(CameraInfo cameraInfo) throws Exception;
Result<JSONObject> getTamperDet(Map<String,Object> map);
Result<String> setTamperDet(Map<String,Object> map);
Result<JSONObject> getTamperNotif(Map<String,Object> map);
Result setTamperNotif(Map<String,Object> map);
Result testAudio(Map<String,Object> map);
Result<JSONObject> getAlarmInfo(Map<String,Object> map);
Result<String> setAlarmInfo(Map<String,Object> map);
Result<JSONObject> getAlarmPlan(Map<String,Object> map);
Result setAlarmPlan(Map<String,Object> map);
Result<IPage<CameraInfo>> searchVideo(Integer pageNo, Integer pageSize, CameraInfo cameraInfo);
Result<Map<String,Object>> getPlaybackUrlList(CameraInfo cameraInfo);
Result<String> deletePlaybackChn(CameraInfo cameraInfo);
Result<Map<String,Object>> getMultitransUrl(CameraInfo cameraInfo) throws Exception;
Result uploadToServer(CameraInfo cameraInfo);
Result<String> stopUploadToServer(CameraInfo cameraInfo);
Result getUploadToServerProcess(CameraInfo cameraInfo);
}

View File

@ -0,0 +1,52 @@
package com.nu.modules.tplink.common.controller;
import com.tplink.ignite.libs.developersdk.api.TumsClient;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import com.nu.modules.tplink.utils.TumsApi;
import com.nu.modules.tplink.utils.TumsConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/iot/tplink")
@Slf4j
public class TpLinkController {
@Autowired
private TumsApi tumsApi;
@Resource
TumsConfig tumsConfig;
/**
* 登录图门系统
* @return
*/
@GetMapping(value = "/login")
public Result<Map<String,String>> login() {
Map<String,String> map = new HashMap<>();
map.put("cookie","");
map.put("serverUrl",tumsConfig.getUrl());
TumsClient tc = tumsApi.createTumsClient();
if(tc!=null){
map.put("cookie",tc.getCookie());
}
return Result.OK(map);
}
/**
* 登出图门系统
* @return
*/
@GetMapping(value = "/logout")
public Result<Map> logout() {
tumsApi.destroyTumsClient();
return Result.OK();
}
}

View File

@ -0,0 +1,41 @@
package com.nu.modules.tplink.common.entity;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecg.common.aspect.annotation.Dict;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.io.Serializable;
/**
* @Description: 护理单元-物联管理-TPLINK错误码
* @Author: jeecg-boot
* @Date: 2025-02-10
* @Version: V1.0
*/
@Data
@TableName("nu_iot_tplink_error_code")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="nu_iot_tplink_error_code对象", description="护理单元-物联管理-TPLINK错误码")
public class ErrorCode implements Serializable {
private static final long serialVersionUID = 1L;
/**错误码*/
@Excel(name = "错误码", width = 15)
@ApiModelProperty(value = "错误码")
private String errorCode;
/**错误描述*/
@Excel(name = "错误描述", width = 15)
@ApiModelProperty(value = "错误描述")
private String errorMsg;
}

View File

@ -0,0 +1,17 @@
package com.nu.modules.tplink.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import com.nu.modules.tplink.common.entity.ErrorCode;
/**
* @Description: 护理单元-物联管理-错误码
* @Author: jeecg-boot
* @Date: 2025-02-10
* @Version: V1.0
*/
@Mapper
public interface ErrorCodeMapper extends BaseMapper<ErrorCode> {
ErrorCode getByCode(String errorCode);
}

View File

@ -0,0 +1,13 @@
<?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.nu.modules.tplink.common.mapper.ErrorCodeMapper">
<select id="getByCode" parameterType="String" resultType="com.nu.modules.tplink.common.entity.ErrorCode">
select
error_code as errorCode,
error_msg as errorMsg
from nu_iot_tplink_error_code
where error_code = #{errorCode}
</select>
</mapper>

View File

@ -0,0 +1,14 @@
package com.nu.modules.tplink.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nu.modules.tplink.common.entity.ErrorCode;
/**
* @Description: 护理单元-物联管理-错误码
* @Author: jeecg-boot
* @Date: 2025-02-10
* @Version: V1.0
*/
public interface IErrorCodeService extends IService<ErrorCode> {
ErrorCode getByCode(String errorCode);
}

View File

@ -0,0 +1,24 @@
package com.nu.modules.tplink.common.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nu.modules.tplink.common.entity.ErrorCode;
import com.nu.modules.tplink.common.mapper.ErrorCodeMapper;
import com.nu.modules.tplink.common.service.IErrorCodeService;
import org.springframework.stereotype.Service;
/**
* @Description: 护理单元-物联管理-错误码
* @Author: jeecg-boot
* @Date: 2025-02-10
* @Version: V1.0
*/
@Service
public class ErrorCodeServiceImpl extends ServiceImpl<ErrorCodeMapper, ErrorCode> implements IErrorCodeService {
@Override
public ErrorCode getByCode(String errorCode){
return baseMapper.getByCode(errorCode);
}
}

View File

@ -0,0 +1,63 @@
package com.nu.modules.tplink.enums;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
/**
* 接口枚举类
*/
@Getter
@RequiredArgsConstructor
public enum ApiEnum {
//前缀对应相应设备的API无前缀则是公用API
//IPC 视频
//NVS 存储服务器
//AUDIO 音箱
//ROUTER 路由器
//SWITCH 交换机
//AP 无线路由器
//AC 线控制器
GET_ENCRYPT_KEY_FOR_LOGIN("/tums/account/v1/getEncryptKeyForLogin","获取登录公钥"),
LOGIN("/tums/account/v2/login","登录"),
LOGOUT("/tums/account/v1/logout","注销"),
SET_CURRENT_PROJECT("/tums/resource/v2/setCurrentProject","设置当前项目"),
GET_ALL_PROJECT_INFO("/tums/resource/v2/getAllProjectInfo","获取所有项目信息"),
GET_ROOT_REGIONS("/tums/resource/v2/getRootRegions","获取区域列表"),
GET_DEVICE_LIST("/tums/deviceManager/v2/getDeviceList","获取设备列表"),
MODIFY_DEVICE_DETAILS("/tums/deviceManager/v1/modifyDeviceDetails","修改设备信息"),
REBOOT_DEVICE_LIST("/tums/deviceManager/v2/rebootDeviceList","重启设备"),
QUERY_ALARM_LOG("/tums/logManager/v2/queryAlarmLog","查询告警日志列表"),
QUERY_UNREAD_ALARM_MSG("/tums/logManager/v2/queryUnreadAlarmMsg","查询未读告警日志列表"),
IPC_GET_IPC_CAPABILITY("/tums/deviceManager/v1/getIpcCapability","获取ipc能力集"),
IPC_PASSTHROUGH("/tums/devConfig/v1/passthrough","设备配置信息"),
IPC_ADD_PREVIEW_CHN("/tums/preview/v1/addPreviewChn","添加预览通道"),
IPC_GET_PREVIEW_URL("/tums/preview/v1/getPreviewUrl","获取预览通道的url"),
IPC_SEARCH_YEAR("/tums/playback/v1/searchYear","搜索存在回放录像的日期"),
IPC_GET_PLAYBACK_URL("/tums/playback/v1/getPlaybackUrl","获取回放通道的url"),
IPC_SUSPEND_PLAYBACK("/tums/playback/v1/suspendPlayback","暂停通道回放"),
IPC_DELETE_PLAYBACK_CHN("/tums/playback/v1/deletePlaybackChn","删除回放通道"),
IPC_GET_STORAGES_BY_ID("/tums/playback/v1/getStoragesById","获取指定监控点的存储设备列表"),
IPC_SEARCH_VIDEO("/tums/playback/v3/searchVideo","搜索当天的录像数据V3"),
IPC_ADD_PLAYBACK_CHN("/tums/playback/v2/addPlaybackChn","添加回放通道V2"),
IPC_GET_MULTITRANS_URL("/tums/playback/v1/getMultitransUrl","获取nvmp设备双向通信URL"),
IPC_GET_RECORD_CFGS("/tums/record/v1/getRecordCfgs","获取录像配置"),
IPC_SET_RECORD_CFGS("/tums/record/v1/setRecordCfgs","设置录像计划"),
IPC_GET_BATCH_PROGRESS("/tums/record/v1/getBatchProgress","获取批量操作录像计划进度"),
IPC_MOTION_CTRL("/tums/ptz/v1/motionCtrl","高速球机移动方向控制"),
IPC_GET_ALL_PRESETS("/tums/ptz/v1/getAllPresets","获取高速球机的所有预置点"),
IPC_OPERATE_PRESET("/tums/ptz/v1/operatePreset","操作高速球机的预置点"),
IPC_GET_ALL_TOURS("/tums/ptz/v1/getAllTours","获取高速球机的所有巡航列表"),
IPC_GET_TOURS_INFO("/tums/ptz/v1/getToursInfo","获取高速球机的巡航信息"),
IPC_ADD_NEW_TOUR("/tums/ptz/v1/addNewTour","高速球机新增巡航点"),
IPC_MODIFY_TOUR("/tums/ptz/v1/modifyTour","修改高速球机的巡航点配置"),
IPC_EXECUTE_TOUR("/tums/ptz/v1/executeTour","操作高速球机的巡航点"),
IPC_DELETE_TOUR("/tums/ptz/v1/deleteTour","删除高速球机巡航点"),
IPC_UPLOAD_TO_SERVER("/tums/playback/v1/uploadToServer","回放视频转mp4上传"),
IPC_STOP_UPLOAD_TO_SERVER("/tums/preview/v1/stopUploadToServer","停止转存MP4上传任务"),
IPC_GET_UPLOAD_TO_SERVER_PROCESS("/tums/preview/v1/getUploadToServerProcess","获取转存MP4上传任务进度");
private final String value;//自定义属性枚举值获取如ApiEnum.GET_ENCRYPT_KEY_FOR_LOGIN.getValue();
private final String remark;//自定义属性枚举描述获取如ApiEnum.GET_ENCRYPT_KEY_FOR_LOGIN.getRemark();
}

View File

@ -0,0 +1,88 @@
/**
* Versionv1.0.0 ,
* DescriptionTP-LINK厂家项目信息相关操作
* CreateDate2025-01-22 09:00:00
* Author曹磊
*/
package com.nu.modules.tplink.project.controller;
import javax.servlet.http.HttpServletRequest;
import org.jeecg.common.api.vo.Result;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.project.model.ProjectTreeModel;
import com.nu.modules.tplink.project.service.IProjectInfoService;
import org.jeecg.common.system.base.controller.JeecgController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import java.util.List;
/**
* @Description: 护理单元-物联管理-TPLINK项目信息
* @Author: jeecg-boot
* @Date: 2025-01-22
* @Version: V1.0
*/
@Api(tags="护理单元-物联管理-TPLINK项目信息")
@RestController
@RequestMapping("/iot/projectInfo")
@Slf4j
public class ProjectInfoController extends JeecgController<ProjectInfo, IProjectInfoService> {
@Autowired
private IProjectInfoService service;
/**
* 分页列表查询
*
* @param projectInfo
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "护理单元-物联管理-TPLINK项目信息-分页列表查询")
@ApiOperation(value="护理单元-物联管理-TPLINK项目信息-分页列表查询", notes="护理单元-物联管理-TPLINK项目信息-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<ProjectInfo>> queryPageList(ProjectInfo projectInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
Page<ProjectInfo> page = new Page<ProjectInfo>(pageNo, pageSize);
IPage<ProjectInfo> pageList = service.findPage(page, projectInfo);
return Result.OK(pageList);
}
/**
* 同步项目信息
*
* @return
*/
@GetMapping(value = "/sync")
public Result getUploadToServerProcess()throws Exception{
return service.sync();
}
/**
* 异步查询项目list
* @return
*/
@RequestMapping(value = "/queryRegionTreeSync", method = RequestMethod.GET)
public Result<List<ProjectTreeModel>> queryDepartTreeSync() {
Result<List<ProjectTreeModel>> result = new Result<>();
try {
List<ProjectTreeModel> list = service.queryTreeList();
result.setResult(list);
result.setSuccess(true);
} catch (Exception e) {
log.error(e.getMessage(),e);
result.setSuccess(false);
result.setMessage("查询失败");
}
return result;
}
}

View File

@ -0,0 +1,120 @@
package com.nu.modules.tplink.project.entity;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.*;
import org.jeecg.common.constant.ProvinceCityArea;
import org.jeecg.common.util.SpringContextUtils;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.jeecg.common.aspect.annotation.Dict;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* @Description: 护理单元-物联管理-TPLINK项目信息
* @Author: jeecg-boot
* @Date: 2025-01-22
* @Version: V1.0
*/
@Data
@TableName("nu_iot_tplink_project")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="nu_iot_tplink_project对象", description="护理单元-物联管理-TPLINK项目信息")
public class ProjectInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**ID*/
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "ID")
private Integer id;
/**项目ID*/
@Excel(name = "项目ID", width = 15)
@ApiModelProperty(value = "项目ID")
private String projectId;
/**项目名称*/
@Excel(name = "项目名称", width = 15)
@ApiModelProperty(value = "项目名称")
private String projectName;
/**创建时间戳,单位秒*/
@ApiModelProperty(value = "创建时间戳,单位秒")
private String createTime;
@TableField(exist = false)
@ApiModelProperty(value = "创建时间,年月日时分秒")
private String createTimeStr;
/**设备数量*/
@Excel(name = "设备数量", width = 15)
@ApiModelProperty(value = "设备数量")
private Integer deviceNum;
/**消息数量*/
@Excel(name = "消息数量", width = 15)
@ApiModelProperty(value = "消息数量")
private Integer messageNum;
/**项目次序*/
@Excel(name = "项目次序", width = 15)
@ApiModelProperty(value = "项目次序")
private Integer sort;
/**项目次序接口对应字段在数据库中是关键字数据库中用sort代替order*/
@ApiModelProperty(value = "项目次序")
@TableField(exist = false)
private String order;
/** 离线设备数*/
@Excel(name = "离线设备数", width = 15)
@ApiModelProperty(value = "离线设备数")
private Integer offlineNum;
/**异常设备数*/
@Excel(name = "异常设备数", width = 15)
@ApiModelProperty(value = "异常设备数")
private Integer abnormalNum;
/**未读消息数*/
@Excel(name = "未读消息数", width = 15)
@ApiModelProperty(value = "未读消息数")
private Integer unreadMessageNum;
/**nms设备总数*/
@Excel(name = "nms设备总数", width = 15)
@ApiModelProperty(value = "nms设备总数")
private Integer totalNmsDevNum;
/**vms设备总数*/
@Excel(name = "vms设备总数", width = 15)
@ApiModelProperty(value = "vms设备总数")
private Integer totalVmsDevNum;
/**nbs设备总数*/
@Excel(name = "nbs设备总数", width = 15)
@ApiModelProperty(value = "nbs设备总数")
private Integer totalNbsDevNum;
/**离线nms设备总数*/
@Excel(name = "离线nms设备总数", width = 15)
@ApiModelProperty(value = "离线nms设备总数")
private Integer offlineNmsDevNum;
/**离线vms设备总数*/
@Excel(name = "离线vms设备总数", width = 15)
@ApiModelProperty(value = "离线vms设备总数")
private Integer offlineVmsDevNum;
/**离线nbs设备总数*/
@Excel(name = "离线nbs设备总数", width = 15)
@ApiModelProperty(value = "离线nbs设备总数")
private Integer offlineNbsDevNum;
/**运行时间单位s*/
@Excel(name = "运行时间单位s", width = 15)
@ApiModelProperty(value = "运行时间单位s")
private Integer runningTime;
@TableField(exist = false)
@ApiModelProperty(value = "运行天数")
private String runningTimeStr;
/**状态1正常 2冻结*/
@Excel(name = "状态1正常 2冻结", width = 15)
@ApiModelProperty(value = "状态1正常 2冻结")
private Integer status;
/**是否有叶子节点: 1是0否*/
@Excel(name = "是否有叶子节点: 1是0否", width = 15)
@ApiModelProperty(value = "是否有叶子节点: 1是0否")
private Integer izLeaf;
}

View File

@ -0,0 +1,39 @@
package com.nu.modules.tplink.project.job;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.util.DateUtils;
import com.nu.modules.tplink.common.entity.ErrorCode;
import com.nu.modules.tplink.common.service.IErrorCodeService;
import com.nu.modules.tplink.project.service.IProjectInfoService;
import com.nu.modules.tplink.utils.TumsApi;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
@Slf4j
public class ProjectSyncJob implements Job {
@Autowired
IProjectInfoService service;
@Autowired
private TumsApi tumsApi;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String jsonRequest = "{\n" +
" \"start\": 0,\n" +
" \"limit\": 1000\n" +
"}";
String jsonResponse = tumsApi.getAllProjectInfo(jsonRequest);
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
service.sync(jsonResponse);
}else{
log.error("ProjectSyncJob:{}-{}", DateUtils.now(),jsonObject.getStr("msg"));
}
}
}

View File

@ -0,0 +1,26 @@
package com.nu.modules.tplink.project.mapper;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
/**
* @Description: 护理单元-物联管理-TPLINK项目信息
* @Author: jeecg-boot
* @Date: 2025-01-22
* @Version: V1.0
*/
public interface ProjectInfoMapper extends BaseMapper<ProjectInfo> {
ProjectInfo getByProjectId(Map<String, String> map);
List<ProjectInfo> findList(ProjectInfo projectInfo);
IPage<ProjectInfo> findPage(Page<ProjectInfo> page, @Param("params") ProjectInfo projectInfo);
int add(Map<String, String> map);
int updateById(Map<String, String> map);
int updateLeafByPId(Map<String, String> map);
List<ProjectInfo> queryTreeList();
}

View File

@ -0,0 +1,175 @@
<?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.nu.modules.tplink.project.mapper.ProjectInfoMapper">
<select id="getByProjectId" parameterType="java.util.Map" resultType="com.nu.modules.tplink.project.entity.ProjectInfo">
select id,
project_id as projectId,
project_name as projectName,
create_time as createTime,
device_num as deviceNum,
message_num as messageNum,
sort as sort,
offline_num as offlineNum,
abnormal_num as abnormalNum,
unread_message_num as unreadMessageNum,
total_nms_dev_num as totalNmsDevNum,
total_vms_dev_num as totalVmsDevNum,
total_nbs_dev_num as totalNbsDevNum,
offline_nms_dev_num as offlineNmsDevNum,
offline_vms_dev_num as offlineVmsDevNum,
offline_nbs_dev_num as offlineNbsDevNum,
running_time as runningTime
from nu_iot_tplink_project
where project_id = #{projectId}
</select>
<select id="findList" parameterType="com.nu.modules.tplink.project.entity.ProjectInfo" resultType="com.nu.modules.tplink.project.entity.ProjectInfo">
select id,
project_id as projectId,
project_name as projectName,
create_time as createTime,
device_num as deviceNum,
message_num as messageNum,
sort as sort,
offline_num as offlineNum,
abnormal_num as abnormalNum,
unread_message_num as unreadMessageNum,
total_nms_dev_num as totalNmsDevNum,
total_vms_dev_num as totalVmsDevNum,
total_nbs_dev_num as totalNbsDevNum,
offline_nms_dev_num as offlineNmsDevNum,
offline_vms_dev_num as offlineVmsDevNum,
offline_nbs_dev_num as offlineNbsDevNum,
running_time as runningTime,
status
from nu_iot_tplink_project
<where>
<if test="status!=null">
and status = #{status}
</if>
</where>
</select>
<select id="findPage" parameterType="com.nu.modules.tplink.project.entity.ProjectInfo" resultType="com.nu.modules.tplink.project.entity.ProjectInfo">
select id,
project_id as projectId,
project_name as projectName,
create_time as createTime,
DATE_FORMAT(FROM_UNIXTIME(create_time),'%Y-%m-%d %H:%i:%s') as createTimeStr,
device_num as deviceNum,
message_num as messageNum,
sort as sort,
offline_num as offlineNum,
abnormal_num as abnormalNum,
running_time as runningTime,
running_time DIV 86400 AS runningTimeStr,
status
from nu_iot_tplink_project
<where>
<if test="params.status!=null">
and status = #{params.status}
</if>
<if test="params.projectName != null and params.projectName != ''">
AND project_name LIKE concat('%',#{params.projectName},'%')
</if>
</where>
</select>
<insert id="add">
insert into nu_iot_tplink_project(
project_id,
project_name,
create_time,
device_num,
message_num,
sort,
offline_num,
abnormal_num,
unread_message_num,
total_nms_dev_num,
total_vms_dev_num,
total_nbs_dev_num,
offline_nms_dev_num,
offline_vms_dev_num,
offline_nbs_dev_num,
running_time,
status,
iz_leaf
)
values(
#{projectId},
#{projectName},
#{createTime},
#{deviceNum},
#{messageNum},
#{sort},
#{offlineNum},
#{abnormalNum},
#{unreadMessageNum},
#{totalNmsDevNum},
#{totalVmsDevNum},
#{totalNbsDevNum},
#{offlineNmsDevNum},
#{offlineVmsDevNum},
#{offlineNbsDevNum},
#{runningTime},
#{status},
1
)
</insert>
<update id="updateById">
update nu_iot_tplink_project
set
project_id = #{projectId},
project_name = #{projectName},
create_time = #{createTime},
device_num = #{deviceNum},
message_num = #{messageNum},
sort = #{sort},
offline_num = #{offlineNum},
abnormal_num = #{abnormalNum},
unread_message_num = #{unreadMessageNum},
total_nms_dev_num = #{totalNmsDevNum},
total_vms_dev_num = #{totalVmsDevNum},
total_nbs_dev_num = #{totalNbsDevNum},
offline_nms_dev_num = #{offlineNmsDevNum},
offline_vms_dev_num = #{offlineVmsDevNum},
offline_nbs_dev_num = #{offlineNbsDevNum},
running_time = #{runningTime}
where id = #{id}
</update>
<update id="updateLeafByPId">
update nu_iot_tplink_project
set iz_leaf = #{izLeaf}
where project_id = #{projectId}
</update>
<select id="queryTreeList" parameterType="com.nu.modules.tplink.project.entity.ProjectInfo" resultType="com.nu.modules.tplink.project.entity.ProjectInfo">
select id,
project_id as projectId,
project_name as projectName,
create_time as createTime,
device_num as deviceNum,
message_num as messageNum,
sort as sort,
offline_num as offlineNum,
abnormal_num as abnormalNum,
unread_message_num as unreadMessageNum,
total_nms_dev_num as totalNmsDevNum,
total_vms_dev_num as totalVmsDevNum,
total_nbs_dev_num as totalNbsDevNum,
offline_nms_dev_num as offlineNmsDevNum,
offline_vms_dev_num as offlineVmsDevNum,
offline_nbs_dev_num as offlineNbsDevNum,
running_time as runningTime,
status,
iz_leaf as izLeaf
from nu_iot_tplink_project
where status = 1
order by sort
</select>
</mapper>

View File

@ -0,0 +1,193 @@
package com.nu.modules.tplink.project.model;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.region.model.RegionTreeModel;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* <p>
* 项目表 存储项目结构数据的实体类
* <p>
*
* @Author 曹磊
* @Since 2025-02-27
*/
public class ProjectTreeModel implements Serializable{
private static final long serialVersionUID = 1L;
/** 对应ProjectInfo中的projectId字段,前端数据树中的key*/
private String key;
/** 对应ProjectInfo中的projectId字段,前端数据树中的value*/
private String value;
/** 对应ProjectInfo中的projectName字段,前端数据树中的title*/
private String title;
private boolean isLeaf;
private String type;
// 以下所有字段均与ProjectInfo相同
private String id;
private String projectId;
private String projectName;
private String order;
private Integer sort;
private List<RegionTreeModel> children = new ArrayList<>();
/**
* 将ProjectInfo对象转换成ProjectTreeModel对象
* @param projectInfo
*/
public ProjectTreeModel(ProjectInfo projectInfo) {
this.key = projectInfo.getProjectId();
this.value = projectInfo.getProjectId();
this.title = projectInfo.getProjectName();
this.type = "project";
this.id = "0";
this.projectId = projectInfo.getProjectId();
this.projectName = projectInfo.getProjectName();
this.order = projectInfo.getOrder();
this.sort = projectInfo.getSort();
if(0 == projectInfo.getIzLeaf()){
this.isLeaf = false;
}else{
this.isLeaf = true;
}
}
public boolean getIsLeaf() {
return isLeaf;
}
public void setIsLeaf(boolean isleaf) {
this.isLeaf = isleaf;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<RegionTreeModel> getChildren() {
return children;
}
public void setChildren(List<RegionTreeModel> children) {
if (children==null){
this.isLeaf=true;
}
this.children = children;
}
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
/**
* 重写equals方法
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ProjectTreeModel model = (ProjectTreeModel) o;
return Objects.equals(id, model.id) &&
Objects.equals(projectId, model.projectId) &&
Objects.equals(projectName, model.projectName) &&
Objects.equals(order, model.order) &&
Objects.equals(sort, model.sort) &&
Objects.equals(children, model.children);
}
/**
* 重写hashCode方法
*/
@Override
public int hashCode() {
return Objects.hash(id, projectId, projectName, order, sort, children);
}
}

View File

@ -0,0 +1,24 @@
package com.nu.modules.tplink.project.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.project.model.ProjectTreeModel;
import java.util.List;
/**
* @Description: 护理单元-物联管理-TPLINK项目信息
* @Author: jeecg-boot
* @Date: 2025-01-22
* @Version: V1.0
*/
public interface IProjectInfoService extends IService<ProjectInfo> {
Result sync();
void sync(String jsonResponse);
List<ProjectInfo> findList(ProjectInfo projectInfo);
IPage<ProjectInfo> findPage(Page<ProjectInfo> page, ProjectInfo projectInfo);
List<ProjectTreeModel> queryTreeList();
}

View File

@ -0,0 +1,131 @@
package com.nu.modules.tplink.project.service.impl;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.project.mapper.ProjectInfoMapper;
import com.nu.modules.tplink.project.model.ProjectTreeModel;
import com.nu.modules.tplink.project.service.IProjectInfoService;
import com.nu.modules.tplink.utils.TumsApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Description: 护理单元-物联管理-TPLINK项目信息
* @Author: jeecg-boot
* @Date: 2025-01-22
* @Version: V1.0
*/
@Service
@Slf4j
public class ProjectInfoServiceImpl extends ServiceImpl<ProjectInfoMapper, ProjectInfo> implements IProjectInfoService {
@Autowired
private TumsApi tumsApi;
/**
* 同步项目信息
* @return
*/
@Override
public Result sync(){
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"start\"").append(":0,");
sb.append("\"limit\"").append(":1000");
sb.append("}");
String jsonResponse = tumsApi.getAllProjectInfo(sb.toString());
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
sync(jsonResponse);
return Result.OK("同步项目成功!");
}else{
return Result.error(jsonObject.getStr("msg"));
}
}
/**
* 接口返回数据同步入库
* @param jsonResponse
*/
@Override
public void sync(String jsonResponse){
JSONObject jsonObject = new JSONObject(jsonResponse);
if(jsonObject.getInt("error_code").equals(0)){
JSONObject result = (JSONObject)jsonObject.get("result");
if(result.getInt("total")>0){
JSONArray list = result.getJSONArray("list");
for(int i=0;i<list.size();i++){
JSONObject voObject = (JSONObject)list.get(i);
Map<String, String> map = new HashMap<>();
for (String key : voObject.keySet()) {
map.put(key, voObject.getStr(key));
}
map.put("sort", map.get("order"));
ProjectInfo entity = baseMapper.getByProjectId(map);
if(entity==null){
//新增
map.put("status","1");
baseMapper.add(map);
}else{
//修改
map.put("id",String.valueOf(entity.getId()));
baseMapper.updateById(map);
}
}
}
}
}
/**
* TPLINK项目信息列表查询
*
* @param projectInfo
* @return
*/
@Override
public List<ProjectInfo> findList(ProjectInfo projectInfo){
return baseMapper.findList(projectInfo);
}
/**
* TPLINK项目信息分页列表查询
*
* @param page
* @param projectInfo
* @return
*/
@Override
public IPage<ProjectInfo> findPage(Page<ProjectInfo> page,ProjectInfo projectInfo){
return baseMapper.findPage(page,projectInfo);
}
/**
* 查询项目treeList
*
*/
@Override
public List<ProjectTreeModel> queryTreeList(){
List<ProjectTreeModel> records = new ArrayList<>();
List<ProjectInfo> list = baseMapper.queryTreeList();
for (int i = 0; i < list.size(); i++) {
ProjectInfo project = list.get(i);
ProjectTreeModel treeModel = new ProjectTreeModel(project);
records.add(treeModel);
}
return records;
}
}

View File

@ -0,0 +1,89 @@
/**
* Versionv1.0.0 ,
* DescriptionTP-LINK厂家区域信息相关操作
* CreateDate2025-02-20 09:00:00
* Author曹磊
*/
package com.nu.modules.tplink.region.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.base.controller.JeecgController;
import com.nu.modules.tplink.region.entity.RegionInfo;
import com.nu.modules.tplink.region.model.RegionTreeModel;
import com.nu.modules.tplink.region.service.IRegionInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
* @Description: 护理单元-物联管理-TPLINK区域信息
* @Author: jeecg-boot
* @Date: 2025-02-20
* @Version: V1.0
*/
@Api(tags="护理单元-物联管理-TPLINK区域信息")
@RestController
@RequestMapping("/iot/regionInfo")
@Slf4j
public class RegionInfoController extends JeecgController<RegionInfo, IRegionInfoService> {
@Autowired
private IRegionInfoService service;
/**
* 分页列表查询
*
* @param regionInfo
* @param pageNo
* @param pageSize
* @param req
* @return
*/
//@AutoLog(value = "护理单元-物联管理-TPLINK项目信息-分页列表查询")
@ApiOperation(value="护理单元-物联管理-TPLINK项目信息-分页列表查询", notes="护理单元-物联管理-TPLINK项目信息-分页列表查询")
@GetMapping(value = "/list")
public Result<IPage<RegionInfo>> queryPageList(RegionInfo regionInfo,
@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
HttpServletRequest req) {
Page<RegionInfo> page = new Page<RegionInfo>(pageNo, pageSize);
IPage<RegionInfo> pageList = service.findPage(page, regionInfo);
return Result.OK(pageList);
}
/**
* 同步区域信息
*
* @return
*/
@GetMapping(value = "/sync")
public Result getUploadToServerProcess(RegionInfo regionInfo)throws Exception{
return service.sync(regionInfo);
}
/**
* 异步查询区域list
* @param parentId 父节点 异步加载时传递
* @return
*/
@RequestMapping(value = "/queryRegionTreeSync", method = RequestMethod.GET)
public Result<List<RegionTreeModel>> queryDepartTreeSync(@RequestParam(name = "parentId", required = false) String parentId, @RequestParam(name = "projectId", required = false) String projectId) {
Result<List<RegionTreeModel>> result = new Result<>();
try {
List<RegionTreeModel> list = service.queryTreeListByPid(parentId,projectId);
result.setResult(list);
result.setSuccess(true);
} catch (Exception e) {
log.error(e.getMessage(),e);
result.setSuccess(false);
result.setMessage("查询失败");
}
return result;
}
}

View File

@ -0,0 +1,109 @@
package com.nu.modules.tplink.region.entity;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.jeecgframework.poi.excel.annotation.Excel;
import java.io.Serializable;
/**
* @Description: 护理单元-物联管理-TPLINK区域信息
* @Author: jeecg-boot
* @Date: 2025-02-20
* @Version: V1.0
*/
@Data
@TableName("nu_iot_tplink_region")
@Accessors(chain = true)
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="nu_iot_tplink_region对象", description="护理单元-物联管理-TPLINK区域信息")
public class RegionInfo implements Serializable {
private static final long serialVersionUID = 1L;
/**ID*/
@TableId(type = IdType.AUTO)
@ApiModelProperty(value = "ID")
private Integer id;
/**区域ID*/
@Excel(name = "区域ID", width = 15)
@ApiModelProperty(value = "区域ID")
private String regionId;
/**区域名称*/
@Excel(name = "区域名称", width = 15)
@ApiModelProperty(value = "区域名称")
private String regionName;
/**区域层级*/
@Excel(name = "区域层级", width = 15)
@ApiModelProperty(value = "区域层级")
private String regionLevel;
/**区域次序接口对应字段在数据库中是关键字数据库中用sort代替order*/
@ApiModelProperty(value = "项目次序")
@TableField(exist = false)
private String order;
/**项目次序*/
@Excel(name = "项目次序", width = 15)
@ApiModelProperty(value = "项目次序")
private Integer sort;
/**父区域ID*/
@Excel(name = "父区域ID", width = 15)
@ApiModelProperty(value = "父区域ID")
private String parentId;
/**父区域ID*/
@Excel(name = "父区域", width = 15)
@ApiModelProperty(value = "父区域")
@TableField(exist = false)
private String parentName;
/**项目ID*/
@Excel(name = "项目ID", width = 15)
@ApiModelProperty(value = "项目ID")
private String projectId;
/**项目名称*/
@Excel(name = "项目名称", width = 15)
@ApiModelProperty(value = "项目名称")
@TableField(exist = false)
private String projectName;
/**系统类型*/
@Excel(name = "系统类型", width = 15)
@ApiModelProperty(value = "系统类型")
private String sysType;
/**流道*/
@Excel(name = "流道", width = 15)
@ApiModelProperty(value = "流道")
private String streamWay;
/**是否有子区域*/
@Excel(name = "是否有子区域", width = 15)
@ApiModelProperty(value = "是否有子区域 0无 1有")
private String hasChildren;
/**区域类型*/
@Excel(name = "区域类型", width = 15)
@ApiModelProperty(value = "区域类型")
private String regionType;
/**更新时间*/
@Excel(name = "更新时间", width = 15)
@ApiModelProperty(value = "更新时间,年月日时分秒")
private String updateTime;
/**流媒体服务器ID*/
@Excel(name = "流媒体服务器ID", width = 15)
@ApiModelProperty(value = "流媒体服务器ID")
private String mediaServerId;
/**备用流媒体服务器ID*/
@Excel(name = "备用流媒体服务器ID", width = 15)
@ApiModelProperty(value = "备用流媒体服务器ID")
private String backupMediaServerId;
/**绑定类型*/
@Excel(name = "绑定类型", width = 15)
@ApiModelProperty(value = "绑定类型 0:设备直接取流/流媒体转发模式1: 自动模式")
private String bindType;
/**是否有叶子节点: 1是0否*/
@Excel(name = "是否有叶子节点: 1是0否", width = 15)
@ApiModelProperty(value = "是否有叶子节点: 1是0否")
private Integer izLeaf;
}

View File

@ -0,0 +1,55 @@
package com.nu.modules.tplink.region.job;
import cn.hutool.json.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.DateUtils;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.project.service.IProjectInfoService;
import com.nu.modules.tplink.region.service.IRegionInfoService;
import com.nu.modules.tplink.utils.TumsApi;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
* 区域信息同步
*/
@Slf4j
public class RegionSyncJob implements Job {
@Autowired
IRegionInfoService service;
@Autowired
IProjectInfoService pService;
@Autowired
private TumsApi tumsApi;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
ProjectInfo pi = new ProjectInfo();
pi.setStatus(1);//正常状态
List<ProjectInfo> projectList = pService.findList(pi);
if(projectList!=null&&projectList.size()>0){
for(int i=0;i< projectList.size();i++){
ProjectInfo projectInfo = projectList.get(i);
String jsonRequest = "{\n" +
" \"projectId\": \""+projectInfo.getProjectId()+"\",\n"+
" \"sysType\": 3\n"+
"}";
// System.out.println(jsonRequest);
String jsonResponse = tumsApi.getRootRegions(jsonRequest);
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
service.sync(jsonResponse);
}else{
log.error("RegionSyncJob:{}-{}", DateUtils.now(),jsonObject.getStr("msg"));
}
}
}
}
}

View File

@ -0,0 +1,24 @@
package com.nu.modules.tplink.region.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import com.nu.modules.tplink.region.entity.RegionInfo;
import java.util.List;
import java.util.Map;
/**
* @Description: 护理单元-物联管理-TPLINK区域信息
* @Author: jeecg-boot
* @Date: 2025-02-20
* @Version: V1.0
*/
public interface RegionInfoMapper extends BaseMapper<RegionInfo> {
RegionInfo getByRegionId(Map<String, String> map);
List<RegionInfo> findList(RegionInfo regionInfo);
IPage<RegionInfo> findPage(Page<RegionInfo> page, @Param("params") RegionInfo regionInfo);
int add(Map<String, String> map);
int updateById(Map<String, String> map);
List<RegionInfo> queryTreeListByPid(String parentId,String projectId);
}

View File

@ -0,0 +1,156 @@
<?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.nu.modules.tplink.region.mapper.RegionInfoMapper">
<select id="getByRegionId" parameterType="java.util.Map" resultType="com.nu.modules.tplink.region.entity.RegionInfo">
select id,
region_id as regionId,
region_name as regionName,
region_level as regionLevel,
sort,
parent_id as parentId,
project_id as projectId,
sys_type as sysType,
stream_way as streamWay,
has_children as hasChildren,
region_type as regionType,
update_time as updateTime,
media_server_id as mediaServerId,
backup_media_server_id as backupMediaServerId,
bind_type as bindType
from nu_iot_tplink_region
where region_id = #{regionId}
</select>
<select id="findList" parameterType="com.nu.modules.tplink.region.entity.RegionInfo" resultType="com.nu.modules.tplink.region.entity.RegionInfo">
select a.id,
a.region_id as regionId,
a.region_name as regionName,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
b.project_name as projectName,
a.project_id as projectId,
a.sys_type as sysType,
a.stream_way as streamWay,
a.has_children as hasChildren,
a.region_type as regionType,
a.update_time as updateTime,
a.media_server_id as mediaServerId,
a.backup_media_server_id as backupMediaServerId,
a.bind_type as bindType
from nu_iot_tplink_region a
left join nu_iot_tplink_project b on a.project_id = b.project_id
<where>
<if test="projectId != null and projectId != ''">
and a.project_id = #{projectId}
</if>
</where>
</select>
<select id="findPage" parameterType="com.nu.modules.tplink.region.entity.RegionInfo" resultType="com.nu.modules.tplink.region.entity.RegionInfo">
select a.id,
a.region_id as regionId,
a.region_name as regionName,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
b.project_name as projectName,
a.project_id as projectId,
a.sys_type as sysType,
a.stream_way as streamWay,
a.has_children as hasChildren,
a.region_type as regionType,
DATE_FORMAT(FROM_UNIXTIME(a.update_time/1000),'%Y-%m-%d %H:%i:%s') as updateTime,
a.media_server_id as mediaServerId,
a.backup_media_server_id as backupMediaServerId,
a.bind_type as bindType
from nu_iot_tplink_region a
left join nu_iot_tplink_project b on a.project_id = b.project_id
<where>
<if test="params.projectId != null and params.projectId != ''">
and a.project_id = #{params.projectId}
</if>
</where>
</select>
<insert id="add">
insert into nu_iot_tplink_region(
region_id,
region_name,
region_level,
sort,
parent_id,
project_id,
sys_type,
stream_way,
has_children,
region_type,
update_time,
media_server_id,
backup_media_server_id,
bind_type
)
values(
#{regionId},
#{regionName},
#{regionLevel},
#{sort},
#{parentId},
#{projectId},
#{sysType},
#{streamWay},
#{hasChildren},
#{regionType},
#{updateTime},
#{mediaServerId},
#{backupMediaServerId},
#{bindType}
)
</insert>
<update id="updateById">
update nu_iot_tplink_region
set
region_id = #{regionId},
region_name = #{regionName},
region_level = #{regionLevel},
sort = #{sort},
parent_id = #{parentId},
project_id = #{projectId},
sys_type = #{sysType},
stream_way = #{streamWay},
has_children = #{hasChildren},
region_type = #{regionType},
update_time = #{updateTime},
media_server_id = #{mediaServerId},
backup_media_server_id = #{backupMediaServerId},
bind_type = #{bindType}
where id = #{id}
</update>
<select id="queryTreeListByPid" parameterType="com.nu.modules.tplink.region.entity.RegionInfo" resultType="com.nu.modules.tplink.region.entity.RegionInfo">
select a.id,
a.region_id as regionId,
a.region_name as regionName,
a.region_level as regionLevel,
a.sort,
a.parent_id as parentId,
b.project_name as projectName,
a.project_id as projectId,
a.sys_type as sysType,
a.stream_way as streamWay,
a.has_children as hasChildren,
a.region_type as regionType,
a.update_time as updateTime,
a.media_server_id as mediaServerId,
a.backup_media_server_id as backupMediaServerId,
a.bind_type as bindType,
a.iz_leaf as izLeaf
from nu_iot_tplink_region a
left join nu_iot_tplink_project b on a.project_id = b.project_id
where a.parent_id = #{parentId}
and a.project_id = #{projectId}
</select>
</mapper>

View File

@ -0,0 +1,352 @@
package com.nu.modules.tplink.region.model;
import com.nu.modules.tplink.region.entity.RegionInfo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* <p>
* 区域表 存储区域结构数据的实体类
* <p>
*
* @Author 曹磊
* @Since 2025-02-27
*/
public class RegionTreeModel implements Serializable{
private static final long serialVersionUID = 1L;
/** 对应SysDepart中的id字段,前端数据树中的key*/
private String key;
/** 对应SysDepart中的id字段,前端数据树中的value*/
private String value;
/** 对应depart_name字段,前端数据树中的title*/
private String title;
private boolean isLeaf;
private String type;
// 以下所有字段均与RegionInfo相同
private String id;
private String regionId;
private String regionName;
private String regionLevel;
private String order;
private Integer sort;
private String parentId;
private String parentName;
private String projectId;
private String projectName;
private String sysType;
private String streamWay;
private String hasChildren;
private String regionType;
private String updateTime;
private String mediaServerId;
private String backupMediaServerId;
private String bindType;
private List<RegionTreeModel> children = new ArrayList<>();
/**
* 将RegionInfo对象转换成RegionTreeModel对象
* @param regionInfo
*/
public RegionTreeModel(RegionInfo regionInfo) {
this.key = regionInfo.getRegionId();
this.value = regionInfo.getRegionId();
this.title = regionInfo.getRegionName();
this.type = "region";
this.id = regionInfo.getRegionId();
this.regionId = regionInfo.getRegionId();
this.regionName = regionInfo.getRegionName();
this.regionLevel = regionInfo.getRegionLevel();
this.order = regionInfo.getOrder();
this.sort = regionInfo.getSort();
this.parentId = regionInfo.getParentId();
this.parentName = regionInfo.getParentName();
this.projectId = regionInfo.getProjectId();
this.projectName = regionInfo.getProjectName();
this.sysType = regionInfo.getSysType();
this.streamWay = regionInfo.getStreamWay();
this.hasChildren = regionInfo.getHasChildren();
this.regionType = regionInfo.getRegionType();
this.updateTime = regionInfo.getUpdateTime();
this.mediaServerId = regionInfo.getMediaServerId();
this.backupMediaServerId = regionInfo.getBackupMediaServerId();
this.bindType = regionInfo.getBindType();
if(0 == regionInfo.getIzLeaf()){
this.isLeaf = false;
}else{
this.isLeaf = true;
}
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public boolean getIsLeaf() {
return isLeaf;
}
public void setIsLeaf(boolean isleaf) {
this.isLeaf = isleaf;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public List<RegionTreeModel> getChildren() {
return children;
}
public void setChildren(List<RegionTreeModel> children) {
if (children==null){
this.isLeaf=true;
}
this.children = children;
}
public String getRegionId() {
return regionId;
}
public void setRegionId(String regionId) {
this.regionId = regionId;
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public String getRegionName() {
return regionName;
}
public void setRegionName(String regionName) {
this.regionName = regionName;
}
public String getRegionLevel() {
return regionLevel;
}
public void setRegionLevel(String regionLevel) {
this.regionLevel = regionLevel;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public Integer getSort() {
return sort;
}
public void setSort(Integer sort) {
this.sort = sort;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public String getParentName() {
return parentName;
}
public void setParentName(String parentName) {
this.parentName = parentName;
}
public String getProjectId() {
return projectId;
}
public void setProjectId(String projectId) {
this.projectId = projectId;
}
public String getProjectName() {
return projectName;
}
public void setProjectName(String projectName) {
this.projectName = projectName;
}
public String getSysType() {
return sysType;
}
public void setSysType(String sysType) {
this.sysType = sysType;
}
public String getStreamWay() {
return streamWay;
}
public void setStreamWay(String streamWay) {
this.streamWay = streamWay;
}
public String getHasChildren() {
return hasChildren;
}
public void setHasChildren(String hasChildren) {
this.hasChildren = hasChildren;
}
public String getRegionType() {
return regionType;
}
public void setRegionType(String regionType) {
this.regionType = regionType;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getMediaServerId() {
return mediaServerId;
}
public void setMediaServerId(String mediaServerId) {
this.mediaServerId = mediaServerId;
}
public String getBackupMediaServerId() {
return backupMediaServerId;
}
public void setBackupMediaServerId(String backupMediaServerId) {
this.backupMediaServerId = backupMediaServerId;
}
public String getBindType() {
return bindType;
}
public void setBindType(String bindType) {
this.bindType = bindType;
}
/**
* 重写equals方法
*/
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
RegionTreeModel model = (RegionTreeModel) o;
return Objects.equals(id, model.id) &&
Objects.equals(regionId, model.regionId) &&
Objects.equals(regionName, model.regionName) &&
Objects.equals(regionLevel, model.regionLevel) &&
Objects.equals(order, model.order) &&
Objects.equals(sort, model.sort) &&
Objects.equals(parentId, model.parentId) &&
Objects.equals(parentName, model.parentName) &&
Objects.equals(projectId, model.projectId) &&
Objects.equals(projectName, model.projectName) &&
Objects.equals(sysType, model.sysType) &&
Objects.equals(streamWay, model.streamWay) &&
Objects.equals(hasChildren, model.hasChildren) &&
Objects.equals(regionType, model.regionType) &&
Objects.equals(updateTime, model.updateTime) &&
Objects.equals(mediaServerId, model.mediaServerId) &&
Objects.equals(backupMediaServerId, model.backupMediaServerId) &&
Objects.equals(bindType, model.bindType) &&
Objects.equals(children, model.children);
}
/**
* 重写hashCode方法
*/
@Override
public int hashCode() {
return Objects.hash(id, regionId, regionName, regionLevel, order,
sort, parentId, parentName, projectId, projectName, sysType, streamWay, hasChildren,
regionType, updateTime, mediaServerId, backupMediaServerId, bindType,
children);
}
}

View File

@ -0,0 +1,24 @@
package com.nu.modules.tplink.region.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.jeecg.common.api.vo.Result;
import com.nu.modules.tplink.region.entity.RegionInfo;
import com.nu.modules.tplink.region.model.RegionTreeModel;
import java.util.List;
/**
* @Description: 护理单元-物联管理-TPLINK区域信息
* @Author: jeecg-boot
* @Date: 2025-01-22
* @Version: V1.0
*/
public interface IRegionInfoService extends IService<RegionInfo> {
Result sync(RegionInfo regionInfo);
void sync(String jsonResponse);
List<RegionInfo> findList(RegionInfo regionInfo);
IPage<RegionInfo> findPage(Page<RegionInfo> page, RegionInfo regionInfo);
List<RegionTreeModel> queryTreeListByPid(String parentId,String projectId);
}

View File

@ -0,0 +1,146 @@
package com.nu.modules.tplink.region.service.impl;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import com.nu.modules.tplink.project.entity.ProjectInfo;
import com.nu.modules.tplink.project.mapper.ProjectInfoMapper;
import com.nu.modules.tplink.project.model.ProjectTreeModel;
import com.nu.modules.tplink.region.entity.RegionInfo;
import com.nu.modules.tplink.region.mapper.RegionInfoMapper;
import com.nu.modules.tplink.region.model.RegionTreeModel;
import com.nu.modules.tplink.region.service.IRegionInfoService;
import com.nu.modules.tplink.utils.TumsApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @Description: 护理单元-物联管理-TPLINK区域信息
* @Author: jeecg-boot
* @Date: 2025-02-20
* @Version: V1.0
*/
@Service
@Slf4j
public class RegionInfoServiceImpl extends ServiceImpl<RegionInfoMapper, RegionInfo> implements IRegionInfoService {
@Autowired
private TumsApi tumsApi;
@Autowired
private ProjectInfoMapper projectInfoMapper;
/**
* 同步区域信息
* @return
*/
@Override
public Result sync(RegionInfo regionInfo){
StringBuffer sb = new StringBuffer();
sb.append("{");
sb.append("\"projectId\"").append(":").append("\"").append(regionInfo.getProjectId()).append("\",");
sb.append("\"sysType\"").append(":3");
sb.append("}");
String jsonResponse = tumsApi.getRootRegions(sb.toString());
JSONObject jsonObject = new JSONObject(jsonResponse);
String errorCode = jsonObject.getStr("error_code");
if(errorCode.equals("0")){
sync(jsonResponse);
return Result.OK("同步区域成功!");
}else{
return Result.error(jsonObject.getStr("msg"));
}
}
/**
* 接口返回数据同步入库
* @param jsonResponse
*/
@Override
public void sync(String jsonResponse){
JSONObject jsonObject = new JSONObject(jsonResponse);
if(jsonObject.getInt("error_code").equals(0)){
JSONArray list = jsonObject.getJSONArray("result");
for(int i=0;i<list.size();i++){
JSONObject voObject = (JSONObject)list.get(i);
Map<String, String> map = new HashMap<>();
for (String key : voObject.keySet()) {
map.put(key, voObject.getStr(key));
}
map.put("sort", map.get("order"));
String hasChildren = map.get("hasChildren");
if(hasChildren.equals("0")){
map.put("izLeaf", "1");
}else{
map.put("izLeaf", "0");
}
RegionInfo entity = baseMapper.getByRegionId(map);
if(entity==null){
//新增
baseMapper.add(map);
}else{
//修改
map.put("id",String.valueOf(entity.getId()));
baseMapper.updateById(map);
}
String projectId = map.get("projectId");
if(projectId!=null&&!("").equals(projectId)){
Map<String, String> projectMap = new HashMap<>();
projectMap.put("projectId", map.get("projectId"));
projectMap.put("izLeaf", "0");
projectInfoMapper.updateLeafByPId(projectMap);
}
}
}
}
/**
* TPLINK项目信息列表查询
*
* @param regionInfo
* @return
*/
@Override
public List<RegionInfo> findList(RegionInfo regionInfo){
return baseMapper.findList(regionInfo);
}
/**
* TPLINK项目信息分页列表查询
*
* @param page
* @param regionInfo
* @return
*/
@Override
public IPage<RegionInfo> findPage(Page<RegionInfo> page,RegionInfo regionInfo){
return baseMapper.findPage(page,regionInfo);
}
/**
* 查询区域treeList
*
* @param parentId
* @return
*/
@Override
public List<RegionTreeModel> queryTreeListByPid(String parentId,String projectId){
List<RegionTreeModel> records = new ArrayList<>();
List<RegionInfo> list = baseMapper.queryTreeListByPid(parentId,projectId);
for (int i = 0; i < list.size(); i++) {
RegionInfo region = list.get(i);
RegionTreeModel treeModel = new RegionTreeModel(region);
records.add(treeModel);
}
return records;
}
}

View File

@ -0,0 +1,23 @@
package com.nu.modules.tplink.utils;
import org.jeecg.common.api.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/iot/test")
public class TestUtil {
@Autowired
private TumsApi tumsApi;
@GetMapping(value = "/login")
public Result login() {
tumsApi.login();
tumsApi.logout();
return Result.OK();
}
}

View File

@ -0,0 +1,368 @@
package com.nu.modules.tplink.utils;
import com.tplink.ignite.libs.developersdk.api.TumsClient;
import com.tplink.ignite.libs.developersdk.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import com.nu.modules.tplink.enums.ApiEnum;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
@Slf4j
public class TumsApi {
@Resource
TumsConfig tumsConfig;
TumsClient tumsClient;
/**
* 创建tumsClient
* @return
*/
public TumsClient createTumsClient(){
if(this.tumsClient==null){
login();
}
return this.tumsClient;
}
/**
* 销毁tumsClient
*/
public void destroyTumsClient(){
if(this.tumsClient!=null){
logout();
}
}
/**
* 登录
* @return
*/
public void login(){
TumsClient tc = new TumsClient(tumsConfig.getUsername(), tumsConfig.getPassword(), tumsConfig.getUrl());
ResultVO loginResult = tc.login();
// 判断是否登录成功
if (loginResult.getErrorCode() != 0) {
log.error("login fail, fail message:[{}]", loginResult.getMsg());
tumsClient = null;
} else {
log.info("login success");
String cookie = tc.getCookie();
String rsaKey = tc.getRsaKey();
log.info("cookie",cookie);
log.info("rsaKey",rsaKey);
tumsClient = tc;
}
}
/**
* 注销
*/
public void logout(){
ResultVO logoutResult = tumsClient.logout();
if (logoutResult.getErrorCode() != 0) {
log.error("logout fail, errorCode:{}", logoutResult.getErrorCode());
} else {
log.info("logout success");
tumsClient = null;
}
}
/**
* 设置当前项目
* @param jsonRequest
* @return
*/
public String setCurrentProject(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.SET_CURRENT_PROJECT.getValue());
// log.info("setCurrentProject:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取所有项目信息
* @param jsonRequest
* @return
*/
public String getAllProjectInfo(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.GET_ALL_PROJECT_INFO.getValue());
// log.info("getAllProjectInfo:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取区域列表
* @param jsonRequest
* @return
*/
public String getRootRegions(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.GET_ROOT_REGIONS.getValue());
log.info("getAllProjectInfo:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取设备列表
* @param jsonRequest
* @return
*/
public String getDeviceList(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.GET_DEVICE_LIST.getValue());
// log.info("getDeviceList:{}",jsonResponse);
return jsonResponse;
}
/**
* 修改设备信息
* @param jsonRequest
* @return
*/
public String modifyDeviceDetails(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.MODIFY_DEVICE_DETAILS.getValue());
// log.info("modifyDeviceDetails:{}",jsonResponse);
return jsonResponse;
}
/**
* 重启设备
* @param jsonRequest
* @return
*/
public String rebootDeviceList(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.REBOOT_DEVICE_LIST.getValue());
// log.info("rebootDeviceList:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取告警列表
* @param jsonRequest
* @return
*/
public String getAlarmLog(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.QUERY_ALARM_LOG.getValue());
// log.info("getAlarmLog:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取ipc能力集
* @param jsonRequest
* @return
*/
public String getIpcCapability(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_IPC_CAPABILITY.getValue());
// log.info("getIpcCapability:{}",jsonResponse);
return jsonResponse;
}
/**
* 设备配置信息
* @param jsonRequest
* @return
*/
public String passthrough(String jsonRequest){
log.info("passthrough:request:{}",jsonRequest);
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_PASSTHROUGH.getValue());
log.info("passthrough:response:{}",jsonResponse);
return jsonResponse;
}
/**
* 添加预览通道
* @param jsonRequest
* @return
*/
public String addPreviewChn(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_ADD_PREVIEW_CHN.getValue());
// log.info("addPreviewChn:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取预览通道的url
* @param jsonRequest
* @return
*/
public String getPreviewUrl(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_PREVIEW_URL.getValue());
// log.info("getPreviewUrl:{}",jsonResponse);
return jsonResponse;
}
/**
* 搜索存在回放录像的日期
* @param jsonRequest
* @return
*/
public String searchYear(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_SEARCH_YEAR.getValue());
// log.info("searchYear:{}",jsonResponse);
return jsonResponse;
}
/**
* 搜索当天的录像数据
* @param jsonRequest
* @return
*/
public String searchVideo(String jsonRequest){
log.info("searchVideo:request:{}",jsonRequest);
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_SEARCH_VIDEO.getValue());
log.info("searchVideo:response:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取指定监控点的存储设备列表
* @param jsonRequest
* @return
*/
public String getStoragesById(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_STORAGES_BY_ID.getValue());
log.info("getStoragesById:{}",jsonResponse);
return jsonResponse;
}
/**
* 添加回放通道V2
* @param jsonRequest
* @return
*/
public String addPlaybackChn(String jsonRequest){
this.createTumsClient();
log.info("addPlaybackChn:request:{}",jsonRequest);
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_ADD_PLAYBACK_CHN.getValue());
log.info("addPlaybackChn:response:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取回放通道的url
* @param jsonRequest
* @return
*/
public String getPlaybackUrl(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_PLAYBACK_URL.getValue());
log.info("getPlaybackUrl:{}",jsonResponse);
return jsonResponse;
}
/**
* 删除回放通道
* @param jsonRequest
* @return
*/
public String deletePlaybackChn(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_DELETE_PLAYBACK_CHN.getValue());
log.info("deletePlaybackChn:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取nvmp设备双向通信URL
* @param jsonRequest
* @return
*/
public String getMultitransUrl(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_MULTITRANS_URL.getValue());
log.info("getMultitransUrl:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取录像配置
* @param jsonRequest
* @return
*/
public String getRecordCfgs(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_RECORD_CFGS.getValue());
log.info("getRecordCfgs:{}",jsonResponse);
return jsonResponse;
}
/**
* 设置录像计划
* @param jsonRequest
* @return
*/
public String setRecordCfgs(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_SET_RECORD_CFGS.getValue());
log.info("setRecordCfgs:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取批量操作录像计划进度
* @param jsonRequest
* @return
*/
public String getBatchProgress(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_BATCH_PROGRESS.getValue());
log.info("getBatchProgress:{}",jsonResponse);
return jsonResponse;
}
/**
* 回放视频转mp4上传
* @param jsonRequest
* @return
*/
public String uploadToServer(String jsonRequest){
this.createTumsClient();
log.info("uploadToServer:request:{}",jsonRequest);
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_UPLOAD_TO_SERVER.getValue());
log.info("uploadToServer:response:{}",jsonResponse);
return jsonResponse;
}
/**
* 停止转存MP4上传任务
* @param jsonRequest
* @return
*/
public String stopUploadToServer(String jsonRequest){
this.createTumsClient();
log.info("stopUploadToServer:request:{}",jsonRequest);
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_STOP_UPLOAD_TO_SERVER.getValue());
log.info("stopUploadToServer:response:{}",jsonResponse);
return jsonResponse;
}
/**
* 获取转存MP4上传任务进度
* @param jsonRequest
* @return
*/
public String getUploadToServerProcess(String jsonRequest){
this.createTumsClient();
String jsonResponse = tumsClient.request(jsonRequest, ApiEnum.IPC_GET_UPLOAD_TO_SERVER_PROCESS.getValue());
log.info("getUploadToServerProcess:{}",jsonResponse);
return jsonResponse;
}
}

View File

@ -0,0 +1,29 @@
package com.nu.modules.tplink.utils;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
@Data
public class TumsConfig {
@Value("${tplink.tums.url}")
private String url; //获取图门系统地址
@Value("${tplink.tums.username}")
private String username; // 获取图门系统用户
@Value("${tplink.tums.password}")
private String password; //获取图门系统密码
@Value("${tplink.ftp.ip}")
private String ftpIp; //回放视频转FTP上传IP
@Value("${tplink.ftp.port}")
private String ftpPort; //回放视频转FTP上传端口
@Value("${tplink.ftp.username}")
private String ftpUsername; //回放视频转FTP上传用户
@Value("${tplink.ftp.password}")
private String ftpPassword; //回放视频转FTP上传密码
@Value("${tplink.ftp.uploadpath}")
private String ftpUploadpath; //回放视频转FTP上传路径
}

View File

@ -337,3 +337,15 @@ justauth:
type: default
prefix: 'demo::'
timeout: 1h
#tplink登录信息
tplink:
tums:
url: https://121.36.88.64:8888
username: admin
password: Bl20230518
ftp:
ip: 1.92.152.160
port: 21
username: administrator
password: Root@123..
uploadpath: /