Commit 28f9e05d authored by huangcb's avatar huangcb

增加数据类型:date/time/datetime处理

parent 800dced9
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;
}
} }
...@@ -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;
...@@ -129,6 +130,21 @@ public class DataModelPropertyServiceImpl extends ServiceImpl<DataModelPropertyD ...@@ -129,6 +130,21 @@ 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 "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;
} }
......
...@@ -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
...@@ -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,integer-int8,boolean-bit(1),date-date,time-int,datetime-timestamptz 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_
\ 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