Browse Source

温湿度设备预兼容,后面客户要加再完整修改

jwy_category
review512jwy@163.com 1 month ago
parent
commit
2fb031ffd6
  1. 15
      dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java
  2. 11
      dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/DeviceAttrCode.java
  3. 6
      dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java
  4. 6
      dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java
  5. 32
      dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/DashboardRealtimeMeasureMapper.java
  6. 1
      dongjian-dashboard-back-dao/src/main/resources/mappers/aurora/DashboardRealtimeMeasureMapperExt.xml
  7. 109
      dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardRealtimeMeasureMapper.xml
  8. 37
      dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardRecordAccumulateMapper.xml
  9. 3
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/device/LineDataSearchParams.java
  10. 34
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRealtimeMeasure.java
  11. 70
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRealtimeMeasureExample.java
  12. 34
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRecordAccumulate.java
  13. 70
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRecordAccumulateExample.java
  14. 3
      dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/LineData.java
  15. 2
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataAccumulateService.java
  16. 2
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataMeasureService.java
  17. 195
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java
  18. 4
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java
  19. 57
      dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java

15
dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java

@ -38,11 +38,18 @@ public class Constants {
// 定义分类与设备类型的映射 // 定义分类与设备类型的映射
public static final Map<Integer, List<Integer>> CATEGORY_DEVICE_TYPE_MAP = new HashMap<>(); public static final Map<Integer, List<Integer>> CATEGORY_DEVICE_TYPE_MAP = new HashMap<>();
//温湿度
public static final List<Integer> DEVICE_TYPE_TEMPERATURE_HUMIDITY = Arrays.asList(8888882,9999992);
static { static {
CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_ALARM, Arrays.asList(46, 110)); CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_ALARM, new ArrayList<>(Arrays.asList(46, 110)));
CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_MEASURE, Arrays.asList(47, 111, 121));
CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_ACCUMULATE, Arrays.asList(48, 112, 122)); CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_MEASURE, new ArrayList<>(Arrays.asList(47, 111, 121)));
CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_STATUS, Arrays.asList(86, 113, 123)); CATEGORY_DEVICE_TYPE_MAP.get(CATEGORY_MEASURE).addAll(DEVICE_TYPE_TEMPERATURE_HUMIDITY);
CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_ACCUMULATE, new ArrayList<>(Arrays.asList(48, 112, 122)));
CATEGORY_DEVICE_TYPE_MAP.put(CATEGORY_STATUS, new ArrayList<>(Arrays.asList(86, 113, 123)));
// 收集所有的设备类型ID // 收集所有的设备类型ID
for (List<Integer> ids : CATEGORY_DEVICE_TYPE_MAP.values()) { for (List<Integer> ids : CATEGORY_DEVICE_TYPE_MAP.values()) {

11
dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/DeviceAttrCode.java

@ -0,0 +1,11 @@
package com.dongjian.dashboard.back.common;
public class DeviceAttrCode {
public static final String COMMON = "single";
public static final String MEASURE_TEMPERATURE = "temperature";
public static final String MEASURE_HUMIDITY = "humidity";
}

6
dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java

@ -114,14 +114,14 @@ public class DeviceDataAccumulateController {
@OperationLog(operation = "getLineData", remark = "") @OperationLog(operation = "getLineData", remark = "")
@Operation(summary = "获取7日趋势数据") @Operation(summary = "获取7日趋势数据")
@RequestMapping(value = "/getLineData",method = RequestMethod.GET) @RequestMapping(value = "/getLineData",method = RequestMethod.POST)
public SimpleDataResponse<LineData> getLineData( public SimpleDataResponse<List<LineData>> getLineData(
@Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName, @Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
@Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken, @Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken,
@Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId, @Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
@Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId, @Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId,
@Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType,
LineDataSearchParams lineDataSearchParams @RequestBody LineDataSearchParams lineDataSearchParams
) throws BusinessException { ) throws BusinessException {
return deviceDataAccumulateService.getLineData(lineDataSearchParams, CompanyId, UserId, LanguageType); return deviceDataAccumulateService.getLineData(lineDataSearchParams, CompanyId, UserId, LanguageType);
} }

6
dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java

@ -113,14 +113,14 @@ public class DeviceDataMeasureController {
@OperationLog(operation = "getLineData", remark = "") @OperationLog(operation = "getLineData", remark = "")
@Operation(summary = "获取7日趋势数据") @Operation(summary = "获取7日趋势数据")
@RequestMapping(value = "/getLineData",method = RequestMethod.GET) @RequestMapping(value = "/getLineData",method = RequestMethod.POST)
public SimpleDataResponse<LineData> getLineData( public SimpleDataResponse<List<LineData>> getLineData(
@Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName, @Parameter(name = "LoginName", description = "Login name", required = true, schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
@Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken, @Parameter(name = "AccessToken", description = "Authentication token", required = true) @RequestHeader(required=true) String AccessToken,
@Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId, @Parameter(name = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
@Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId, @Parameter(name = "CompanyId", description = "ID of the company to which the user belongs", required = false, schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) Long CompanyId,
@Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType,
LineDataSearchParams lineDataSearchParams @RequestBody LineDataSearchParams lineDataSearchParams
) throws BusinessException { ) throws BusinessException {
return deviceDataMeasureService.getLineData(lineDataSearchParams, CompanyId, UserId, LanguageType); return deviceDataMeasureService.getLineData(lineDataSearchParams, CompanyId, UserId, LanguageType);
} }

32
dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/DashboardRealtimeMeasureMapper.java

@ -22,14 +22,6 @@ public interface DashboardRealtimeMeasureMapper {
*/ */
int deleteByExample(DashboardRealtimeMeasureExample example); int deleteByExample(DashboardRealtimeMeasureExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dashboard_realtime_measure
*
* @mbg.generated
*/
int deleteByPrimaryKey(String deviceId);
/** /**
* This method was generated by MyBatis Generator. * This method was generated by MyBatis Generator.
* This method corresponds to the database table dashboard_realtime_measure * This method corresponds to the database table dashboard_realtime_measure
@ -54,14 +46,6 @@ public interface DashboardRealtimeMeasureMapper {
*/ */
List<DashboardRealtimeMeasure> selectByExample(DashboardRealtimeMeasureExample example); List<DashboardRealtimeMeasure> selectByExample(DashboardRealtimeMeasureExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dashboard_realtime_measure
*
* @mbg.generated
*/
DashboardRealtimeMeasure selectByPrimaryKey(String deviceId);
/** /**
* This method was generated by MyBatis Generator. * This method was generated by MyBatis Generator.
* This method corresponds to the database table dashboard_realtime_measure * This method corresponds to the database table dashboard_realtime_measure
@ -77,20 +61,4 @@ public interface DashboardRealtimeMeasureMapper {
* @mbg.generated * @mbg.generated
*/ */
int updateByExample(@Param("record") DashboardRealtimeMeasure record, @Param("example") DashboardRealtimeMeasureExample example); int updateByExample(@Param("record") DashboardRealtimeMeasure record, @Param("example") DashboardRealtimeMeasureExample example);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dashboard_realtime_measure
*
* @mbg.generated
*/
int updateByPrimaryKeySelective(DashboardRealtimeMeasure record);
/**
* This method was generated by MyBatis Generator.
* This method corresponds to the database table dashboard_realtime_measure
*
* @mbg.generated
*/
int updateByPrimaryKey(DashboardRealtimeMeasure record);
} }

1
dongjian-dashboard-back-dao/src/main/resources/mappers/aurora/DashboardRealtimeMeasureMapperExt.xml

@ -5,6 +5,7 @@
<select id="selectRealtimeMeasureByDevices" parameterType="map" resultType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasure"> <select id="selectRealtimeMeasureByDevices" parameterType="map" resultType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasure">
SELECT SELECT
device_id, device_id,
attr_code,
upload_value, upload_value,
max_value, max_value,
min_value, min_value,

109
dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardRealtimeMeasureMapper.xml

@ -6,7 +6,8 @@
WARNING - @mbg.generated WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify. This element is automatically generated by MyBatis Generator, do not modify.
--> -->
<id column="device_id" jdbcType="VARCHAR" property="deviceId" /> <result column="device_id" jdbcType="VARCHAR" property="deviceId" />
<result column="attr_code" jdbcType="VARCHAR" property="attrCode" />
<result column="date_year" jdbcType="INTEGER" property="dateYear" /> <result column="date_year" jdbcType="INTEGER" property="dateYear" />
<result column="date_month" jdbcType="INTEGER" property="dateMonth" /> <result column="date_month" jdbcType="INTEGER" property="dateMonth" />
<result column="date_day" jdbcType="INTEGER" property="dateDay" /> <result column="date_day" jdbcType="INTEGER" property="dateDay" />
@ -89,7 +90,7 @@
WARNING - @mbg.generated WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify. This element is automatically generated by MyBatis Generator, do not modify.
--> -->
device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, device_id, attr_code, date_year, date_month, date_day, date_hour, date_minute, date_second,
upload_value, min_value, max_value, upload_at upload_value, min_value, max_value, upload_at
</sql> </sql>
<select id="selectByExample" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasureExample" resultMap="BaseResultMap"> <select id="selectByExample" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasureExample" resultMap="BaseResultMap">
@ -111,24 +112,6 @@
order by ${orderByClause} order by ${orderByClause}
</if> </if>
</select> </select>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
-->
select
<include refid="Base_Column_List" />
from dashboard_realtime_measure
where device_id = #{deviceId,jdbcType=VARCHAR}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
-->
delete from dashboard_realtime_measure
where device_id = #{deviceId,jdbcType=VARCHAR}
</delete>
<delete id="deleteByExample" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasureExample"> <delete id="deleteByExample" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasureExample">
<!-- <!--
WARNING - @mbg.generated WARNING - @mbg.generated
@ -144,14 +127,16 @@
WARNING - @mbg.generated WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify. This element is automatically generated by MyBatis Generator, do not modify.
--> -->
insert into dashboard_realtime_measure (device_id, date_year, date_month, insert into dashboard_realtime_measure (device_id, attr_code, date_year,
date_day, date_hour, date_minute, date_month, date_day, date_hour,
date_second, upload_value, min_value, date_minute, date_second, upload_value,
max_value, upload_at) min_value, max_value, upload_at
values (#{deviceId,jdbcType=VARCHAR}, #{dateYear,jdbcType=INTEGER}, #{dateMonth,jdbcType=INTEGER}, )
#{dateDay,jdbcType=INTEGER}, #{dateHour,jdbcType=INTEGER}, #{dateMinute,jdbcType=INTEGER}, values (#{deviceId,jdbcType=VARCHAR}, #{attrCode,jdbcType=VARCHAR}, #{dateYear,jdbcType=INTEGER},
#{dateSecond,jdbcType=INTEGER}, #{uploadValue,jdbcType=VARCHAR}, #{minValue,jdbcType=VARCHAR}, #{dateMonth,jdbcType=INTEGER}, #{dateDay,jdbcType=INTEGER}, #{dateHour,jdbcType=INTEGER},
#{maxValue,jdbcType=VARCHAR}, #{uploadAt,jdbcType=BIGINT}) #{dateMinute,jdbcType=INTEGER}, #{dateSecond,jdbcType=INTEGER}, #{uploadValue,jdbcType=VARCHAR},
#{minValue,jdbcType=VARCHAR}, #{maxValue,jdbcType=VARCHAR}, #{uploadAt,jdbcType=BIGINT}
)
</insert> </insert>
<insert id="insertSelective" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasure"> <insert id="insertSelective" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasure">
<!-- <!--
@ -163,6 +148,9 @@
<if test="deviceId != null"> <if test="deviceId != null">
device_id, device_id,
</if> </if>
<if test="attrCode != null">
attr_code,
</if>
<if test="dateYear != null"> <if test="dateYear != null">
date_year, date_year,
</if> </if>
@ -198,6 +186,9 @@
<if test="deviceId != null"> <if test="deviceId != null">
#{deviceId,jdbcType=VARCHAR}, #{deviceId,jdbcType=VARCHAR},
</if> </if>
<if test="attrCode != null">
#{attrCode,jdbcType=VARCHAR},
</if>
<if test="dateYear != null"> <if test="dateYear != null">
#{dateYear,jdbcType=INTEGER}, #{dateYear,jdbcType=INTEGER},
</if> </if>
@ -250,6 +241,9 @@
<if test="record.deviceId != null"> <if test="record.deviceId != null">
device_id = #{record.deviceId,jdbcType=VARCHAR}, device_id = #{record.deviceId,jdbcType=VARCHAR},
</if> </if>
<if test="record.attrCode != null">
attr_code = #{record.attrCode,jdbcType=VARCHAR},
</if>
<if test="record.dateYear != null"> <if test="record.dateYear != null">
date_year = #{record.dateYear,jdbcType=INTEGER}, date_year = #{record.dateYear,jdbcType=INTEGER},
</if> </if>
@ -292,6 +286,7 @@
--> -->
update dashboard_realtime_measure update dashboard_realtime_measure
set device_id = #{record.deviceId,jdbcType=VARCHAR}, set device_id = #{record.deviceId,jdbcType=VARCHAR},
attr_code = #{record.attrCode,jdbcType=VARCHAR},
date_year = #{record.dateYear,jdbcType=INTEGER}, date_year = #{record.dateYear,jdbcType=INTEGER},
date_month = #{record.dateMonth,jdbcType=INTEGER}, date_month = #{record.dateMonth,jdbcType=INTEGER},
date_day = #{record.dateDay,jdbcType=INTEGER}, date_day = #{record.dateDay,jdbcType=INTEGER},
@ -306,62 +301,4 @@
<include refid="Update_By_Example_Where_Clause" /> <include refid="Update_By_Example_Where_Clause" />
</if> </if>
</update> </update>
<update id="updateByPrimaryKeySelective" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasure">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
-->
update dashboard_realtime_measure
<set>
<if test="dateYear != null">
date_year = #{dateYear,jdbcType=INTEGER},
</if>
<if test="dateMonth != null">
date_month = #{dateMonth,jdbcType=INTEGER},
</if>
<if test="dateDay != null">
date_day = #{dateDay,jdbcType=INTEGER},
</if>
<if test="dateHour != null">
date_hour = #{dateHour,jdbcType=INTEGER},
</if>
<if test="dateMinute != null">
date_minute = #{dateMinute,jdbcType=INTEGER},
</if>
<if test="dateSecond != null">
date_second = #{dateSecond,jdbcType=INTEGER},
</if>
<if test="uploadValue != null">
upload_value = #{uploadValue,jdbcType=VARCHAR},
</if>
<if test="minValue != null">
min_value = #{minValue,jdbcType=VARCHAR},
</if>
<if test="maxValue != null">
max_value = #{maxValue,jdbcType=VARCHAR},
</if>
<if test="uploadAt != null">
upload_at = #{uploadAt,jdbcType=BIGINT},
</if>
</set>
where device_id = #{deviceId,jdbcType=VARCHAR}
</update>
<update id="updateByPrimaryKey" parameterType="com.dongjian.dashboard.back.model.DashboardRealtimeMeasure">
<!--
WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify.
-->
update dashboard_realtime_measure
set date_year = #{dateYear,jdbcType=INTEGER},
date_month = #{dateMonth,jdbcType=INTEGER},
date_day = #{dateDay,jdbcType=INTEGER},
date_hour = #{dateHour,jdbcType=INTEGER},
date_minute = #{dateMinute,jdbcType=INTEGER},
date_second = #{dateSecond,jdbcType=INTEGER},
upload_value = #{uploadValue,jdbcType=VARCHAR},
min_value = #{minValue,jdbcType=VARCHAR},
max_value = #{maxValue,jdbcType=VARCHAR},
upload_at = #{uploadAt,jdbcType=BIGINT}
where device_id = #{deviceId,jdbcType=VARCHAR}
</update>
</mapper> </mapper>

37
dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardRecordAccumulateMapper.xml

@ -8,6 +8,7 @@
--> -->
<id column="id" jdbcType="BIGINT" property="id" /> <id column="id" jdbcType="BIGINT" property="id" />
<result column="device_id" jdbcType="VARCHAR" property="deviceId" /> <result column="device_id" jdbcType="VARCHAR" property="deviceId" />
<result column="attr_code" jdbcType="VARCHAR" property="attrCode" />
<result column="date_year" jdbcType="INTEGER" property="dateYear" /> <result column="date_year" jdbcType="INTEGER" property="dateYear" />
<result column="date_month" jdbcType="INTEGER" property="dateMonth" /> <result column="date_month" jdbcType="INTEGER" property="dateMonth" />
<result column="date_day" jdbcType="INTEGER" property="dateDay" /> <result column="date_day" jdbcType="INTEGER" property="dateDay" />
@ -90,8 +91,8 @@
WARNING - @mbg.generated WARNING - @mbg.generated
This element is automatically generated by MyBatis Generator, do not modify. This element is automatically generated by MyBatis Generator, do not modify.
--> -->
id, device_id, date_year, date_month, date_day, date_hour, date_minute, date_second, id, device_id, attr_code, date_year, date_month, date_day, date_hour, date_minute,
upload_value, increment_today, increment_minute, upload_at date_second, upload_value, increment_today, increment_minute, upload_at
</sql> </sql>
<select id="selectByExample" parameterType="com.dongjian.dashboard.back.model.DashboardRecordAccumulateExample" resultMap="BaseResultMap"> <select id="selectByExample" parameterType="com.dongjian.dashboard.back.model.DashboardRecordAccumulateExample" resultMap="BaseResultMap">
<!-- <!--
@ -148,14 +149,16 @@
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Long">
SELECT LAST_INSERT_ID() SELECT LAST_INSERT_ID()
</selectKey> </selectKey>
insert into dashboard_record_accumulate (device_id, date_year, date_month, insert into dashboard_record_accumulate (device_id, attr_code, date_year,
date_day, date_hour, date_minute, date_month, date_day, date_hour,
date_second, upload_value, increment_today, date_minute, date_second, upload_value,
increment_minute, upload_at) increment_today, increment_minute, upload_at
values (#{deviceId,jdbcType=VARCHAR}, #{dateYear,jdbcType=INTEGER}, #{dateMonth,jdbcType=INTEGER}, )
#{dateDay,jdbcType=INTEGER}, #{dateHour,jdbcType=INTEGER}, #{dateMinute,jdbcType=INTEGER}, values (#{deviceId,jdbcType=VARCHAR}, #{attrCode,jdbcType=VARCHAR}, #{dateYear,jdbcType=INTEGER},
#{dateSecond,jdbcType=INTEGER}, #{uploadValue,jdbcType=VARCHAR}, #{incrementToday,jdbcType=VARCHAR}, #{dateMonth,jdbcType=INTEGER}, #{dateDay,jdbcType=INTEGER}, #{dateHour,jdbcType=INTEGER},
#{incrementMinute,jdbcType=VARCHAR}, #{uploadAt,jdbcType=BIGINT}) #{dateMinute,jdbcType=INTEGER}, #{dateSecond,jdbcType=INTEGER}, #{uploadValue,jdbcType=VARCHAR},
#{incrementToday,jdbcType=VARCHAR}, #{incrementMinute,jdbcType=VARCHAR}, #{uploadAt,jdbcType=BIGINT}
)
</insert> </insert>
<insert id="insertSelective" parameterType="com.dongjian.dashboard.back.model.DashboardRecordAccumulate"> <insert id="insertSelective" parameterType="com.dongjian.dashboard.back.model.DashboardRecordAccumulate">
<!-- <!--
@ -170,6 +173,9 @@
<if test="deviceId != null"> <if test="deviceId != null">
device_id, device_id,
</if> </if>
<if test="attrCode != null">
attr_code,
</if>
<if test="dateYear != null"> <if test="dateYear != null">
date_year, date_year,
</if> </if>
@ -205,6 +211,9 @@
<if test="deviceId != null"> <if test="deviceId != null">
#{deviceId,jdbcType=VARCHAR}, #{deviceId,jdbcType=VARCHAR},
</if> </if>
<if test="attrCode != null">
#{attrCode,jdbcType=VARCHAR},
</if>
<if test="dateYear != null"> <if test="dateYear != null">
#{dateYear,jdbcType=INTEGER}, #{dateYear,jdbcType=INTEGER},
</if> </if>
@ -260,6 +269,9 @@
<if test="record.deviceId != null"> <if test="record.deviceId != null">
device_id = #{record.deviceId,jdbcType=VARCHAR}, device_id = #{record.deviceId,jdbcType=VARCHAR},
</if> </if>
<if test="record.attrCode != null">
attr_code = #{record.attrCode,jdbcType=VARCHAR},
</if>
<if test="record.dateYear != null"> <if test="record.dateYear != null">
date_year = #{record.dateYear,jdbcType=INTEGER}, date_year = #{record.dateYear,jdbcType=INTEGER},
</if> </if>
@ -303,6 +315,7 @@
update dashboard_record_accumulate update dashboard_record_accumulate
set id = #{record.id,jdbcType=BIGINT}, set id = #{record.id,jdbcType=BIGINT},
device_id = #{record.deviceId,jdbcType=VARCHAR}, device_id = #{record.deviceId,jdbcType=VARCHAR},
attr_code = #{record.attrCode,jdbcType=VARCHAR},
date_year = #{record.dateYear,jdbcType=INTEGER}, date_year = #{record.dateYear,jdbcType=INTEGER},
date_month = #{record.dateMonth,jdbcType=INTEGER}, date_month = #{record.dateMonth,jdbcType=INTEGER},
date_day = #{record.dateDay,jdbcType=INTEGER}, date_day = #{record.dateDay,jdbcType=INTEGER},
@ -327,6 +340,9 @@
<if test="deviceId != null"> <if test="deviceId != null">
device_id = #{deviceId,jdbcType=VARCHAR}, device_id = #{deviceId,jdbcType=VARCHAR},
</if> </if>
<if test="attrCode != null">
attr_code = #{attrCode,jdbcType=VARCHAR},
</if>
<if test="dateYear != null"> <if test="dateYear != null">
date_year = #{dateYear,jdbcType=INTEGER}, date_year = #{dateYear,jdbcType=INTEGER},
</if> </if>
@ -367,6 +383,7 @@
--> -->
update dashboard_record_accumulate update dashboard_record_accumulate
set device_id = #{deviceId,jdbcType=VARCHAR}, set device_id = #{deviceId,jdbcType=VARCHAR},
attr_code = #{attrCode,jdbcType=VARCHAR},
date_year = #{dateYear,jdbcType=INTEGER}, date_year = #{dateYear,jdbcType=INTEGER},
date_month = #{dateMonth,jdbcType=INTEGER}, date_month = #{dateMonth,jdbcType=INTEGER},
date_day = #{dateDay,jdbcType=INTEGER}, date_day = #{dateDay,jdbcType=INTEGER},

3
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/device/LineDataSearchParams.java

@ -9,4 +9,7 @@ public class LineDataSearchParams {
@Schema(description = "device ID") @Schema(description = "device ID")
private String deviceId; private String deviceId;
@Schema(description = "属性编码, 默认:single,温湿度设备:temperature或者humidity")
private String[] attrCodeList;
} }

34
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRealtimeMeasure.java

@ -12,6 +12,15 @@ public class DashboardRealtimeMeasure implements Serializable {
*/ */
private String deviceId; private String deviceId;
/**
*
* This field was generated by MyBatis Generator.
* This field corresponds to the database column dashboard_realtime_measure.attr_code
*
* @mbg.generated
*/
private String attrCode;
/** /**
* *
* This field was generated by MyBatis Generator. * This field was generated by MyBatis Generator.
@ -134,6 +143,30 @@ public class DashboardRealtimeMeasure implements Serializable {
this.deviceId = deviceId == null ? null : deviceId.trim(); this.deviceId = deviceId == null ? null : deviceId.trim();
} }
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column dashboard_realtime_measure.attr_code
*
* @return the value of dashboard_realtime_measure.attr_code
*
* @mbg.generated
*/
public String getAttrCode() {
return attrCode;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column dashboard_realtime_measure.attr_code
*
* @param attrCode the value for dashboard_realtime_measure.attr_code
*
* @mbg.generated
*/
public void setAttrCode(String attrCode) {
this.attrCode = attrCode == null ? null : attrCode.trim();
}
/** /**
* This method was generated by MyBatis Generator. * This method was generated by MyBatis Generator.
* This method returns the value of the database column dashboard_realtime_measure.date_year * This method returns the value of the database column dashboard_realtime_measure.date_year
@ -387,6 +420,7 @@ public class DashboardRealtimeMeasure implements Serializable {
sb.append(" ["); sb.append(" [");
sb.append("Hash = ").append(hashCode()); sb.append("Hash = ").append(hashCode());
sb.append(", deviceId=").append(deviceId); sb.append(", deviceId=").append(deviceId);
sb.append(", attrCode=").append(attrCode);
sb.append(", dateYear=").append(dateYear); sb.append(", dateYear=").append(dateYear);
sb.append(", dateMonth=").append(dateMonth); sb.append(", dateMonth=").append(dateMonth);
sb.append(", dateDay=").append(dateDay); sb.append(", dateDay=").append(dateDay);

70
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRealtimeMeasureExample.java

@ -264,6 +264,76 @@ public class DashboardRealtimeMeasureExample {
return (Criteria) this; return (Criteria) this;
} }
public Criteria andAttrCodeIsNull() {
addCriterion("attr_code is null");
return (Criteria) this;
}
public Criteria andAttrCodeIsNotNull() {
addCriterion("attr_code is not null");
return (Criteria) this;
}
public Criteria andAttrCodeEqualTo(String value) {
addCriterion("attr_code =", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotEqualTo(String value) {
addCriterion("attr_code <>", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeGreaterThan(String value) {
addCriterion("attr_code >", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeGreaterThanOrEqualTo(String value) {
addCriterion("attr_code >=", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeLessThan(String value) {
addCriterion("attr_code <", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeLessThanOrEqualTo(String value) {
addCriterion("attr_code <=", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeLike(String value) {
addCriterion("attr_code like", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotLike(String value) {
addCriterion("attr_code not like", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeIn(List<String> values) {
addCriterion("attr_code in", values, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotIn(List<String> values) {
addCriterion("attr_code not in", values, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeBetween(String value1, String value2) {
addCriterion("attr_code between", value1, value2, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotBetween(String value1, String value2) {
addCriterion("attr_code not between", value1, value2, "attrCode");
return (Criteria) this;
}
public Criteria andDateYearIsNull() { public Criteria andDateYearIsNull() {
addCriterion("date_year is null"); addCriterion("date_year is null");
return (Criteria) this; return (Criteria) this;

34
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRecordAccumulate.java

@ -21,6 +21,15 @@ public class DashboardRecordAccumulate implements Serializable {
*/ */
private String deviceId; private String deviceId;
/**
*
* This field was generated by MyBatis Generator.
* This field corresponds to the database column dashboard_record_accumulate.attr_code
*
* @mbg.generated
*/
private String attrCode;
/** /**
* *
* This field was generated by MyBatis Generator. * This field was generated by MyBatis Generator.
@ -167,6 +176,30 @@ public class DashboardRecordAccumulate implements Serializable {
this.deviceId = deviceId == null ? null : deviceId.trim(); this.deviceId = deviceId == null ? null : deviceId.trim();
} }
/**
* This method was generated by MyBatis Generator.
* This method returns the value of the database column dashboard_record_accumulate.attr_code
*
* @return the value of dashboard_record_accumulate.attr_code
*
* @mbg.generated
*/
public String getAttrCode() {
return attrCode;
}
/**
* This method was generated by MyBatis Generator.
* This method sets the value of the database column dashboard_record_accumulate.attr_code
*
* @param attrCode the value for dashboard_record_accumulate.attr_code
*
* @mbg.generated
*/
public void setAttrCode(String attrCode) {
this.attrCode = attrCode == null ? null : attrCode.trim();
}
/** /**
* This method was generated by MyBatis Generator. * This method was generated by MyBatis Generator.
* This method returns the value of the database column dashboard_record_accumulate.date_year * This method returns the value of the database column dashboard_record_accumulate.date_year
@ -421,6 +454,7 @@ public class DashboardRecordAccumulate implements Serializable {
sb.append("Hash = ").append(hashCode()); sb.append("Hash = ").append(hashCode());
sb.append(", id=").append(id); sb.append(", id=").append(id);
sb.append(", deviceId=").append(deviceId); sb.append(", deviceId=").append(deviceId);
sb.append(", attrCode=").append(attrCode);
sb.append(", dateYear=").append(dateYear); sb.append(", dateYear=").append(dateYear);
sb.append(", dateMonth=").append(dateMonth); sb.append(", dateMonth=").append(dateMonth);
sb.append(", dateDay=").append(dateDay); sb.append(", dateDay=").append(dateDay);

70
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardRecordAccumulateExample.java

@ -324,6 +324,76 @@ public class DashboardRecordAccumulateExample {
return (Criteria) this; return (Criteria) this;
} }
public Criteria andAttrCodeIsNull() {
addCriterion("attr_code is null");
return (Criteria) this;
}
public Criteria andAttrCodeIsNotNull() {
addCriterion("attr_code is not null");
return (Criteria) this;
}
public Criteria andAttrCodeEqualTo(String value) {
addCriterion("attr_code =", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotEqualTo(String value) {
addCriterion("attr_code <>", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeGreaterThan(String value) {
addCriterion("attr_code >", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeGreaterThanOrEqualTo(String value) {
addCriterion("attr_code >=", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeLessThan(String value) {
addCriterion("attr_code <", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeLessThanOrEqualTo(String value) {
addCriterion("attr_code <=", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeLike(String value) {
addCriterion("attr_code like", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotLike(String value) {
addCriterion("attr_code not like", value, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeIn(List<String> values) {
addCriterion("attr_code in", values, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotIn(List<String> values) {
addCriterion("attr_code not in", values, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeBetween(String value1, String value2) {
addCriterion("attr_code between", value1, value2, "attrCode");
return (Criteria) this;
}
public Criteria andAttrCodeNotBetween(String value1, String value2) {
addCriterion("attr_code not between", value1, value2, "attrCode");
return (Criteria) this;
}
public Criteria andDateYearIsNull() { public Criteria andDateYearIsNull() {
addCriterion("date_year is null"); addCriterion("date_year is null");
return (Criteria) this; return (Criteria) this;

3
dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/LineData.java

@ -9,6 +9,9 @@ import java.util.List;
@Data @Data
public class LineData { public class LineData {
@Schema(description = "属性编码, 默认:single,温湿度设备:temperature或者humidity")
private String attrCode;
@Schema(description = "X-axis data", example = "[]") @Schema(description = "X-axis data", example = "[]")
private List<Object> xData = new ArrayList<>(); private List<Object> xData = new ArrayList<>();

2
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataAccumulateService.java

@ -18,5 +18,5 @@ public interface DeviceDataAccumulateService {
List<DeviceAccumulateData> handleDeviceAccumulateData(AccumulateDataSearchParam pageSearchParam); List<DeviceAccumulateData> handleDeviceAccumulateData(AccumulateDataSearchParam pageSearchParam);
SimpleDataResponse<LineData> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType); SimpleDataResponse<List<LineData>> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType);
} }

2
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataMeasureService.java

@ -18,5 +18,5 @@ public interface DeviceDataMeasureService {
List<DeviceMeasureData> handleDeviceMeasureData(MeasureDataSearchParam pageSearchParam); List<DeviceMeasureData> handleDeviceMeasureData(MeasureDataSearchParam pageSearchParam);
SimpleDataResponse<LineData> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType); SimpleDataResponse<List<LineData>> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType);
} }

195
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java

@ -1,9 +1,7 @@
package com.dongjian.dashboard.back.service.common; package com.dongjian.dashboard.back.service.common;
import java.sql.Connection; import java.math.BigDecimal;
import java.sql.DriverManager; import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.time.Instant; import java.time.Instant;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.ZoneId; import java.time.ZoneId;
@ -142,6 +140,23 @@ public class CommonOpt {
return dbUrl.replaceAll(regex, "$1" + auroraHost + "$3"); return dbUrl.replaceAll(regex, "$1" + auroraHost + "$3");
} }
public String extractValue(ObjectMapper mapper, Integer typeId, String rawData) {
if (Constants.DEVICE_TYPE_TEMPERATURE_HUMIDITY.contains(typeId)){
List<String> values = extractAllValues(mapper, rawData);
List<String> result = new ArrayList<>();
for (int i = 0; i < values.size(); i++){
if (0 == i){
result.add(values.get(i));
} else if (1 == i){
result.add(values.get(i));
}
}
return StringUtils.join(result, ",");
} else {
return extractFirstValue(mapper, rawData);
}
}
public String extractFirstValue(ObjectMapper mapper, String rawData) { public String extractFirstValue(ObjectMapper mapper, String rawData) {
if (StringUtils.isBlank(rawData)){ if (StringUtils.isBlank(rawData)){
return ""; return "";
@ -158,6 +173,33 @@ public class CommonOpt {
return ""; return "";
} }
public List<String> extractAllValues(ObjectMapper mapper, String rawData) {
List<String> result = new ArrayList<>();
if (StringUtils.isBlank(rawData)) {
return result;
}
try {
JsonNode node = mapper.readTree(rawData);
if (!node.isObject()) {
return result;
}
Iterator<Map.Entry<String, JsonNode>> fields = node.fields();
while (fields.hasNext()) {
JsonNode valueNode = fields.next().getValue();
result.add(valueNode.isValueNode() ? valueNode.asText() : valueNode.toString());
}
} catch (Exception e) {
logger.error("Failed to parse multi rawData JSON: {}", rawData, e);
}
return result;
}
public List<Long> getBindBuildingIdList(Long userId) { public List<Long> getBindBuildingIdList(Long userId) {
Integer buildingManager = basicUserMapperExt.checkBuildingManager(userId); Integer buildingManager = basicUserMapperExt.checkBuildingManager(userId);
if (buildingManager > 0) { if (buildingManager > 0) {
@ -188,8 +230,11 @@ public class CommonOpt {
return dateList; return dateList;
} }
public LineData getLineData(Long companyId, LineDataSearchParams lineDataSearchParams) { public List<LineData> getLineData(Long companyId, LineDataSearchParams lineDataSearchParams, int deviceType) {
List<LineData> lineDataList = new ArrayList<>();
for (String attrCode : lineDataSearchParams.getAttrCodeList()){
LineData lineData = new LineData(); LineData lineData = new LineData();
lineData.setAttrCode(attrCode);
try { try {
Map<String, Object> apikeyParamMap = new HashMap<>(); Map<String, Object> apikeyParamMap = new HashMap<>();
apikeyParamMap.put("companyId", companyId); apikeyParamMap.put("companyId", companyId);
@ -197,7 +242,7 @@ public class CommonOpt {
if (null == apikeyInfo) { if (null == apikeyInfo) {
logger.error("Failed to get AuroraInfo for companyId: {}", companyId); logger.error("Failed to get AuroraInfo for companyId: {}", companyId);
return lineData; lineDataList.add(lineData);
} }
if (StringUtils.isNotBlank(apikeyInfo.getAuroraUrl())) { if (StringUtils.isNotBlank(apikeyInfo.getAuroraUrl())) {
@ -219,18 +264,45 @@ public class CommonOpt {
List<String> dateList = getPreDay(1); List<String> dateList = getPreDay(1);
for (String date : dateList) { for (String date : dateList) {
String baseSql = "SELECT rawData, receive_ts FROM rawData_" + date + " WHERE deviceId = ? order by receive_ts "; //获取昨天的值,这里只针对累积设备
String sql = baseSql; Double lastDayValue = null;
if (deviceType == 2) {
lastDayValue = getLastDayValue(conn, date, lineDataSearchParams.getDeviceId());
}
// 提取年、月、日
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM_dd");
LocalDate currentDate = LocalDate.parse(date, formatter);
int year = currentDate.getYear();
int month = currentDate.getMonthValue();
int day = currentDate.getDayOfMonth();
String sql = "";
if (deviceType == 2){
sql = "SELECT upload_value, upload_at FROM dashboard_record_accumulate " +
"WHERE device_id = ? AND attr_code = ? AND date_year = ? AND date_month = ? AND date_day = ? order by id ";
} else if (deviceType == 3){
sql = "SELECT upload_value, upload_at FROM dashboard_record_measure " +
"WHERE device_id = ? AND attr_code = ? AND date_year = ? AND date_month = ? AND date_day = ? order by id ";
}
logger.info("getLineData sql: {}", sql); logger.info("getLineData sql: {}", sql);
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setString(1, lineDataSearchParams.getDeviceId()); preparedStatement.setString(1, lineDataSearchParams.getDeviceId());
preparedStatement.setString(2, attrCode);
preparedStatement.setInt(3, year); // 设置年份
preparedStatement.setInt(4, month); // 设置月份
preparedStatement.setInt(5, day); // 设置日期
try (ResultSet result = preparedStatement.executeQuery()) { try (ResultSet result = preparedStatement.executeQuery()) {
if (result.next()) { if (result.next()) {
if (deviceType == 2) {
processResult(result, lineData, lastDayValue);
} else if (deviceType == 3) {
processResult(result, lineData); processResult(result, lineData);
} }
} }
} }
} }
}
} catch (Exception e) { } catch (Exception e) {
logger.error("getLineData processing aurora error", e); logger.error("getLineData processing aurora error", e);
} }
@ -239,7 +311,46 @@ public class CommonOpt {
} catch (Exception e) { } catch (Exception e) {
logger.error("getLineData error", e); logger.error("getLineData error", e);
} }
return lineData; lineDataList.add(lineData);
}
return lineDataList;
}
private Double getLastDayValue(Connection conn, String date, String deviceId) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM_dd");
// 解析日期字符串为 LocalDate 对象
LocalDate previousDate = LocalDate.parse(date, formatter);
// 获取前一天的日期
LocalDate previousDay = previousDate.minusDays(1);
// 获取年、月、日
int year = previousDay.getYear();
int month = previousDay.getMonthValue();
int day = previousDay.getDayOfMonth();
String sql = "SELECT upload_value FROM dashboard_realtime_accumulate_day " +
"WHERE device_id = ? AND date_year = ? AND date_month = ? AND date_day = ?";
logger.info("getUploadValue sql: {}", sql);
try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setString(1, deviceId); // 设置设备ID
preparedStatement.setInt(2, year); // 设置年份
preparedStatement.setInt(3, month); // 设置月份
preparedStatement.setInt(4, day); // 设置日期
try (ResultSet result = preparedStatement.executeQuery()) {
if (result.next()) {
String uploadValue = result.getString("upload_value");
logger.info("Found upload_value: {}", uploadValue);
return new BigDecimal(uploadValue).doubleValue();
} else {
logger.warn("No data found for deviceId: {} on {}/{}/{}", deviceId, year, month, day);
}
}
} catch (SQLException e) {
logger.error("Error getLastDayValue query: ", e);
}
return null;
} }
private void processResult(ResultSet result, LineData lineData) { private void processResult(ResultSet result, LineData lineData) {
@ -255,8 +366,8 @@ public class CommonOpt {
// 遍历查询结果 // 遍历查询结果
do { do {
// 获取 receive_ts 和 rawData // 获取 receive_ts 和 rawData
long receiveTs = result.getLong("receive_ts"); long receiveTs = result.getLong("upload_at");
String rawData = result.getString("rawData"); String value = result.getString("upload_value");
// 如果 receiveTs 为 0(表示无效时间戳),跳过当前行 // 如果 receiveTs 为 0(表示无效时间戳),跳过当前行
if (receiveTs == 0) { if (receiveTs == 0) {
@ -272,7 +383,7 @@ public class CommonOpt {
xDataList.add(formattedDate); xDataList.add(formattedDate);
// 将 rawData解析 添加到 yData // 将 rawData解析 添加到 yData
String value = extractFirstValue(mapper, rawData); // String value = extractFirstValue(mapper, rawData);
yDataList.add(StringUtils.isBlank(value) ? "0" : value); yDataList.add(StringUtils.isBlank(value) ? "0" : value);
} while (result.next()); } while (result.next());
@ -285,4 +396,64 @@ public class CommonOpt {
} }
} }
private void processResult(ResultSet result, LineData lineData, Double lastDayValue) {
try {
// 用于存储 xData 和 yData
List<Object> xDataList = new ArrayList<>();
List<Object> yDataList = new ArrayList<>();
// 使用 DateTimeFormatter 来格式化时间
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
ObjectMapper mapper = new ObjectMapper();
// 用于存储每个小时最后一条数据(仅在 deviceType = 2 时使用)
Map<String, Double> lastHourData = new LinkedHashMap<>(); // 按插入顺序保存数据
// 遍历查询结果
do {
// 获取 receive_ts 和 rawData
long receiveTs = result.getLong("upload_at");
String value = result.getString("upload_value");
// 如果 receiveTs 为 0(表示无效时间戳),跳过当前行
if (receiveTs == 0) {
continue; // 跳过当前循环的剩余部分,继续处理下一行
}
// 将 long 时间戳转换为 LocalDateTime(日本时区)
Instant instant = Instant.ofEpochMilli(receiveTs);
String formattedDate = instant.atZone(ZoneId.of("Asia/Tokyo"))
.toLocalDateTime()
.format(formatter);
// 将 rawData解析 添加到 yData
// String value = extractFirstValue(mapper, rawData);
double todayValue = StringUtils.isBlank(value) ? 0.0 : new BigDecimal(value).doubleValue();
//计算差值
double yValue = todayValue;//默认今天值
if (null != lastDayValue && yValue >= lastDayValue){
yValue = todayValue - lastDayValue;
}
// 按小时分组,每个小时只保存最后一条数据
String hourKey = formattedDate.substring(0, 13) + ":00:00";
lastHourData.put(hourKey, yValue);
} while (result.next());
//只取每小时的最后一条数据
for (Map.Entry<String, Double> entry : lastHourData.entrySet()) {
xDataList.add(entry.getKey()); // 添加每小时的时间
yDataList.add(entry.getValue()); // 添加每小时最后一条数据的值
}
// 将处理后的数据加入到 lineData 中
lineData.getXData().addAll(xDataList);
lineData.getYData().addAll(yDataList);
} catch (Exception e) {
logger.error("Error processing result set", e);
}
}
} }

4
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java

@ -136,9 +136,9 @@ public class DeviceDataAccumulateServiceImpl implements DeviceDataAccumulateServ
} }
@Override @Override
public SimpleDataResponse<LineData> getLineData(LineDataSearchParams lineDataSearchParams, public SimpleDataResponse<List<LineData>> getLineData(LineDataSearchParams lineDataSearchParams,
Long companyId, Long userId, Integer languageType) { Long companyId, Long userId, Integer languageType) {
return SimpleDataResponse.success(commonOpt.getLineData(companyId, lineDataSearchParams)); return SimpleDataResponse.success(commonOpt.getLineData(companyId, lineDataSearchParams, 2));
} }

57
dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java

@ -1,6 +1,7 @@
package com.dongjian.dashboard.back.service.impl; package com.dongjian.dashboard.back.service.impl;
import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.Constants;
import com.dongjian.dashboard.back.common.DeviceAttrCode;
import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange;
import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageInfo;
import com.dongjian.dashboard.back.common.response.SimpleDataResponse; import com.dongjian.dashboard.back.common.response.SimpleDataResponse;
@ -109,8 +110,8 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService {
dashboardRealtimeMeasureMapperExt.selectRealtimeMeasureByDevices(deviceIds); dashboardRealtimeMeasureMapperExt.selectRealtimeMeasureByDevices(deviceIds);
// 转 map:device_id -> 数据对象 // 转 map:device_id -> 数据对象
Map<String, DashboardRealtimeMeasure> realtimeMap = realtimeList.stream() Map<String, List<DashboardRealtimeMeasure>> realtimeMap = realtimeList.stream()
.collect(Collectors.toMap(DashboardRealtimeMeasure::getDeviceId, Function.identity())); .collect(Collectors.groupingBy(DashboardRealtimeMeasure::getDeviceId));
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
@ -118,21 +119,49 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService {
String deviceId = data.getDeviceId(); String deviceId = data.getDeviceId();
// 默认 measurementValue 从 rawData 提取 // 默认 measurementValue 从 rawData 提取
data.setMeasurementValue(commonOpt.extractFirstValue(mapper, data.getRawData())); data.setMeasurementValue(commonOpt.extractValue(mapper, data.getTypeId(), data.getRawData()));
// 如果在实时表中存在记录,则更新 measurementValue/max/min // 如果在实时表中存在记录,则更新 measurementValue/max/min
DashboardRealtimeMeasure realtime = realtimeMap.get(deviceId); List<DashboardRealtimeMeasure> realtime = realtimeMap.get(deviceId);
if (realtime != null) { if (CollectionUtils.isNotEmpty(realtime)) {
// upload_value 始终作为 measurementValue
if (StringUtils.isNotBlank(realtime.getUploadValue())) { List<DashboardRealtimeMeasure> sortedRealtime = realtime;// 默认值为原始数据
data.setMeasurementValue(realtime.getUploadValue());
if (Constants.DEVICE_TYPE_TEMPERATURE_HUMIDITY.contains(data.getTypeId())){
// 根据 attrCode 排序,temperature 排在前,humidity 排在后
sortedRealtime = realtime.stream()
.sorted(Comparator.comparing(measure ->
DeviceAttrCode.MEASURE_TEMPERATURE.equals(measure.getAttrCode()) ? 0 :
DeviceAttrCode.MEASURE_HUMIDITY.equals(measure.getAttrCode()) ? 2 : 1)) // temperature > others > humidity
.toList();
} }
// 获取所有 MeasurementValue 并用逗号连接(不需要日期过滤)
String measurementValues = sortedRealtime.stream()
.map(DashboardRealtimeMeasure::getUploadValue) // 提取每个 UploadValue
.filter(StringUtils::isNotBlank) // 过滤空值
.collect(Collectors.joining(","));
// 仅当日期 == 今天时才设置 max/min // 仅当日期 == 今天时才设置 max/min
if (year == realtime.getDateYear() && month == realtime.getDateMonth() && day == realtime.getDateDay()) { List<DashboardRealtimeMeasure> todayMeasures = sortedRealtime.stream()
data.setMaxValue(realtime.getMaxValue()); .filter(measure -> year == measure.getDateYear() &&
data.setMinValue(realtime.getMinValue()); month == measure.getDateMonth() &&
} day == measure.getDateDay())
.toList();
// 获取所有 MaxValue 并用逗号连接(仅限日期是今天的数据)
String maxValues = todayMeasures.stream()
.map(measure -> String.valueOf(measure.getMaxValue())) // 提取每个 MaxValue
.collect(Collectors.joining(","));
// 获取所有 MinValue 并用逗号连接(仅限日期是今天的数据)
String minValues = todayMeasures.stream()
.map(measure -> String.valueOf(measure.getMinValue())) // 提取每个 MinValue
.collect(Collectors.joining(","));
// 设置 data 中的属性
data.setMeasurementValue(measurementValues);
data.setMaxValue(maxValues);
data.setMinValue(minValues);
} }
// 收藏状态 // 收藏状态
@ -144,8 +173,8 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService {
} }
@Override @Override
public SimpleDataResponse<LineData> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType) { public SimpleDataResponse<List<LineData>> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType) {
return SimpleDataResponse.success(commonOpt.getLineData(companyId, lineDataSearchParams)); return SimpleDataResponse.success(commonOpt.getLineData(companyId, lineDataSearchParams, 3));
} }
} }

Loading…
Cancel
Save