Commit aac981f3 authored by chenfm's avatar chenfm

Merge remote-tracking branch 'origin/chenfm' into chenfm

parents 7d773f3a ffa9caa3
package com.esv.datacenter.iot.common.component; package com.esv.datacenter.iot.common.component;
import com.esv.datacenter.iot.module.datamodel.service.DataModelAlarmRuleService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner; import org.springframework.boot.ApplicationRunner;
...@@ -22,8 +24,21 @@ public class ApplicationLoadRunner implements ApplicationRunner { ...@@ -22,8 +24,21 @@ public class ApplicationLoadRunner implements ApplicationRunner {
@Value("${spring.application.name}") @Value("${spring.application.name}")
private String applicationName; private String applicationName;
@Autowired
private DataModelAlarmRuleService dataModelAlarmRuleService;
@Override @Override
public void run(ApplicationArguments var) { public void run(ApplicationArguments var) {
log.info("-------------------- [{}]初始化完成 --------------------", applicationName); log.info("-------------------- [{}]初始化完成 --------------------", applicationName);
// 初始化缓存数据模型告警规则
try {
dataModelAlarmRuleService.cacheInitAlarmRule();
log.info("-------------------- 缓存数据模型告警规则初始化成功 --------------------");
} catch (Exception e) {
log.error("-------------------- 缓存数据模型告警规则初始化失败 --------------------");
log.error(e.getMessage(), e);
}
} }
} }
\ No newline at end of file
...@@ -2,6 +2,7 @@ package com.esv.datacenter.iot.common.component; ...@@ -2,6 +2,7 @@ package com.esv.datacenter.iot.common.component;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -126,6 +127,24 @@ public class RedisComponent { ...@@ -126,6 +127,24 @@ public class RedisComponent {
} }
} }
/**
* @description 普通缓存放入(缓存时间不过期,慎用!!!)
* @param key:
* @param value:
* @return boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 19:27
**/
public boolean set(String key, Object value) {
try {
redisTemplate.opsForValue().set(key, value);
return true;
} catch (Exception e) {
log.error(e.getMessage(), e);
return false;
}
}
/** /**
* 递增 * 递增
* *
......
package com.esv.datacenter.iot.common.component; package com.esv.datacenter.iot.common.component;
import com.esv.datacenter.iot.common.util.DateUtils;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelPropertyEntity; import com.esv.datacenter.iot.module.datamodel.entity.DataModelPropertyEntity;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import io.micrometer.core.instrument.util.TimeUtils;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -186,6 +188,18 @@ public class TimescaleComponent { ...@@ -186,6 +188,18 @@ public class TimescaleComponent {
case "number": case "number":
sb.append(defaultValue); sb.append(defaultValue);
break; break;
case "integer":
sb.append(defaultValue);
break;
case "date":
sb.append("'").append(defaultValue).append("'::date");
break;
case "time":
sb.append(DateUtils.getMilliSecondsOfDay(defaultValue));
break;
case "datetime":
sb.append("'").append(defaultValue).append("'");
break;
default: default:
sb.append("'").append(defaultValue).append("'::text"); sb.append("'").append(defaultValue).append("'::text");
break; break;
...@@ -201,9 +215,9 @@ public class TimescaleComponent { ...@@ -201,9 +215,9 @@ public class TimescaleComponent {
StringBuffer sb = new StringBuffer(); StringBuffer sb = new StringBuffer();
sb.append("CREATE INDEX ") sb.append("CREATE INDEX ")
.append(table) .append(table)
.append("_instance_id_idx ON ") .append("_device_id_idx ON ")
.append(table) .append(table)
.append(" (instance_id);"); .append(" (device_id);");
return sb.toString(); return sb.toString();
} }
......
...@@ -6,6 +6,7 @@ import org.joda.time.format.DateTimeFormat; ...@@ -6,6 +6,7 @@ import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter; import org.joda.time.format.DateTimeFormatter;
import java.util.Date; import java.util.Date;
import java.util.Objects;
/** /**
* @description: 日期工具类 * @description: 日期工具类
...@@ -321,4 +322,101 @@ public class DateUtils { ...@@ -321,4 +322,101 @@ public class DateUtils {
DateTime dateTime = new DateTime(target); DateTime dateTime = new DateTime(target);
return dateTime.isAfter(startTime.getTime()) && dateTime.isBefore(endTime.getTime()); return dateTime.isAfter(startTime.getTime()) && dateTime.isBefore(endTime.getTime());
} }
/**
* @description 判断是否有效日期时间(yyyy-MM-dd HH:mm:ss)
* @param dateTimeStr:
* @param format:
* @return boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 16:21
**/
public static boolean isValidDatetime(String dateTimeStr, String format) {
if (Objects.isNull(StringUtils.trimToNull(format))) {
format = DATE_FORMAT1;
}
try {
Date datetime = parse(dateTimeStr, format);
if (!dateTimeStr.equals(format(datetime, format))) {
return false;
}
} catch (Exception e) {
return false;
}
return true;
}
/**
* @description 判断是否有效日期(yyyy-MM-dd)
* @param dateStr:
* @param format:
* @return boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 16:20
**/
public static boolean isValidDate(String dateStr, String format) {
if (Objects.isNull(StringUtils.trimToNull(format))) {
format = DATE_FORMAT3;
}
try {
Date date = parse(dateStr, format);
if (!dateStr.equals(format(date, format))) {
return false;
}
} catch (Exception e) {
return false;
}
return true;
}
/**
* @description 校验是否有效时间(HH:mm:ss)
* @param time:
* @param format:
* @return boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 16:08
**/
public static boolean isValidTime(String time, String format) {
if (Objects.isNull(StringUtils.trimToNull(format))) {
format = DATE_FORMAT1;
}
String datetime = "1970-01-01 " + time;
try {
Date date = parse(datetime, format);
if (!datetime.equals(format(date, format))) {
return false;
}
} catch (Exception e) {
return false;
}
return true;
}
/**
* @description 获取距离当天0点0分0秒的秒数
* @param time:
* @return int
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 16:17
**/
public static int getSecondsOfDay(String time) {
String[] hms = time.split(":");
int timeOfDay = 3600 * Integer.parseInt(hms[0]) + 60 * Integer.parseInt(hms[1]) + Integer.parseInt(hms[2]);
return timeOfDay;
}
/**
* @description 获取距离当天0点0分0秒的毫秒数
* @param time:
* @return int
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 16:17
**/
public static int getMilliSecondsOfDay(String time) {
return getSecondsOfDay(time) * 1000;
}
} }
...@@ -75,9 +75,24 @@ public class ReqUtils { ...@@ -75,9 +75,24 @@ public class ReqUtils {
* createTime 2020/05/25 13:55 * createTime 2020/05/25 13:55
**/ **/
public static Long getRequestTenantId() { public static Long getRequestTenantId() {
String userId = getRequestHeader(GatewayHeaders.TENANT_ID); String tenantId = getRequestHeader(GatewayHeaders.TENANT_ID);
if (StringUtils.isNotBlank(userId)) { if (StringUtils.isNotBlank(tenantId)) {
return Long.parseLong(userId); return Long.parseLong(tenantId);
} else {
return null;
}
}
/**
* @description 获取当前请求的部门ID
* @return java.lang.Long
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 15:56
**/
public static Long getRequestDepartmentId() {
String departmentId = getRequestHeader(GatewayHeaders.DEPARTMENT_ID);
if (StringUtils.isNotBlank(departmentId)) {
return Long.parseLong(departmentId);
} else { } else {
return null; return null;
} }
......
package com.esv.datacenter.iot.common.validator.groups;
import javax.validation.groups.Default;
/**
* @description: 参数校验分组:通过ID获取记录列表
* @project: SpringCloudTemplate
* @name: com.esv.springcloud.template.common.validator.groups.ValidatorDelete
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/03/12 17:58
* @version:1.0
*/
public interface ValidatorListById extends Default {
}
...@@ -26,7 +26,7 @@ public class DataPermHandler implements TenantHandler { ...@@ -26,7 +26,7 @@ public class DataPermHandler implements TenantHandler {
/** /**
* 不需要数据权限查询的表 * 不需要数据权限查询的表
**/ **/
private final List<String> filterTableNames = Arrays.asList("device_data_alarm"); private final List<String> filterTableNames = Arrays.asList("data_model_alarm_rule", "device_data_alarm");
@Override @Override
public Expression getTenantId(boolean where) { public Expression getTenantId(boolean where) {
......
...@@ -10,13 +10,10 @@ import com.esv.datacenter.iot.module.datamodel.service.DataModelAlarmRuleService ...@@ -10,13 +10,10 @@ import com.esv.datacenter.iot.module.datamodel.service.DataModelAlarmRuleService
import com.esv.datacenter.iot.module.datamodel.service.DataModelService; import com.esv.datacenter.iot.module.datamodel.service.DataModelService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/** /**
* @description: * @description: 数据模型告警规则Controller
* @author: huangchaobin@esvtek.com * @author: huangchaobin@esvtek.com
* @createTime: 2020/08/05 16:27 * @createTime: 2020/08/05 16:27
* @version:1.0 * @version:1.0
...@@ -36,7 +33,7 @@ public class DataModelAlarmRuleController { ...@@ -36,7 +33,7 @@ public class DataModelAlarmRuleController {
} }
/** /**
* @description 保存告警规则 * @description 保存数据模型告警规则
* @param form: * @param form:
* @return com.esv.datacenter.iot.common.response.EResponse * @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com * @author huangChaobin@esvtek.com
...@@ -46,7 +43,7 @@ public class DataModelAlarmRuleController { ...@@ -46,7 +43,7 @@ public class DataModelAlarmRuleController {
public EResponse save(@RequestBody @Validated(ValidatorInsert.class) DataModelAlarmRuleForm form) throws EException { public EResponse save(@RequestBody @Validated(ValidatorInsert.class) DataModelAlarmRuleForm form) throws EException {
// 模型ID有效性校验 // 模型ID有效性校验
if (!dataModelService.isModelExits(form.getModelId())) { if (!dataModelService.isModelExits(form.getModelId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型ID"); throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型ID");
} }
// 保存告警规则 // 保存告警规则
...@@ -66,9 +63,21 @@ public class DataModelAlarmRuleController { ...@@ -66,9 +63,21 @@ public class DataModelAlarmRuleController {
public EResponse list(@RequestBody @Validated(ValidatorList.class) DataModelAlarmRuleForm form) throws EException { public EResponse list(@RequestBody @Validated(ValidatorList.class) DataModelAlarmRuleForm form) throws EException {
// 模型ID有效性校验 // 模型ID有效性校验
if (!dataModelService.isModelExits(form.getModelId())) { if (!dataModelService.isModelExits(form.getModelId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型ID"); throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型ID");
} }
return EResponse.ok(dataModelAlarmRuleService.getAlarmRuleList(form.getModelId())); return EResponse.ok(dataModelAlarmRuleService.getAlarmRuleList(form.getModelId()));
} }
/**
* @description 缓存数据模型告警规则
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 15:58
**/
@GetMapping("/updateCache")
public EResponse updateCache() throws EException {
dataModelAlarmRuleService.cacheInitAlarmRule();
return EResponse.ok();
}
} }
...@@ -155,7 +155,7 @@ public class DataModelController { ...@@ -155,7 +155,7 @@ public class DataModelController {
**/ **/
private void checkIsValidModelId(Long modelId) { private void checkIsValidModelId(Long modelId) {
if (!dataModelService.isModelExits(modelId)) { if (!dataModelService.isModelExits(modelId)) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型id值"); throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型ID");
} }
} }
......
package com.esv.datacenter.iot.module.datamodel.dao; package com.esv.datacenter.iot.module.datamodel.dao;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelAlarmRuleEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.esv.datacenter.iot.module.datamodel.dto.DataModelAlarmRuleDto;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelAlarmRuleEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* 数据模型告警规则表 * 数据模型告警规则表
* *
...@@ -13,5 +16,13 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -13,5 +16,13 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface DataModelAlarmRuleDao extends BaseMapper<DataModelAlarmRuleEntity> { public interface DataModelAlarmRuleDao extends BaseMapper<DataModelAlarmRuleEntity> {
/**
* @description 查询所有数据模型告警规则
* @return java.util.List<com.esv.datacenter.iot.module.datamodel.dto.DataModelAlarmRuleDto>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 15:48
**/
List<DataModelAlarmRuleDto> selectAll();
} }
package com.esv.datacenter.iot.module.datamodel.dto;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/06 14:47
* @version:1.0
*/
@Data
public class DataModelAlarmRuleDto {
/**
*
*/
private Long id;
/**
* 模型ID
*/
private Long modelId;
/**
* 模型属性ID
*/
private Long propertyId;
/**
* 判定规则代码(字典表)
*/
private Integer ruleExpression;
/**
* 告警等级(字典表)
*/
private Integer alarmLevel;
/**
* 阈值
*/
private String threshold;
/**
* 属性代码
*/
private String propertyCode;
/**
* 属性名称
*/
private String propertyName;
/**
* 属性类型(字典表)
*/
private Integer propertyType;
/**
* 属性默认值
*/
private String propertyDefaultValue;
/**
* 属性单位
*/
private String propertyUnit;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
...@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.annotation.FieldFill; ...@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import lombok.Data;
/** /**
* 数据模型告警规则表 * 数据模型告警规则表
...@@ -79,4 +81,9 @@ public class DataModelAlarmRuleEntity implements Serializable { ...@@ -79,4 +81,9 @@ public class DataModelAlarmRuleEntity implements Serializable {
*/ */
private Date updateTime; private Date updateTime;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
} }
package com.esv.datacenter.iot.module.datamodel.service; package com.esv.datacenter.iot.module.datamodel.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.module.datamodel.dto.DataModelAlarmRuleDto;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelAlarmRuleEntity; import com.esv.datacenter.iot.module.datamodel.entity.DataModelAlarmRuleEntity;
import com.esv.datacenter.iot.module.datamodel.form.AlarmRuleItemForm;
import com.esv.datacenter.iot.module.datamodel.form.DataModelAlarmRuleForm; import com.esv.datacenter.iot.module.datamodel.form.DataModelAlarmRuleForm;
import com.esv.datacenter.iot.module.datamodel.vo.AlarmRuleItemVO; import com.esv.datacenter.iot.module.datamodel.vo.AlarmRuleItemVO;
...@@ -34,5 +36,23 @@ public interface DataModelAlarmRuleService extends IService<DataModelAlarmRuleEn ...@@ -34,5 +36,23 @@ public interface DataModelAlarmRuleService extends IService<DataModelAlarmRuleEn
**/ **/
List<AlarmRuleItemVO> getAlarmRuleList(Long modelId); List<AlarmRuleItemVO> getAlarmRuleList(Long modelId);
/**
* @description 缓存数据模型告警规则
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 14:49
**/
void cacheInitAlarmRule();
/**
* @description 设置缓存数据模型告警规则
* @param modelId:
* @param alarmRuleItemList:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 14:49
**/
void setCacheAlarmRule(Long modelId, List<DataModelAlarmRuleDto> alarmRuleItemList);
} }
...@@ -5,6 +5,7 @@ import com.esv.datacenter.iot.common.vo.PageResultVO; ...@@ -5,6 +5,7 @@ import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity; import com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity;
import com.esv.datacenter.iot.module.datamodel.form.DataModelForm; import com.esv.datacenter.iot.module.datamodel.form.DataModelForm;
import com.esv.datacenter.iot.module.datamodel.vo.DataDataModelDetailVO; import com.esv.datacenter.iot.module.datamodel.vo.DataDataModelDetailVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelBriefVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelVO; import com.esv.datacenter.iot.module.datamodel.vo.DataModelVO;
import java.util.List; import java.util.List;
...@@ -65,11 +66,11 @@ public interface DataModelService extends IService<DataModelEntity> { ...@@ -65,11 +66,11 @@ public interface DataModelService extends IService<DataModelEntity> {
/** /**
* @description 获取所有模型列表 * @description 获取所有模型列表
* @return java.util.List<com.esv.datacenter.iot.module.dmodel.vo.ModelVO> * @return java.util.List<com.esv.datacenter.iot.module.dmodel.vo.DataModelBriefVO>
* @author huangChaobin@esvtek.com * @author huangChaobin@esvtek.com
* @createTime 2020/08/01 13:04 * @createTime 2020/08/01 13:04
**/ **/
List<DataModelVO> getAllModeList(); List<DataModelBriefVO> getAllModeList();
/** /**
* @description 判断模型是否存在 * @description 判断模型是否存在
......
package com.esv.datacenter.iot.module.datamodel.service.impl; package com.esv.datacenter.iot.module.datamodel.service.impl;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.common.component.RedisComponent;
import com.esv.datacenter.iot.common.util.ReqUtils; import com.esv.datacenter.iot.common.util.ReqUtils;
import com.esv.datacenter.iot.module.datamodel.dao.DataModelAlarmRuleDao; import com.esv.datacenter.iot.module.datamodel.dao.DataModelAlarmRuleDao;
import com.esv.datacenter.iot.module.datamodel.dto.DataModelAlarmRuleDto;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelAlarmRuleEntity; import com.esv.datacenter.iot.module.datamodel.entity.DataModelAlarmRuleEntity;
import com.esv.datacenter.iot.module.datamodel.form.AlarmRuleItemForm; import com.esv.datacenter.iot.module.datamodel.form.AlarmRuleItemForm;
import com.esv.datacenter.iot.module.datamodel.form.DataModelAlarmRuleForm; import com.esv.datacenter.iot.module.datamodel.form.DataModelAlarmRuleForm;
import com.esv.datacenter.iot.module.datamodel.service.DataModelAlarmRuleService; import com.esv.datacenter.iot.module.datamodel.service.DataModelAlarmRuleService;
import com.esv.datacenter.iot.module.datamodel.vo.AlarmRuleItemVO; import com.esv.datacenter.iot.module.datamodel.vo.AlarmRuleItemVO;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.*;
import java.util.List;
@Service("dataModelAlarmRuleService") @Service("dataModelAlarmRuleService")
public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRuleDao, DataModelAlarmRuleEntity> implements DataModelAlarmRuleService { public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRuleDao, DataModelAlarmRuleEntity> implements DataModelAlarmRuleService {
@Value("${spring.application.name}")
private String applicationName;
@Autowired
private RedisComponent redisComponent;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void saveAlarmRule(DataModelAlarmRuleForm form) { public void saveAlarmRule(DataModelAlarmRuleForm form) {
...@@ -31,6 +42,7 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul ...@@ -31,6 +42,7 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul
// 新增模型告警规则 // 新增模型告警规则
String[] notBlandParams = new String[]{"propertyId", "ruleExpression", "alarmLevel", "threshold"}; String[] notBlandParams = new String[]{"propertyId", "ruleExpression", "alarmLevel", "threshold"};
List<AlarmRuleItemForm> alarmRuleItemList = form.getAlarmRuleItemList(); List<AlarmRuleItemForm> alarmRuleItemList = form.getAlarmRuleItemList();
List<DataModelAlarmRuleDto> alarmRuleDtoList = new ArrayList<>();
for (AlarmRuleItemForm ruleItemForm : alarmRuleItemList) { for (AlarmRuleItemForm ruleItemForm : alarmRuleItemList) {
// 告警规则必填校验 // 告警规则必填校验
ReqUtils.checkParamsNotBlank(JSON.parseObject(ruleItemForm.toString()), notBlandParams); ReqUtils.checkParamsNotBlank(JSON.parseObject(ruleItemForm.toString()), notBlandParams);
...@@ -38,6 +50,8 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul ...@@ -38,6 +50,8 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul
DataModelAlarmRuleEntity entity = new DataModelAlarmRuleEntity(); DataModelAlarmRuleEntity entity = new DataModelAlarmRuleEntity();
BeanUtils.copyProperties(ruleItemForm, entity); BeanUtils.copyProperties(ruleItemForm, entity);
entity.setModelId(form.getModelId()); entity.setModelId(form.getModelId());
entity.setTenantId(ReqUtils.getRequestTenantId());
entity.setDepartmentId(ReqUtils.getRequestDepartmentId());
this.getBaseMapper().insert(entity); this.getBaseMapper().insert(entity);
// 更新排序 // 更新排序
...@@ -45,7 +59,15 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul ...@@ -45,7 +59,15 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul
sortEntity.setId(entity.getId()); sortEntity.setId(entity.getId());
sortEntity.setSortNum(entity.getId()); sortEntity.setSortNum(entity.getId());
this.getBaseMapper().updateById(sortEntity); this.getBaseMapper().updateById(sortEntity);
// 设置缓存数据
DataModelAlarmRuleDto dto = new DataModelAlarmRuleDto();
BeanUtils.copyProperties(entity, dto);
alarmRuleDtoList.add(dto);
} }
// 缓存数据模型告警规则
this.setCacheAlarmRule(modelId, alarmRuleDtoList);
} }
@Override @Override
...@@ -63,4 +85,50 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul ...@@ -63,4 +85,50 @@ public class DataModelAlarmRuleServiceImpl extends ServiceImpl<DataModelAlarmRul
return voList; return voList;
} }
@Override
public void cacheInitAlarmRule() {
List<DataModelAlarmRuleDto> dataModelAlarmRuleDtoList = this.getBaseMapper().selectAll();
if (Objects.isNull(dataModelAlarmRuleDtoList) || 0 == dataModelAlarmRuleDtoList.size()) {
return;
}
Long modelId = -99L;
List<DataModelAlarmRuleDto> alarmRuleDtoList = null;
Map<Long, Object> alarmRuleMap = new HashMap<>(32);
for (DataModelAlarmRuleDto entity : dataModelAlarmRuleDtoList) {
if (!entity.getModelId().equals(modelId)) {
if (null != alarmRuleDtoList && 0 < alarmRuleDtoList.size()) {
alarmRuleMap.put(modelId, alarmRuleDtoList);
}
alarmRuleDtoList = new ArrayList<>();
}
modelId = entity.getModelId();
DataModelAlarmRuleDto dto = new DataModelAlarmRuleDto();
BeanUtils.copyProperties(entity, dto);
alarmRuleDtoList.add(dto);
}
if (!alarmRuleMap.containsKey(modelId)) {
alarmRuleMap.put(modelId, alarmRuleDtoList);
}
// 初始化缓存数据模型告警规则
for(Map.Entry<Long, Object> entry : alarmRuleMap.entrySet()){
this.setCacheAlarmRule(entry.getKey(), (List<DataModelAlarmRuleDto>) entry.getValue());
}
}
@Override
public void setCacheAlarmRule(Long modelId, List<DataModelAlarmRuleDto> alarmRuleItemList) {
String cacheKey = applicationName + "::data_model::alarm_rule::" + modelId;
if (null == alarmRuleItemList || 0 == alarmRuleItemList.size()) {
redisComponent.del(cacheKey);
} else {
JSONArray jsonArray = new JSONArray();
alarmRuleItemList.forEach( dto -> {
jsonArray.add(JSONObject.parse(dto.toString()));
});
redisComponent.set(cacheKey, jsonArray.toString());
}
}
} }
\ No newline at end of file
...@@ -7,6 +7,7 @@ import com.esv.datacenter.iot.common.component.BaseDataComponent; ...@@ -7,6 +7,7 @@ import com.esv.datacenter.iot.common.component.BaseDataComponent;
import com.esv.datacenter.iot.common.em.DbDeletedEnum; import com.esv.datacenter.iot.common.em.DbDeletedEnum;
import com.esv.datacenter.iot.common.exception.EException; import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode; import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.util.DateUtils;
import com.esv.datacenter.iot.common.util.ReqUtils; import com.esv.datacenter.iot.common.util.ReqUtils;
import com.esv.datacenter.iot.module.datamodel.dao.DataModelPropertyDao; import com.esv.datacenter.iot.module.datamodel.dao.DataModelPropertyDao;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelPropertyEntity; import com.esv.datacenter.iot.module.datamodel.entity.DataModelPropertyEntity;
...@@ -122,6 +123,28 @@ public class DataModelPropertyServiceImpl extends ServiceImpl<DataModelPropertyD ...@@ -122,6 +123,28 @@ public class DataModelPropertyServiceImpl extends ServiceImpl<DataModelPropertyD
throw new EException(ECode.PARAM_ERROR.code(), "无效的默认值["+propertyDefaultValue+"]"); throw new EException(ECode.PARAM_ERROR.code(), "无效的默认值["+propertyDefaultValue+"]");
} }
break; break;
case "integer":
try {
Long.parseLong(propertyDefaultValue);
} catch (Exception e) {
throw new EException(ECode.PARAM_ERROR.code(), "无效的默认值["+propertyDefaultValue+"]");
}
break;
case "date":
if (!DateUtils.isValidDate(propertyDefaultValue, null)) {
throw new EException(ECode.PARAM_ERROR.code(), "无效的默认值["+propertyDefaultValue+"]");
}
break;
case "time":
if (!DateUtils.isValidTime(propertyDefaultValue, null)) {
throw new EException(ECode.PARAM_ERROR.code(), "无效的默认值["+propertyDefaultValue+"]");
}
break;
case "datetime":
if (!DateUtils.isValidDatetime(propertyDefaultValue, null)) {
throw new EException(ECode.PARAM_ERROR.code(), "无效的默认值["+propertyDefaultValue+"]");
}
break;
default: default:
break; break;
} }
......
...@@ -17,7 +17,9 @@ import com.esv.datacenter.iot.module.datamodel.form.DataModelPropertyForm; ...@@ -17,7 +17,9 @@ import com.esv.datacenter.iot.module.datamodel.form.DataModelPropertyForm;
import com.esv.datacenter.iot.module.datamodel.service.DataModelPropertyService; import com.esv.datacenter.iot.module.datamodel.service.DataModelPropertyService;
import com.esv.datacenter.iot.module.datamodel.service.DataModelService; import com.esv.datacenter.iot.module.datamodel.service.DataModelService;
import com.esv.datacenter.iot.module.datamodel.vo.DataDataModelDetailVO; import com.esv.datacenter.iot.module.datamodel.vo.DataDataModelDetailVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelBriefVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelVO; import com.esv.datacenter.iot.module.datamodel.vo.DataModelVO;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -34,6 +36,8 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt ...@@ -34,6 +36,8 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt
private TimescaleComponent timescaleComponent; private TimescaleComponent timescaleComponent;
@Autowired @Autowired
private DataModelPropertyService dataModelPropertyService; private DataModelPropertyService dataModelPropertyService;
@Autowired
private DeviceDataMapService deviceDataMapService;
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -122,6 +126,12 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt ...@@ -122,6 +126,12 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt
// 判断是否修改模型属性并校验 // 判断是否修改模型属性并校验
List<DataModelPropertyForm> propertyList = form.getPropertyList(); List<DataModelPropertyForm> propertyList = form.getPropertyList();
if (null != propertyList && 0 < propertyList.size()) { if (null != propertyList && 0 < propertyList.size()) {
// 如果有设备模型使用,不能更新
int count = deviceDataMapService.getCountByDataModelId(modelId);
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "改模型已被设备使用,不能修改属性");
}
// 保存模型属性 // 保存模型属性
this.dataModelPropertyService.saveModelProperty(modelId, propertyList); this.dataModelPropertyService.saveModelProperty(modelId, propertyList);
...@@ -136,6 +146,12 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt ...@@ -136,6 +146,12 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void deleteModel(Long modelId) { public void deleteModel(Long modelId) {
// 如果有设备模型使用,不能删除
int count = deviceDataMapService.getCountByDataModelId(modelId);
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "改模型已被设备使用,不能删除");
}
// 逻辑删除模型 // 逻辑删除模型
DataModelEntity modelEntity = new DataModelEntity(); DataModelEntity modelEntity = new DataModelEntity();
modelEntity.setId(modelId); modelEntity.setId(modelId);
...@@ -153,15 +169,13 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt ...@@ -153,15 +169,13 @@ public class DataModelServiceImpl extends ServiceImpl<DataModelDao, DataModelEnt
} }
@Override @Override
public List<DataModelVO> getAllModeList() { public List<DataModelBriefVO> getAllModeList() {
List<DataModelEntity> modelEntityList = this.getBaseMapper().selectList(new LambdaQueryWrapper<DataModelEntity>() List<DataModelEntity> modelEntityList = this.getBaseMapper().selectList(new LambdaQueryWrapper<DataModelEntity>()
.orderByAsc(DataModelEntity::getName)); .orderByAsc(DataModelEntity::getName));
List<DataModelVO> dataModelVOList = new ArrayList<>(); List<DataModelBriefVO> dataModelVOList = new ArrayList<>();
for (DataModelEntity entity : modelEntityList) { for (DataModelEntity entity : modelEntityList) {
DataModelVO vo = new DataModelVO(); DataModelBriefVO vo = new DataModelBriefVO();
BeanUtils.copyProperties(entity, vo); BeanUtils.copyProperties(entity, vo);
vo.setCreateTime(entity.getCreateTime().getTime());
vo.setUpdateTime(entity.getUpdateTime().getTime());
dataModelVOList.add(vo); dataModelVOList.add(vo);
} }
......
package com.esv.datacenter.iot.module.datamodel.vo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/07/31 16:12
* @version:1.0
*/
@Data
public class DataModelBriefVO {
/**
*
*/
private Long id;
/**
* 模型名称
*/
private String name;
/**
* 模型描述
*/
private String description;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.datamodel.vo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.List;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/10 14:44
* @version:1.0
*/
@Data
public class DataModelDetailVO extends DataModelBriefVO {
List<DataModelPropertyVO> propertyList;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.datamodel.vo; package com.esv.datacenter.iot.module.datamodel.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import lombok.Data; import lombok.Data;
/** /**
...@@ -18,16 +14,7 @@ public class DataModelPropertyVO { ...@@ -18,16 +14,7 @@ public class DataModelPropertyVO {
/** /**
* *
*/ */
@TableId
private Long id; private Long id;
/**
* 租户ID
*/
private Long tenantId;
/**
* 部门ID
*/
private Long departmentId;
/** /**
* 模型ID * 模型ID
*/ */
...@@ -56,20 +43,13 @@ public class DataModelPropertyVO { ...@@ -56,20 +43,13 @@ public class DataModelPropertyVO {
* 排列序号 * 排列序号
*/ */
private Long sortNum; private Long sortNum;
/**
* 是否删除:0-未删除、1-已删除
*/
@TableLogic
private Boolean deleted;
/** /**
* 创建者 * 创建者
*/ */
@TableField(fill = FieldFill.INSERT)
private String createUser; private String createUser;
/** /**
* 修改者 * 修改者
*/ */
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUser; private String updateUser;
/** /**
* 创建时间 * 创建时间
......
package com.esv.datacenter.iot.module.devicemodel.controller;
import com.alibaba.fastjson.JSONObject;
import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.response.EResponse;
import com.esv.datacenter.iot.common.validator.groups.*;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceInstanceService;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description: 设备实例Controller
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 10:35
* @version:1.0
*/
@Slf4j
@RestController
@RequestMapping("/deviceModel/instance")
@Validated
public class DeviceInstanceController {
private DeviceTypeService deviceTypeService;
private DeviceInstanceService deviceInstanceService;
public DeviceInstanceController(DeviceTypeService deviceTypeService, DeviceInstanceService deviceInstanceService) {
this.deviceTypeService = deviceTypeService;
this.deviceInstanceService = deviceInstanceService;
}
/**
* @description 新增设备实例
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:36
**/
@PostMapping("/add")
public EResponse add(@RequestBody @Validated(ValidatorInsert.class) DeviceInstanceForm form) throws EException {
if (!deviceTypeService.isValidTypeId(form.getDeviceTypeId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备类型ID");
}
Long id = deviceInstanceService.insertDeviceInstance(form);
JSONObject data = new JSONObject();
data.put("id", id);
return EResponse.ok(data);
}
/**
* @description 删除设备实例
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:51
**/
@PostMapping("/delete")
public EResponse delete(@RequestBody @Validated(ValidatorDelete.class) DeviceInstanceForm form) throws EException {
if (!deviceInstanceService.isValidId(form.getId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备ID");
}
deviceInstanceService.deleteInstance(form.getId());
return EResponse.ok();
}
/**
* @description 编辑设备实例信息
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 11:03
**/
@PostMapping("/edit")
public EResponse edit(@RequestBody @Validated(ValidatorUpdate.class) DeviceInstanceForm form) throws EException {
if (!deviceInstanceService.isValidId(form.getId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备ID");
}
deviceInstanceService.updateInstance(form);
return EResponse.ok();
}
/**
* @description 分页查询设备实例
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:08
**/
@PostMapping("/list")
public EResponse list(@RequestBody @Validated(ValidatorList.class) DeviceInstanceForm form) throws EException {
return EResponse.ok(deviceInstanceService.getInstance4Page(form));
}
/**
* @description 通过设备类型ID获取设备列表
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/10 10:24
**/
@PostMapping("/getInstanceByDeviceTypeId")
public EResponse getInstanceByDeviceTypeId(@RequestBody @Validated(ValidatorListById.class) DeviceInstanceForm form) throws EException {
if (!deviceTypeService.isValidTypeId(form.getDeviceTypeId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备类型ID");
}
return EResponse.ok(deviceInstanceService.getInstanceListByTypeId(form.getDeviceTypeId()));
}
}
package com.esv.datacenter.iot.module.devicemodel.controller;
import com.alibaba.fastjson.JSONObject;
import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.response.EResponse;
import com.esv.datacenter.iot.common.validator.groups.*;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceDataMapForm;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceTypeForm;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceInstanceService;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceTypeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Objects;
/**
* @description: 设备类型Controller
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/06 20:14
* @version:1.0
*/
@Slf4j
@RestController
@RequestMapping("/deviceModel")
@Validated
public class DeviceTypeController {
private DeviceTypeService deviceTypeService;
private DeviceInstanceService deviceInstanceService;
private DeviceDataMapService deviceDataMapService;
public DeviceTypeController(DeviceTypeService deviceTypeService, DeviceInstanceService deviceInstanceService,
DeviceDataMapService deviceDataMapService) {
this.deviceTypeService = deviceTypeService;
this.deviceInstanceService = deviceInstanceService;
this.deviceDataMapService = deviceDataMapService;
}
/**
* @description 新增设备类型
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:16
**/
@PostMapping("/add")
public EResponse add(@RequestBody @Validated(ValidatorInsert.class) DeviceTypeForm form) throws EException {
Long id = deviceTypeService.insertDeviceType(form);
JSONObject data = new JSONObject();
data.put("id", id);
return EResponse.ok(data);
}
/**
* @description 更新设备类型信息
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:20
**/
@PostMapping("/edit")
public EResponse edit(@RequestBody @Validated(ValidatorUpdate.class) DeviceTypeForm form) throws EException {
if (!deviceTypeService.isValidTypeId(form.getId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备类型ID");
}
deviceTypeService.updateDeviceType(form);
return EResponse.ok();
}
/**
* @description 删除设备类型
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:35
**/
@PostMapping("/delete")
public EResponse delete(@RequestBody @Validated(ValidatorDelete.class) DeviceTypeForm form) throws EException {
if (!deviceTypeService.isValidTypeId(form.getId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备类型ID");
}
int deviceInstanceCount = deviceInstanceService.getInstanceCountByTypeId(form.getId());
if (0 < deviceInstanceCount) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "该设备类型有设备实例,不能删除");
}
deviceTypeService.deleteDeviceType(form.getId());
return EResponse.ok();
}
/**
* @description 分页查询设备类型
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 9:45
**/
@PostMapping("/list")
public EResponse list(@RequestBody @Validated(ValidatorList.class) DeviceTypeForm form) throws EException {
String name = StringUtils.trimToNull(form.getName());
if (Objects.isNull(name)) {
form.setName(null);
} else {
form.setName("%" + name + "%");
}
return EResponse.ok(deviceTypeService.getType4Page(form));
}
/**
* @description 获取设备类型列表
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 9:57
**/
@PostMapping("/all")
public EResponse all() throws EException {
return EResponse.ok(deviceTypeService.getTypeList());
}
/**
* @description 通过设备类型ID获取对应的数据模型列表
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:39
**/
@PostMapping("/getDataModelByDeviceTypeId")
public EResponse getDataModelByDeviceTypeId(@RequestBody @Validated(ValidatorDetail.class) DeviceTypeForm form) throws EException {
if (!deviceTypeService.isValidTypeId(form.getId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备类型ID");
}
return EResponse.ok(deviceTypeService.getDataModelByDeviceTypeId(form.getId()));
}
/**
* @description 保存设备类型与数据模型的映射记录
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:46
**/
@PostMapping("/saveDataModelByDeviceTypeId")
public EResponse saveDataModelByDeviceTypeId(@RequestBody @Validated(ValidatorInsert.class) DeviceDataMapForm form) throws EException {
if (!deviceTypeService.isValidTypeId(form.getDeviceTypeId())) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的设备类型ID");
}
deviceDataMapService.saveDeviceDataMap(form.getDeviceTypeId(), form.getDataModelId());
return EResponse.ok();
}
}
package com.esv.datacenter.iot.module.devicemodel.dao; package com.esv.datacenter.iot.module.devicemodel.dao;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity; import com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* 设备数据模型映射表 * 设备类型-数据模型映射表
* *
* @author 黄朝斌 * @author 黄朝斌
* @email huangchaobin@esvtek.com * @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24 * @date 2020-08-06 16:15:13
*/ */
@Mapper @Mapper
public interface DeviceDataMapDao extends BaseMapper<DeviceDataMapEntity> { public interface DeviceDataMapDao extends BaseMapper<DeviceDataMapEntity> {
/**
* @description 通过设备类型ID获取对应的数据模型列表
* @param entity:
* @return java.util.List<com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:31
**/
List<DataModelEntity> selectDataModelByDeviceTypeId(DeviceDataMapEntity entity);
} }
package com.esv.datacenter.iot.module.devicemodel.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm;
import org.apache.ibatis.annotations.Mapper;
/**
* 设备实例表
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 16:15:13
*/
@Mapper
public interface DeviceInstanceDao extends BaseMapper<DeviceInstanceEntity> {
/**
* @description 分页查询
* @param page:
* @param queryObj:
* @return com.baomidou.mybatisplus.core.metadata.IPage
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 13:37
**/
IPage select4Page(IPage page, DeviceInstanceForm queryObj);
}
package com.esv.datacenter.iot.module.devicemodel.dao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 设备模型表
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
@Mapper
public interface DeviceModelDao extends BaseMapper<DeviceModelEntity> {
}
package com.esv.datacenter.iot.module.devicemodel.dao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelInstanceEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 设备模型实例表
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
@Mapper
public interface DeviceModelInstanceDao extends BaseMapper<DeviceModelInstanceEntity> {
}
package com.esv.datacenter.iot.module.devicemodel.dao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelPropertyEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* 设备模型属性表
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
@Mapper
public interface DeviceModelPropertyDao extends BaseMapper<DeviceModelPropertyEntity> {
}
package com.esv.datacenter.iot.module.devicemodel.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.esv.datacenter.iot.module.datamodel.form.DataModelForm;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceTypeEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceTypeForm;
import org.apache.ibatis.annotations.Mapper;
/**
* 设备类型表
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 16:15:13
*/
@Mapper
public interface DeviceTypeDao extends BaseMapper<DeviceTypeEntity> {
/**
* @description 分页查询
* @param page:
* @param queryObj:
* @return com.baomidou.mybatisplus.core.metadata.IPage
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 9:34
**/
IPage select4Page(IPage page, DeviceTypeForm queryObj);
}
package com.esv.datacenter.iot.module.devicemodel.dto;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.Date;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 13:43
* @version:1.0
*/
@Data
public class DeviceInstanceDto {
/**
*
*/
private Long id;
/**
* 设备类型ID
*/
private Long deviceTypeId;
/**
* 设备类型名称
*/
private String deviceTypeName;
/**
* 设备名称
*/
private String name;
/**
* 设备描述
*/
private String description;
/**
* 设备业务ID
*/
private String businessId;
/**
* 设备型号
*/
private String deviceModel;
/**
* 创建者
*/
private String createUser;
/**
* 修改者
*/
private String updateUser;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
...@@ -10,11 +10,11 @@ import java.util.Date; ...@@ -10,11 +10,11 @@ import java.util.Date;
import lombok.Data; import lombok.Data;
/** /**
* 设备数据模型映射表 * 设备类型-数据模型映射表
* *
* @author 黄朝斌 * @author 黄朝斌
* @email huangchaobin@esvtek.com * @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24 * @date 2020-08-06 16:15:13
*/ */
@Data @Data
@TableName("device_data_map") @TableName("device_data_map")
...@@ -37,9 +37,9 @@ public class DeviceDataMapEntity implements Serializable { ...@@ -37,9 +37,9 @@ public class DeviceDataMapEntity implements Serializable {
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Long departmentId; private Long departmentId;
/** /**
* 设备型ID * 设备型ID
*/ */
private Long deviceModelId; private Long deviceTypeId;
/** /**
* 数据模型ID * 数据模型ID
*/ */
......
...@@ -7,15 +7,15 @@ import java.util.Date; ...@@ -7,15 +7,15 @@ import java.util.Date;
import lombok.Data; import lombok.Data;
/** /**
* 设备模型实例表 * 设备实例表
* *
* @author 黄朝斌 * @author 黄朝斌
* @email huangchaobin@esvtek.com * @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24 * @date 2020-08-06 16:15:13
*/ */
@Data @Data
@TableName("device_model_instance") @TableName("device_instance")
public class DeviceModelInstanceEntity implements Serializable { public class DeviceInstanceEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
...@@ -34,17 +34,25 @@ public class DeviceModelInstanceEntity implements Serializable { ...@@ -34,17 +34,25 @@ public class DeviceModelInstanceEntity implements Serializable {
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Long departmentId; private Long departmentId;
/** /**
* 型ID * 设备类型ID
*/ */
private Long modelId; private Long deviceTypeId;
/** /**
* 实例名称 * 设备名称
*/ */
private String name; private String name;
/** /**
* 实例描述 * 设备描述
*/ */
private String description; private String description;
/**
* 设备业务ID
*/
private String businessId;
/**
* 设备型号
*/
private String deviceModel;
/** /**
* 是否删除:0-未删除、1-已删除 * 是否删除:0-未删除、1-已删除
*/ */
......
package com.esv.datacenter.iot.module.devicemodel.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 设备模型属性表
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
@Data
@TableName("device_model_property")
public class DeviceModelPropertyEntity implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
*/
@TableId
private Long id;
/**
* 租户ID
*/
@TableField(fill = FieldFill.INSERT)
private Long tenantId;
/**
* 部门ID
*/
@TableField(fill = FieldFill.INSERT)
private Long departmentId;
/**
* 模型ID
*/
private Long modelId;
/**
* 属性代码
*/
private String propertyCode;
/**
* 属性名称
*/
private String propertyName;
/**
* 属性类型(字典表)
*/
private Integer propertyType;
/**
* 属性默认值
*/
private String propertyDefaultValue;
/**
* 属性单位
*/
private String propertyUnit;
/**
* 排列序号
*/
private Long sortNum;
/**
* 是否删除:0-未删除、1-已删除
*/
@TableLogic
private Boolean deleted;
/**
* 创建者
*/
@TableField(fill = FieldFill.INSERT)
private String createUser;
/**
* 修改者
*/
@TableField(fill = FieldFill.INSERT_UPDATE)
private String updateUser;
/**
* 创建时间
*/
private Date createTime;
/**
* 修改时间
*/
private Date updateTime;
}
...@@ -7,15 +7,15 @@ import java.util.Date; ...@@ -7,15 +7,15 @@ import java.util.Date;
import lombok.Data; import lombok.Data;
/** /**
* 设备型表 * 设备型表
* *
* @author 黄朝斌 * @author 黄朝斌
* @email huangchaobin@esvtek.com * @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24 * @date 2020-08-06 16:15:13
*/ */
@Data @Data
@TableName("device_model") @TableName("device_type")
public class DeviceModelEntity implements Serializable { public class DeviceTypeEntity implements Serializable {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
...@@ -34,11 +34,11 @@ public class DeviceModelEntity implements Serializable { ...@@ -34,11 +34,11 @@ public class DeviceModelEntity implements Serializable {
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Long departmentId; private Long departmentId;
/** /**
* 模型名称 * 名称
*/ */
private String name; private String name;
/** /**
* 模型描述 * 描述
*/ */
private String description; private String description;
/** /**
......
package com.esv.datacenter.iot.module.devicemodel.form;
import com.esv.datacenter.iot.common.validator.groups.ValidatorInsert;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.NotNull;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 14:40
* @version:1.0
*/
@Data
public class DeviceDataMapForm {
/**
* 设备类型ID
*/
@NotNull(message = "[设备类型ID]不能为空", groups = {ValidatorInsert.class})
private Long deviceTypeId;
/**
* 数据模型ID
*/
private String dataModelId;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.devicemodel.form;
import com.esv.datacenter.iot.common.validator.groups.*;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 10:21
* @version:1.0
*/
@Data
public class DeviceInstanceForm {
/**
*
*/
@NotNull(message = "[设备ID]不能为空", groups = {ValidatorDelete.class, ValidatorUpdate.class})
private Long id;
/**
* 设备类型ID
*/
@NotNull(message = "[设备类型ID]不能为空", groups = {ValidatorInsert.class, ValidatorList.class, ValidatorListById.class})
private Long deviceTypeId;
/**
* 设备名称
*/
@Length(max = 50, message = "[设备名称]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class, ValidatorList.class})
@NotBlank(message = "[设备名称]不能为空", groups = {ValidatorInsert.class})
private String name;
/**
* 设备描述
*/
@Length(max = 200, message = "[设备描述]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class})
@NotBlank(message = "[设备描述]不能为空", groups = {ValidatorInsert.class})
private String description;
/**
* 设备业务ID
*/
@Length(max = 50, message = "[设备业务ID]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class, ValidatorList.class})
private String businessId;
/**
* 设备型号
*/
@Length(max = 200, message = "[设备型号]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class, ValidatorList.class})
private String deviceModel;
/**
* 页码
**/
@Range(min = 1, max = 65535, message = "无效的pageNum", groups = {ValidatorList.class})
@NotNull(message = "参数pageNum不能为空", groups = {ValidatorList.class})
private Integer pageNum;
/**
* 每页记录条数
**/
@Range(min = 1, max = 100, message = "pageSize", groups = {ValidatorList.class})
@NotNull(message = "参数pageSize不能为空", groups = {ValidatorList.class})
private Integer pageSize;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.devicemodel.form;
import com.esv.datacenter.iot.common.validator.groups.*;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/06 16:34
* @version:1.0
*/
@Data
public class DeviceTypeForm {
/**
*
*/
@NotNull(message = "[设备类型ID]不能为空", groups = {ValidatorUpdate.class, ValidatorDelete.class, ValidatorDetail.class})
private Long id;
/**
* 名称
*/
@Length(max = 50, message = "[设备类型名称]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class, ValidatorList.class})
@NotBlank(message = "[设备类型名称]不能为空", groups = {ValidatorInsert.class})
private String name;
/**
* 描述
*/
@Length(max = 200, message = "[设备类型描述]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class})
@NotBlank(message = "[设备类型描述]不能为空", groups = {ValidatorInsert.class})
private String description;
/**
* 页码
**/
@Range(min = 1, max = 65535, message = "无效的pageNum", groups = {ValidatorList.class})
@NotNull(message = "参数pageNum不能为空", groups = {ValidatorList.class})
private Integer pageNum;
/**
* 每页记录条数
**/
@Range(min = 1, max = 100, message = "pageSize", groups = {ValidatorList.class})
@NotNull(message = "参数pageSize不能为空", groups = {ValidatorList.class})
private Integer pageSize;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.devicemodel.service; package com.esv.datacenter.iot.module.devicemodel.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity; import com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity;
import java.util.List;
/** /**
* 设备数据模型映射Service * 设备类型-数据模型映射Service
* *
* @author 黄朝斌 * @author 黄朝斌
* @email huangchaobin@esvtek.com * @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24 * @date 2020-08-06 16:15:13
*/ */
public interface DeviceDataMapService extends IService<DeviceDataMapEntity> { public interface DeviceDataMapService extends IService<DeviceDataMapEntity> {
/**
* @description 统计指定数据模型的使用数量
* @param dataModelId:
* @return int
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 16:25
**/
int getCountByDataModelId(Long dataModelId);
/**
* @description 通过设备类型ID删除映射记录
* @param deviceTypeId:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:30
**/
void deleteByDeviceTypeId(Long deviceTypeId);
/**
* @description 保存设备类型与数据模型的映射记录
* @param deviceTypeId:
* @param dataModelIds:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:18
**/
void saveDeviceDataMap(Long deviceTypeId, String dataModelIds);
/**
* @description 通过设备类型ID获取对应的数据模型列表
* @param deviceTypeId:
* @return java.util.List<com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:26
**/
List<DataModelEntity> getDataModelByDeviceTypeId(Long deviceTypeId);
} }
package com.esv.datacenter.iot.module.devicemodel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm;
import com.esv.datacenter.iot.module.devicemodel.vo.DeviceInstanceVO;
import java.util.List;
/**
* 设备实例Service
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 16:15:13
*/
public interface DeviceInstanceService extends IService<DeviceInstanceEntity> {
/**
* @description 查询指定设备类型ID的设备实例数量
* @param deviceTypeId:
* @return int
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:25
**/
int getInstanceCountByTypeId(Long deviceTypeId);
/**
* @description 新增设备实例
* @param form:
* @return java.lang.Long
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:40
**/
Long insertDeviceInstance(DeviceInstanceForm form);
/**
* @description 删除设备实例
* @param id:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:49
**/
void deleteInstance(Long id);
/**
* @description 编辑设备实例信息
* @param form:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:58
**/
void updateInstance(DeviceInstanceForm form);
/**
* @description 判断是否有效实例ID
* @param id:
* @return java.lang.Boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:47
**/
Boolean isValidId(Long id);
/**
* @description 通过ID获取设备实例
* @param id:
* @return com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 10:47
**/
DeviceInstanceEntity getInstanceById(Long id);
/**
* @description 分页查询
* @param form:
* @return com.esv.datacenter.iot.common.vo.PageResultVO
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 13:39
**/
PageResultVO getInstance4Page(DeviceInstanceForm form);
/**
* @description 查询指定设备类型ID的设备实例列表
* @param deviceTypeId:
* @return int
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:25
**/
List<DeviceInstanceVO> getInstanceListByTypeId(Long deviceTypeId);
}
package com.esv.datacenter.iot.module.devicemodel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelInstanceEntity;
/**
* 设备模型实例Service
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
public interface DeviceModelInstanceService extends IService<DeviceModelInstanceEntity> {
}
package com.esv.datacenter.iot.module.devicemodel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelPropertyEntity;
/**
* 设备模型属性Service
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
public interface DeviceModelPropertyService extends IService<DeviceModelPropertyEntity> {
}
package com.esv.datacenter.iot.module.devicemodel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelEntity;
/**
* 设备模型Service
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 10:23:24
*/
public interface DeviceModelService extends IService<DeviceModelEntity> {
}
package com.esv.datacenter.iot.module.devicemodel.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelBriefVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelDetailVO;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceTypeEntity;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceTypeForm;
import com.esv.datacenter.iot.module.devicemodel.vo.DeviceTypeBriefVO;
import lombok.Data;
import java.util.List;
/**
* 设备类型Service
*
* @author 黄朝斌
* @email huangchaobin@esvtek.com
* @date 2020-08-06 16:15:13
*/
public interface DeviceTypeService extends IService<DeviceTypeEntity> {
/**
* @description 新增设备类型
* @param form:
* @return java.lang.Long
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 19:55
**/
Long insertDeviceType(DeviceTypeForm form);
/**
* @description 更新设备类型
* @param form:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:08
**/
void updateDeviceType(DeviceTypeForm form);
/**
* @description 通过设备类型ID查询记录
* @param id:
* @return com.esv.datacenter.iot.module.devicemodel.entity.DeviceTypeEntity
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:22
**/
DeviceTypeEntity getDeviceTypeById(Long id);
/**
* @description 删除设备类型
* @param id:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/06 20:24
**/
void deleteDeviceType(Long id);
/**
* @description 分页查询
* @param form:
* @return com.esv.datacenter.iot.common.vo.PageResultVO
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 9:35
**/
PageResultVO getType4Page(DeviceTypeForm form);
/**
* @description 是否有效的设备类型ID
* @param id:
* @return java.lang.Boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 9:48
**/
Boolean isValidTypeId(Long id);
/**
* @description 获取设备类型列表
* @return java.util.List<com.esv.datacenter.iot.module.devicemodel.vo.DeviceTypeBriefVO>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 9:54
**/
List<DeviceTypeBriefVO> getTypeList();
/**
* @description 通过设备类型ID获取对应的数据模型列表
* @param deviceTypeId:
* @return java.util.List<com.esv.datacenter.iot.module.datamodel.vo.DataModelDetailVO>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/07 14:34
**/
List<DataModelDetailVO> getDataModelByDeviceTypeId(Long deviceTypeId);
}
package com.esv.datacenter.iot.module.devicemodel.service.impl; package com.esv.datacenter.iot.module.devicemodel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity;
import com.esv.datacenter.iot.module.devicemodel.dao.DeviceDataMapDao; import com.esv.datacenter.iot.module.devicemodel.dao.DeviceDataMapDao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity; import com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService; import com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
@Service("deviceDataMapService") @Service("deviceDataMapService")
public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, DeviceDataMapEntity> implements DeviceDataMapService { public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, DeviceDataMapEntity> implements DeviceDataMapService {
@Override
public int getCountByDataModelId(Long dataModelId) {
return this.getBaseMapper().selectCount(new LambdaQueryWrapper<DeviceDataMapEntity>()
.eq(DeviceDataMapEntity::getDataModelId, dataModelId));
}
@Override
public void deleteByDeviceTypeId(Long deviceTypeId) {
this.getBaseMapper().delete(new LambdaQueryWrapper<DeviceDataMapEntity>()
.eq(DeviceDataMapEntity::getDeviceTypeId, deviceTypeId));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void saveDeviceDataMap(Long deviceTypeId, String dataModelIds) {
this.getBaseMapper().delete(new LambdaQueryWrapper<DeviceDataMapEntity>().eq(DeviceDataMapEntity::getDeviceTypeId, deviceTypeId));
if (Objects.nonNull(StringUtils.trimToNull(dataModelIds))) {
String[] dataModelIdList = dataModelIds.split(",");
for (String dataModelId : dataModelIdList) {
DeviceDataMapEntity entity = new DeviceDataMapEntity();
entity.setDeviceTypeId(deviceTypeId);
entity.setDataModelId(Long.parseLong(dataModelId));
this.getBaseMapper().insert(entity);
}
}
}
@Override
public List<DataModelEntity> getDataModelByDeviceTypeId(Long deviceTypeId) {
DeviceDataMapEntity entity = new DeviceDataMapEntity();
entity.setDeviceTypeId(deviceTypeId);
return this.getBaseMapper().selectDataModelByDeviceTypeId(entity);
}
} }
\ No newline at end of file
package com.esv.datacenter.iot.module.devicemodel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.devicemodel.dao.DeviceInstanceDao;
import com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceInstanceService;
import com.esv.datacenter.iot.module.devicemodel.vo.DeviceInstanceVO;
import com.esv.datacenter.iot.module.devicemodel.vo.DeviceTypeVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Service("deviceInstanceService")
public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, DeviceInstanceEntity> implements DeviceInstanceService {
@Override
public int getInstanceCountByTypeId(Long deviceTypeId) {
return this.getBaseMapper().selectCount(new LambdaQueryWrapper<DeviceInstanceEntity>()
.eq(DeviceInstanceEntity::getDeviceTypeId, deviceTypeId));
}
@Override
public Long insertDeviceInstance(DeviceInstanceForm form) {
int count = this.getBaseMapper().selectCount(new LambdaQueryWrapper<DeviceInstanceEntity>()
.eq(DeviceInstanceEntity::getName, form.getName()));
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "设备名称[" + form.getName() + "]已存在");
}
DeviceInstanceEntity entity = new DeviceInstanceEntity();
BeanUtils.copyProperties(form, entity);
this.getBaseMapper().insert(entity);
return entity.getId();
}
@Override
public void deleteInstance(Long id) {
this.getBaseMapper().deleteById(id);
}
@Override
public void updateInstance(DeviceInstanceForm form) {
if (Objects.nonNull(StringUtils.trimToNull(form.getName()))) {
int count = this.getBaseMapper().selectCount(new LambdaQueryWrapper<DeviceInstanceEntity>()
.ne(DeviceInstanceEntity::getId, form.getId())
.eq(DeviceInstanceEntity::getName, form.getName()));
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "设备名称[" + form.getName() + "]已存在");
}
}
DeviceInstanceEntity entity = new DeviceInstanceEntity();
BeanUtils.copyProperties(form, entity);
this.getBaseMapper().updateById(entity);
}
@Override
public Boolean isValidId(Long id) {
DeviceInstanceEntity entity = this.getInstanceById(id);
if (Objects.isNull(entity)) {
return false;
} else {
return true;
}
}
@Override
public DeviceInstanceEntity getInstanceById(Long id) {
return this.getBaseMapper().selectById(id);
}
@Override
public PageResultVO getInstance4Page(DeviceInstanceForm form) {
IPage<DeviceInstanceDto> page = new Page<>(form.getPageNum(), form.getPageSize());
this.baseMapper.select4Page(page, form);
List<DeviceInstanceDto> entityList = page.getRecords();
List<DeviceInstanceVO> voList = new ArrayList<>();
for (DeviceInstanceDto entity : entityList) {
DeviceInstanceVO vo = new DeviceInstanceVO();
BeanUtils.copyProperties(entity, vo);
vo.setCreateTime(entity.getCreateTime().getTime());
vo.setUpdateTime(entity.getUpdateTime().getTime());
voList.add(vo);
}
return new PageResultVO(page, voList);
}
@Override
public List<DeviceInstanceVO> getInstanceListByTypeId(Long deviceTypeId) {
List<DeviceInstanceEntity> entityList = this.getBaseMapper().selectList(new LambdaQueryWrapper<DeviceInstanceEntity>()
.eq(DeviceInstanceEntity::getDeviceTypeId, deviceTypeId)
.orderByAsc(DeviceInstanceEntity::getName));
List<DeviceInstanceVO> voList = new ArrayList<>();
for (DeviceInstanceEntity entity : entityList) {
DeviceInstanceVO vo = new DeviceInstanceVO();
BeanUtils.copyProperties(entity, vo);
vo.setCreateTime(entity.getCreateTime().getTime());
vo.setUpdateTime(entity.getUpdateTime().getTime());
voList.add(vo);
}
return voList;
}
}
\ No newline at end of file
package com.esv.datacenter.iot.module.devicemodel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.module.devicemodel.dao.DeviceModelInstanceDao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelInstanceEntity;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceModelInstanceService;
import org.springframework.stereotype.Service;
@Service("deviceModelInstanceService")
public class DeviceModelInstanceServiceImpl extends ServiceImpl<DeviceModelInstanceDao, DeviceModelInstanceEntity> implements DeviceModelInstanceService {
}
\ No newline at end of file
package com.esv.datacenter.iot.module.devicemodel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.module.devicemodel.dao.DeviceModelPropertyDao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelPropertyEntity;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceModelPropertyService;
import org.springframework.stereotype.Service;
@Service("deviceModelPropertyService")
public class DeviceModelPropertyServiceImpl extends ServiceImpl<DeviceModelPropertyDao, DeviceModelPropertyEntity> implements DeviceModelPropertyService {
}
\ No newline at end of file
package com.esv.datacenter.iot.module.devicemodel.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.module.devicemodel.dao.DeviceModelDao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelEntity;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceModelService;
import org.springframework.stereotype.Service;
@Service("deviceModelService")
public class DeviceModelServiceImpl extends ServiceImpl<DeviceModelDao, DeviceModelEntity> implements DeviceModelService {
}
\ No newline at end of file
package com.esv.datacenter.iot.module.devicemodel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity;
import com.esv.datacenter.iot.module.datamodel.service.DataModelPropertyService;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelBriefVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelDetailVO;
import com.esv.datacenter.iot.module.datamodel.vo.DataModelPropertyVO;
import com.esv.datacenter.iot.module.devicemodel.dao.DeviceTypeDao;
import com.esv.datacenter.iot.module.devicemodel.entity.DeviceTypeEntity;
import com.esv.datacenter.iot.module.devicemodel.form.DeviceTypeForm;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService;
import com.esv.datacenter.iot.module.devicemodel.service.DeviceTypeService;
import com.esv.datacenter.iot.module.devicemodel.vo.DeviceTypeBriefVO;
import com.esv.datacenter.iot.module.devicemodel.vo.DeviceTypeVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Service("deviceTypeService")
public class DeviceTypeServiceImpl extends ServiceImpl<DeviceTypeDao, DeviceTypeEntity> implements DeviceTypeService {
@Autowired
private DeviceDataMapService deviceDataMapService;
@Autowired
private DataModelPropertyService dataModelPropertyService;
@Override
public Long insertDeviceType(DeviceTypeForm form) {
// 判断设备名称是否有重复
int count = this.getBaseMapper().selectCount(new LambdaQueryWrapper<DeviceTypeEntity>()
.eq(DeviceTypeEntity::getName, form.getName()));
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "设备类型[" + form.getName() + "]已存在");
}
DeviceTypeEntity entity = new DeviceTypeEntity();
BeanUtils.copyProperties(form, entity);
this.getBaseMapper().insert(entity);
return entity.getId();
}
@Override
public void updateDeviceType(DeviceTypeForm form) {
// 判断设备名称是否有重复
int count = this.getBaseMapper().selectCount(new LambdaQueryWrapper<DeviceTypeEntity>()
.ne(DeviceTypeEntity::getId, form.getId())
.eq(DeviceTypeEntity::getName, form.getName()));
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "设备类型[" + form.getName() + "]已存在");
}
DeviceTypeEntity entity = new DeviceTypeEntity();
BeanUtils.copyProperties(form, entity);
this.getBaseMapper().updateById(entity);
}
@Override
public DeviceTypeEntity getDeviceTypeById(Long id) {
return this.getBaseMapper().selectById(id);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteDeviceType(Long id) {
// 删除设备类型记录
this.getBaseMapper().deleteById(id);
// 删除设备类型与数据类型对应的映射记录
this.deviceDataMapService.deleteByDeviceTypeId(id);
}
@Override
public PageResultVO getType4Page(DeviceTypeForm form) {
IPage<DeviceTypeEntity> page = new Page<>(form.getPageNum(), form.getPageSize());
this.baseMapper.select4Page(page, form);
List<DeviceTypeEntity> entityList = page.getRecords();
List<DeviceTypeVO> voList = new ArrayList<>();
for (DeviceTypeEntity entity : entityList) {
DeviceTypeVO vo = new DeviceTypeVO();
BeanUtils.copyProperties(entity, vo);
vo.setCreateTime(entity.getCreateTime().getTime());
vo.setUpdateTime(entity.getUpdateTime().getTime());
voList.add(vo);
}
return new PageResultVO(page, voList);
}
@Override
public Boolean isValidTypeId(Long id) {
DeviceTypeEntity entity = this.getDeviceTypeById(id);
if (Objects.isNull(entity)) {
return false;
} else {
return true;
}
}
@Override
public List<DeviceTypeBriefVO> getTypeList() {
List<DeviceTypeEntity> entityList = this.getBaseMapper().selectList(new LambdaQueryWrapper<DeviceTypeEntity>()
.orderByAsc(DeviceTypeEntity::getName));
List<DeviceTypeBriefVO> voList = new ArrayList<>();
for (DeviceTypeEntity entity : entityList) {
DeviceTypeBriefVO vo = new DeviceTypeBriefVO();
BeanUtils.copyProperties(entity, vo);
voList.add(vo);
}
return voList;
}
@Override
public List<DataModelDetailVO> getDataModelByDeviceTypeId(Long deviceTypeId) {
List<DataModelEntity> entityList = deviceDataMapService.getDataModelByDeviceTypeId(deviceTypeId);
List<DataModelDetailVO> voList = new ArrayList<>();
for (DataModelEntity entity : entityList) {
DataModelDetailVO vo = new DataModelDetailVO();
BeanUtils.copyProperties(entity, vo);
vo.setPropertyList(dataModelPropertyService.getModelPropertyList(entity.getId()));
voList.add(vo);
}
return voList;
}
}
\ No newline at end of file
package com.esv.datacenter.iot.module.devicemodel.vo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 13:41
* @version:1.0
*/
@Data
public class DeviceInstanceVO {
/**
*
*/
private Long id;
/**
* 设备类型ID
*/
private Long deviceTypeId;
/**
* 设备类型名称
*/
private String deviceTypeName;
/**
* 设备名称
*/
private String name;
/**
* 设备描述
*/
private String description;
/**
* 设备业务ID
*/
private String businessId;
/**
* 设备型号
*/
private String deviceModel;
/**
* 创建者
*/
private String createUser;
/**
* 修改者
*/
private String updateUser;
/**
* 创建时间
*/
private Long createTime;
/**
* 修改时间
*/
private Long updateTime;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.devicemodel.vo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 9:39
* @version:1.0
*/
@Data
public class DeviceTypeBriefVO {
/**
*
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.devicemodel.vo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/07 9:39
* @version:1.0
*/
@Data
public class DeviceTypeVO {
/**
*
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 创建者
*/
private String createUser;
/**
* 修改者
*/
private String updateUser;
/**
* 创建时间
*/
private Long createTime;
/**
* 修改时间
*/
private Long updateTime;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.test.controller; package com.esv.datacenter.iot.module.test.controller;
import com.alibaba.fastjson.JSONArray;
import com.esv.datacenter.iot.common.component.RedisComponent;
import com.esv.datacenter.iot.common.response.EResponse; import com.esv.datacenter.iot.common.response.EResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringEscapeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/** /**
* @description: * @description:
* @project: freight-base-service * @project: freight-base-service
...@@ -20,9 +26,30 @@ import org.springframework.web.bind.annotation.RestController; ...@@ -20,9 +26,30 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j @Slf4j
public class TestController { public class TestController {
@Autowired
RedisComponent redisComponent;
@GetMapping("/ping") @GetMapping("/ping")
public EResponse ping() { public EResponse ping() {
return EResponse.ok(); return EResponse.ok();
} }
@GetMapping("/getCache")
public EResponse getCache(HttpServletRequest request) {
String key = request.getParameter("key");
String str = (String) redisComponent.get(key);
log.info(str);
return EResponse.ok(str);
}
@GetMapping("/getCache4List")
public EResponse getCache4List(HttpServletRequest request) {
String key = request.getParameter("key");
String str = (String) redisComponent.get(key);
log.info(str);
JSONArray array = JSONArray.parseArray(str);
log.info(array.toJSONString());
return EResponse.ok(array);
}
} }
...@@ -71,7 +71,7 @@ feign-base-service-name: datacenter-base-service ...@@ -71,7 +71,7 @@ feign-base-service-name: datacenter-base-service
db: db:
dict: dict:
table-field: table-field:
map: 1-string,2-number,3-boolean map: 1-string,2-number,3-integer,4-boolean,5-date,6-time,7-datetime
timescale: timescale:
data-source: data-source:
jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot
...@@ -84,5 +84,5 @@ timescale: ...@@ -84,5 +84,5 @@ timescale:
maximum-pool-size: 1 maximum-pool-size: 1
max-lifetime: 0 max-lifetime: 0
table-field: table-field:
map: string-text,number-numeric,boolean-bit(1) map: string-text,number-numeric,integer-int8,boolean-bit(1),date-date,time-int4,datetime-timestamptz
table-prefix: iot_model_ table-prefix: iot_data_model_
\ No newline at end of file \ No newline at end of file
...@@ -71,7 +71,7 @@ feign-base-service-name: datacenter-base-service ...@@ -71,7 +71,7 @@ feign-base-service-name: datacenter-base-service
db: db:
dict: dict:
table-field: table-field:
map: 1-string,2-number,3-boolean map: 1-string,2-number,3-integer,4-boolean,5-date,6-time,7-datetime
timescale: timescale:
data-source: data-source:
jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot
...@@ -84,7 +84,5 @@ timescale: ...@@ -84,7 +84,5 @@ timescale:
maximum-pool-size: 10 maximum-pool-size: 10
max-lifetime: 0 max-lifetime: 0
table-field: table-field:
map: string-text,number-numeric,boolean-bit(1) map: string-text,number-numeric,integer-int8,boolean-bit(1),date-date,time-int4,datetime-timestamptz
table-prefix: iot_data_model_ table-prefix: iot_data_model_
rdbms: \ No newline at end of file
table-prefix: iot_device_model_
\ No newline at end of file
...@@ -20,5 +20,12 @@ ...@@ -20,5 +20,12 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
</resultMap> </resultMap>
<select id="selectAll" resultType="com.esv.datacenter.iot.module.datamodel.dto.DataModelAlarmRuleDto">
select a.id, a.model_id, a.property_id, a.rule_expression, a.alarm_level, a.threshold,
b.property_code, b.property_name, b.property_type, b.property_default_value, b.property_unit
from data_model_alarm_rule a, data_model_property b
where a.model_id = b.model_id and a.property_id = b.id
ORDER BY model_id ASC
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
<select id="select4Page" parameterType="com.esv.datacenter.iot.module.datamodel.form.DataModelForm" <select id="select4Page" parameterType="com.esv.datacenter.iot.module.datamodel.form.DataModelForm"
resultType="com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity"> resultType="com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity">
select * select *
from base_object_model from data_model
where deleted = false where deleted = false
<if test="queryObj.name != null"> <if test="queryObj.name != null">
and name like #{queryObj.name} and name like #{queryObj.name}
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
</select> </select>
<update id="logicDeleteModel" parameterType="com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity"> <update id="logicDeleteModel" parameterType="com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity">
update base_object_model update data_model
set deleted = #{deleted} set deleted = #{deleted}
where id = #{id} where id = #{id}
</update> </update>
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
</resultMap> </resultMap>
<update id="logicDeleteModelProperty" parameterType="com.esv.datacenter.iot.module.datamodel.entity.DataModelPropertyEntity"> <update id="logicDeleteModelProperty" parameterType="com.esv.datacenter.iot.module.datamodel.entity.DataModelPropertyEntity">
update base_object_model_property update data_model_property
set deleted = #{deleted} set deleted = #{deleted}
where model_id = #{modelId} where model_id = #{modelId}
</update> </update>
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<result property="id" column="id"/> <result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/> <result property="tenantId" column="tenant_id"/>
<result property="departmentId" column="department_id"/> <result property="departmentId" column="department_id"/>
<result property="deviceModelId" column="device_model_id"/> <result property="deviceTypeId" column="device_type_id"/>
<result property="dataModelId" column="data_model_id"/> <result property="dataModelId" column="data_model_id"/>
<result property="createUser" column="create_user"/> <result property="createUser" column="create_user"/>
<result property="updateUser" column="update_user"/> <result property="updateUser" column="update_user"/>
...@@ -16,5 +16,12 @@ ...@@ -16,5 +16,12 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
</resultMap> </resultMap>
<select id="selectDataModelByDeviceTypeId" parameterType="com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity"
resultType="com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity">
select b.id, b.name, b.description
from device_data_map a, data_model b
where a.data_model_id = b.id and a.device_type_id = #{deviceTypeId}
ORDER BY b.name ASC
</select>
</mapper> </mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.esv.datacenter.iot.module.devicemodel.dao.DeviceModelInstanceDao"> <mapper namespace="com.esv.datacenter.iot.module.devicemodel.dao.DeviceInstanceDao">
<!-- 可根据自己的需求,是否要使用 --> <!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelInstanceEntity" id="deviceModelInstanceMap"> <resultMap type="com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity" id="deviceInstanceMap">
<result property="id" column="id"/> <result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/> <result property="tenantId" column="tenant_id"/>
<result property="departmentId" column="department_id"/> <result property="departmentId" column="department_id"/>
<result property="modelId" column="model_id"/> <result property="deviceTypeId" column="device_type_id"/>
<result property="name" column="name"/> <result property="name" column="name"/>
<result property="description" column="description"/> <result property="description" column="description"/>
<result property="businessId" column="business_id"/>
<result property="deviceModel" column="device_model"/>
<result property="deleted" column="deleted"/> <result property="deleted" column="deleted"/>
<result property="createUser" column="create_user"/> <result property="createUser" column="create_user"/>
<result property="updateUser" column="update_user"/> <result property="updateUser" column="update_user"/>
...@@ -18,5 +20,25 @@ ...@@ -18,5 +20,25 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
</resultMap> </resultMap>
<!-- 分页查询 -->
<select id="select4Page" parameterType="com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm"
resultType="com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto">
select a.*, b.name as deviceTypeName
from device_instance a, device_type b
where a.device_type_id = b.id and a.deleted = false
<if test="queryObj.deviceTypeId != null">
and a.device_type_id = #{queryObj.deviceTypeId}
</if>
<if test="queryObj.name != null">
and a.name like CONCAT('%', #{queryObj.name}, '%')
</if>
<if test="queryObj.businessId != null">
and a.business_id like CONCAT('%', #{queryObj.businessId}, '%')
</if>
<if test="queryObj.deviceModel != null">
and a.device_model like CONCAT('%', #{queryObj.deviceModel}, '%')
</if>
ORDER BY a.name ASC
</select>
</mapper> </mapper>
\ No newline at end of file
<?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.esv.datacenter.iot.module.devicemodel.dao.DeviceModelPropertyDao">
<!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelPropertyEntity" id="deviceModelPropertyMap">
<result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/>
<result property="departmentId" column="department_id"/>
<result property="modelId" column="model_id"/>
<result property="propertyCode" column="property_code"/>
<result property="propertyName" column="property_name"/>
<result property="propertyType" column="property_type"/>
<result property="propertyDefaultValue" column="property_default_value"/>
<result property="propertyUnit" column="property_unit"/>
<result property="sortNum" column="sort_num"/>
<result property="deleted" column="deleted"/>
<result property="createUser" column="create_user"/>
<result property="updateUser" column="update_user"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
</resultMap>
</mapper>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?> <?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"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.esv.datacenter.iot.module.devicemodel.dao.DeviceModelDao"> <mapper namespace="com.esv.datacenter.iot.module.devicemodel.dao.DeviceTypeDao">
<!-- 可根据自己的需求,是否要使用 --> <!-- 可根据自己的需求,是否要使用 -->
<resultMap type="com.esv.datacenter.iot.module.devicemodel.entity.DeviceModelEntity" id="deviceModelMap"> <resultMap type="com.esv.datacenter.iot.module.devicemodel.entity.DeviceTypeEntity" id="deviceTypeMap">
<result property="id" column="id"/> <result property="id" column="id"/>
<result property="tenantId" column="tenant_id"/> <result property="tenantId" column="tenant_id"/>
<result property="departmentId" column="department_id"/> <result property="departmentId" column="department_id"/>
...@@ -17,5 +17,16 @@ ...@@ -17,5 +17,16 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
</resultMap> </resultMap>
<!-- 分页查询 -->
<select id="select4Page" parameterType="com.esv.datacenter.iot.module.devicemodel.form.DeviceTypeForm"
resultType="com.esv.datacenter.iot.module.devicemodel.entity.DeviceTypeEntity">
select *
from device_type
where deleted = false
<if test="queryObj.name != null">
and name like #{queryObj.name}
</if>
ORDER BY name ASC
</select>
</mapper> </mapper>
\ No newline at end of file
...@@ -3,8 +3,8 @@ package com.esv.datacenter.iot.module.datamodel.controller; ...@@ -3,8 +3,8 @@ package com.esv.datacenter.iot.module.datamodel.controller;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.esv.datacenter.iot.BaseTestController; import com.esv.datacenter.iot.BaseTestController;
import com.esv.datacenter.iot.common.response.ECode; import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.module.datamodel.form.DataModelPropertyForm;
import com.esv.datacenter.iot.module.datamodel.form.DataModelForm; import com.esv.datacenter.iot.module.datamodel.form.DataModelForm;
import com.esv.datacenter.iot.module.datamodel.form.DataModelPropertyForm;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.junit.Assert; import org.junit.Assert;
import org.junit.FixMethodOrder; import org.junit.FixMethodOrder;
...@@ -39,24 +39,99 @@ import java.util.List; ...@@ -39,24 +39,99 @@ import java.util.List;
public class DataModelControllerTest extends BaseTestController { public class DataModelControllerTest extends BaseTestController {
/** /**
* * 创建数据模型
**/ **/
@Test @Test
public void a1_add_success_test() throws Exception { public void a1_add_success_test() throws Exception {
String url = "/model/add"; String url = "/dataModel/add";
// 构造数据 // 构造数据
DataModelForm form = new DataModelForm(); DataModelForm form = new DataModelForm();
form.setName("测试模型"); form.setName("hcb-测试模型-1639");
form.setDescription("这是一个测试模型"); form.setDescription("这是一个测试模型");
List<DataModelPropertyForm> propertyList = new ArrayList<>(); List<DataModelPropertyForm> propertyList = new ArrayList<>();
DataModelPropertyForm dataModelPropertyForm = new DataModelPropertyForm(); DataModelPropertyForm dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("id"); dataModelPropertyForm.setPropertyCode("t1");
dataModelPropertyForm.setPropertyName("主键"); dataModelPropertyForm.setPropertyName("string");
dataModelPropertyForm.setPropertyType(1); dataModelPropertyForm.setPropertyType(1);
dataModelPropertyForm.setPropertyDefaultValue("hello world");
propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList);
dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("t2");
dataModelPropertyForm.setPropertyName("number");
dataModelPropertyForm.setPropertyType(2);
dataModelPropertyForm.setPropertyDefaultValue("3.14");
propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList);
dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("t3");
dataModelPropertyForm.setPropertyName("integer");
dataModelPropertyForm.setPropertyType(3);
dataModelPropertyForm.setPropertyDefaultValue("100");
propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList);
dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("t4");
dataModelPropertyForm.setPropertyName("boolean");
dataModelPropertyForm.setPropertyType(4);
dataModelPropertyForm.setPropertyDefaultValue("true");
propertyList.add(dataModelPropertyForm); propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList); form.setPropertyList(propertyList);
dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("t5");
dataModelPropertyForm.setPropertyName("date");
dataModelPropertyForm.setPropertyType(5);
dataModelPropertyForm.setPropertyDefaultValue("1970-01-01");
propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList);
dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("t6");
dataModelPropertyForm.setPropertyName("time");
dataModelPropertyForm.setPropertyType(6);
dataModelPropertyForm.setPropertyDefaultValue("00:00:00");
propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList);
dataModelPropertyForm = new DataModelPropertyForm();
dataModelPropertyForm.setPropertyCode("t7");
dataModelPropertyForm.setPropertyName("datetime");
dataModelPropertyForm.setPropertyType(7);
dataModelPropertyForm.setPropertyDefaultValue("1970-01-01 00:00:00");
propertyList.add(dataModelPropertyForm);
form.setPropertyList(propertyList);
MvcResult mvcResult = this.getMockMvc().perform(MockMvcRequestBuilders.post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.headers(this.getDefaultHttpHeaders())
.content(form.toString()))
.andDo(MockMvcResultHandlers.print())
.andExpect(MockMvcResultMatchers.status().isOk())
.andReturn();
String responseStr = mvcResult.getResponse().getContentAsString();
log.info(responseStr);
JSONObject result = JSONObject.parseObject(responseStr);
Assert.assertEquals(ECode.SUCCESS.code(), result.getIntValue("code"));
}
/**
* 删除数据模型
**/
@Test
public void b1_delete_success_test() throws Exception {
String url = "/dataModel/delete";
// 构造数据
DataModelForm form = new DataModelForm();
form.setId(4L);
MvcResult mvcResult = this.getMockMvc().perform(MockMvcRequestBuilders.post(url) MvcResult mvcResult = this.getMockMvc().perform(MockMvcRequestBuilders.post(url)
.contentType(MediaType.APPLICATION_JSON_UTF8_VALUE) .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
.headers(this.getDefaultHttpHeaders()) .headers(this.getDefaultHttpHeaders())
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment