diff --git a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java index 17b73e9..a6d422b 100644 --- a/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java +++ b/dongjian-dashboard-back-common/src/main/java/com/dongjian/dashboard/back/common/Constants.java @@ -1,5 +1,7 @@ package com.dongjian.dashboard.back.common; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; /** @@ -7,6 +9,11 @@ import java.util.*; * @time 2022年5月20日 下午2:01:41 */ public class Constants { + + public static final ZoneId ZONE_TOKYO = ZoneId.of("Asia/Tokyo"); + public static final DateTimeFormatter FORMATTER_YMDHMS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + +// public static final int EXPORT_PAGE_SIZE = 600; //这个很重要,不要随便动 public static final String DES_SALT = "ci3b512jwy199511"; @@ -24,6 +31,8 @@ public class Constants { public static final String WINDOW_ALERT_IGNORED = "alert_window_notice:ignore:%d"; + public static final String REDIS_BA_STATUS_LATEST_VALUE = "ba_status_latest_value_"; + public static final int AURORA_IN_BATCH_SIZE = 1000; // 定义大类常量 @@ -70,7 +79,7 @@ public class Constants { CATEGORY_MAP.put(CATEGORY_MEASURE, new ArrayList<>(List.of(1003L))); - CATEGORY_MAP.put(CATEGORY_ACCUMULATE, new ArrayList<>(List.of(1002L))); + CATEGORY_MAP.put(CATEGORY_ACCUMULATE, new ArrayList<>(List.of(1002L,1006L))); CATEGORY_MAP.put(CATEGORY_STATUS, new ArrayList<>(List.of(1004L))); diff --git a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml index d882e5e..3d94b6d 100644 --- a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml +++ b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_cn.yml @@ -49,7 +49,7 @@ msgcn: roleHasBinded: 角色已绑定用户,请先解绑再删除 loginNameOrEmailHasExisted: 用户名或邮箱已被使用 mailAddUserPwdSubject: 新建账号密码 - mailAddUserPwdContent: '账号 {0} 的密码为 {1} 请妥善保管

登陆网址:{2}' + mailAddUserPwdContent: '{0}

このたびは、データ管理プラットフォームへのご登録、誠にありがとうございます。

下記の通り、アカウントが発行されましたのでご案内いたします。

-------------------------------------------------
ユーザー名(ID):{1}
初期パスワード:{2}
-------------------------------------------------

ご不明な点がございましたら、お気軽にサポートまでお問い合わせください。

-------------------------------
イオンディライト株式会社
サポート窓口: smbil-support@ifmservice.jp
-------------------------------' mailResetUserPwdSubject: 重置账号密码 pwdFormatError: 密码组成必须包含数字、英文字母、特殊符号(~!@#$%^&*)且大于等于12位 oldPwdError: 旧密码错误 @@ -77,6 +77,8 @@ msgcn: levelNameExist: 层级名称已存在 invalidParentLevel: 无效的父级层级 levelReferencedByChildren: 已被下级层级绑定,请先解绑后再删除 + elapsedTime: '{0}天{1}小时{2}分' + categoryHasExisted: 分类已存在 operationLogMap: addRole: 新增角色 editRole: 编辑角色 @@ -137,5 +139,11 @@ msgcn: editLevel: 编辑层级 deleteLevel: 删除层级 queryLevel: 获取层级列表 + addNotificationCategory: 新增通知分类 + editNotificationCategory: 编辑通知分类 + delNotificationCategory: 删除通知分类 + addNotification: 新增通知 + editNotification: 编辑通知 + delNotification: 删除通知 diff --git a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml index 4263fa6..48f8cec 100644 --- a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml +++ b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_en.yml @@ -49,7 +49,7 @@ msgen: roleHasBinded: 角色已绑定用户,请先解绑再删除 loginNameOrEmailHasExisted: 用户名或邮箱已被使用 mailAddUserPwdSubject: 新建账号密码 - mailAddUserPwdContent: '账号 {0} 的密码为 {1} 请妥善保管

登陆网址:{2}' + mailAddUserPwdContent: '{0}

このたびは、データ管理プラットフォームへのご登録、誠にありがとうございます。

下記の通り、アカウントが発行されましたのでご案内いたします。

-------------------------------------------------
ユーザー名(ID):{1}
初期パスワード:{2}
-------------------------------------------------

ご不明な点がございましたら、お気軽にサポートまでお問い合わせください。

-------------------------------
イオンディライト株式会社
サポート窓口: smbil-support@ifmservice.jp
-------------------------------' mailResetUserPwdSubject: 重置账号密码 pwdFormatError: 密码组成必须包含数字、英文字母、特殊符号(~!@#$%^&*)且大于等于12位 oldPwdError: 旧密码错误 @@ -77,6 +77,8 @@ msgen: levelNameExist: Level name already exists invalidParentLevel: Invalid parent level levelReferencedByChildren: It is bound by child levels. Please unbind them before deleting. + elapsedTime: '{0}d {1}h {2}m' + categoryHasExisted: Category already exists. operationLogMap: addRole: Add Role editRole: Edit Role @@ -137,6 +139,13 @@ msgen: editLevel: Edit Level deleteLevel: Delete Level queryLevel: Get Level List + addNotificationCategory: Add notification category + editNotificationCategory: Edit notification category + delNotificationCategory: Delete notification category + addNotification: Add notification + editNotification: Edit notification + delNotification: Delete notification + diff --git a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml index 373e8f4..ce16418 100644 --- a/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml +++ b/dongjian-dashboard-back-common/src/main/resources/config/language/msg/msg_jp.yml @@ -49,7 +49,7 @@ msgjp: roleHasBinded: 役割はユーザーにバインドされている ので、削除する前にバインドを解除してください loginNameOrEmailHasExisted: ユーザー名またはメールボックスはすでに使用されています mailAddUserPwdSubject: 新規アカウント・パスワードの作成 - mailAddUserPwdContent: 'アカウント {0} のパスワードは {1} お忘れにならないようにお願いします。

ログインWebアドレス:{2}' + mailAddUserPwdContent: '{0} 様

このたびは、データ管理プラットフォームへのご登録、誠にありがとうございます。

下記の通り、アカウントが発行されましたのでご案内いたします。

-------------------------------------------------
ユーザー名(ID):{1}
初期パスワード:{2}
-------------------------------------------------

ご不明な点がございましたら、お気軽にサポートまでお問い合わせください。

ログインはこちらから:
【AD スマビル 可視化UI URL】:https://smbil.ifmservice.jp/login

-------------------------------
イオンディライト株式会社
サポート窓口: smbil-support@ifmservice.jp
-------------------------------' mailResetUserPwdSubject: アカウント・パスワードのリセット pwdFormatError: パスワードの構成には、数字、アルファベット、特殊文字(~!@#$%^&*) で、12桁以上 oldPwdError: 旧パスワードエラー @@ -77,6 +77,8 @@ msgjp: levelNameExist: 階層名は既に存在しています invalidParentLevel: 無効な上位階層です levelReferencedByChildren: 下位階層に紐づいています。削除する前に紐付けを解除してください。 + elapsedTime: '{0}日{1}時間{2}分間' + categoryHasExisted: カテゴリは既に存在します。 operationLogMap: addRole: ロールを追加 editRole: ロールを編集 @@ -137,6 +139,13 @@ msgjp: editLevel: レベルを編集 deleteLevel: レベルを削除 queryLevel: レベル一覧を取得 + addNotificationCategory: 通知カテゴリを追加 + editNotificationCategory: 通知カテゴリを編集 + delNotificationCategory: 通知カテゴリを削除 + addNotification: 通知を追加 + editNotification: 通知を編集 + delNotification: 通知を削除 + diff --git a/dongjian-dashboard-back-controller/buildPush-aeon-prod.sh b/dongjian-dashboard-back-controller/buildPush-aeon-prod.sh new file mode 100644 index 0000000..8ddfb37 --- /dev/null +++ b/dongjian-dashboard-back-controller/buildPush-aeon-prod.sh @@ -0,0 +1,11 @@ +aws configure set aws_access_key_id AKIAR26KHSVRUEAKRBPZ +aws configure set aws_secret_access_key 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 +aws configure set default.region ap-northeast-1 +aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 126588786019.dkr.ecr.ap-northeast-1.amazonaws.com + +docker build -t 126588786019.dkr.ecr.ap-northeast-1.amazonaws.com/aeon-prod/dashboard-back:latest\ + --build-arg JAR_FILE=target/dongjian-dashboard-back-controller-0.0.1-SNAPSHOT.jar \ + --build-arg LIB_DIR=target/lib \ + --build-arg CONFIG_DIR=target/config \ + . +docker push 126588786019.dkr.ecr.ap-northeast-1.amazonaws.com/aeon-prod/dashboard-back:latest \ No newline at end of file diff --git a/dongjian-dashboard-back-controller/buildPush-aeon.sh b/dongjian-dashboard-back-controller/buildPush-aeon.sh index 6a0a00f..d650f07 100644 --- a/dongjian-dashboard-back-controller/buildPush-aeon.sh +++ b/dongjian-dashboard-back-controller/buildPush-aeon.sh @@ -1,11 +1,11 @@ -aws configure set aws_access_key_id AKIAQNYBBSGDVT3VF4ON -aws configure set aws_secret_access_key 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 +aws configure set aws_access_key_id AKIAVSKFRQDPNWHJDSHL +aws configure set aws_secret_access_key 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 aws configure set default.region ap-northeast-1 -aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 029530100103.dkr.ecr.ap-northeast-1.amazonaws.com +aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 382934810846.dkr.ecr.ap-northeast-1.amazonaws.com -docker build -t 029530100103.dkr.ecr.ap-northeast-1.amazonaws.com/aeon/dashboard-back:latest\ +docker build -t 382934810846.dkr.ecr.ap-northeast-1.amazonaws.com/aeon/dashboard-back-stg:latest\ --build-arg JAR_FILE=target/dongjian-dashboard-back-controller-0.0.1-SNAPSHOT.jar \ --build-arg LIB_DIR=target/lib \ --build-arg CONFIG_DIR=target/config \ . -docker push 029530100103.dkr.ecr.ap-northeast-1.amazonaws.com/aeon/dashboard-back:latest \ No newline at end of file +docker push 382934810846.dkr.ecr.ap-northeast-1.amazonaws.com/aeon/dashboard-back-stg:latest \ No newline at end of file diff --git a/dongjian-dashboard-back-controller/dockerfile b/dongjian-dashboard-back-controller/dockerfile index 77e7952..b571e8e 100644 --- a/dongjian-dashboard-back-controller/dockerfile +++ b/dongjian-dashboard-back-controller/dockerfile @@ -2,7 +2,8 @@ # FROM openjdk:17-jdk FROM amazoncorretto:17-alpine # 安装 fontconfig 和 DejaVu 字体 (这是一个通用且免费的字体包) -RUN apk --no-cache add fontconfig ttf-dejavu +RUN apk --no-cache upgrade && \ + apk --no-cache add fontconfig ttf-dejavu ENV TZ=Asia/Tokyo WORKDIR /home/data-center-dashboard diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/aspect/OperationLogAspect.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/aspect/OperationLogAspect.java index bfcd2ae..c38acbd 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/aspect/OperationLogAspect.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/configurator/aspect/OperationLogAspect.java @@ -6,7 +6,10 @@ import com.dongjian.dashboard.back.common.config.DataSourceInterceptor; import com.dongjian.dashboard.back.dao.ex.DashboardOperationLogMapperExt; import com.dongjian.dashboard.back.model.DashboardOperationLog; import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.IPUtils; import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -69,8 +72,13 @@ public class OperationLogAspect { logEntry.setUri(uri); logEntry.setMethodName(method.getName()); logEntry.setClassName(signature.getDeclaringTypeName()); - logEntry.setIpAddress(request.getRemoteAddr()); - String paramsJson = objectMapper.writeValueAsString(joinPoint.getArgs()); + logEntry.setIpAddress(IPUtils.getClientIp(request)); +// String paramsJson = objectMapper.writeValueAsString(joinPoint.getArgs()); + Object[] filteredArgs = Arrays.stream(joinPoint.getArgs()) + .filter(arg -> !(arg instanceof ServletRequest) && !(arg instanceof ServletResponse)) + .toArray(); + String paramsJson = objectMapper.writeValueAsString(filteredArgs); + logEntry.setRequestParams(paramsJson); logEntry.setExecutionTimeMs(duration); logEntry.setCreatedAt(System.currentTimeMillis()); diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DashboardNotificationCategoryController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DashboardNotificationCategoryController.java new file mode 100644 index 0000000..8248449 --- /dev/null +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DashboardNotificationCategoryController.java @@ -0,0 +1,98 @@ +package com.dongjian.dashboard.back.controller; + +import com.dongjian.dashboard.back.common.exception.BusinessException; +import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.PageResponse; +import com.dongjian.dashboard.back.common.response.ResponseCode; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.configurator.aspect.OperationLog; +import com.dongjian.dashboard.back.configurator.interceptor.AccessRequired; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationCategorySearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.DeleteDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.service.DashboardNotificationCategoryService; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationCategoryPageVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@AccessRequired +@RequestMapping("/dashboardNotificationCategory") +@Tag(name = "dashboard通知里的分类管理", description = "Data Provider manage API") +@SuppressWarnings("unchecked") +public class DashboardNotificationCategoryController { + + private static Logger logger = LoggerFactory.getLogger(DashboardNotificationCategoryController.class); + + @Autowired + private DashboardNotificationCategoryService dashboardNotificationCategoryService; + + @OperationLog(operation = "addNotificationCategory", remark = "") + @Operation(summary = "Add category") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public SimpleDataResponse add( + @RequestBody OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType) { + return dashboardNotificationCategoryService.add(optDashboardNotificationCategoryParams, UserId, CompanyId, LanguageType); + } + + @OperationLog(operation = "editNotificationCategory", remark = "") + @Operation(summary = "Edit category") + @RequestMapping(value = "/edit", method = RequestMethod.POST) + public SimpleDataResponse edit( + @RequestBody OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType) { + return dashboardNotificationCategoryService.edit(optDashboardNotificationCategoryParams, UserId, CompanyId, LanguageType); + } + + @OperationLog(operation = "delNotificationCategory", remark = "") + @Operation(summary = "Delete category") + @RequestMapping(value = "/batchDelete", method = RequestMethod.POST) + public SimpleDataResponse batchDelete( + @RequestBody DeleteDashboardNotificationCategoryParams deleteParams, + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType) { + return dashboardNotificationCategoryService.batchDelete(deleteParams, UserId, CompanyId, LanguageType); + } + + @Operation(summary = "Get category list") + @RequestMapping(value = "/getListPage", method = RequestMethod.GET) + public PageResponse> getListPage( + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType, + @RequestHeader Integer UTCOffset, + DashboardNotificationCategorySearchParams searchParams) throws BusinessException { + + searchParams.setUserId(UserId); + PageResponse> response = new PageResponse<>(); + try { + response.setData(dashboardNotificationCategoryService.getListPage(searchParams, CompanyId, UserId, LanguageType, UTCOffset)); + response.setCode(ResponseCode.SUCCESS); + response.setMsg("success"); + } catch (Exception e) { + logger.error("Error querying list", e); + response.setCode(ResponseCode.SERVER_ERROR); + response.setMsg("service error"); + } + return response; + } + +} diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DashboardNotificationController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DashboardNotificationController.java new file mode 100644 index 0000000..baebe19 --- /dev/null +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DashboardNotificationController.java @@ -0,0 +1,98 @@ +package com.dongjian.dashboard.back.controller; + +import com.dongjian.dashboard.back.common.exception.BusinessException; +import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.PageResponse; +import com.dongjian.dashboard.back.common.response.ResponseCode; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.configurator.aspect.OperationLog; +import com.dongjian.dashboard.back.configurator.interceptor.AccessRequired; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationSearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.DeleteDashboardNotificationParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationParams; +import com.dongjian.dashboard.back.service.DashboardNotificationService; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationPageVO; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@AccessRequired +@RequestMapping("/dashboardNotification") +@Tag(name = "dashboard通知管理", description = "Data Provider manage API") +@SuppressWarnings("unchecked") +public class DashboardNotificationController { + + private static Logger logger = LoggerFactory.getLogger(DashboardNotificationController.class); + + @Autowired + private DashboardNotificationService dashboardNotificationService; + + @OperationLog(operation = "addNotification", remark = "") + @Operation(summary = "Add dashboard notification") + @RequestMapping(value = "/add", method = RequestMethod.POST) + public SimpleDataResponse add( + @RequestBody OptDashboardNotificationParams optDashboardNotificationParams, + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType) { + return dashboardNotificationService.add(optDashboardNotificationParams, UserId, CompanyId, LanguageType); + } + + @OperationLog(operation = "editNotification", remark = "") + @Operation(summary = "Edit dashboard notification") + @RequestMapping(value = "/edit", method = RequestMethod.POST) + public SimpleDataResponse edit( + @RequestBody OptDashboardNotificationParams optDashboardNotificationParams, + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType) { + return dashboardNotificationService.edit(optDashboardNotificationParams, UserId, CompanyId, LanguageType); + } + + @OperationLog(operation = "delNotification", remark = "") + @Operation(summary = "Delete dashboard notification") + @RequestMapping(value = "/batchDelete", method = RequestMethod.POST) + public SimpleDataResponse batchDelete( + @RequestBody DeleteDashboardNotificationParams deleteParams, + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType) { + return dashboardNotificationService.batchDelete(deleteParams, UserId, CompanyId, LanguageType); + } + + @Operation(summary = "Get dashboard notification list") + @RequestMapping(value = "/getListPage", method = RequestMethod.GET) + public PageResponse> getListPage( + @RequestHeader String LoginName, + @RequestHeader String AccessToken, + @RequestHeader Long UserId, + @RequestHeader(required = false) Long CompanyId, + @RequestHeader Integer LanguageType, + @RequestHeader Integer UTCOffset, + DashboardNotificationSearchParams searchParams) throws BusinessException { + + searchParams.setUserId(UserId); + PageResponse> response = new PageResponse<>(); + try { + response.setData(dashboardNotificationService.getListPage(searchParams, CompanyId, UserId, LanguageType, UTCOffset)); + response.setCode(ResponseCode.SUCCESS); + response.setMsg("success"); + } catch (Exception e) { + logger.error("Error querying list", e); + response.setCode(ResponseCode.SERVER_ERROR); + response.setMsg("service error"); + } + return response; + } + +} diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java index 7404568..f99a26a 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAccumulateController.java @@ -2,6 +2,10 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.util.StringUtils; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -14,17 +18,22 @@ import com.dongjian.dashboard.back.dto.device.LineDataSearchParams; import com.dongjian.dashboard.back.easyexcel.ExportDeviceAccumulateDataDTO; import com.dongjian.dashboard.back.easyexcel.LanguageDynamicHeaderAdapter; import com.dongjian.dashboard.back.service.DeviceDataAccumulateService; +import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; import com.dongjian.dashboard.back.vo.device.LineData; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -46,8 +55,13 @@ public class DeviceDataAccumulateController { private static final Logger logger = LoggerFactory.getLogger(DeviceDataAccumulateController.class); + @Value("${export.page.size}") + private Integer EXPORT_PAGE_SIZE; + @Autowired private DeviceDataAccumulateService deviceDataAccumulateService; + @Autowired + private CommonOpt commonOpt; @OperationLog(operation = "getCumulativeDataList", remark = "") @Operation(summary = "获取积算数据列表") @@ -90,25 +104,61 @@ public class DeviceDataAccumulateController { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("積算データ", StandardCharsets.UTF_8).replace("+", "%20"); + String fileName = URLEncoder.encode("積算データ"+CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataAccumulateService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); - - List exportList = list.stream().map(item -> { - ExportDeviceAccumulateDataDTO dto = new ExportDeviceAccumulateDataDTO(); - BeanUtils.copyProperties(item, dto); - return dto; - }).toList(); + // ===== 固定导出分页大小===== + pageSearchParam.setPageSize(EXPORT_PAGE_SIZE); - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceAccumulateDataDTO.class, LanguageType); - - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); + + // ===== 循环分页查询并写 Excel ===== + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataAccumulateService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceAccumulateData item : list) { + ExportDeviceAccumulateDataDTO dto = new ExportDeviceAccumulateDataDTO(); + BeanUtils.copyProperties(item, dto); + dto.setLastYearRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getLastYearValue())); + dto.setYesterdayRatio(CommonUtil.ratio(item.getCumulativeValue(), item.getYesterdayValue())); + dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + // 最后一页判断(加这个更安全) + if (pageNum >= pageData.getPages()) { + break; + } + + pageNum++; + } + } catch (Exception e) { + logger.error("export error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } @@ -116,6 +166,7 @@ public class DeviceDataAccumulateController { @Operation(summary = "获取7日趋势数据") @RequestMapping(value = "/getLineData",method = RequestMethod.POST) public SimpleDataResponse> getLineData( + @Parameter(name = "searchType", description = "1-按小时,2-全部数据", required = true) Integer searchType, @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 = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId, @@ -123,7 +174,7 @@ public class DeviceDataAccumulateController { @Parameter(name = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, @RequestBody LineDataSearchParams lineDataSearchParams ) throws BusinessException { - return deviceDataAccumulateService.getLineData(lineDataSearchParams, CompanyId, UserId, LanguageType); + return deviceDataAccumulateService.getLineData(searchType, lineDataSearchParams, CompanyId, UserId, LanguageType); } } diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java index 7fbe789..9847ddf 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataAlarmController.java @@ -2,6 +2,9 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -17,18 +20,22 @@ import com.dongjian.dashboard.back.dto.device.WindowAlertQueryRequest; import com.dongjian.dashboard.back.easyexcel.ExportDeviceAlarmDataDTO; import com.dongjian.dashboard.back.easyexcel.LanguageDynamicHeaderAdapter; import com.dongjian.dashboard.back.service.DeviceDataAlarmService; +import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceAlarmData; import com.dongjian.dashboard.back.vo.data.HandleHistoryDataVO; import com.dongjian.dashboard.back.vo.device.WindowAlertVO; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -50,6 +57,9 @@ public class DeviceDataAlarmController { private static final Logger logger = LoggerFactory.getLogger(DeviceDataAlarmController.class); + @Value("${export.page.size}") + private Integer EXPORT_PAGE_SIZE; + @Autowired private DeviceDataAlarmService deviceDataAlarmService; @@ -84,35 +94,65 @@ public class DeviceDataAlarmController { @OperationLog(operation = "exportAlarmData", remark = "") @GetMapping("/exportData") public void exportDeviceAlarm(HttpServletResponse response, - @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, - AlarmDataSearchParam pageSearchParam + @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, + AlarmDataSearchParam pageSearchParam ) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("警報データ", StandardCharsets.UTF_8).replace("+", "%20"); + String fileName = URLEncoder.encode("警報データ"+ CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataAlarmService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); - - List exportList = list.stream().map(item -> { - ExportDeviceAlarmDataDTO dto = new ExportDeviceAlarmDataDTO(); - BeanUtils.copyProperties(item, dto); - return dto; - }).toList(); + // ===== 固定导出分页大小 ===== + pageSearchParam.setPageSize(EXPORT_PAGE_SIZE); - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceAlarmDataDTO.class, LanguageType); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataAlarmService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceAlarmData item : list) { + ExportDeviceAlarmDataDTO dto = new ExportDeviceAlarmDataDTO(); + BeanUtils.copyProperties(item, dto); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + if (pageNum >= pageData.getPages()) { + break; + } + pageNum++; + } + } catch (Exception e) { + logger.error("export alarm error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } @OperationLog(operation = "handleAlarm", remark = "") diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java index 6156013..9722f6b 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataBaStatusController.java @@ -2,26 +2,37 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; import com.dongjian.dashboard.back.common.response.ResponseCode; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; import com.dongjian.dashboard.back.configurator.aspect.OperationLog; import com.dongjian.dashboard.back.configurator.interceptor.AccessRequired; import com.dongjian.dashboard.back.dto.data.BaStatusDataSearchParam; +import com.dongjian.dashboard.back.dto.device.LineDataSearchParams; import com.dongjian.dashboard.back.easyexcel.ExportDeviceBaStatusDataDTO; import com.dongjian.dashboard.back.easyexcel.LanguageDynamicHeaderAdapter; import com.dongjian.dashboard.back.service.DeviceDataBaStatusService; +import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData; +import com.dongjian.dashboard.back.vo.device.LineData; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -43,8 +54,13 @@ public class DeviceDataBaStatusController { private static final Logger logger = LoggerFactory.getLogger(DeviceDataAccumulateController.class); + @Value("${export.page.size}") + private Integer EXPORT_PAGE_SIZE; + @Autowired private DeviceDataBaStatusService deviceDataBaStatusService; + @Autowired + private CommonOpt commonOpt; @OperationLog(operation = "getBaStatusDataList", remark = "") @Operation(summary = "获取状态数据列表") @@ -77,35 +93,81 @@ public class DeviceDataBaStatusController { @OperationLog(operation = "exportBaStatusData", remark = "") @GetMapping("/exportData") public void exportDeviceBaStatus(HttpServletResponse response, - @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, - BaStatusDataSearchParam pageSearchParam + @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, + BaStatusDataSearchParam pageSearchParam ) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("稼働設備", StandardCharsets.UTF_8).replace("+", "%20"); + String fileName = URLEncoder.encode("稼働設備"+ CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataBaStatusService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); - - List exportList = list.stream().map(item -> { - ExportDeviceBaStatusDataDTO dto = new ExportDeviceBaStatusDataDTO(); - BeanUtils.copyProperties(item, dto); - return dto; - }).toList(); + // ===== 固定导出分页大小 ===== + pageSearchParam.setPageSize(EXPORT_PAGE_SIZE); - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceBaStatusDataDTO.class, LanguageType); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); + + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataBaStatusService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceBaStatusData item : list) { + ExportDeviceBaStatusDataDTO dto = new ExportDeviceBaStatusDataDTO(); + BeanUtils.copyProperties(item, dto); + dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + if (pageNum >= pageData.getPages()) { + break; + } + pageNum++; + } + } catch (Exception e) { + logger.error("export BA status error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } + } - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + @OperationLog(operation = "getLineData", remark = "") + @Operation(summary = "获取状态迁移图") + @RequestMapping(value = "/getLineData",method = RequestMethod.POST) + public SimpleDataResponse> getLineData( + @Parameter(name = "searchType", description = "1-按小时,2-全部数据", required = true) Integer searchType, + @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, + @RequestBody LineDataSearchParams lineDataSearchParams + ) throws BusinessException { + return deviceDataBaStatusService.getLineData(searchType, lineDataSearchParams, CompanyId, UserId, LanguageType); } } diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java index 2e34f8d..e4eff25 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/DeviceDataMeasureController.java @@ -2,6 +2,9 @@ package com.dongjian.dashboard.back.controller; import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.ExcelWriter; +import com.alibaba.excel.write.metadata.WriteSheet; +import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.exception.BusinessException; import com.dongjian.dashboard.back.common.response.PageInfo; import com.dongjian.dashboard.back.common.response.PageResponse; @@ -14,17 +17,22 @@ import com.dongjian.dashboard.back.dto.device.LineDataSearchParams; import com.dongjian.dashboard.back.easyexcel.ExportDeviceMeasureDataDTO; import com.dongjian.dashboard.back.easyexcel.LanguageDynamicHeaderAdapter; import com.dongjian.dashboard.back.service.DeviceDataMeasureService; +import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; import com.dongjian.dashboard.back.vo.device.LineData; +import com.github.pagehelper.PageHelper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; +import org.apache.commons.collections4.CollectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import java.io.IOException; @@ -46,8 +54,13 @@ public class DeviceDataMeasureController { private static final Logger logger = LoggerFactory.getLogger(DeviceDataAccumulateController.class); + @Value("${export.page.size}") + private Integer EXPORT_PAGE_SIZE; + @Autowired private DeviceDataMeasureService deviceDataMeasureService; + @Autowired + private CommonOpt commonOpt; @OperationLog(operation = "getMeasureDataList", remark = "") @Operation(summary = "获取计测数据列表") @@ -80,35 +93,66 @@ public class DeviceDataMeasureController { @OperationLog(operation = "exportMeasureData", remark = "") @GetMapping("/exportData") public void exportDeviceMeasure(HttpServletResponse response, - @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, - MeasureDataSearchParam pageSearchParam + @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 = "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 = "LanguageType", description = "Language type (0: Chinese, 1: English, 2: Japanese)", required = true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType, + MeasureDataSearchParam pageSearchParam ) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); - String fileName = URLEncoder.encode("計測データ", StandardCharsets.UTF_8).replace("+", "%20"); + String fileName = URLEncoder.encode("計測データ"+ CommonUtil.generateExcelSuffix(), StandardCharsets.UTF_8).replace("+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); - PageInfo pageData = deviceDataMeasureService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); - List list = pageData.getList(); - - List exportList = list.stream().map(item -> { - ExportDeviceMeasureDataDTO dto = new ExportDeviceMeasureDataDTO(); - BeanUtils.copyProperties(item, dto); - return dto; - }).toList(); + // ===== 固定导出分页大小 ===== + pageSearchParam.setPageSize(EXPORT_PAGE_SIZE); - // 构造 Excel header:每列三语组合为字符串 "中文||English||日本語" + // ===== 构建 Excel ===== List> head = LanguageDynamicHeaderAdapter.buildHead(ExportDeviceMeasureDataDTO.class, LanguageType); - - EasyExcel.write(response.getOutputStream()) - .head(head) - .sheet("sheet1") - .doWrite(exportList); + ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).head(head).build(); + WriteSheet sheet = EasyExcel.writerSheet("sheet1").build(); + + int pageNum = 1; + try { + while (true) { + pageSearchParam.setPageNum(pageNum); + + PageInfo pageData = deviceDataMeasureService.getDataList(pageSearchParam, CompanyId, UserId, LanguageType); + + List list = pageData.getList(); + if (CollectionUtils.isEmpty(list)) { + break; // 没数据了,结束 + } + + for (DeviceMeasureData item : list) { + ExportDeviceMeasureDataDTO dto = new ExportDeviceMeasureDataDTO(); + BeanUtils.copyProperties(item, dto); + dto.setStatus111(commonOpt.status111Mapping(item.getStatus111())); + excelWriter.write(List.of(dto), sheet); + + // 手动置空,提醒 GC 回收 + dto = null; + item = null; + } + + // 手动清理分页数据和缓存 + list.clear(); + PageHelper.clearPage(); + + if (pageNum >= pageData.getPages()) { + break; + } + pageNum++; + } + } catch (Exception e) { + logger.error("export measure data error", e); + throw e; + } finally { + excelWriter.finish(); + PageHelper.clearPage(); + } } @OperationLog(operation = "getLineData", remark = "") diff --git a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/OverviewController.java b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/OverviewController.java index 86818d4..95dd689 100644 --- a/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/OverviewController.java +++ b/dongjian-dashboard-back-controller/src/main/java/com/dongjian/dashboard/back/controller/OverviewController.java @@ -57,7 +57,7 @@ public class OverviewController { @Operation(summary = "Get notification") @RequestMapping(value = "/getNotification", method = RequestMethod.GET) - public SimpleDataResponse getNotification( + public SimpleDataResponse> getNotification( @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 = "UserId", description = "User ID", required = true, schema = @Schema(defaultValue = "1")) @RequestHeader(required = true) Long UserId, diff --git a/dongjian-dashboard-back-controller/src/main/resources/config/application.properties b/dongjian-dashboard-back-controller/src/main/resources/config/application.properties index bd5ed46..4d9e7ac 100644 --- a/dongjian-dashboard-back-controller/src/main/resources/config/application.properties +++ b/dongjian-dashboard-back-controller/src/main/resources/config/application.properties @@ -10,7 +10,7 @@ spring.datasource.admin.name=data_center_aeon_admin spring.datasource.admin.url=jdbc:mysql://${datasourceDNS}/data_center_aeon_admin?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=${datasourceTimeZone} spring.datasource.admin.username=${datasourceUsername} spring.datasource.admin.password=${datasourcePassword} -#使用druid数据源 +#使用druid数据源 spring.datasource.admin.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.admin.driverClassName=com.mysql.jdbc.Driver spring.datasource.admin.hikari.driverClassName=com.mysql.jdbc.Driver @@ -23,7 +23,7 @@ dynamic.jdbc.url=jdbc:mysql://${datasourceDNS:rm-bp11k2zm2fr7864428o.mysql.rds.a spring.datasource.url=jdbc:mysql://${datasourceDNS:rm-bp11k2zm2fr7864428o.mysql.rds.aliyuncs.com:3306}/data_center_aeon_admin?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=${datasourceTimeZone} -# Aurora 数据源配置 +# Aurora 数据源配置 spring.aurora.datasource.url=${auroraUrl:jdbc:mysql://rm-bp11k2zm2fr7864428o.mysql.rds.aliyuncs.com:3306/data_center_aeon_admin} spring.aurora.datasource.username=${auroraUser:zhc} spring.aurora.datasource.password=${auroraPass:Youqu48bnb1} @@ -33,11 +33,11 @@ spring.aurora.datasource.maximum-pool-size=${auroraMaxPool:30} spring.aurora.datasource.connection-timeout=${auroraConnTimeout:30000} -#配置log日志 +#配置log日志 logging.config=classpath:config/logback-boot.xml logging_level=${loggingLevel} logging_path=${loggingPath} -#部署时使用SYSLOG +#部署时使用SYSLOG logging_appender=${loggingAppender} logging_maxHistory=${loggingMaxHistory:7} logging_maxFileSize=100MB @@ -45,54 +45,55 @@ mybatis_log_level=${mybatisLogLevel} user.login.keytimeout=360000 -#集群模式cluster +#集群模式cluster spring.redis.cluster.nodes=192.168.0.30:7000,192.168.0.30:7001 -#跨集群执行命令时要遵循的最大重定向数量 +#跨集群执行命令时要遵循的最大重定向数量 spring.redis.cluster.max-redirects=3 -#哨兵模式sentinel +#哨兵模式sentinel spring.redis.sentinel.master=mymaster spring.redis.sentinel.nodes=192.168.0.30:16379,192.168.0.30:16379 -#单机模式standalone +#单机模式standalone spring.redis.host=${redisHost} spring.redis.port=6379 spring.redis.password=${redisPassword} spring.redis.timeout=5000 -#Redis数据库索引(默认为0) +#Redis数据库索引(默认为0) spring.redis.database=0 -#配置启动模式cluster、sentinel、standalone +#配置启动模式cluster、sentinel、standalone spring.redis.mode=standalone # Lettuce -# 连接池最大连接数(使用负值表示没有限制) +# 连接池最大连接数(使用负值表示没有限制) spring.redis.lettuce.pool.max-active=8 -# 连接池最大阻塞等待时间(使用负值表示没有限制) +# 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.lettuce.pool.max-wait=100 -# 连接池中的最大空闲连接 +# 连接池中的最大空闲连接 spring.redis.lettuce.pool.max-idle=8 -# 连接池中的最 小空闲连接 +# 连接池中的最 小空闲连接 spring.redis.lettuce.pool.min-idle=0 -# 关闭超时时间 +# 关闭超时时间 spring.redis.lettuce.shutdown-timeout=100 -#邮件发送信息 +#邮件发送信息 mail.smtp.host=email-smtp.ap-northeast-1.amazonaws.com mail.smtp.port=465 mail.smtp.auth=true mail.smtp.ssl=true -mail.sender.username=AKIAVRXFMB43Z4Q6WGZN -mail.sender.password_encrypted=true -mail.sender.password=a/52R0rao7ksRMvl1j17fVEmPCw7gC9OreHDqWOE+S7sgmoQT0YgoLRJqOlJqX7e -mail.sender.sendername=datacenter-info -mail.sender.from=alert@ttkdatatechbuild.com -#邮件通知服务开关 +mail.sender.username=AKIAR26KHSVR3E7N7V3X +mail.sender.password_encrypted=false +mail.sender.password=BFe3PePmvmKJKF/cwVxKq2C3EG10IcYQ+fNq0Eccl0PU +mail.sender.sendername=smbil-support@ifmservice.jp +mail.sender.from=smbil-support@ifmservice.jp +#\u90AE\u4EF6\u901A\u77E5\u670D\u52A1\u5F00\u5173 mail.send.switch=true + Spring.mvc.hiddenmethod.filter.enabled=true -#单个文件上传发大小 +#单个文件上传发大小 spring.servlet.multipart.max-file-size=20MB -#多个文件上传的共大小不得超过100M +#多个文件上传的共大小不得超过100M spring.servlet.multipart.max-request-size=100MB server.servlet.context-path=/api @@ -126,4 +127,6 @@ ai.api_base=${aiApiBase:https://pdf-demo-stg.ttkdatatechbuild.com/api} oidc.issuer = ${oidcIssuer:https://dongjian.southwave.tech/api} oidc.bimviewer-url = ${oidcBimviewerUrl:https://bimviewer-stg.ttkdatatechbuild.com/TTNB} -oidc.bimviewer-cognito-auth-host = ${oidcBimviewerCognitoAuthHost:https://bimviewer-stg.auth.ap-northeast-1.amazoncognito.com} \ No newline at end of file +oidc.bimviewer-cognito-auth-host = ${oidcBimviewerCognitoAuthHost:https://bimviewer-stg.auth.ap-northeast-1.amazoncognito.com} + +export.page.size = ${exportPageSize:600} \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/aurora/DashboardRecordAccumulateMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/aurora/DashboardRecordAccumulateMapperExt.java index 87c5eec..c165ce9 100644 --- a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/aurora/DashboardRecordAccumulateMapperExt.java +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/aurora/DashboardRecordAccumulateMapperExt.java @@ -2,6 +2,7 @@ package com.dongjian.dashboard.back.dao.aurora; import com.dongjian.dashboard.back.dao.auto.DashboardRecordAccumulateMapper; import com.dongjian.dashboard.back.vo.device.DeviceIncrement; +import com.dongjian.dashboard.back.vo.record.RecordAccumulateDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -33,4 +34,10 @@ public interface DashboardRecordAccumulateMapperExt extends DashboardRecordAccum @Param("targetSeconds") int targetSeconds ); + List selectByDay( + @Param("deviceIds") List deviceIds, + @Param("year") int year, + @Param("month") int month, + @Param("day") int day + ); } diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/BaStatusHistoryMapper.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/BaStatusHistoryMapper.java new file mode 100644 index 0000000..a1a3387 --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/BaStatusHistoryMapper.java @@ -0,0 +1,96 @@ +package com.dongjian.dashboard.back.dao.auto; + +import com.dongjian.dashboard.back.model.BaStatusHistory; +import com.dongjian.dashboard.back.model.BaStatusHistoryExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface BaStatusHistoryMapper { + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + long countByExample(BaStatusHistoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int deleteByExample(BaStatusHistoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int deleteByPrimaryKey(Long id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int insert(BaStatusHistory record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int insertSelective(BaStatusHistory record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + List selectByExample(BaStatusHistoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + BaStatusHistory selectByPrimaryKey(Long id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int updateByExampleSelective(@Param("record") BaStatusHistory record, @Param("example") BaStatusHistoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int updateByExample(@Param("record") BaStatusHistory record, @Param("example") BaStatusHistoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int updateByPrimaryKeySelective(BaStatusHistory record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + int updateByPrimaryKey(BaStatusHistory record); +} \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/DashboardNotificationCategoryMapper.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/DashboardNotificationCategoryMapper.java new file mode 100644 index 0000000..5f480e5 --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/auto/DashboardNotificationCategoryMapper.java @@ -0,0 +1,96 @@ +package com.dongjian.dashboard.back.dao.auto; + +import com.dongjian.dashboard.back.model.DashboardNotificationCategory; +import com.dongjian.dashboard.back.model.DashboardNotificationCategoryExample; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +public interface DashboardNotificationCategoryMapper { + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + long countByExample(DashboardNotificationCategoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int deleteByExample(DashboardNotificationCategoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int deleteByPrimaryKey(Long id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int insert(DashboardNotificationCategory record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int insertSelective(DashboardNotificationCategory record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + List selectByExample(DashboardNotificationCategoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + DashboardNotificationCategory selectByPrimaryKey(Long id); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int updateByExampleSelective(@Param("record") DashboardNotificationCategory record, @Param("example") DashboardNotificationCategoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int updateByExample(@Param("record") DashboardNotificationCategory record, @Param("example") DashboardNotificationCategoryExample example); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int updateByPrimaryKeySelective(DashboardNotificationCategory record); + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + int updateByPrimaryKey(DashboardNotificationCategory record); +} \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BaStatusHistoryMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BaStatusHistoryMapperExt.java new file mode 100644 index 0000000..f863644 --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/BaStatusHistoryMapperExt.java @@ -0,0 +1,9 @@ +package com.dongjian.dashboard.back.dao.ex; + +import com.dongjian.dashboard.back.dao.auto.BaStatusHistoryMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BaStatusHistoryMapperExt extends BaStatusHistoryMapper { + +} diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationCategoryMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationCategoryMapperExt.java new file mode 100644 index 0000000..dda31c0 --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationCategoryMapperExt.java @@ -0,0 +1,17 @@ +package com.dongjian.dashboard.back.dao.ex; + +import com.dongjian.dashboard.back.dao.auto.DashboardNotificationCategoryMapper; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationCategorySearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationCategoryPageVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface DashboardNotificationCategoryMapperExt extends DashboardNotificationCategoryMapper { + + int checkExist(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams); + + List getListPage(DashboardNotificationCategorySearchParams pageSearchParam); +} diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationMapperExt.java index 7de86e8..0a7f069 100644 --- a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationMapperExt.java +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DashboardNotificationMapperExt.java @@ -4,6 +4,7 @@ import java.util.List; import com.dongjian.dashboard.back.dao.auto.DashboardNotificationMapper; import com.dongjian.dashboard.back.dao.auto.UserBuildingRelationMapper; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationSearchParams; import com.dongjian.dashboard.back.model.UserBuildingRelation; import com.dongjian.dashboard.back.vo.building.BindedBuildingVO; import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationPageVO; @@ -12,6 +13,8 @@ import org.apache.ibatis.annotations.Mapper; @Mapper public interface DashboardNotificationMapperExt extends DashboardNotificationMapper { - DashboardNotificationPageVO getNotification(Long companyId); + List getNotification(Long companyId); + + List getListPage(DashboardNotificationSearchParams pageSearchParam); } diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java index 10bed02..a3ab5be 100644 --- a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceInfoMapperExt.java @@ -13,6 +13,7 @@ import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; import com.dongjian.dashboard.back.vo.device.DeviceVO; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -38,4 +39,6 @@ public interface DeviceInfoMapperExt extends DeviceInfoMapper { List getDevice4AlarmData(AlarmDataSearchParam pageSearchParam); List getDevice4AlarmDataByGroup(AlarmDataSearchParam pageSearchParam); + + List selectAlertingDeviceIds(@Param("deviceIds") List deviceIds); } diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceRawdataRealtimeMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceRawdataRealtimeMapperExt.java index 55a4b64..fb68699 100644 --- a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceRawdataRealtimeMapperExt.java +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/DeviceRawdataRealtimeMapperExt.java @@ -11,7 +11,4 @@ import java.util.Map; @Mapper public interface DeviceRawdataRealtimeMapperExt extends DeviceRawdataRealtimeMapper { - List getOverviewInfo(Map paramMap); - - List getBuildingInfo(Map buildingMap); } diff --git a/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/OverviewInfoMapperExt.java b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/OverviewInfoMapperExt.java new file mode 100644 index 0000000..e27ef49 --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/java/com/dongjian/dashboard/back/dao/ex/OverviewInfoMapperExt.java @@ -0,0 +1,19 @@ +package com.dongjian.dashboard.back.dao.ex; + +import com.dongjian.dashboard.back.vo.data.OverviewCategoryVO; +import com.dongjian.dashboard.back.vo.data.OverviewInfo; +import com.dongjian.dashboard.back.vo.data.OverviewVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; +import java.util.Map; + +@Mapper +public interface OverviewInfoMapperExt { + + List getOverviewInfo(Map paramMap); + + List getBuildingInfo(Map buildingMap); + + List getExistingCategoryList(Map allCategoryParamMap); +} diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/aurora/DashboardRecordAccumulateMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/aurora/DashboardRecordAccumulateMapperExt.xml index b045c80..a62381b 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/aurora/DashboardRecordAccumulateMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/aurora/DashboardRecordAccumulateMapperExt.xml @@ -77,4 +77,23 @@ + + + \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BaStatusHistoryMapper.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BaStatusHistoryMapper.xml new file mode 100644 index 0000000..771aef2 --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BaStatusHistoryMapper.xml @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + + + + + + + + and ${criterion.condition} + + + and ${criterion.condition} #{criterion.value} + + + and ${criterion.condition} #{criterion.value} and #{criterion.secondValue} + + + and ${criterion.condition} + + #{listItem} + + + + + + + + + + + + id, device_info_id, is_running, update_ts + + + + + + delete from ba_status_history + where id = #{id,jdbcType=BIGINT} + + + + delete from ba_status_history + + + + + + + + SELECT LAST_INSERT_ID() + + insert into ba_status_history (device_info_id, is_running, update_ts + ) + values (#{deviceInfoId,jdbcType=INTEGER}, #{isRunning,jdbcType=INTEGER}, #{updateTs,jdbcType=VARCHAR} + ) + + + + + SELECT LAST_INSERT_ID() + + insert into ba_status_history + + + device_info_id, + + + is_running, + + + update_ts, + + + + + #{deviceInfoId,jdbcType=INTEGER}, + + + #{isRunning,jdbcType=INTEGER}, + + + #{updateTs,jdbcType=VARCHAR}, + + + + + + + update ba_status_history + + + id = #{record.id,jdbcType=BIGINT}, + + + device_info_id = #{record.deviceInfoId,jdbcType=INTEGER}, + + + is_running = #{record.isRunning,jdbcType=INTEGER}, + + + update_ts = #{record.updateTs,jdbcType=VARCHAR}, + + + + + + + + + update ba_status_history + set id = #{record.id,jdbcType=BIGINT}, + device_info_id = #{record.deviceInfoId,jdbcType=INTEGER}, + is_running = #{record.isRunning,jdbcType=INTEGER}, + update_ts = #{record.updateTs,jdbcType=VARCHAR} + + + + + + + update ba_status_history + + + device_info_id = #{deviceInfoId,jdbcType=INTEGER}, + + + is_running = #{isRunning,jdbcType=INTEGER}, + + + update_ts = #{updateTs,jdbcType=VARCHAR}, + + + where id = #{id,jdbcType=BIGINT} + + + + update ba_status_history + set device_info_id = #{deviceInfoId,jdbcType=INTEGER}, + is_running = #{isRunning,jdbcType=INTEGER}, + update_ts = #{updateTs,jdbcType=VARCHAR} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml index a165f53..708a2d6 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml @@ -26,6 +26,8 @@ + + id, user_type, company_id, username, login_name, `password`, salt, email, mfa_secret, mfa_bind, mobile_number, last_login_time, flag, expire_time, create_time, creator_id, - modify_time, modifier_id, super_role, create_platform + modify_time, modifier_id, super_role, create_platform, last_name, first_name + + select + + distinct + + 'true' as QUERYID, + + from dashboard_notification_category + + + + + order by ${orderByClause} + + + + + + delete from dashboard_notification_category + where id = #{id,jdbcType=BIGINT} + + + + delete from dashboard_notification_category + + + + + + + + SELECT LAST_INSERT_ID() + + insert into dashboard_notification_category (company_id, `name`, remark, + flag, created_by, created_at, + updated_at, updated_by) + values (#{companyId,jdbcType=BIGINT}, #{name,jdbcType=VARCHAR}, #{remark,jdbcType=VARCHAR}, + #{flag,jdbcType=INTEGER}, #{createdBy,jdbcType=BIGINT}, #{createdAt,jdbcType=BIGINT}, + #{updatedAt,jdbcType=BIGINT}, #{updatedBy,jdbcType=BIGINT}) + + + + + SELECT LAST_INSERT_ID() + + insert into dashboard_notification_category + + + company_id, + + + `name`, + + + remark, + + + flag, + + + created_by, + + + created_at, + + + updated_at, + + + updated_by, + + + + + #{companyId,jdbcType=BIGINT}, + + + #{name,jdbcType=VARCHAR}, + + + #{remark,jdbcType=VARCHAR}, + + + #{flag,jdbcType=INTEGER}, + + + #{createdBy,jdbcType=BIGINT}, + + + #{createdAt,jdbcType=BIGINT}, + + + #{updatedAt,jdbcType=BIGINT}, + + + #{updatedBy,jdbcType=BIGINT}, + + + + + + + update dashboard_notification_category + + + id = #{record.id,jdbcType=BIGINT}, + + + company_id = #{record.companyId,jdbcType=BIGINT}, + + + `name` = #{record.name,jdbcType=VARCHAR}, + + + remark = #{record.remark,jdbcType=VARCHAR}, + + + flag = #{record.flag,jdbcType=INTEGER}, + + + created_by = #{record.createdBy,jdbcType=BIGINT}, + + + created_at = #{record.createdAt,jdbcType=BIGINT}, + + + updated_at = #{record.updatedAt,jdbcType=BIGINT}, + + + updated_by = #{record.updatedBy,jdbcType=BIGINT}, + + + + + + + + + update dashboard_notification_category + set id = #{record.id,jdbcType=BIGINT}, + company_id = #{record.companyId,jdbcType=BIGINT}, + `name` = #{record.name,jdbcType=VARCHAR}, + remark = #{record.remark,jdbcType=VARCHAR}, + flag = #{record.flag,jdbcType=INTEGER}, + created_by = #{record.createdBy,jdbcType=BIGINT}, + created_at = #{record.createdAt,jdbcType=BIGINT}, + updated_at = #{record.updatedAt,jdbcType=BIGINT}, + updated_by = #{record.updatedBy,jdbcType=BIGINT} + + + + + + + update dashboard_notification_category + + + company_id = #{companyId,jdbcType=BIGINT}, + + + `name` = #{name,jdbcType=VARCHAR}, + + + remark = #{remark,jdbcType=VARCHAR}, + + + flag = #{flag,jdbcType=INTEGER}, + + + created_by = #{createdBy,jdbcType=BIGINT}, + + + created_at = #{createdAt,jdbcType=BIGINT}, + + + updated_at = #{updatedAt,jdbcType=BIGINT}, + + + updated_by = #{updatedBy,jdbcType=BIGINT}, + + + where id = #{id,jdbcType=BIGINT} + + + + update dashboard_notification_category + set company_id = #{companyId,jdbcType=BIGINT}, + `name` = #{name,jdbcType=VARCHAR}, + remark = #{remark,jdbcType=VARCHAR}, + flag = #{flag,jdbcType=INTEGER}, + created_by = #{createdBy,jdbcType=BIGINT}, + created_at = #{createdAt,jdbcType=BIGINT}, + updated_at = #{updatedAt,jdbcType=BIGINT}, + updated_by = #{updatedBy,jdbcType=BIGINT} + where id = #{id,jdbcType=BIGINT} + + \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardNotificationMapper.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardNotificationMapper.xml index 4ba4c67..c30f8a7 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardNotificationMapper.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/auto/DashboardNotificationMapper.xml @@ -10,6 +10,7 @@ + @@ -94,8 +95,8 @@ WARNING - @mbg.generated This element is automatically generated by MyBatis Generator, do not modify. --> - id, company_id, demand_time, category, flag, created_at, created_by, updated_at, - updated_by + id, company_id, demand_time, category, category_id, flag, created_at, created_by, + updated_at, updated_by device_info.id, @@ -425,7 +501,7 @@ #{companyId} - and device_info.flag = 0 and (device_info.device_id LIKE '%\_85' or device_info.device_id LIKE '%\_85_9003') + and device_info.flag = 0 and (device_info.device_id LIKE '%\_85' or device_info.device_id LIKE '%\_85_9003' or device_info.device_id LIKE '%\_131_5') and basic_monitoring_asset.flag != 1 and basic_space.flag != 1 and basic_floor.flag != 1 and basic_building.flag != 1 and type.device_category_id in diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceRawdataRealtimeMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceRawdataRealtimeMapperExt.xml index f9abf7b..09ae341 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceRawdataRealtimeMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/DeviceRawdataRealtimeMapperExt.xml @@ -2,52 +2,5 @@ - - - - \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml index fbc4e31..f7d00bf 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/MonitoringPointCategoryGroupMapperExt.xml @@ -67,6 +67,7 @@ mpc.company_id, mpc.thumbnail_normal_base64, mpc.thumbnail_alarm_base64, + mpc.thumbnail_dis_base64, mpc.`name`, mpc.remark FROM diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OperationLogMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OperationLogMapperExt.xml index 4aa436b..23ed64a 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OperationLogMapperExt.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OperationLogMapperExt.xml @@ -16,7 +16,13 @@ dolog.request_params, dolog.execution_time_ms, dolog.created_at, - buser.login_name `user` + COALESCE( + NULLIF( + CONCAT_WS(' ', buser.last_name, buser.first_name), + '' + ), + buser.login_name + ) AS `user` FROM dashboard_operation_log dolog INNER JOIN data_center_aeon_admin.basic_user buser ON buser.id = dolog.user_id diff --git a/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml new file mode 100644 index 0000000..a6d2fcd --- /dev/null +++ b/dongjian-dashboard-back-dao/src/main/resources/mappers/ex/OverviewInfoMapperExt.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/dongjian-dashboard-back-dao/src/main/resources/mybatis-generator/generatorConfig.xml b/dongjian-dashboard-back-dao/src/main/resources/mybatis-generator/generatorConfig.xml index b750704..96e2c69 100644 --- a/dongjian-dashboard-back-dao/src/main/resources/mybatis-generator/generatorConfig.xml +++ b/dongjian-dashboard-back-dao/src/main/resources/mybatis-generator/generatorConfig.xml @@ -154,5 +154,15 @@ + + + +
+ + + + +
+ \ No newline at end of file diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/bo/LatestValueBO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/bo/LatestValueBO.java new file mode 100644 index 0000000..530164f --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/bo/LatestValueBO.java @@ -0,0 +1,9 @@ +package com.dongjian.dashboard.back.bo; + +import lombok.Data; + +@Data +public class LatestValueBO { + private Long updateTs; + private Integer value; +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DashboardNotificationCategorySearchParams.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DashboardNotificationCategorySearchParams.java new file mode 100644 index 0000000..dd5d718 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DashboardNotificationCategorySearchParams.java @@ -0,0 +1,25 @@ +package com.dongjian.dashboard.back.dto.dashboardnotification; + +import com.dongjian.dashboard.back.dto.BaseSearchParams; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** +* @author Mr.Jiang +* @time 2022年7月21日 下午8:50:31 +*/ +@Data +public class DashboardNotificationCategorySearchParams extends BaseSearchParams{ + + @Schema(description = "IDs, comma-separated", example = "1,47") + private String categoryIds; + + @Schema(description = "name", example = "name47") + private String name; + + @Schema(description = "ID list", hidden = true) + private List categoryIdList; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DashboardNotificationSearchParams.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DashboardNotificationSearchParams.java new file mode 100644 index 0000000..f5f0b11 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DashboardNotificationSearchParams.java @@ -0,0 +1,22 @@ +package com.dongjian.dashboard.back.dto.dashboardnotification; + +import com.dongjian.dashboard.back.dto.BaseSearchParams; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** +* @author Mr.Jiang +* @time 2022年7月21日 下午8:50:31 +*/ +@Data +public class DashboardNotificationSearchParams extends BaseSearchParams{ + + @Schema(description = "DashboardNotification IDs, comma-separated", example = "1,47") + private String dashboardNotificationIds; + + @Schema(description = "DashboardNotification ID list", hidden = true) + private List dashboardNotificationIdList; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DeleteDashboardNotificationCategoryParams.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DeleteDashboardNotificationCategoryParams.java new file mode 100644 index 0000000..81989a9 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DeleteDashboardNotificationCategoryParams.java @@ -0,0 +1,16 @@ +package com.dongjian.dashboard.back.dto.dashboardnotification; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** +* @author Mr.Jiang +* @time 2022年7月21日 下午8:50:31 +*/ +@Data +public class DeleteDashboardNotificationCategoryParams { + + @Schema(description = "IDs, separated by commas", example = "2738967,587") + private String categoryIds; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DeleteDashboardNotificationParams.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DeleteDashboardNotificationParams.java new file mode 100644 index 0000000..1babfe4 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/DeleteDashboardNotificationParams.java @@ -0,0 +1,16 @@ +package com.dongjian.dashboard.back.dto.dashboardnotification; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** +* @author Mr.Jiang +* @time 2022年7月21日 下午8:50:31 +*/ +@Data +public class DeleteDashboardNotificationParams{ + + @Schema(description = "DashboardNotification IDs, separated by commas", example = "2738967,587") + private String dashboardNotificationIds; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/OptDashboardNotificationCategoryParams.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/OptDashboardNotificationCategoryParams.java new file mode 100644 index 0000000..990a83c --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/OptDashboardNotificationCategoryParams.java @@ -0,0 +1,21 @@ +package com.dongjian.dashboard.back.dto.dashboardnotification; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class OptDashboardNotificationCategoryParams { + + @Schema(description = "unique identifier ID, not required for new entries", example = "2738967") + private Long categoryId; + + @Schema(description = "Company ID", example = "2738967", hidden = true) + private Long companyId; + + @Schema(description = "name", example = "webhook", required = true) + private String name; + + @Schema(description = "remark", example = "remark") + private String remark; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/OptDashboardNotificationParams.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/OptDashboardNotificationParams.java new file mode 100644 index 0000000..daf7d95 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/dashboardnotification/OptDashboardNotificationParams.java @@ -0,0 +1,26 @@ +package com.dongjian.dashboard.back.dto.dashboardnotification; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class OptDashboardNotificationParams { + + @Schema(description = "Provider unique identifier ID, not required for new entries", example = "2738967") + private Long dashboardNotificationId; + + @Schema(description = "Company ID", example = "2738967", hidden = true) + private Long companyId; + + @Schema(description = "demand time", example = "testProvider1") + private String demandTime; + +// @Schema(description = "category", example = "remark") +// private String category; + @Schema(description = "Category ID", example = "2738967") + private Long categoryId; + + @Schema(description ="content", example = "2") + private String content; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/AlarmDataSearchParam.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/AlarmDataSearchParam.java index 372d34a..712aa5c 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/AlarmDataSearchParam.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/data/AlarmDataSearchParam.java @@ -8,7 +8,7 @@ import lombok.EqualsAndHashCode; @Data public class AlarmDataSearchParam extends DataSearchParam { - @Schema(description = "查询类型:1-告警一览,2-告警历史,3-未确认告警",example = "1") + @Schema(description = "查询类型:1-告警一览,2-告警历史,3-未确认告警,4-只查告警类型设备(不是历史)",example = "1") private Integer searchType; } diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/user/OptUserParam.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/user/OptUserParam.java index e93d317..bb90f5f 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/user/OptUserParam.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/dto/user/OptUserParam.java @@ -36,6 +36,12 @@ public class OptUserParam { @Schema(description = "所属企业ID",example = "2", hidden = true) private Long companyId; + + @Schema(description = "姓",example = "鸠山", required = true) + private String lastName; + + @Schema(description = "名",example = "由纪夫", required = true) + private String firstName; } diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceAccumulateDataDTO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceAccumulateDataDTO.java index eedc59e..b1bfd38 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceAccumulateDataDTO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceAccumulateDataDTO.java @@ -10,32 +10,35 @@ public class ExportDeviceAccumulateDataDTO { @ExcelProperty(value = {"上传时间", "Upload Time", "計測日時"}, converter = TimestampConverter.class) private Long uploadTimestamp; + @ExcelProperty({"设施名", "Facility Name", "施設名"}) + private String buildingName; + @ExcelProperty({"监视点名称", "Monitoring Point Name", "監視点名称"}) private String monitoringPointName; - @ExcelProperty({"楼层名称", "Floor Name", "フロア"}) + @ExcelProperty({"楼层名称", "Floor", "フロア"}) private String floorName; - @ExcelProperty({"监控点分类名称", "Monitoring Point Category Name", "分類"}) + @ExcelProperty({"监控点分类名称", "Category", "分類"}) private String monitoringPointCategoryName; - @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"}) - private String gatewayInfoName; +// @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"}) +// private String gatewayInfoName; - @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"}) - private String dataProviderName; +// @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"}) +// private String dataProviderName; - @ExcelProperty({"设备状态", "Device Status", "デバイス状態"}) + @ExcelProperty({"设备状态", "Device Status", "ステータスフラグ"}) private String status111; - @ExcelProperty({"累积值", "Cumulative Value", "計測値"}) + @ExcelProperty({"积算值", "Accumulated Value", "積算値"}) private String cumulativeValue; - @ExcelProperty({"昨日值", "Yesterday's Value", "前日値"}) - private String yesterdayValue; + @ExcelProperty({"前日比(%)", "Previous Day Ratio(%)", "前日比(%)"}) + private String yesterdayRatio; - @ExcelProperty({"去年值", "Last Year's Value", "前年値"}) - private String lastYearValue; + @ExcelProperty({"前年比(%)", "Previous Year Ratio(%)", "前年比(%)"}) + private String lastYearRatio; @ExcelProperty({"单位", "Unit", "単位"}) private String unit; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceBaStatusDataDTO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceBaStatusDataDTO.java index d6f7ef8..a882969 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceBaStatusDataDTO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceBaStatusDataDTO.java @@ -10,6 +10,9 @@ public class ExportDeviceBaStatusDataDTO { @ExcelProperty(value = {"上传时间", "Upload Time", "計測日時"}, converter = TimestampConverter.class) private Long uploadTimestamp; + @ExcelProperty({"设施名", "Facility Name", "施設名"}) + private String buildingName; + @ExcelProperty({"监视点名称", "Monitoring Point Name", "監視点名称"}) private String monitoringPointName; @@ -19,17 +22,17 @@ public class ExportDeviceBaStatusDataDTO { @ExcelProperty({"监控点分类名称", "Monitoring Point Category Name", "分類"}) private String monitoringPointCategoryName; - @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"}) - private String gatewayInfoName; +// @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"}) +// private String gatewayInfoName; - @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"}) - private String dataProviderName; +// @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"}) +// private String dataProviderName; - @ExcelProperty({"设备状态", "Device Status", "デバイス状態"}) - private String status111; + @ExcelProperty({"状态", "Status", "状態"}) + private String runningStatus; - @ExcelProperty(value = {"运行状态", "Running status", "状態"}, converter = RunningStatusConverter.class) - private Integer runningStatus; + @ExcelProperty({"设备状态", "Device Status", "ステータスフラグ"}) + private String status111; @ExcelProperty(value = {"上次运行时间", "Last start time", "前回ON"}, converter = TimestampConverter.class) private Long lastStartTime; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceMeasureDataDTO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceMeasureDataDTO.java index 0006bb1..b0ff741 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceMeasureDataDTO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/ExportDeviceMeasureDataDTO.java @@ -10,6 +10,9 @@ public class ExportDeviceMeasureDataDTO { @ExcelProperty(value = {"上传时间", "Upload Time", "計測日時"}, converter = TimestampConverter.class) private Long uploadTimestamp; + @ExcelProperty({"设施名", "Facility Name", "施設名"}) + private String buildingName; + @ExcelProperty({"监视点名称", "Monitoring Point Name", "監視点名称"}) private String monitoringPointName; @@ -19,22 +22,22 @@ public class ExportDeviceMeasureDataDTO { @ExcelProperty({"监控点分类名称", "Monitoring Point Category Name", "分類"}) private String monitoringPointCategoryName; - @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"}) - private String gatewayInfoName; +// @ExcelProperty({"网关信息名称", "Gateway Info Name", "接続先情報"}) +// private String gatewayInfoName; - @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"}) - private String dataProviderName; +// @ExcelProperty({"数据提供方名称", "Data Provider Name", "データソース"}) +// private String dataProviderName; - @ExcelProperty({"设备状态", "Device Status", "デバイス状態"}) + @ExcelProperty({"设备状态", "Device Status", "ステータスフラグ"}) private String status111; @ExcelProperty({"测量值", "Measurement value", "計測値"}) private String measurementValue; - @ExcelProperty({"最大值", "Maximum Value", "最高値"}) + @ExcelProperty({"最大值", "Maximum Value", "最大値"}) private String maxValue; - @ExcelProperty({"最小值", "Minimum Value", "最低値"}) + @ExcelProperty({"最小值", "Minimum Value", "最小値"}) private String minValue; @ExcelProperty({"单位", "Unit", "単位"}) diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/SecondsToHMSConverter.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/SecondsToHMSConverter.java index 2e85b4d..62fe18d 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/SecondsToHMSConverter.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/easyexcel/SecondsToHMSConverter.java @@ -28,6 +28,8 @@ public class SecondsToHMSConverter implements Converter { if (null == value) return ""; + value = value / 1000; + long hours = value / 3600; long minutes = (value % 3600) / 60; long seconds = value % 60; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BaStatusHistory.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BaStatusHistory.java new file mode 100644 index 0000000..c6c761a --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BaStatusHistory.java @@ -0,0 +1,166 @@ +package com.dongjian.dashboard.back.model; + +import java.io.Serializable; + +public class BaStatusHistory implements Serializable { + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column ba_status_history.id + * + * @mbg.generated + */ + private Long id; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column ba_status_history.device_info_id + * + * @mbg.generated + */ + private Integer deviceInfoId; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column ba_status_history.is_running + * + * @mbg.generated + */ + private Integer isRunning; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column ba_status_history.update_ts + * + * @mbg.generated + */ + private String updateTs; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table ba_status_history + * + * @mbg.generated + */ + private static final long serialVersionUID = 1L; + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column ba_status_history.id + * + * @return the value of ba_status_history.id + * + * @mbg.generated + */ + public Long getId() { + return id; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column ba_status_history.id + * + * @param id the value for ba_status_history.id + * + * @mbg.generated + */ + public void setId(Long id) { + this.id = id; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column ba_status_history.device_info_id + * + * @return the value of ba_status_history.device_info_id + * + * @mbg.generated + */ + public Integer getDeviceInfoId() { + return deviceInfoId; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column ba_status_history.device_info_id + * + * @param deviceInfoId the value for ba_status_history.device_info_id + * + * @mbg.generated + */ + public void setDeviceInfoId(Integer deviceInfoId) { + this.deviceInfoId = deviceInfoId; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column ba_status_history.is_running + * + * @return the value of ba_status_history.is_running + * + * @mbg.generated + */ + public Integer getIsRunning() { + return isRunning; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column ba_status_history.is_running + * + * @param isRunning the value for ba_status_history.is_running + * + * @mbg.generated + */ + public void setIsRunning(Integer isRunning) { + this.isRunning = isRunning; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column ba_status_history.update_ts + * + * @return the value of ba_status_history.update_ts + * + * @mbg.generated + */ + public String getUpdateTs() { + return updateTs; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column ba_status_history.update_ts + * + * @param updateTs the value for ba_status_history.update_ts + * + * @mbg.generated + */ + public void setUpdateTs(String updateTs) { + this.updateTs = updateTs == null ? null : updateTs.trim(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", deviceInfoId=").append(deviceInfoId); + sb.append(", isRunning=").append(isRunning); + sb.append(", updateTs=").append(updateTs); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BaStatusHistoryExample.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BaStatusHistoryExample.java new file mode 100644 index 0000000..75a14df --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BaStatusHistoryExample.java @@ -0,0 +1,552 @@ +package com.dongjian.dashboard.back.model; + +import java.util.ArrayList; +import java.util.List; + +public class BaStatusHistoryExample { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table ba_status_history + * + * @mbg.generated + */ + protected String orderByClause; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table ba_status_history + * + * @mbg.generated + */ + protected boolean distinct; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table ba_status_history + * + * @mbg.generated + */ + protected List oredCriteria; + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public BaStatusHistoryExample() { + oredCriteria = new ArrayList(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table ba_status_history + * + * @mbg.generated + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdIsNull() { + addCriterion("device_info_id is null"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdIsNotNull() { + addCriterion("device_info_id is not null"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdEqualTo(Integer value) { + addCriterion("device_info_id =", value, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdNotEqualTo(Integer value) { + addCriterion("device_info_id <>", value, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdGreaterThan(Integer value) { + addCriterion("device_info_id >", value, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdGreaterThanOrEqualTo(Integer value) { + addCriterion("device_info_id >=", value, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdLessThan(Integer value) { + addCriterion("device_info_id <", value, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdLessThanOrEqualTo(Integer value) { + addCriterion("device_info_id <=", value, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdIn(List values) { + addCriterion("device_info_id in", values, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdNotIn(List values) { + addCriterion("device_info_id not in", values, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdBetween(Integer value1, Integer value2) { + addCriterion("device_info_id between", value1, value2, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andDeviceInfoIdNotBetween(Integer value1, Integer value2) { + addCriterion("device_info_id not between", value1, value2, "deviceInfoId"); + return (Criteria) this; + } + + public Criteria andIsRunningIsNull() { + addCriterion("is_running is null"); + return (Criteria) this; + } + + public Criteria andIsRunningIsNotNull() { + addCriterion("is_running is not null"); + return (Criteria) this; + } + + public Criteria andIsRunningEqualTo(Integer value) { + addCriterion("is_running =", value, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningNotEqualTo(Integer value) { + addCriterion("is_running <>", value, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningGreaterThan(Integer value) { + addCriterion("is_running >", value, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningGreaterThanOrEqualTo(Integer value) { + addCriterion("is_running >=", value, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningLessThan(Integer value) { + addCriterion("is_running <", value, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningLessThanOrEqualTo(Integer value) { + addCriterion("is_running <=", value, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningIn(List values) { + addCriterion("is_running in", values, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningNotIn(List values) { + addCriterion("is_running not in", values, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningBetween(Integer value1, Integer value2) { + addCriterion("is_running between", value1, value2, "isRunning"); + return (Criteria) this; + } + + public Criteria andIsRunningNotBetween(Integer value1, Integer value2) { + addCriterion("is_running not between", value1, value2, "isRunning"); + return (Criteria) this; + } + + public Criteria andUpdateTsIsNull() { + addCriterion("update_ts is null"); + return (Criteria) this; + } + + public Criteria andUpdateTsIsNotNull() { + addCriterion("update_ts is not null"); + return (Criteria) this; + } + + public Criteria andUpdateTsEqualTo(String value) { + addCriterion("update_ts =", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsNotEqualTo(String value) { + addCriterion("update_ts <>", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsGreaterThan(String value) { + addCriterion("update_ts >", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsGreaterThanOrEqualTo(String value) { + addCriterion("update_ts >=", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsLessThan(String value) { + addCriterion("update_ts <", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsLessThanOrEqualTo(String value) { + addCriterion("update_ts <=", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsLike(String value) { + addCriterion("update_ts like", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsNotLike(String value) { + addCriterion("update_ts not like", value, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsIn(List values) { + addCriterion("update_ts in", values, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsNotIn(List values) { + addCriterion("update_ts not in", values, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsBetween(String value1, String value2) { + addCriterion("update_ts between", value1, value2, "updateTs"); + return (Criteria) this; + } + + public Criteria andUpdateTsNotBetween(String value1, String value2) { + addCriterion("update_ts not between", value1, value2, "updateTs"); + return (Criteria) this; + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table ba_status_history + * + * @mbg.generated do_not_delete_during_merge + */ + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table ba_status_history + * + * @mbg.generated + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUser.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUser.java index 9c6439c..1c1f09c 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUser.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUser.java @@ -183,6 +183,24 @@ public class BasicUser implements Serializable { */ private Integer createPlatform; + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column basic_user.last_name + * + * @mbg.generated + */ + private String lastName; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column basic_user.first_name + * + * @mbg.generated + */ + private String firstName; + /** * This field was generated by MyBatis Generator. * This field corresponds to the database table basic_user @@ -671,6 +689,54 @@ public class BasicUser implements Serializable { this.createPlatform = createPlatform; } + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column basic_user.last_name + * + * @return the value of basic_user.last_name + * + * @mbg.generated + */ + public String getLastName() { + return lastName; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column basic_user.last_name + * + * @param lastName the value for basic_user.last_name + * + * @mbg.generated + */ + public void setLastName(String lastName) { + this.lastName = lastName == null ? null : lastName.trim(); + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column basic_user.first_name + * + * @return the value of basic_user.first_name + * + * @mbg.generated + */ + public String getFirstName() { + return firstName; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column basic_user.first_name + * + * @param firstName the value for basic_user.first_name + * + * @mbg.generated + */ + public void setFirstName(String firstName) { + this.firstName = firstName == null ? null : firstName.trim(); + } + /** * This method was generated by MyBatis Generator. * This method corresponds to the database table basic_user @@ -703,6 +769,8 @@ public class BasicUser implements Serializable { sb.append(", modifierId=").append(modifierId); sb.append(", superRole=").append(superRole); sb.append(", createPlatform=").append(createPlatform); + sb.append(", lastName=").append(lastName); + sb.append(", firstName=").append(firstName); sb.append(", serialVersionUID=").append(serialVersionUID); sb.append("]"); return sb.toString(); diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUserExample.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUserExample.java index b0e3aa7..d39fd22 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUserExample.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/BasicUserExample.java @@ -1463,6 +1463,146 @@ public class BasicUserExample { addCriterion("create_platform not between", value1, value2, "createPlatform"); return (Criteria) this; } + + public Criteria andLastNameIsNull() { + addCriterion("last_name is null"); + return (Criteria) this; + } + + public Criteria andLastNameIsNotNull() { + addCriterion("last_name is not null"); + return (Criteria) this; + } + + public Criteria andLastNameEqualTo(String value) { + addCriterion("last_name =", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameNotEqualTo(String value) { + addCriterion("last_name <>", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameGreaterThan(String value) { + addCriterion("last_name >", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameGreaterThanOrEqualTo(String value) { + addCriterion("last_name >=", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameLessThan(String value) { + addCriterion("last_name <", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameLessThanOrEqualTo(String value) { + addCriterion("last_name <=", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameLike(String value) { + addCriterion("last_name like", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameNotLike(String value) { + addCriterion("last_name not like", value, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameIn(List values) { + addCriterion("last_name in", values, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameNotIn(List values) { + addCriterion("last_name not in", values, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameBetween(String value1, String value2) { + addCriterion("last_name between", value1, value2, "lastName"); + return (Criteria) this; + } + + public Criteria andLastNameNotBetween(String value1, String value2) { + addCriterion("last_name not between", value1, value2, "lastName"); + return (Criteria) this; + } + + public Criteria andFirstNameIsNull() { + addCriterion("first_name is null"); + return (Criteria) this; + } + + public Criteria andFirstNameIsNotNull() { + addCriterion("first_name is not null"); + return (Criteria) this; + } + + public Criteria andFirstNameEqualTo(String value) { + addCriterion("first_name =", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameNotEqualTo(String value) { + addCriterion("first_name <>", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameGreaterThan(String value) { + addCriterion("first_name >", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameGreaterThanOrEqualTo(String value) { + addCriterion("first_name >=", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameLessThan(String value) { + addCriterion("first_name <", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameLessThanOrEqualTo(String value) { + addCriterion("first_name <=", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameLike(String value) { + addCriterion("first_name like", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameNotLike(String value) { + addCriterion("first_name not like", value, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameIn(List values) { + addCriterion("first_name in", values, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameNotIn(List values) { + addCriterion("first_name not in", values, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameBetween(String value1, String value2) { + addCriterion("first_name between", value1, value2, "firstName"); + return (Criteria) this; + } + + public Criteria andFirstNameNotBetween(String value1, String value2) { + addCriterion("first_name not between", value1, value2, "firstName"); + return (Criteria) this; + } } /** diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotification.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotification.java index f2ec5d7..3d4d90b 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotification.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotification.java @@ -39,6 +39,15 @@ public class DashboardNotification implements Serializable { */ private String category; + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification.category_id + * + * @mbg.generated + */ + private Long categoryId; + /** * * This field was generated by MyBatis Generator. @@ -197,6 +206,30 @@ public class DashboardNotification implements Serializable { this.category = category == null ? null : category.trim(); } + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification.category_id + * + * @return the value of dashboard_notification.category_id + * + * @mbg.generated + */ + public Long getCategoryId() { + return categoryId; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification.category_id + * + * @param categoryId the value for dashboard_notification.category_id + * + * @mbg.generated + */ + public void setCategoryId(Long categoryId) { + this.categoryId = categoryId; + } + /** * This method was generated by MyBatis Generator. * This method returns the value of the database column dashboard_notification.flag @@ -357,6 +390,7 @@ public class DashboardNotification implements Serializable { sb.append(", companyId=").append(companyId); sb.append(", demandTime=").append(demandTime); sb.append(", category=").append(category); + sb.append(", categoryId=").append(categoryId); sb.append(", flag=").append(flag); sb.append(", createdAt=").append(createdAt); sb.append(", createdBy=").append(createdBy); diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationCategory.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationCategory.java new file mode 100644 index 0000000..9b15530 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationCategory.java @@ -0,0 +1,336 @@ +package com.dongjian.dashboard.back.model; + +import java.io.Serializable; + +public class DashboardNotificationCategory implements Serializable { + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.id + * + * @mbg.generated + */ + private Long id; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.company_id + * + * @mbg.generated + */ + private Long companyId; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.name + * + * @mbg.generated + */ + private String name; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.remark + * + * @mbg.generated + */ + private String remark; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.flag + * + * @mbg.generated + */ + private Integer flag; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.created_by + * + * @mbg.generated + */ + private Long createdBy; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.created_at + * + * @mbg.generated + */ + private Long createdAt; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.updated_at + * + * @mbg.generated + */ + private Long updatedAt; + + /** + * + * This field was generated by MyBatis Generator. + * This field corresponds to the database column dashboard_notification_category.updated_by + * + * @mbg.generated + */ + private Long updatedBy; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + private static final long serialVersionUID = 1L; + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.id + * + * @return the value of dashboard_notification_category.id + * + * @mbg.generated + */ + public Long getId() { + return id; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.id + * + * @param id the value for dashboard_notification_category.id + * + * @mbg.generated + */ + public void setId(Long id) { + this.id = id; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.company_id + * + * @return the value of dashboard_notification_category.company_id + * + * @mbg.generated + */ + public Long getCompanyId() { + return companyId; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.company_id + * + * @param companyId the value for dashboard_notification_category.company_id + * + * @mbg.generated + */ + public void setCompanyId(Long companyId) { + this.companyId = companyId; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.name + * + * @return the value of dashboard_notification_category.name + * + * @mbg.generated + */ + public String getName() { + return name; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.name + * + * @param name the value for dashboard_notification_category.name + * + * @mbg.generated + */ + public void setName(String name) { + this.name = name == null ? null : name.trim(); + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.remark + * + * @return the value of dashboard_notification_category.remark + * + * @mbg.generated + */ + public String getRemark() { + return remark; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.remark + * + * @param remark the value for dashboard_notification_category.remark + * + * @mbg.generated + */ + public void setRemark(String remark) { + this.remark = remark == null ? null : remark.trim(); + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.flag + * + * @return the value of dashboard_notification_category.flag + * + * @mbg.generated + */ + public Integer getFlag() { + return flag; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.flag + * + * @param flag the value for dashboard_notification_category.flag + * + * @mbg.generated + */ + public void setFlag(Integer flag) { + this.flag = flag; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.created_by + * + * @return the value of dashboard_notification_category.created_by + * + * @mbg.generated + */ + public Long getCreatedBy() { + return createdBy; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.created_by + * + * @param createdBy the value for dashboard_notification_category.created_by + * + * @mbg.generated + */ + public void setCreatedBy(Long createdBy) { + this.createdBy = createdBy; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.created_at + * + * @return the value of dashboard_notification_category.created_at + * + * @mbg.generated + */ + public Long getCreatedAt() { + return createdAt; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.created_at + * + * @param createdAt the value for dashboard_notification_category.created_at + * + * @mbg.generated + */ + public void setCreatedAt(Long createdAt) { + this.createdAt = createdAt; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.updated_at + * + * @return the value of dashboard_notification_category.updated_at + * + * @mbg.generated + */ + public Long getUpdatedAt() { + return updatedAt; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.updated_at + * + * @param updatedAt the value for dashboard_notification_category.updated_at + * + * @mbg.generated + */ + public void setUpdatedAt(Long updatedAt) { + this.updatedAt = updatedAt; + } + + /** + * This method was generated by MyBatis Generator. + * This method returns the value of the database column dashboard_notification_category.updated_by + * + * @return the value of dashboard_notification_category.updated_by + * + * @mbg.generated + */ + public Long getUpdatedBy() { + return updatedBy; + } + + /** + * This method was generated by MyBatis Generator. + * This method sets the value of the database column dashboard_notification_category.updated_by + * + * @param updatedBy the value for dashboard_notification_category.updated_by + * + * @mbg.generated + */ + public void setUpdatedBy(Long updatedBy) { + this.updatedBy = updatedBy; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", companyId=").append(companyId); + sb.append(", name=").append(name); + sb.append(", remark=").append(remark); + sb.append(", flag=").append(flag); + sb.append(", createdBy=").append(createdBy); + sb.append(", createdAt=").append(createdAt); + sb.append(", updatedAt=").append(updatedAt); + sb.append(", updatedBy=").append(updatedBy); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationCategoryExample.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationCategoryExample.java new file mode 100644 index 0000000..6dd0121 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationCategoryExample.java @@ -0,0 +1,862 @@ +package com.dongjian.dashboard.back.model; + +import java.util.ArrayList; +import java.util.List; + +public class DashboardNotificationCategoryExample { + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + protected String orderByClause; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + protected boolean distinct; + + /** + * This field was generated by MyBatis Generator. + * This field corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + protected List oredCriteria; + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public DashboardNotificationCategoryExample() { + oredCriteria = new ArrayList(); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public void setOrderByClause(String orderByClause) { + this.orderByClause = orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public String getOrderByClause() { + return orderByClause; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public void setDistinct(boolean distinct) { + this.distinct = distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public boolean isDistinct() { + return distinct; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public List getOredCriteria() { + return oredCriteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public void or(Criteria criteria) { + oredCriteria.add(criteria); + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public Criteria or() { + Criteria criteria = createCriteriaInternal(); + oredCriteria.add(criteria); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public Criteria createCriteria() { + Criteria criteria = createCriteriaInternal(); + if (oredCriteria.size() == 0) { + oredCriteria.add(criteria); + } + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + protected Criteria createCriteriaInternal() { + Criteria criteria = new Criteria(); + return criteria; + } + + /** + * This method was generated by MyBatis Generator. + * This method corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public void clear() { + oredCriteria.clear(); + orderByClause = null; + distinct = false; + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + protected abstract static class GeneratedCriteria { + protected List criteria; + + protected GeneratedCriteria() { + super(); + criteria = new ArrayList(); + } + + public boolean isValid() { + return criteria.size() > 0; + } + + public List getAllCriteria() { + return criteria; + } + + public List getCriteria() { + return criteria; + } + + protected void addCriterion(String condition) { + if (condition == null) { + throw new RuntimeException("Value for condition cannot be null"); + } + criteria.add(new Criterion(condition)); + } + + protected void addCriterion(String condition, Object value, String property) { + if (value == null) { + throw new RuntimeException("Value for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value)); + } + + protected void addCriterion(String condition, Object value1, Object value2, String property) { + if (value1 == null || value2 == null) { + throw new RuntimeException("Between values for " + property + " cannot be null"); + } + criteria.add(new Criterion(condition, value1, value2)); + } + + public Criteria andIdIsNull() { + addCriterion("id is null"); + return (Criteria) this; + } + + public Criteria andIdIsNotNull() { + addCriterion("id is not null"); + return (Criteria) this; + } + + public Criteria andIdEqualTo(Long value) { + addCriterion("id =", value, "id"); + return (Criteria) this; + } + + public Criteria andIdNotEqualTo(Long value) { + addCriterion("id <>", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThan(Long value) { + addCriterion("id >", value, "id"); + return (Criteria) this; + } + + public Criteria andIdGreaterThanOrEqualTo(Long value) { + addCriterion("id >=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThan(Long value) { + addCriterion("id <", value, "id"); + return (Criteria) this; + } + + public Criteria andIdLessThanOrEqualTo(Long value) { + addCriterion("id <=", value, "id"); + return (Criteria) this; + } + + public Criteria andIdIn(List values) { + addCriterion("id in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdNotIn(List values) { + addCriterion("id not in", values, "id"); + return (Criteria) this; + } + + public Criteria andIdBetween(Long value1, Long value2) { + addCriterion("id between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andIdNotBetween(Long value1, Long value2) { + addCriterion("id not between", value1, value2, "id"); + return (Criteria) this; + } + + public Criteria andCompanyIdIsNull() { + addCriterion("company_id is null"); + return (Criteria) this; + } + + public Criteria andCompanyIdIsNotNull() { + addCriterion("company_id is not null"); + return (Criteria) this; + } + + public Criteria andCompanyIdEqualTo(Long value) { + addCriterion("company_id =", value, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdNotEqualTo(Long value) { + addCriterion("company_id <>", value, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdGreaterThan(Long value) { + addCriterion("company_id >", value, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdGreaterThanOrEqualTo(Long value) { + addCriterion("company_id >=", value, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdLessThan(Long value) { + addCriterion("company_id <", value, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdLessThanOrEqualTo(Long value) { + addCriterion("company_id <=", value, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdIn(List values) { + addCriterion("company_id in", values, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdNotIn(List values) { + addCriterion("company_id not in", values, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdBetween(Long value1, Long value2) { + addCriterion("company_id between", value1, value2, "companyId"); + return (Criteria) this; + } + + public Criteria andCompanyIdNotBetween(Long value1, Long value2) { + addCriterion("company_id not between", value1, value2, "companyId"); + return (Criteria) this; + } + + public Criteria andNameIsNull() { + addCriterion("`name` is null"); + return (Criteria) this; + } + + public Criteria andNameIsNotNull() { + addCriterion("`name` is not null"); + return (Criteria) this; + } + + public Criteria andNameEqualTo(String value) { + addCriterion("`name` =", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotEqualTo(String value) { + addCriterion("`name` <>", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThan(String value) { + addCriterion("`name` >", value, "name"); + return (Criteria) this; + } + + public Criteria andNameGreaterThanOrEqualTo(String value) { + addCriterion("`name` >=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThan(String value) { + addCriterion("`name` <", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLessThanOrEqualTo(String value) { + addCriterion("`name` <=", value, "name"); + return (Criteria) this; + } + + public Criteria andNameLike(String value) { + addCriterion("`name` like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameNotLike(String value) { + addCriterion("`name` not like", value, "name"); + return (Criteria) this; + } + + public Criteria andNameIn(List values) { + addCriterion("`name` in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameNotIn(List values) { + addCriterion("`name` not in", values, "name"); + return (Criteria) this; + } + + public Criteria andNameBetween(String value1, String value2) { + addCriterion("`name` between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andNameNotBetween(String value1, String value2) { + addCriterion("`name` not between", value1, value2, "name"); + return (Criteria) this; + } + + public Criteria andRemarkIsNull() { + addCriterion("remark is null"); + return (Criteria) this; + } + + public Criteria andRemarkIsNotNull() { + addCriterion("remark is not null"); + return (Criteria) this; + } + + public Criteria andRemarkEqualTo(String value) { + addCriterion("remark =", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotEqualTo(String value) { + addCriterion("remark <>", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThan(String value) { + addCriterion("remark >", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkGreaterThanOrEqualTo(String value) { + addCriterion("remark >=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThan(String value) { + addCriterion("remark <", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLessThanOrEqualTo(String value) { + addCriterion("remark <=", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkLike(String value) { + addCriterion("remark like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotLike(String value) { + addCriterion("remark not like", value, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkIn(List values) { + addCriterion("remark in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotIn(List values) { + addCriterion("remark not in", values, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkBetween(String value1, String value2) { + addCriterion("remark between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andRemarkNotBetween(String value1, String value2) { + addCriterion("remark not between", value1, value2, "remark"); + return (Criteria) this; + } + + public Criteria andFlagIsNull() { + addCriterion("flag is null"); + return (Criteria) this; + } + + public Criteria andFlagIsNotNull() { + addCriterion("flag is not null"); + return (Criteria) this; + } + + public Criteria andFlagEqualTo(Integer value) { + addCriterion("flag =", value, "flag"); + return (Criteria) this; + } + + public Criteria andFlagNotEqualTo(Integer value) { + addCriterion("flag <>", value, "flag"); + return (Criteria) this; + } + + public Criteria andFlagGreaterThan(Integer value) { + addCriterion("flag >", value, "flag"); + return (Criteria) this; + } + + public Criteria andFlagGreaterThanOrEqualTo(Integer value) { + addCriterion("flag >=", value, "flag"); + return (Criteria) this; + } + + public Criteria andFlagLessThan(Integer value) { + addCriterion("flag <", value, "flag"); + return (Criteria) this; + } + + public Criteria andFlagLessThanOrEqualTo(Integer value) { + addCriterion("flag <=", value, "flag"); + return (Criteria) this; + } + + public Criteria andFlagIn(List values) { + addCriterion("flag in", values, "flag"); + return (Criteria) this; + } + + public Criteria andFlagNotIn(List values) { + addCriterion("flag not in", values, "flag"); + return (Criteria) this; + } + + public Criteria andFlagBetween(Integer value1, Integer value2) { + addCriterion("flag between", value1, value2, "flag"); + return (Criteria) this; + } + + public Criteria andFlagNotBetween(Integer value1, Integer value2) { + addCriterion("flag not between", value1, value2, "flag"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNull() { + addCriterion("created_by is null"); + return (Criteria) this; + } + + public Criteria andCreatedByIsNotNull() { + addCriterion("created_by is not null"); + return (Criteria) this; + } + + public Criteria andCreatedByEqualTo(Long value) { + addCriterion("created_by =", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotEqualTo(Long value) { + addCriterion("created_by <>", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThan(Long value) { + addCriterion("created_by >", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByGreaterThanOrEqualTo(Long value) { + addCriterion("created_by >=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThan(Long value) { + addCriterion("created_by <", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByLessThanOrEqualTo(Long value) { + addCriterion("created_by <=", value, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByIn(List values) { + addCriterion("created_by in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotIn(List values) { + addCriterion("created_by not in", values, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByBetween(Long value1, Long value2) { + addCriterion("created_by between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedByNotBetween(Long value1, Long value2) { + addCriterion("created_by not between", value1, value2, "createdBy"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNull() { + addCriterion("created_at is null"); + return (Criteria) this; + } + + public Criteria andCreatedAtIsNotNull() { + addCriterion("created_at is not null"); + return (Criteria) this; + } + + public Criteria andCreatedAtEqualTo(Long value) { + addCriterion("created_at =", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotEqualTo(Long value) { + addCriterion("created_at <>", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThan(Long value) { + addCriterion("created_at >", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtGreaterThanOrEqualTo(Long value) { + addCriterion("created_at >=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThan(Long value) { + addCriterion("created_at <", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtLessThanOrEqualTo(Long value) { + addCriterion("created_at <=", value, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtIn(List values) { + addCriterion("created_at in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotIn(List values) { + addCriterion("created_at not in", values, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtBetween(Long value1, Long value2) { + addCriterion("created_at between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andCreatedAtNotBetween(Long value1, Long value2) { + addCriterion("created_at not between", value1, value2, "createdAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNull() { + addCriterion("updated_at is null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIsNotNull() { + addCriterion("updated_at is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedAtEqualTo(Long value) { + addCriterion("updated_at =", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotEqualTo(Long value) { + addCriterion("updated_at <>", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThan(Long value) { + addCriterion("updated_at >", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtGreaterThanOrEqualTo(Long value) { + addCriterion("updated_at >=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThan(Long value) { + addCriterion("updated_at <", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtLessThanOrEqualTo(Long value) { + addCriterion("updated_at <=", value, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtIn(List values) { + addCriterion("updated_at in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotIn(List values) { + addCriterion("updated_at not in", values, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtBetween(Long value1, Long value2) { + addCriterion("updated_at between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedAtNotBetween(Long value1, Long value2) { + addCriterion("updated_at not between", value1, value2, "updatedAt"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNull() { + addCriterion("updated_by is null"); + return (Criteria) this; + } + + public Criteria andUpdatedByIsNotNull() { + addCriterion("updated_by is not null"); + return (Criteria) this; + } + + public Criteria andUpdatedByEqualTo(Long value) { + addCriterion("updated_by =", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotEqualTo(Long value) { + addCriterion("updated_by <>", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThan(Long value) { + addCriterion("updated_by >", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByGreaterThanOrEqualTo(Long value) { + addCriterion("updated_by >=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThan(Long value) { + addCriterion("updated_by <", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByLessThanOrEqualTo(Long value) { + addCriterion("updated_by <=", value, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByIn(List values) { + addCriterion("updated_by in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotIn(List values) { + addCriterion("updated_by not in", values, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByBetween(Long value1, Long value2) { + addCriterion("updated_by between", value1, value2, "updatedBy"); + return (Criteria) this; + } + + public Criteria andUpdatedByNotBetween(Long value1, Long value2) { + addCriterion("updated_by not between", value1, value2, "updatedBy"); + return (Criteria) this; + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table dashboard_notification_category + * + * @mbg.generated do_not_delete_during_merge + */ + public static class Criteria extends GeneratedCriteria { + + protected Criteria() { + super(); + } + } + + /** + * This class was generated by MyBatis Generator. + * This class corresponds to the database table dashboard_notification_category + * + * @mbg.generated + */ + public static class Criterion { + private String condition; + + private Object value; + + private Object secondValue; + + private boolean noValue; + + private boolean singleValue; + + private boolean betweenValue; + + private boolean listValue; + + private String typeHandler; + + public String getCondition() { + return condition; + } + + public Object getValue() { + return value; + } + + public Object getSecondValue() { + return secondValue; + } + + public boolean isNoValue() { + return noValue; + } + + public boolean isSingleValue() { + return singleValue; + } + + public boolean isBetweenValue() { + return betweenValue; + } + + public boolean isListValue() { + return listValue; + } + + public String getTypeHandler() { + return typeHandler; + } + + protected Criterion(String condition) { + super(); + this.condition = condition; + this.typeHandler = null; + this.noValue = true; + } + + protected Criterion(String condition, Object value, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.typeHandler = typeHandler; + if (value instanceof List) { + this.listValue = true; + } else { + this.singleValue = true; + } + } + + protected Criterion(String condition, Object value) { + this(condition, value, null); + } + + protected Criterion(String condition, Object value, Object secondValue, String typeHandler) { + super(); + this.condition = condition; + this.value = value; + this.secondValue = secondValue; + this.typeHandler = typeHandler; + this.betweenValue = true; + } + + protected Criterion(String condition, Object value, Object secondValue) { + this(condition, value, secondValue, null); + } + } +} \ No newline at end of file diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationExample.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationExample.java index 81d08d1..c4c7bab 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationExample.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/model/DashboardNotificationExample.java @@ -454,6 +454,66 @@ public class DashboardNotificationExample { return (Criteria) this; } + public Criteria andCategoryIdIsNull() { + addCriterion("category_id is null"); + return (Criteria) this; + } + + public Criteria andCategoryIdIsNotNull() { + addCriterion("category_id is not null"); + return (Criteria) this; + } + + public Criteria andCategoryIdEqualTo(Long value) { + addCriterion("category_id =", value, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdNotEqualTo(Long value) { + addCriterion("category_id <>", value, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdGreaterThan(Long value) { + addCriterion("category_id >", value, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdGreaterThanOrEqualTo(Long value) { + addCriterion("category_id >=", value, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdLessThan(Long value) { + addCriterion("category_id <", value, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdLessThanOrEqualTo(Long value) { + addCriterion("category_id <=", value, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdIn(List values) { + addCriterion("category_id in", values, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdNotIn(List values) { + addCriterion("category_id not in", values, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdBetween(Long value1, Long value2) { + addCriterion("category_id between", value1, value2, "categoryId"); + return (Criteria) this; + } + + public Criteria andCategoryIdNotBetween(Long value1, Long value2) { + addCriterion("category_id not between", value1, value2, "categoryId"); + return (Criteria) this; + } + public Criteria andFlagIsNull() { addCriterion("flag is null"); return (Criteria) this; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationCategoryPageVO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationCategoryPageVO.java new file mode 100644 index 0000000..0a94fe3 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationCategoryPageVO.java @@ -0,0 +1,28 @@ +package com.dongjian.dashboard.back.vo.dashboardnotification; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** +* @author Mr.Jiang +* @time 2022年7月21日 下午8:50:31 +*/ +@Data +public class DashboardNotificationCategoryPageVO { + + @Schema(description = "unique identifier ID, not required for new entries", example = "2738967") + private Long categoryId; + + @Schema(description = "Company ID", example = "2738967", hidden = true) + private Long companyId; + + @Schema(description = "name", example = "webhook", required = true) + private String name; + + @Schema(description = "remark", example = "remark") + private String remark; + + @Schema(description = "created time", example = "2738967") + private Long createdAt; + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationPageVO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationPageVO.java index 9d475ba..ea1d588 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationPageVO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/dashboardnotification/DashboardNotificationPageVO.java @@ -3,9 +3,9 @@ package com.dongjian.dashboard.back.vo.dashboardnotification; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; -/** +/** * @author Mr.Jiang -* @time 2022年7月21日 下午8:50:31 +* @time 2022年7月21日 下午8:50:31 */ @Data public class DashboardNotificationPageVO { @@ -13,15 +13,21 @@ public class DashboardNotificationPageVO { @Schema(description = "Provider unique identifier ID, not required for new entries", example = "2738967") private Long dashboardNotificationId; + @Schema(description = "Company ID", example = "2738967", hidden = true) + private Long companyId; + @Schema(description = "demand time", example = "testProvider1") private String demandTime; @Schema(description = "category", example = "remark") private String category; + @Schema(description = "Category ID", example = "2738967") + private Long categoryId; + @Schema(description ="content", example = "2") private String content; - + @Schema(description = "created time", example = "2738967") private Long createdAt; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java index 4a32f7f..3c72960 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/BaseData.java @@ -15,6 +15,12 @@ public class BaseData { @Schema(description = "device name", example = "12-34") private String deviceName; + @Schema(description = "building ID", example = "33") + private Long buildingId; + + @Schema(description = "building name", example = "66") + private String buildingName; + @Schema(description = "upload timestamp", example = "1740033000234") private Long uploadTimestamp; diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceAlarmData.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceAlarmData.java index 2cf2a15..62f1f9e 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceAlarmData.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/DeviceAlarmData.java @@ -33,5 +33,14 @@ public class DeviceAlarmData extends BaseData{ @Schema(description = "资产记号",example = "122") private String assetSymbol; + @Schema(description = "已过去时长(毫秒级时间戳)", example = "15306854254") + private Long elapsedTime; + + @Schema(description = "已过去时长", example = "177日3時間54分間") + private String elapsedTimeStr; + + @Schema(description = "0=正常,1=告警", example = "1") + private Integer inAlarm; + } diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewCategoryVO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewCategoryVO.java new file mode 100644 index 0000000..105aa32 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewCategoryVO.java @@ -0,0 +1,23 @@ +package com.dongjian.dashboard.back.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class OverviewCategoryVO { + + private Long buildingId; + + private String buildingName; + + private String deviceId; + + private Long monitoringPointCategoryId; + + private String monitoringPointCategoryName; + + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewVO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewVO.java index 8b12751..29d72da 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewVO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/data/OverviewVO.java @@ -33,6 +33,9 @@ public class OverviewVO { @Schema(description = "今天告警数量",example = "1111") private Integer alarmCountToday = 0; + @Schema(description = "楼宇下设备没有的监视点分类",example = "[]") + private List missingMonitoringPointCategoryList = new ArrayList<>(); + @Schema(description = "监视点分类告警数量",example = "1111") private List monitoringPointCategoryAlarmList = new ArrayList<>(); diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/LineData.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/LineData.java index 2f7f2ad..ceac7f5 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/LineData.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/LineData.java @@ -4,7 +4,9 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Data public class LineData { @@ -13,9 +15,9 @@ public class LineData { private String attrCode; @Schema(description = "X-axis data", example = "[]") - private List xData = new ArrayList<>(); + private List xData = new ArrayList<>(); @Schema(description = "Y-axis data", example = "[]") - private List yData = new ArrayList<>(); + private Map> yData = new HashMap<>(); } diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/SubLineData.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/SubLineData.java new file mode 100644 index 0000000..8e8d93e --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/device/SubLineData.java @@ -0,0 +1,30 @@ +package com.dongjian.dashboard.back.vo.device; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Data +public class SubLineData { + + @Schema(description = "属性编码, 默认:single,温湿度设备:temperature或者humidity") + private String attrCode; + + @Schema(description = "Y-axis data", example = "[]") + private Map subData = new HashMap<>(); + + + @Data + public static class childLineData { + @Schema(description = "X-axis data", example = "[]") + private List xData = new ArrayList<>(); + + @Schema(description = "Y-axis data", example = "[]") + private List yData = new ArrayList<>(); + } + +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/monitoringpointcategory/MonitoringPointCategoryPageVO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/monitoringpointcategory/MonitoringPointCategoryPageVO.java index 00aa3c4..edee61d 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/monitoringpointcategory/MonitoringPointCategoryPageVO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/monitoringpointcategory/MonitoringPointCategoryPageVO.java @@ -24,4 +24,6 @@ public class MonitoringPointCategoryPageVO { @Schema(description = "告警图标", example = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAalarm") private String thumbnailAlarmBase64; + @Schema(description = "无效图标", example = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAalarm") + private String thumbnailDisBase64; } diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/record/RecordAccumulateDto.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/record/RecordAccumulateDto.java new file mode 100644 index 0000000..6195939 --- /dev/null +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/record/RecordAccumulateDto.java @@ -0,0 +1,14 @@ +package com.dongjian.dashboard.back.vo.record; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class RecordAccumulateDto { + private String deviceId; + private Double incrementToday; + private Integer dateHour; + private Integer dateMinute; + private Integer dateSecond; +} diff --git a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/user/UserPageDTO.java b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/user/UserPageDTO.java index cbe182a..d0beac4 100644 --- a/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/user/UserPageDTO.java +++ b/dongjian-dashboard-back-model/src/main/java/com/dongjian/dashboard/back/vo/user/UserPageDTO.java @@ -48,5 +48,11 @@ public class UserPageDTO { @Schema(description = "创建时间",example = "1678990326897", required = false) private Long createTime; + + @Schema(description = "姓",example = "鸠山", required = true) + private String lastName; + + @Schema(description = "名",example = "由纪夫", required = true) + private String firstName; } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DashboardNotificationCategoryService.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DashboardNotificationCategoryService.java new file mode 100644 index 0000000..8adf0cd --- /dev/null +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DashboardNotificationCategoryService.java @@ -0,0 +1,24 @@ +package com.dongjian.dashboard.back.service; + +import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationCategorySearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.DeleteDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationCategoryPageVO; + +public interface DashboardNotificationCategoryService { + + SimpleDataResponse add(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Long userId, Long companyId, + Integer languageType); + + SimpleDataResponse edit(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Long userId, Long companyId, + Integer languageType); + + SimpleDataResponse batchDelete(DeleteDashboardNotificationCategoryParams deleteParams, Long userId, Long companyId, + Integer languageType); + + PageInfo getListPage(DashboardNotificationCategorySearchParams searchParams, Long companyId, Long userId, + Integer languageType, Integer uTCOffset); + +} diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DashboardNotificationService.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DashboardNotificationService.java new file mode 100644 index 0000000..6b92116 --- /dev/null +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DashboardNotificationService.java @@ -0,0 +1,24 @@ +package com.dongjian.dashboard.back.service; + +import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationSearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.DeleteDashboardNotificationParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationParams; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationPageVO; + +public interface DashboardNotificationService { + + SimpleDataResponse add(OptDashboardNotificationParams optDashboardNotificationParams, Long userId, Long companyId, + Integer languageType); + + SimpleDataResponse edit(OptDashboardNotificationParams optDashboardNotificationParams, Long userId, Long companyId, + Integer languageType); + + SimpleDataResponse batchDelete(DeleteDashboardNotificationParams deleteParams, Long userId, Long companyId, + Integer languageType); + + PageInfo getListPage(DashboardNotificationSearchParams searchParams, Long companyId, Long userId, + Integer languageType, Integer uTCOffset); + +} diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataAccumulateService.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataAccumulateService.java index c5db5b6..cf72fa3 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataAccumulateService.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataAccumulateService.java @@ -18,5 +18,5 @@ public interface DeviceDataAccumulateService { List handleDeviceAccumulateData(AccumulateDataSearchParam pageSearchParam); - SimpleDataResponse> getLineData(LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType); + SimpleDataResponse> getLineData(Integer searchType, LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataBaStatusService.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataBaStatusService.java index a8b238b..204054b 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataBaStatusService.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/DeviceDataBaStatusService.java @@ -1,8 +1,11 @@ package com.dongjian.dashboard.back.service; import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; import com.dongjian.dashboard.back.dto.data.BaStatusDataSearchParam; +import com.dongjian.dashboard.back.dto.device.LineDataSearchParams; import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData; +import com.dongjian.dashboard.back.vo.device.LineData; import java.util.List; @@ -14,4 +17,6 @@ public interface DeviceDataBaStatusService { PageInfo getDataList(BaStatusDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType); List handleDeviceBaStatusData(BaStatusDataSearchParam pageSearchParam); + + SimpleDataResponse> getLineData(Integer searchType, LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/OverviewService.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/OverviewService.java index 1257691..43a3a31 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/OverviewService.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/OverviewService.java @@ -17,5 +17,5 @@ public interface OverviewService { SimpleDataResponse getWeatherInfo(QueryWeather queryWeather, Long userId, Long companyId, Integer languageType, Integer utcOffset); - SimpleDataResponse getNotification(Long userId, Long companyId, Integer languageType, Integer utcOffset); + SimpleDataResponse> getNotification(Long userId, Long companyId, Integer languageType, Integer utcOffset); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java index c2d17df..908e518 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/CommonOpt.java @@ -2,26 +2,33 @@ package com.dongjian.dashboard.back.service.common; import java.math.BigDecimal; import java.sql.*; +import java.text.MessageFormat; import java.time.Instant; import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.function.BiConsumer; import java.util.function.Function; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import com.alibaba.fastjson2.JSON; import com.dongjian.dashboard.back.common.Constants; -import com.dongjian.dashboard.back.common.response.ResponseCode; -import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; import com.dongjian.dashboard.back.dao.ex.*; import com.dongjian.dashboard.back.dto.device.LineDataSearchParams; import com.dongjian.dashboard.back.model.*; import com.dongjian.dashboard.back.util.DESUtil; +import com.dongjian.dashboard.back.util.DateUtil; +import com.dongjian.dashboard.back.util.DurationData; import com.dongjian.dashboard.back.vo.building.BindedBuildingVO; import com.dongjian.dashboard.back.vo.company.AuroraInfo; +import com.dongjian.dashboard.back.vo.device.SubLineData; +import com.dongjian.dashboard.back.vo.device.DeviceIncrement; import com.dongjian.dashboard.back.vo.device.LineData; +import com.dongjian.dashboard.back.vo.record.RecordAccumulateDto; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections.CollectionUtils; @@ -34,13 +41,13 @@ import org.springframework.stereotype.Component; import com.dongjian.dashboard.back.util.CommonUtil; -/** +/** * @author Mr.Jiang -* @time 2022年5月28日 上午7:41:40 +* @time 2022年5月28日 上午7:41:40 */ @Component public class CommonOpt { - + private static Logger logger = LoggerFactory.getLogger(CommonOpt.class); public enum ExtractStrategy { @@ -56,7 +63,7 @@ public class CommonOpt { @Value("${spring.datasource.url}") private String dbUrl; - + @Autowired private BasicCompanyMapperExt basicCompanyMapperExt; @Autowired @@ -69,13 +76,16 @@ public class CommonOpt { private DeviceRawdataRealtimeMapperExt deviceRawdataRealtimeMapperExt; @Autowired private DeviceInfoMapperExt deviceInfoMapperExt; - + + @Autowired + private MsgLanguageChange msgLanguageChange; + /** * 根据自身企业ID获取子企业ID的list,list包含自身ID - * + * * @param companyId 自身ID - * + * * @return */ public List getSelfAndSubCompanyId(Long companyId) { @@ -85,7 +95,7 @@ public class CommonOpt { return idsList; } - + private void collectChildIds(List idsList, String parentCompanyIds) { Map searchChildMap = new HashMap(); searchChildMap.put("companyIds", parentCompanyIds); @@ -97,14 +107,14 @@ public class CommonOpt { } } - + /** * 过滤掉不属于targetCompany和它子企业的ID - * + * * @param targetCompanyId 指定企业ID - * + * * @param needProcessedCompanyIds 需要被处理的企业ID - * + * */ public List filterCompanyIds(Long targetCompanyId, String needProcessedCompanyIds) { List selfAndSubCompanyList = getSelfAndSubCompanyId(targetCompanyId); @@ -151,11 +161,6 @@ public class CommonOpt { return getAuroraInfoByApikey(paramMap); } - public String buildAuroraJdbcUrl(String dbUrl, String auroraHost) { - String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)"; - return dbUrl.replaceAll(regex, "$1" + auroraHost + "$3"); - } - public String extractValue(ObjectMapper mapper, Long categoryId, String rawData) { if (Constants.DEVICE_TYPE_TEMPERATURE_HUMIDITY.contains(categoryId)){ List values = extractAllValues(mapper, rawData); @@ -265,8 +270,10 @@ public class CommonOpt { } public List getPreDay(int days) { + // 日本时区 + ZoneId JST = Constants.ZONE_TOKYO; // 获取当前日期 - LocalDate currentDate = LocalDate.now(); + LocalDate currentDate = LocalDate.now(JST); // 设置日期格式化 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy_MM_dd"); // 用于存储日期的列表 @@ -280,198 +287,287 @@ public class CommonOpt { return dateList; } - public List getLineData(Long companyId, LineDataSearchParams lineDataSearchParams, int deviceType) { - List lineDataList = new ArrayList<>(); - for (String attrCode : lineDataSearchParams.getAttrCodeList()){ - DeviceInfo deviceInfo = getDeviceInfoByDeviceId(lineDataSearchParams.getDeviceId()); - if (null == deviceInfo){ - continue; - } - LineData lineData = new LineData(); - lineData.setAttrCode(attrCode); - try { - Map apikeyParamMap = new HashMap<>(); - apikeyParamMap.put("companyId", companyId); - AuroraInfo apikeyInfo = getAuroraInfoByApikey(apikeyParamMap); - - if (null == apikeyInfo) { - logger.error("Failed to get AuroraInfo for companyId: {}", companyId); - lineDataList.add(lineData); - } + public List getAccumulateLineData(Long companyId, Integer searchType, LineDataSearchParams lineDataSearchParams) { + List result = new ArrayList<>(); + executeLineDataQuery( + result, + companyId, + searchType, + lineDataSearchParams, + (conn, lineData) -> { + + DeviceInfo deviceInfo = getDeviceInfoByDeviceId(lineDataSearchParams.getDeviceId()); + List dateList = getPreDay(1); + + for (String date : dateList) { + LocalDate current = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy_MM_dd")); + + LocalDate yesterday = current.minusDays(1); + LocalDate beforeYesterday = current.minusDays(2); + LocalDate lastYear = DateUtil.getLastYearSameIsoWeekDay(current); + LocalDate lastYearPrev = lastYear.minusDays(1); + + Double todayBase = getDayAccumulate(conn, yesterday, lineDataSearchParams.getDeviceId()); + Double yesterdayBase = getDayAccumulate(conn, beforeYesterday, lineDataSearchParams.getDeviceId()); + Double lastYearBase = getDayAccumulate(conn, lastYearPrev, lineDataSearchParams.getDeviceId()); + + SubLineData acc = new SubLineData(); + acc.setAttrCode(lineData.getAttrCode()); + + processAccumulateDay(conn, current, todayBase, "today", acc, deviceInfo); + if (searchType == 1) { + processAccumulateDay(conn, yesterday, yesterdayBase, "yesterday", acc, deviceInfo); + processAccumulateDay(conn, lastYear, lastYearBase, "lastYear", acc, deviceInfo); + LineDataAggregator.convertToAccumulateLineData(acc, lineData); + } else { + LineDataAggregator.convertToLineDataAll(acc, lineData); + } + } + }); + return result; + } - if (StringUtils.isNotBlank(apikeyInfo.getAuroraUrl())) { - Class.forName("com.mysql.cj.jdbc.Driver"); + private void executeLineDataQuery( + List result, + Long companyId, + Integer searchType, + LineDataSearchParams params, + BiConsumer dataProcessor) { - String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)"; - Pattern pattern = Pattern.compile(regex); - Matcher matcher = pattern.matcher(dbUrl); - String newJdbcUrl = ""; - if (matcher.find()) { - newJdbcUrl = matcher.replaceAll("$1" + apikeyInfo.getAuroraUrl() + "$3"); - } + DeviceInfo deviceInfo = getDeviceInfoByDeviceId(params.getDeviceId()); + if (deviceInfo == null) { + return; + } - try (Connection conn = DriverManager.getConnection( - newJdbcUrl.replace("data_center_aeon_admin", "aeon") + "&allowPublicKeyRetrieval=true", - DESUtil.decrypt(apikeyInfo.getAuroraUsername(), Constants.DES_SALT), - DESUtil.decrypt(apikeyInfo.getAuroraPassword(), Constants.DES_SALT))) { + AuroraInfo auroraInfo = getAuroraInfoByApikey(Collections.singletonMap("companyId", companyId)); + if (auroraInfo == null || StringUtils.isBlank(auroraInfo.getAuroraUrl())) { + logger.error("AuroraInfo is not set for companyId: {}", companyId); + return; + } - List dateList = getPreDay(1); + String jdbcUrl = null; + try { + jdbcUrl = buildAuroraJdbcUrl(auroraInfo); + } catch (ClassNotFoundException e) { + logger.error("Failed to build Aurora JDBC URL for companyId: {}", companyId, e); + return; + } - for (String date : dateList) { - //获取昨天的值,这里只针对累积设备 - Double lastDayValue = null; - if (deviceType == 2) { - lastDayValue = getLastDayValue(conn, date, lineDataSearchParams.getDeviceId()); - } + for (String attrCode : params.getAttrCodeList()) { + LineData lineData = new LineData(); + lineData.setAttrCode(attrCode); - // 提取年、月、日 - 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); - try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { - 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()) { - if (result.next()) { - if (deviceType == 2) { - processResult(result, lineData, deviceInfo, lastDayValue); - } else if (deviceType == 3) { - processResult(result, lineData, deviceInfo); - } - } - } - } - } - } catch (Exception e) { - logger.error("getLineData processing aurora error", e); - } - } + try (Connection conn = DriverManager.getConnection( + jdbcUrl, + DESUtil.decrypt(auroraInfo.getAuroraUsername(), Constants.DES_SALT), + DESUtil.decrypt(auroraInfo.getAuroraPassword(), Constants.DES_SALT))) { + + dataProcessor.accept(conn, lineData); } catch (Exception e) { - logger.error("getLineData error", e); + logger.error("executeLineDataQuery error", e); } - lineDataList.add(lineData); + + result.add(lineData); } - return lineDataList; } - private DeviceInfo getDeviceInfoByDeviceId(String deviceId) { - DeviceInfoExample example = new DeviceInfoExample(); - example.createCriteria() - .andDeviceIdEqualTo(deviceId) - .andFlagEqualTo(0); - List list = deviceInfoMapperExt.selectByExample(example); - return list.isEmpty() ? null : list.get(0); + private String buildAuroraJdbcUrl(AuroraInfo auroraInfo) throws ClassNotFoundException { + Class.forName("com.mysql.cj.jdbc.Driver"); + + String regex = "(jdbc:mysql://)([^/]+)(/data_center_aeon_admin.*)"; + Matcher matcher = Pattern.compile(regex).matcher(dbUrl); + + if (!matcher.find()) { + throw new RuntimeException("Invalid dbUrl format"); + } + + return matcher.replaceAll("$1" + auroraInfo.getAuroraUrl() + "$3") + .replace("data_center_aeon_admin", "aeon") + + "&allowPublicKeyRetrieval=true"; } - 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(); + private void processAccumulateDay( + Connection conn, + LocalDate date, + Double baseValue, + String yKey, + SubLineData SubLineData, + DeviceInfo deviceInfo) { - String sql = "SELECT upload_value FROM dashboard_realtime_accumulate_day " + - "WHERE device_id = ? AND date_year = ? AND date_month = ? AND date_day = ?"; + SubLineData.childLineData childLineData = new SubLineData.childLineData(); - 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); // 设置日期 + String 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"; - 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); + try (PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setString(1, deviceInfo.getDeviceId()); + ps.setString(2, SubLineData.getAttrCode()); + ps.setInt(3, date.getYear()); + ps.setInt(4, date.getMonthValue()); + ps.setInt(5, date.getDayOfMonth()); + + try (ResultSet rs = ps.executeQuery()) { + + DateTimeFormatter formatter = Constants.FORMATTER_YMDHMS; + ZoneId JST = Constants.ZONE_TOKYO; + + while (rs.next()) { + long ts = rs.getLong("upload_at"); + String value = rs.getString("upload_value"); + + if (ts == 0) continue; + + String time = Instant.ofEpochMilli(ts) + .atZone(JST) + .toLocalDateTime() + .format(formatter); + + double current = StringUtils.isBlank(value) + ? 0 + : new BigDecimal(value).doubleValue(); + + double y = baseValue == null || current < baseValue + ? current + : current - baseValue; + + childLineData.getXData().add(time); + childLineData.getYData().add(CommonUtil.formatDecimal(y, deviceInfo.getDashboardDecimalPlaces())); } } - } catch (SQLException e) { - logger.error("Error getLastDayValue query: ", e); + } catch (Exception e) { + logger.error("processAccumulateDay error", e); } - return null; + + SubLineData.getSubData().put(yKey, childLineData); } - private void processResult(ResultSet result, LineData lineData, DeviceInfo deviceInfo) { - try { - // 用于存储 xData 和 yData - List xDataList = new ArrayList<>(); - List yDataList = new ArrayList<>(); + private Double getDayAccumulate(Connection conn, LocalDate date, String deviceId) { - // 使用 DateTimeFormatter 来格式化时间 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - ObjectMapper mapper = new ObjectMapper(); + String sql = "SELECT upload_value FROM dashboard_realtime_accumulate_day " + + "WHERE device_id = ? AND date_year = ? AND date_month = ? AND date_day = ?"; - // 遍历查询结果 - do { - // 获取 receive_ts 和 rawData - long receiveTs = result.getLong("upload_at"); - String value = result.getString("upload_value"); + try (PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setString(1, deviceId); + ps.setInt(2, date.getYear()); + ps.setInt(3, date.getMonthValue()); + ps.setInt(4, date.getDayOfMonth()); - // 如果 receiveTs 为 0(表示无效时间戳),跳过当前行 - if (receiveTs == 0) { - continue; // 跳过当前循环的剩余部分,继续处理下一行 + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return new BigDecimal(rs.getString("upload_value")).doubleValue(); } + } + } catch (Exception e) { + logger.error("getDayAccumulate error", e); + } + return null; + } - // 将 long 时间戳转换为 LocalDateTime(日本时区) - Instant instant = Instant.ofEpochMilli(receiveTs); - String formattedDate = instant.atZone(ZoneId.of("Asia/Tokyo")) - .toLocalDateTime() - .format(formatter); - - xDataList.add(formattedDate); - - // 将 rawData解析 添加到 yData -// String value = extractFirstValue(mapper, rawData); - yDataList.add(CommonUtil.formatDecimal(StringUtils.isBlank(value) ? "0" : value, deviceInfo.getDashboardDecimalPlaces())); + private DeviceInfo getDeviceInfoByDeviceId(String deviceId) { + DeviceInfoExample example = new DeviceInfoExample(); + example.createCriteria() + .andDeviceIdEqualTo(deviceId) + .andFlagEqualTo(0); + List list = deviceInfoMapperExt.selectByExample(example); + return list.isEmpty() ? null : list.get(0); + } - } while (result.next()); + public List getMeasureLineData(Long companyId, Integer searchType, LineDataSearchParams lineDataSearchParams) { + List list = new ArrayList<>(); + executeLineDataQuery( + list, + companyId, + searchType, + lineDataSearchParams, + (conn, lineData) -> { + + DeviceInfo deviceInfo = getDeviceInfoByDeviceId(lineDataSearchParams.getDeviceId()); + List dateList = getPreDay(1); + + for (String date : dateList) { + LocalDate today = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy_MM_dd")); + LocalDate yesterday = today.minusDays(1); + LocalDate lastYear = DateUtil.getLastYearSameIsoWeekDay(today); + + SubLineData sub = new SubLineData(); + sub.setAttrCode(lineData.getAttrCode()); + + processMeasureDay(conn, today, "today", sub, deviceInfo); + if (searchType == 1) { + processMeasureDay(conn, yesterday, "yesterday", sub, deviceInfo); + processMeasureDay(conn, lastYear, "lastYear", sub, deviceInfo); + LineDataAggregator.convertToMeasureLineDataAvg(sub, lineData); + } else { + LineDataAggregator.convertToLineDataAll(sub, lineData); + } + } + }); - lineData.getXData().addAll(xDataList); - lineData.getYData().addAll(yDataList); + return list; + } + private void processMeasureDay( + Connection conn, + LocalDate date, + String yKey, + SubLineData sub, + DeviceInfo deviceInfo + ) { + SubLineData.childLineData child = new SubLineData.childLineData(); + + String 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"; + + try (PreparedStatement ps = conn.prepareStatement(sql)) { + ps.setString(1, deviceInfo.getDeviceId()); + ps.setString(2, sub.getAttrCode()); + ps.setInt(3, date.getYear()); + ps.setInt(4, date.getMonthValue()); + ps.setInt(5, date.getDayOfMonth()); + + try (ResultSet rs = ps.executeQuery()) { + DateTimeFormatter formatter = Constants.FORMATTER_YMDHMS; + + while (rs.next()) { + long ts = rs.getLong("upload_at"); + String value = rs.getString("upload_value"); + if (ts == 0) continue; + + String time = Instant.ofEpochMilli(ts) + .atZone(Constants.ZONE_TOKYO) + .toLocalDateTime() + .format(formatter); + + child.getXData().add(time); + child.getYData().add( + CommonUtil.formatDecimal( + StringUtils.isBlank(value) ? "0" : value, + deviceInfo.getDashboardDecimalPlaces() + ) + ); + } + } } catch (Exception e) { - logger.error("Error processing result set", e); + logger.error("processMeasureDay error", e); } + + sub.getSubData().put(yKey, child); } - private void processResult(ResultSet result, LineData lineData, DeviceInfo deviceInfo, Double lastDayValue) { + + private void processResult(ResultSet result, LineData lineData, DeviceInfo deviceInfo) { try { // 用于存储 xData 和 yData - List xDataList = new ArrayList<>(); + List xDataList = new ArrayList<>(); List yDataList = new ArrayList<>(); // 使用 DateTimeFormatter 来格式化时间 - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + DateTimeFormatter formatter = Constants.FORMATTER_YMDHMS; ObjectMapper mapper = new ObjectMapper(); - // 用于存储每个小时最后一条数据(仅在 deviceType = 2 时使用) - Map lastHourData = new LinkedHashMap<>(); // 按插入顺序保存数据 - // 遍历查询结果 do { // 获取 receive_ts 和 rawData @@ -485,34 +581,20 @@ public class CommonOpt { // 将 long 时间戳转换为 LocalDateTime(日本时区) Instant instant = Instant.ofEpochMilli(receiveTs); - String formattedDate = instant.atZone(ZoneId.of("Asia/Tokyo")) + String formattedDate = instant.atZone(Constants.ZONE_TOKYO) .toLocalDateTime() .format(formatter); + xDataList.add(formattedDate); + // 将 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); + yDataList.add(CommonUtil.formatDecimal(StringUtils.isBlank(value) ? "0" : value, deviceInfo.getDashboardDecimalPlaces())); } while (result.next()); - //只取每小时的最后一条数据 - for (Map.Entry entry : lastHourData.entrySet()) { - xDataList.add(entry.getKey()); // 添加每小时的时间 - yDataList.add(CommonUtil.formatDecimal(entry.getValue(), deviceInfo.getDashboardDecimalPlaces())); // 添加每小时最后一条数据的值 - } - - // 将处理后的数据加入到 lineData 中 lineData.getXData().addAll(xDataList); - lineData.getYData().addAll(yDataList); + lineData.getYData().put("common", yDataList); } catch (Exception e) { logger.error("Error processing result set", e); @@ -678,4 +760,68 @@ public class CommonOpt { return null; } } + + public String formatElapsedTime(Long elapsedTime, Integer languageType) { + DurationData durationData = DurationData.fromMilliseconds(elapsedTime); + return MessageFormat.format( + msgLanguageChange.getParameterMapByCode(languageType, "elapsedTime"), + durationData.getDays(), + durationData.getHours(), + durationData.getMinutes()); + } + + public Map toDeviceIncrementMap( + List records, + int targetSeconds, + String field + ) { + Map result = new HashMap<>(); + Map diffMap = new HashMap<>(); + + for (RecordAccumulateDto r : records) { + String deviceIdLower = r.getDeviceId().toLowerCase(); + int secondsOfDay = r.getDateHour() * 3600 + r.getDateMinute() * 60 + r.getDateSecond(); + int diff = Math.abs(secondsOfDay - targetSeconds); + + if (diff > 600) { + continue; + } + + Integer bestDiff = diffMap.get(deviceIdLower); + if (bestDiff == null || diff < bestDiff) { + diffMap.put(deviceIdLower, diff); + + DeviceIncrement di = result.get(deviceIdLower); + if (di == null) { + di = new DeviceIncrement(); + di.setDeviceId(deviceIdLower); + } + + if ("yesterday".equals(field)) { + di.setYesterdayIncrement(r.getIncrementToday()); + } else { + di.setLastYearIncrement(r.getIncrementToday()); + } + + result.put(deviceIdLower, di); + } + } + + return result; + } + + public String status111Mapping(String status111) { + if(StringUtils.isBlank(status111)){ + return null; + } + return switch (status111) { + case "0" -> "NML"; + case "128" -> "MSK"; + case "64" -> "OVR"; + case "32" -> "TBL"; + case "16" -> "ALM"; + default -> null; + }; + } + } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/LineDataAggregator.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/LineDataAggregator.java new file mode 100644 index 0000000..4ea82a7 --- /dev/null +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/LineDataAggregator.java @@ -0,0 +1,353 @@ +package com.dongjian.dashboard.back.service.common; + +import com.dongjian.dashboard.back.vo.device.SubLineData; +import com.dongjian.dashboard.back.vo.device.LineData; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import java.util.*; + +/** + * 完整整合版:LineData 聚合与转换工具类(统一使用 LineDataAligner 对齐) + */ +public class LineDataAggregator { + + /* =============================== + * 时间工具 + * =============================== */ + public static final class TimeAxisUtil { + public static final DateTimeFormatter DATETIME_FMT = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + public static String hourKey(LocalDateTime time) { + return time.withMinute(0).withSecond(0).withNano(0).format(DATETIME_FMT); + } + + public static String halfHourKey(LocalDateTime time) { + int minute = time.getMinute() < 30 ? 0 : 30; + return time.withMinute(minute).withSecond(0).withNano(0).format(DATETIME_FMT); + } + + public static String alignToHalfHour(LocalTime time) { + int minute = time.getMinute() < 30 ? 0 : 30; + return LocalTime.of(time.getHour(), minute).format(DateTimeFormatter.ofPattern("HH:mm")); + } + + public static String extractDate(String datetime) { + return LocalDateTime.parse(datetime, DATETIME_FMT).toLocalDate().toString(); + } + + public static List generate48HalfHourPoints(String date) { + List list = new ArrayList<>(48); + LocalDateTime t = LocalDate.parse(date).atStartOfDay(); + for (int i = 0; i < 48; i++) { + list.add(t.plusMinutes(i * 30).format(DATETIME_FMT)); + } + return list; + } + } + + /* =============================== + * Y 对齐工具 + * =============================== */ + public static final class LineDataAligner { + + /** + * 对齐 X 轴,补 null + */ + public static Map> alignY( + List xAxis, + Map> seriesValueMap + ) { + Map> result = new LinkedHashMap<>(); + for (Map.Entry> entry : seriesValueMap.entrySet()) { + List aligned = new ArrayList<>(xAxis.size()); + Map valueMap = entry.getValue(); + for (String x : xAxis) { + aligned.add(valueMap.get(x)); + } + result.put(entry.getKey(), aligned); + } + return result; + } + } + + /* =============================== + * 聚合策略接口(可扩展) + * =============================== */ + @FunctionalInterface + public interface HalfHourCollector { + void collect(Map bucket, String key, LocalDateTime time, Object value); + } + + /* 平均值聚合实现 */ + public static class AvgCollector implements HalfHourCollector> { + @Override + public void collect(Map> bucket, String key, LocalDateTime time, Object value) { + bucket.computeIfAbsent(key, k -> new ArrayList<>()).add(Double.parseDouble(value.toString())); + } + } + + /* 取最后一条实现 */ + public static class LastValueCollector implements HalfHourCollector { + @Override + public void collect(Map bucket, String key, LocalDateTime time, Object value) { + TimeValue old = bucket.get(key); + if (old == null || time.isAfter(old.time)) { + bucket.put(key, new TimeValue(time, value)); + } + } + } + + /* =============================== + * 核心数据模型 + * =============================== */ + public static class TimeValue { + LocalDateTime time; + Object value; + + TimeValue(LocalDateTime time, Object value) { + this.time = time; + this.value = value; + } + } + + public static class HalfHourSeries { + String date; + List xList; + List yList; + + HalfHourSeries(String date) { + this(date, new ArrayList<>(), new ArrayList<>()); + } + + HalfHourSeries(String date, List xList, List yList) { + this.date = date; + this.xList = xList; + this.yList = yList; + } + + Map toMap() { + Map map = new HashMap<>(); + for (int i = 0; i < xList.size(); i++) { + map.put(xList.get(i), yList.get(i)); + } + return map; + } + } + + /* =============================== + * 工具方法 + * =============================== */ + private static Object safeGet(List list, int index) { + return (list != null && index < list.size()) ? list.get(index) : null; + } + + private static LocalDateTime parseTime(Object x) { + return LocalDateTime.parse(String.valueOf(x), TimeAxisUtil.DATETIME_FMT); + } + + public static void convertToMeasureLineDataAvg(SubLineData accumulate, LineData lineData) { + if (accumulate == null || accumulate.getSubData() == null) return; + + // 1. 每个 series 做「半小时平均」 + Map seriesMap = new LinkedHashMap<>(); + for (Map.Entry entry : accumulate.getSubData().entrySet()) { + seriesMap.put(entry.getKey(), aggregateAvgByHalfHour(entry.getValue())); + } + + // 2. today 作为 X 轴基准 + HalfHourSeries today = seriesMap.get("today"); + if (today == null) { + throw new IllegalStateException("subData 必须包含 today"); + } + + // 3. 构建最终 X(yyyy-MM-dd HH:mm:00) + List finalX = new ArrayList<>(); + for (String hm : today.xList) { + finalX.add(today.date + " " + hm + ":00"); + } + + // 4. 构建临时 map,用 today.xList 对齐 + Map> tmpMap = new HashMap<>(); + for (Map.Entry entry : seriesMap.entrySet()) { + tmpMap.put(entry.getKey(), entry.getValue().toMap()); + } + + // 5. 写入 LineData + lineData.setXData(finalX); + lineData.setYData(LineDataAligner.alignY(today.xList, tmpMap)); + lineData.setAttrCode(accumulate.getAttrCode()); + + // 6. 补齐 48 半小时 + fillTo48HalfHour(lineData); + } + + private static HalfHourSeries aggregateAvgByHalfHour(SubLineData.childLineData child) { + if (child == null || child.getXData() == null || child.getYData() == null) { + return new HalfHourSeries(null); + } + + Map> bucket = new HashMap<>(); + String date = null; + + int size = Math.min(child.getXData().size(), child.getYData().size()); + + for (int i = 0; i < size; i++) { + Object x = child.getXData().get(i); + Object y = child.getYData().get(i); + if (x == null || y == null) continue; + + LocalDateTime time; + try { + time = LocalDateTime.parse(x.toString(), TimeAxisUtil.DATETIME_FMT); + } catch (Exception e) { + continue; + } + + if (date == null) { + date = time.toLocalDate().toString(); + } + + double num; + try { + num = Double.parseDouble(y.toString()); + } catch (Exception e) { + // 非数字直接丢 + continue; + } + + String hm = TimeAxisUtil.alignToHalfHour(time.toLocalTime()); // HH:mm + bucket.computeIfAbsent(hm, k -> new ArrayList<>()).add(num); + } + + List sortedHM = new ArrayList<>(bucket.keySet()); + Collections.sort(sortedHM); + + List values = new ArrayList<>(); + for (String hm : sortedHM) { + List list = bucket.get(hm); + double avg = list.stream().mapToDouble(Double::doubleValue).average().orElse(0D); + values.add(avg); + } + + return new HalfHourSeries(date, sortedHM, values); + } + + + + /* =============================== + * SubLineData -> LineData + * 半小时取最后一条 + * =============================== */ + public static void convertToAccumulateLineData(SubLineData accumulate, LineData lineData) { + if (accumulate == null || accumulate.getSubData() == null) return; + + Map seriesMap = new LinkedHashMap<>(); + for (Map.Entry entry : accumulate.getSubData().entrySet()) { + seriesMap.put(entry.getKey(), aggregateLastByHalfHour(entry.getValue())); + } + + HalfHourSeries today = seriesMap.get("today"); + if (today == null) throw new IllegalStateException("subData 必须包含 today"); + + // 构建最终 X + List finalX = new ArrayList<>(); + for (String hm : today.xList) finalX.add(today.date + " " + hm + ":00"); + + // 构建临时 Map + Map> tmpMap = new HashMap<>(); + for (Map.Entry entry : seriesMap.entrySet()) { + tmpMap.put(entry.getKey(), entry.getValue().toMap()); + } + + lineData.setXData(finalX); + lineData.setYData(LineDataAligner.alignY(today.xList, tmpMap)); + lineData.setAttrCode(accumulate.getAttrCode()); + + fillTo48HalfHour(lineData); + } + + private static HalfHourSeries aggregateLastByHalfHour(SubLineData.childLineData child) { + if (child == null || child.getXData() == null || child.getYData() == null) + return new HalfHourSeries(null); + + Map bucket = new HashMap<>(); + String date = null; + int size = Math.min(child.getXData().size(), child.getYData().size()); + + for (int i = 0; i < size; i++) { + LocalDateTime time = LocalDateTime.parse(child.getXData().get(i).toString(), TimeAxisUtil.DATETIME_FMT); + Object value = child.getYData().get(i); + if (value == null) continue; + + if (date == null) date = time.toLocalDate().toString(); + String hm = TimeAxisUtil.alignToHalfHour(time.toLocalTime()); + + TimeValue old = bucket.get(hm); + if (old == null || time.isAfter(old.time)) bucket.put(hm, new TimeValue(time, value)); + } + + List sortedHM = new ArrayList<>(bucket.keySet()); + Collections.sort(sortedHM); + + List values = new ArrayList<>(); + for (String hm : sortedHM) values.add(bucket.get(hm).value); + + return new HalfHourSeries(date, sortedHM, values); + } + + /* =============================== + * 补齐 48 半小时点 + * =============================== */ + public static void fillTo48HalfHour(LineData lineData) { + List xData = lineData.getXData(); + Map> yData = lineData.getYData(); + if (xData == null || xData.isEmpty() || yData == null) return; + + String date = TimeAxisUtil.extractDate(xData.get(0)); + List fixedX = TimeAxisUtil.generate48HalfHourPoints(date); + + // 构建临时 Map + Map> tmpMap = new HashMap<>(); + for (Map.Entry> entry : yData.entrySet()) { + Map map = new HashMap<>(); + for (int i = 0; i < xData.size(); i++) { + map.put(xData.get(i), entry.getValue().get(i)); + } + tmpMap.put(entry.getKey(), map); + } + + lineData.setXData(new ArrayList<>(fixedX)); + lineData.setYData(LineDataAligner.alignY(fixedX, tmpMap)); + } + + /* =============================== + * 全量对齐 + * =============================== */ + public static void convertToLineDataAll(SubLineData accumulate, LineData lineData) { + if (accumulate == null || accumulate.getSubData() == null) return; + + LinkedHashSet xSet = new LinkedHashSet<>(); + for (SubLineData.childLineData child : accumulate.getSubData().values()) { + if (child.getXData() != null) xSet.addAll(child.getXData()); + } + List mergedX = new ArrayList<>(xSet); + + Map> tmpMap = new LinkedHashMap<>(); + for (Map.Entry entry : accumulate.getSubData().entrySet()) { + Map map = new LinkedHashMap<>(); + SubLineData.childLineData child = entry.getValue(); + if (child.getXData() != null && child.getYData() != null) { + int size = Math.min(child.getXData().size(), child.getYData().size()); + for (int i = 0; i < size; i++) map.put(child.getXData().get(i), child.getYData().get(i)); + } + tmpMap.put(entry.getKey(), map); + } + + lineData.setXData(mergedX); + lineData.setYData(LineDataAligner.alignY(mergedX, tmpMap)); + } +} diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/LineDataHourAggregator.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/LineDataHourAggregator.java deleted file mode 100644 index 0aabcbe..0000000 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/common/LineDataHourAggregator.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.dongjian.dashboard.back.service.common; - -import com.dongjian.dashboard.back.vo.device.LineData; - -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - -/** - * 给计测设备,按小时聚合数据,求平均值 - */ -public class LineDataHourAggregator { - - private static final DateTimeFormatter INPUT_FMT = - DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - - private static final DateTimeFormatter HOUR_FMT = - DateTimeFormatter.ofPattern("yyyy-MM-dd HH:00:00"); - - public static void aggregateByHour(LineData lineData) { - - List xData = lineData.getXData(); - List yData = lineData.getYData(); - - if (xData == null || yData == null || xData.size() != yData.size()) { - return; - } - - // hour -> List - Map> hourMap = new TreeMap<>(); - - for (int i = 0; i < xData.size(); i++) { - String timeStr = String.valueOf(xData.get(i)); - Object yVal = yData.get(i); - - if (yVal == null) { - continue; - } - - LocalDateTime time = LocalDateTime.parse(timeStr, INPUT_FMT); - String hourKey = time.format(HOUR_FMT); - - hourMap.computeIfAbsent(hourKey, k -> new ArrayList<>()).add(Double.parseDouble(String.valueOf(yVal))); - } - - // 重新构建 xData / yData - List newX = new ArrayList<>(); - List newY = new ArrayList<>(); - - for (Map.Entry> entry : hourMap.entrySet()) { - newX.add(entry.getKey()); - - double avg = entry.getValue() - .stream() - .mapToDouble(Double::doubleValue) - .average() - .orElse(0); - - newY.add(avg); - } - - lineData.setXData(newX); - lineData.setYData(newY); - } -} - diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DashboardNotificationCategoryServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DashboardNotificationCategoryServiceImpl.java new file mode 100644 index 0000000..f652373 --- /dev/null +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DashboardNotificationCategoryServiceImpl.java @@ -0,0 +1,269 @@ +package com.dongjian.dashboard.back.service.impl; + +import com.github.pagehelper.PageHelper; +import com.dongjian.dashboard.back.common.exception.MsgCodeException; +import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; +import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.ResponseCode; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.dao.ex.DashboardNotificationCategoryMapperExt; +import com.dongjian.dashboard.back.dao.ex.DeviceInfoMapperExt; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationCategorySearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.DeleteDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationCategoryParams; +import com.dongjian.dashboard.back.model.DashboardNotificationCategory; +import com.dongjian.dashboard.back.model.DashboardNotificationCategoryExample; +import com.dongjian.dashboard.back.service.DashboardNotificationCategoryService; +import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.CommonUtil; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationCategoryPageVO; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.util.ObjectUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * + * @author jwy-style + * + */ +@Service +public class DashboardNotificationCategoryServiceImpl implements DashboardNotificationCategoryService { + + private static Logger logger = LoggerFactory.getLogger(DashboardNotificationCategoryServiceImpl.class); + + + @Autowired + private CommonOpt commonOpt; + @Autowired + private MsgLanguageChange msgLanguageChange; + @Autowired + private DashboardNotificationCategoryMapperExt dashboardNotificationCategoryMapperExt; + @Autowired + private DeviceInfoMapperExt deviceInfoMapperExt; + + + + /** + * Adds a new dashboardNotificationCategory based on the provided parameters. + * Validates company ownership, performs common verification, and inserts the dashboardNotificationCategory into the database. + * + * @param optDashboardNotificationCategoryParams Parameters for the new dashboardNotificationCategory to be added + * @param userId ID of the user performing the operation + * @param companyId ID of the company associated with the dashboardNotificationCategory + * @param languageType Language type for error messages + * @return SimpleDataResponse indicating success or failure of the operation + */ + @Override + @Transactional + public SimpleDataResponse add(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Long userId, Long companyId, + Integer languageType) { + try { + optDashboardNotificationCategoryParams.setCategoryId(null); + try { + // Validate company ownership to prevent unauthorized operations + if (ObjectUtils.isEmpty(optDashboardNotificationCategoryParams.getCompanyId())) { + optDashboardNotificationCategoryParams.setCompanyId(companyId); + } else { + checkCompany(optDashboardNotificationCategoryParams, languageType, companyId); + } + + // Perform common verification for the dashboardNotificationCategory parameters + commonVerifyOpt(optDashboardNotificationCategoryParams, companyId, languageType); + + } catch (MsgCodeException e) { + return new SimpleDataResponse(ResponseCode.MSG_ERROR, e.getMessage()); + } + + long currentUnix = System.currentTimeMillis(); + DashboardNotificationCategory dashboardNotificationCategory = new DashboardNotificationCategory(); + BeanUtils.copyProperties(optDashboardNotificationCategoryParams,dashboardNotificationCategory); + dashboardNotificationCategory.setId(null); + dashboardNotificationCategory.setCreatedAt(currentUnix); + dashboardNotificationCategory.setCreatedBy(userId); + dashboardNotificationCategoryMapperExt.insertSelective(dashboardNotificationCategory); + + return SimpleDataResponse.success(); + } catch (Exception e) { + logger.error("Error occurred while adding a new dashboardNotificationCategory", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "server error"); + } + } + + /** + * Performs common verification operations on the dashboardNotificationCategory parameters. + * Checks parameter validity and existence of the dashboardNotificationCategory name. + * + * @param optDashboardNotificationCategoryParams Parameters of the dashboardNotificationCategory to be verified + * @param companyId ID of the company associated with the dashboardNotificationCategory + * @param languageType Language type for error messages + */ + private void commonVerifyOpt(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Long companyId, Integer languageType) { + checkParam(optDashboardNotificationCategoryParams, languageType); + checkExist(optDashboardNotificationCategoryParams, languageType); + } + + private void checkExist(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Integer languageType) { + if (dashboardNotificationCategoryMapperExt.checkExist(optDashboardNotificationCategoryParams) > 0) { + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "categoryHasExisted")); + } + } + + /** + * Checks if the specified dashboardNotificationCategory's company ID matches the logged-in user's company or its subsidiary. + * Throws a MsgCodeException if the company ID does not match. + * + * @param optDashboardNotificationCategoryParams Parameters of the dashboardNotificationCategory to be checked + * @param languageType Language type for error messages + * @param companyId ID of the company associated with the logged-in user + * @throws MsgCodeException If the operation is not authorized for the given company + */ + private void checkCompany(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Integer languageType, Long companyId) { + if (!commonOpt.isSubCompany(companyId, optDashboardNotificationCategoryParams.getCompanyId())) { + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth")); + } + } + + /** + * Checks the validity of the dashboardNotificationCategory name parameter. + * Throws a MsgCodeException if the dashboardNotificationCategory name is blank or exceeds 100 characters. + * + * @param optDashboardNotificationCategoryParams Parameters of the dashboardNotificationCategory to be checked + * @param languageType Language type for error messages + * @throws MsgCodeException If the dashboardNotificationCategory name parameter is invalid + */ + private void checkParam(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Integer languageType) { + if(StringUtils.isBlank(optDashboardNotificationCategoryParams.getName()) || optDashboardNotificationCategoryParams.getName().length() > 255){ + throw new MsgCodeException("Parameter error [name]"); + } + if(StringUtils.isNotBlank(optDashboardNotificationCategoryParams.getRemark()) && optDashboardNotificationCategoryParams.getRemark().length() > 255){ + throw new MsgCodeException("Parameter error [remark]"); + } + } + + + /** + * Updates an existing dashboardNotificationCategory with the provided parameters. + * Performs validation checks on the dashboardNotificationCategory parameters and authorization. + * + * @param optDashboardNotificationCategoryParams Parameters of the dashboardNotificationCategory to be updated + * @param userId ID of the user performing the update + * @param companyId ID of the company associated with the dashboardNotificationCategory + * @param languageType Language type for error messages + * @return SimpleDataResponse indicating success or failure of the update operation + */ + @Override + @Transactional + public SimpleDataResponse edit(OptDashboardNotificationCategoryParams optDashboardNotificationCategoryParams, Long userId, Long companyId, + Integer languageType) { + try { + DashboardNotificationCategory oldBP = dashboardNotificationCategoryMapperExt.selectByPrimaryKey(optDashboardNotificationCategoryParams.getCategoryId()); + if (ObjectUtils.isEmpty(oldBP) || 1 == oldBP.getFlag()){ + return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Not found"); + } + try { + List selfAndSubCompanyList = commonOpt.getSelfAndSubCompanyId(companyId); + if (!selfAndSubCompanyList.contains(oldBP.getCompanyId())){ + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth")); + } + // + if (ObjectUtils.isEmpty(optDashboardNotificationCategoryParams.getCompanyId())) { + optDashboardNotificationCategoryParams.setCompanyId(oldBP.getCompanyId()); + } else if(!selfAndSubCompanyList.contains(optDashboardNotificationCategoryParams.getCompanyId())){//设置的所属企业不属于自己权限企业 + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth")); + } + + commonVerifyOpt(optDashboardNotificationCategoryParams, companyId, languageType); + + } catch (MsgCodeException e) { + return new SimpleDataResponse(ResponseCode.MSG_ERROR, e.getMessage()); + } + + DashboardNotificationCategory dashboardNotificationCategory = new DashboardNotificationCategory(); + BeanUtils.copyProperties(optDashboardNotificationCategoryParams,dashboardNotificationCategory); + dashboardNotificationCategory.setUpdatedAt(System.currentTimeMillis()); + dashboardNotificationCategory.setUpdatedBy(userId); + + DashboardNotificationCategoryExample example = new DashboardNotificationCategoryExample(); + DashboardNotificationCategoryExample.Criteria criteria = example.createCriteria(); + criteria.andIdEqualTo(optDashboardNotificationCategoryParams.getCategoryId()); + + + dashboardNotificationCategoryMapperExt.updateByExampleSelective(dashboardNotificationCategory, example); + + return SimpleDataResponse.success(); + } catch (Exception e) { + logger.error("Edit dashboardNotificationCategory error", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "server error"); + } + } + + + /** + * Batch deletes dashboardNotificationCategorys based on the provided dashboardNotificationCategory IDs. + * Performs validation checks on the dashboardNotificationCategory IDs and authorization. + * + * @param deleteDashboardNotificationCategoryParams Parameters containing dashboardNotificationCategory IDs to be deleted + * @param userId ID of the user performing the deletion + * @param companyId ID of the company associated with the dashboardNotificationCategorys + * @param languageType Language type for error messages + * @return SimpleDataResponse indicating success or failure of the batch deletion operation + */ + @Override + @Transactional + public SimpleDataResponse batchDelete(DeleteDashboardNotificationCategoryParams deleteDashboardNotificationCategoryParams, Long userId, + Long companyId, Integer languageType) { + if (StringUtils.isBlank(deleteDashboardNotificationCategoryParams.getCategoryIds())) { + return SimpleDataResponse.success(); + } + try { + List ids = Arrays.asList(StringUtils.split(deleteDashboardNotificationCategoryParams.getCategoryIds(), ",")).stream() + .map(id -> CommonUtil.String2Long(id.trim())).collect(Collectors.toList()); + + + DashboardNotificationCategoryExample dashboardNotificationCategoryExample = new DashboardNotificationCategoryExample(); + DashboardNotificationCategoryExample.Criteria criteria = dashboardNotificationCategoryExample.createCriteria(); + criteria.andIdIn(ids).andCompanyIdIn(commonOpt.getSelfAndSubCompanyId(companyId)); + + DashboardNotificationCategory dashboardNotificationCategory = new DashboardNotificationCategory(); + dashboardNotificationCategory.setFlag(1); + dashboardNotificationCategoryMapperExt.updateByExampleSelective(dashboardNotificationCategory, dashboardNotificationCategoryExample); + + return SimpleDataResponse.success(); + } catch (Exception e) { + logger.error("Batch delete dashboardNotificationCategory error", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "server error"); + } + } + + + @Override + public PageInfo getListPage(DashboardNotificationCategorySearchParams pageSearchParam, Long companyId, + Long userId, Integer languageType, Integer uTCOffset) { + //list防${}注入 + if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) { + pageSearchParam.setCompanyIdList(Arrays.asList(companyId)); + } else { + pageSearchParam.setCompanyIdList(commonOpt.filterCompanyIds(companyId, pageSearchParam.getCompanyIds())); + } + if (StringUtils.isNotBlank(pageSearchParam.getCategoryIds())) { + pageSearchParam.setCategoryIdList(CommonUtil.commaStr2LongList(pageSearchParam.getCategoryIds())); + } + PageHelper.startPage(pageSearchParam.getPageNum() == null ? 1 : pageSearchParam.getPageNum(), pageSearchParam.getPageSize() == null ? 20 : pageSearchParam.getPageSize()); + List resultList = dashboardNotificationCategoryMapperExt.getListPage(pageSearchParam); + + return new PageInfo<>(resultList); + } +} diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DashboardNotificationServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DashboardNotificationServiceImpl.java new file mode 100644 index 0000000..7b0e759 --- /dev/null +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DashboardNotificationServiceImpl.java @@ -0,0 +1,260 @@ +package com.dongjian.dashboard.back.service.impl; + +import com.github.pagehelper.PageHelper; +import com.dongjian.dashboard.back.common.exception.MsgCodeException; +import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; +import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.ResponseCode; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.dao.ex.DashboardNotificationMapperExt; +import com.dongjian.dashboard.back.dao.ex.DeviceInfoMapperExt; +import com.dongjian.dashboard.back.dto.dashboardnotification.DashboardNotificationSearchParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.DeleteDashboardNotificationParams; +import com.dongjian.dashboard.back.dto.dashboardnotification.OptDashboardNotificationParams; +import com.dongjian.dashboard.back.model.DashboardNotification; +import com.dongjian.dashboard.back.model.DashboardNotificationExample; +import com.dongjian.dashboard.back.service.DashboardNotificationService; +import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.CommonUtil; +import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationPageVO; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.util.ObjectUtils; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * + * @author jwy-style + * + */ +@Service +public class DashboardNotificationServiceImpl implements DashboardNotificationService { + + private static Logger logger = LoggerFactory.getLogger(DashboardNotificationServiceImpl.class); + + + @Autowired + private CommonOpt commonOpt; + @Autowired + private MsgLanguageChange msgLanguageChange; + @Autowired + private DashboardNotificationMapperExt dashboardNotificationMapperExt; + + + + /** + * Adds a new dashboardNotification based on the provided parameters. + * Validates company ownership, performs common verification, and inserts the dashboardNotification into the database. + * + * @param optDashboardNotificationParams Parameters for the new dashboardNotification to be added + * @param userId ID of the user performing the operation + * @param companyId ID of the company associated with the dashboardNotification + * @param languageType Language type for error messages + * @return SimpleDataResponse indicating success or failure of the operation + */ + @Override + @Transactional + public SimpleDataResponse add(OptDashboardNotificationParams optDashboardNotificationParams, Long userId, Long companyId, + Integer languageType) { + try { + optDashboardNotificationParams.setDashboardNotificationId(null); + try { + // Validate company ownership to prevent unauthorized operations + if (ObjectUtils.isEmpty(optDashboardNotificationParams.getCompanyId())) { + optDashboardNotificationParams.setCompanyId(companyId); + } else { + checkCompany(optDashboardNotificationParams, languageType, companyId); + } + + // Perform common verification for the dashboardNotification parameters + commonVerifyOpt(optDashboardNotificationParams, companyId, languageType); + + } catch (MsgCodeException e) { + return new SimpleDataResponse(ResponseCode.MSG_ERROR, e.getMessage()); + } + + long currentUnix = System.currentTimeMillis(); + DashboardNotification dashboardNotification = new DashboardNotification(); + BeanUtils.copyProperties(optDashboardNotificationParams,dashboardNotification); + dashboardNotification.setId(null); + dashboardNotification.setCreatedAt(currentUnix); + dashboardNotification.setCreatedBy(userId); + dashboardNotificationMapperExt.insertSelective(dashboardNotification); + + return SimpleDataResponse.success(); + } catch (Exception e) { + logger.error("Error occurred while adding a new dashboardNotification", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "server error"); + } + } + + /** + * Performs common verification operations on the dashboardNotification parameters. + * Checks parameter validity and existence of the dashboardNotification name. + * + * @param optDashboardNotificationParams Parameters of the dashboardNotification to be verified + * @param companyId ID of the company associated with the dashboardNotification + * @param languageType Language type for error messages + */ + private void commonVerifyOpt(OptDashboardNotificationParams optDashboardNotificationParams, Long companyId, Integer languageType) { + checkParam(optDashboardNotificationParams, languageType); + } + + /** + * Checks if the specified dashboardNotification's company ID matches the logged-in user's company or its subsidiary. + * Throws a MsgCodeException if the company ID does not match. + * + * @param optDashboardNotificationParams Parameters of the dashboardNotification to be checked + * @param languageType Language type for error messages + * @param companyId ID of the company associated with the logged-in user + * @throws MsgCodeException If the operation is not authorized for the given company + */ + private void checkCompany(OptDashboardNotificationParams optDashboardNotificationParams, Integer languageType, Long companyId) { + if (!commonOpt.isSubCompany(companyId, optDashboardNotificationParams.getCompanyId())) { + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth")); + } + } + + /** + * Checks the validity of the dashboardNotification name parameter. + * Throws a MsgCodeException if the dashboardNotification name is blank or exceeds 100 characters. + * + * @param optDashboardNotificationParams Parameters of the dashboardNotification to be checked + * @param languageType Language type for error messages + * @throws MsgCodeException If the dashboardNotification name parameter is invalid + */ + private void checkParam(OptDashboardNotificationParams optDashboardNotificationParams, Integer languageType) { + if(StringUtils.isNotBlank(optDashboardNotificationParams.getDemandTime()) && optDashboardNotificationParams.getDemandTime().length() > 100){ + throw new MsgCodeException("Parameter error [demandTime]"); + } + if(null == optDashboardNotificationParams.getCategoryId()){ + throw new MsgCodeException("Parameter error [categoryId]"); + } + } + + + /** + * Updates an existing dashboardNotification with the provided parameters. + * Performs validation checks on the dashboardNotification parameters and authorization. + * + * @param optDashboardNotificationParams Parameters of the dashboardNotification to be updated + * @param userId ID of the user performing the update + * @param companyId ID of the company associated with the dashboardNotification + * @param languageType Language type for error messages + * @return SimpleDataResponse indicating success or failure of the update operation + */ + @Override + @Transactional + public SimpleDataResponse edit(OptDashboardNotificationParams optDashboardNotificationParams, Long userId, Long companyId, + Integer languageType) { + try { + DashboardNotification oldBP = dashboardNotificationMapperExt.selectByPrimaryKey(optDashboardNotificationParams.getDashboardNotificationId()); + if (ObjectUtils.isEmpty(oldBP) || 1 == oldBP.getFlag()){ + return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Not found"); + } + try { + List selfAndSubCompanyList = commonOpt.getSelfAndSubCompanyId(companyId); + if (!selfAndSubCompanyList.contains(oldBP.getCompanyId())){ + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth")); + } + // + if (ObjectUtils.isEmpty(optDashboardNotificationParams.getCompanyId())) { + optDashboardNotificationParams.setCompanyId(oldBP.getCompanyId()); + } else if(!selfAndSubCompanyList.contains(optDashboardNotificationParams.getCompanyId())){//设置的所属企业不属于自己权限企业 + throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth")); + } + + commonVerifyOpt(optDashboardNotificationParams, companyId, languageType); + + } catch (MsgCodeException e) { + return new SimpleDataResponse(ResponseCode.MSG_ERROR, e.getMessage()); + } + + DashboardNotification dashboardNotification = new DashboardNotification(); + BeanUtils.copyProperties(optDashboardNotificationParams,dashboardNotification); + dashboardNotification.setUpdatedAt(System.currentTimeMillis()); + dashboardNotification.setUpdatedBy(userId); + + DashboardNotificationExample example = new DashboardNotificationExample(); + DashboardNotificationExample.Criteria criteria = example.createCriteria(); + criteria.andIdEqualTo(optDashboardNotificationParams.getDashboardNotificationId()); + + + dashboardNotificationMapperExt.updateByExampleSelective(dashboardNotification, example); + + return SimpleDataResponse.success(); + } catch (Exception e) { + logger.error("Edit dashboardNotification error", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "server error"); + } + } + + + /** + * Batch deletes dashboardNotifications based on the provided dashboardNotification IDs. + * Performs validation checks on the dashboardNotification IDs and authorization. + * + * @param deleteDashboardNotificationParams Parameters containing dashboardNotification IDs to be deleted + * @param userId ID of the user performing the deletion + * @param companyId ID of the company associated with the dashboardNotifications + * @param languageType Language type for error messages + * @return SimpleDataResponse indicating success or failure of the batch deletion operation + */ + @Override + @Transactional + public SimpleDataResponse batchDelete(DeleteDashboardNotificationParams deleteDashboardNotificationParams, Long userId, + Long companyId, Integer languageType) { + if (StringUtils.isBlank(deleteDashboardNotificationParams.getDashboardNotificationIds())) { + return SimpleDataResponse.success(); + } + try { + List ids = Arrays.asList(StringUtils.split(deleteDashboardNotificationParams.getDashboardNotificationIds(), ",")).stream() + .map(id -> CommonUtil.String2Long(id.trim())).collect(Collectors.toList()); + + + DashboardNotificationExample dashboardNotificationExample = new DashboardNotificationExample(); + DashboardNotificationExample.Criteria criteria = dashboardNotificationExample.createCriteria(); + criteria.andIdIn(ids).andCompanyIdIn(commonOpt.getSelfAndSubCompanyId(companyId)); + + DashboardNotification dashboardNotification = new DashboardNotification(); + dashboardNotification.setFlag(1); + dashboardNotificationMapperExt.updateByExampleSelective(dashboardNotification, dashboardNotificationExample); + + return SimpleDataResponse.success(); + } catch (Exception e) { + logger.error("Batch delete dashboardNotification error", e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "server error"); + } + } + + + @Override + public PageInfo getListPage(DashboardNotificationSearchParams pageSearchParam, Long companyId, + Long userId, Integer languageType, Integer uTCOffset) { + //list防${}注入 + if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) { + pageSearchParam.setCompanyIdList(Arrays.asList(companyId)); + } else { + pageSearchParam.setCompanyIdList(commonOpt.filterCompanyIds(companyId, pageSearchParam.getCompanyIds())); + } + if (StringUtils.isNotBlank(pageSearchParam.getDashboardNotificationIds())) { + pageSearchParam.setDashboardNotificationIdList(CommonUtil.commaStr2LongList(pageSearchParam.getDashboardNotificationIds())); + } + PageHelper.startPage(pageSearchParam.getPageNum() == null ? 1 : pageSearchParam.getPageNum(), pageSearchParam.getPageSize() == null ? 20 : pageSearchParam.getPageSize()); + List resultList = dashboardNotificationMapperExt.getListPage(pageSearchParam); + + return new PageInfo<>(resultList); + } +} diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java index 4c2fe81..3c86c7a 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAccumulateServiceImpl.java @@ -1,5 +1,6 @@ package com.dongjian.dashboard.back.service.impl; +import java.math.BigDecimal; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.time.LocalDate; @@ -9,6 +10,7 @@ import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; +import com.alibaba.fastjson2.JSON; import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; import com.dongjian.dashboard.back.common.response.PageInfo; @@ -27,6 +29,7 @@ import com.dongjian.dashboard.back.util.DateUtil; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; import com.dongjian.dashboard.back.vo.device.DeviceIncrement; import com.dongjian.dashboard.back.vo.device.LineData; +import com.dongjian.dashboard.back.vo.record.RecordAccumulateDto; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; import org.apache.commons.collections.CollectionUtils; @@ -61,9 +64,9 @@ public class DeviceDataAccumulateServiceImpl implements DeviceDataAccumulateServ @Override public PageInfo getDataList(AccumulateDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType) { - if (null == pageSearchParam.getBuildingId()) { - return new PageInfo<>(new ArrayList<>()); - } +// if (null == pageSearchParam.getBuildingId()) { +// return new PageInfo<>(new ArrayList<>()); +// } //list防${}注入 if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) { @@ -135,7 +138,7 @@ public class DeviceDataAccumulateServiceImpl implements DeviceDataAccumulateServ } } - LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Tokyo")); + LocalDateTime now = LocalDateTime.now(Constants.ZONE_TOKYO); LocalDate today = now.toLocalDate(); LocalDate yesterday = today.minusDays(1); LocalDate lastYear = DateUtil.getLastYearSameIsoWeekDay(today); @@ -145,10 +148,17 @@ public class DeviceDataAccumulateServiceImpl implements DeviceDataAccumulateServ // 批量查询增量数据并构建 Map Map todayMap = dashboardRecordAccumulateMapperExt.selectTodayIncrement(todayDeviceIds, today.getYear(), today.getMonthValue(), today.getDayOfMonth()) .stream().collect(Collectors.toMap(di -> di.getDeviceId().toLowerCase(), Function.identity())); - Map yesterdayMap = dashboardRecordAccumulateMapperExt.selectYesterdayIncrement(deviceIds, yesterday.getYear(), yesterday.getMonthValue(), yesterday.getDayOfMonth(), targetSeconds) - .stream().collect(Collectors.toMap(di -> di.getDeviceId().toLowerCase(), Function.identity())); - Map lastYearMap = dashboardRecordAccumulateMapperExt.selectLastYearIncrement(deviceIds, lastYear.getYear(), lastYear.getMonthValue(), lastYear.getDayOfMonth(), targetSeconds) - .stream().collect(Collectors.toMap(di -> di.getDeviceId().toLowerCase(), Function.identity())); + +// Map yesterdayMap = dashboardRecordAccumulateMapperExt.selectYesterdayIncrement(deviceIds, yesterday.getYear(), yesterday.getMonthValue(), yesterday.getDayOfMonth(), targetSeconds) +// .stream().collect(Collectors.toMap(di -> di.getDeviceId().toLowerCase(), Function.identity())); + List yesterdayRecords = dashboardRecordAccumulateMapperExt.selectByDay(deviceIds, yesterday.getYear(), yesterday.getMonthValue(), yesterday.getDayOfMonth()); + Map yesterdayMap = commonOpt.toDeviceIncrementMap(yesterdayRecords, targetSeconds, "yesterday"); + +// Map lastYearMap = dashboardRecordAccumulateMapperExt.selectLastYearIncrement(deviceIds, lastYear.getYear(), lastYear.getMonthValue(), lastYear.getDayOfMonth(), targetSeconds) +// .stream().collect(Collectors.toMap(di -> di.getDeviceId().toLowerCase(), Function.identity())); + List lastYearRecords = dashboardRecordAccumulateMapperExt.selectByDay(deviceIds, lastYear.getYear(), lastYear.getMonthValue(), lastYear.getDayOfMonth()); + Map lastYearMap = commonOpt.toDeviceIncrementMap(lastYearRecords, targetSeconds, "lastYear"); + resultList.forEach(data -> { String deviceId = data.getDeviceId().toLowerCase(); @@ -183,9 +193,13 @@ public class DeviceDataAccumulateServiceImpl implements DeviceDataAccumulateServ } @Override - public SimpleDataResponse> getLineData(LineDataSearchParams lineDataSearchParams, + public SimpleDataResponse> getLineData(Integer searchType, LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType) { - return SimpleDataResponse.success(commonOpt.getLineData(companyId, lineDataSearchParams, 2)); + if (null == searchType) { + searchType = 2;//默认全部数据 + } + List lineDataList = commonOpt.getAccumulateLineData(companyId, searchType, lineDataSearchParams); + return SimpleDataResponse.success(lineDataList); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAlarmServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAlarmServiceImpl.java index 9503d98..ef5c9d4 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAlarmServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataAlarmServiceImpl.java @@ -61,9 +61,9 @@ public class DeviceDataAlarmServiceImpl implements DeviceDataAlarmService { @Override public PageInfo getDataList(AlarmDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType) { - if (null == pageSearchParam.getBuildingId()) { - return new PageInfo<>(new ArrayList<>()); - } +// if (null == pageSearchParam.getBuildingId()) { +// return new PageInfo<>(new ArrayList<>()); +// } //list防${}注入 if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) { @@ -98,6 +98,8 @@ public class DeviceDataAlarmServiceImpl implements DeviceDataAlarmService { if (CollectionUtils.isNotEmpty(resultList)) { // 查询 favorited_device 表中所有设备的 device_id List favoritedDeviceIds = favoritedDeviceMapperExt.getFavoritedDeviceIds(); + + long currentTs = System.currentTimeMillis(); for (DeviceAlarmData data : resultList){ String deviceId = data.getDeviceId().toLowerCase(); // 判断设备是否在 favorited_device 表中 @@ -106,15 +108,40 @@ public class DeviceDataAlarmServiceImpl implements DeviceDataAlarmService { } else { data.setCollected(0); } - data.setAlertLevelStr(msgLanguageChange.getParameterMapByCode(languageType, "alertLevel_" + data.getAlertLevel())); - data.setConfirmStatusStr(msgLanguageChange.getParameterMapByCode(languageType, "confirmStatus_" + data.getConfirmStatus())); - data.setHandleStatusStr(msgLanguageChange.getParameterMapByCode(languageType, "handleStatus_" + data.getHandleStatus())); + if (null != data.getAlertLevel()) { + data.setAlertLevelStr(msgLanguageChange.getParameterMapByCode(languageType, "alertLevel_" + data.getAlertLevel())); + } + if (null != data.getConfirmStatus()) { + data.setConfirmStatusStr(msgLanguageChange.getParameterMapByCode(languageType, "confirmStatus_" + data.getConfirmStatus())); + } + if (null != data.getHandleStatus()) { + data.setHandleStatusStr(msgLanguageChange.getParameterMapByCode(languageType, "handleStatus_" + data.getHandleStatus())); + } + if (null != data.getUploadTimestamp()) { + data.setElapsedTime(currentTs - data.getUploadTimestamp()); + data.setElapsedTimeStr(commonOpt.formatElapsedTime(data.getElapsedTime(), languageType)); + } + data.setInAlarm(isInAlarm(data.getHandleStatus(), data.getRetainAlert()) ? 1 : 0); } } return resultList; } + public static boolean isInAlarm(Integer handleStatus, Integer retainAlert) { + if (handleStatus == null) { + return false; + } + + // (handle_status != 3 AND handle_status != 4) + if (handleStatus != 3 && handleStatus != 4) { + return true; + } + + // (handle_status = 4 AND retain_alert = 1) + return handleStatus == 4 && Integer.valueOf(1).equals(retainAlert); + } + @Override @Transactional public SimpleDataResponse handleAlarm(HandleAlarmParams handleAlarmParams, Long userId, Long companyId, Integer languageType) { diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java index 027626b..1547679 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataBaStatusServiceImpl.java @@ -1,22 +1,28 @@ package com.dongjian.dashboard.back.service.impl; +import com.alibaba.fastjson2.JSONObject; +import com.dongjian.dashboard.back.bo.LatestValueBO; import com.dongjian.dashboard.back.common.Constants; import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; import com.dongjian.dashboard.back.common.response.PageInfo; +import com.dongjian.dashboard.back.common.response.SimpleDataResponse; +import com.dongjian.dashboard.back.dao.ex.BaStatusHistoryMapperExt; import com.dongjian.dashboard.back.dao.ex.DeviceInfoMapperExt; import com.dongjian.dashboard.back.dao.ex.DeviceRawdataRealtimeMapperExt; import com.dongjian.dashboard.back.dao.ex.FavoritedDeviceMapperExt; import com.dongjian.dashboard.back.dto.data.BaStatusDataSearchParam; +import com.dongjian.dashboard.back.dto.device.LineDataSearchParams; import com.dongjian.dashboard.back.easyexcel.SecondsToHMSConverter; -import com.dongjian.dashboard.back.model.DeviceInfo; -import com.dongjian.dashboard.back.model.DeviceInfoExample; -import com.dongjian.dashboard.back.model.DeviceRawdataRealtime; -import com.dongjian.dashboard.back.model.DeviceRawdataRealtimeExample; +import com.dongjian.dashboard.back.model.*; import com.dongjian.dashboard.back.service.DeviceDataBaStatusService; import com.dongjian.dashboard.back.service.common.CommonOpt; +import com.dongjian.dashboard.back.util.DateUtil; +import com.dongjian.dashboard.back.util.redis.RedisUtil; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; +import com.dongjian.dashboard.back.vo.device.LineData; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.PageHelper; @@ -30,6 +36,8 @@ import org.springframework.stereotype.Service; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.time.*; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @@ -49,20 +57,24 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService @Autowired private FavoritedDeviceMapperExt favoritedDeviceMapperExt; @Autowired + private BaStatusHistoryMapperExt baStatusHistoryMapperExt; + @Autowired private DeviceRawdataRealtimeMapperExt deviceRawdataRealtimeMapperExt; @Autowired private MsgLanguageChange msgLanguageChange; @Autowired private CommonOpt commonOpt; + @Autowired + private RedisUtil redisUtil; @Override public PageInfo getDataList(BaStatusDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType) { - if (null == pageSearchParam.getBuildingId()) { - return new PageInfo<>(new ArrayList<>()); - } +// if (null == pageSearchParam.getBuildingId()) { +// return new PageInfo<>(new ArrayList<>()); +// } //list防${}注入 if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) { @@ -160,11 +172,13 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService data.setStopRun(commonOpt.judgeStopRun(objectMapper, realtime85Map.get(deviceId))); } - if (0 == data.getStopRun()) { - data.setContinuousRunningTimeStr(SecondsToHMSConverter.covertSeconds(data.getContinuousRunningTime())); - } else if (StringUtils.isNotBlank(data.getLatestTs()) && currentTs >= Long.parseLong(data.getLatestTs())) { - long diff = currentTs - Long.parseLong(data.getLatestTs()); - data.setContinuousRunningTimeStr(SecondsToHMSConverter.covertSeconds(diff)); + if (null != data.getStopRun()) { + if (0 == data.getStopRun()) { + data.setContinuousRunningTimeStr(SecondsToHMSConverter.covertSeconds(data.getContinuousRunningTime())); + } else if (StringUtils.isNotBlank(data.getLatestTs()) && currentTs >= Long.parseLong(data.getLatestTs())) { + long diff = currentTs - Long.parseLong(data.getLatestTs()); + data.setContinuousRunningTimeStr(SecondsToHMSConverter.covertSeconds(diff)); + } } } } @@ -172,4 +186,84 @@ public class DeviceDataBaStatusServiceImpl implements DeviceDataBaStatusService return resultList; } + @Override + public SimpleDataResponse> getLineData(Integer searchType, LineDataSearchParams lineDataSearchParams, Long companyId, Long userId, Integer languageType) { + List lineDataList = new ArrayList<>(); + + LineData lineData = new LineData(); + lineData.setAttrCode(lineDataSearchParams.getAttrCodeList()[0]); + + List yCommon = new ArrayList<>(); + + //** 获取昨日最新数据 **// + String redisKey = Constants.REDIS_BA_STATUS_LATEST_VALUE + DateUtil.getYesterdayInJapan(); + Object cacheLastValue = redisUtil.HGet(redisKey, lineDataSearchParams.getDeviceId().toLowerCase()); + if (null != cacheLastValue) { + try { + LatestValueBO latestValueBO = objectMapper.readValue(JSONObject.toJSONString(cacheLastValue), LatestValueBO.class); + String dateFormatted = Instant.ofEpochMilli(latestValueBO.getUpdateTs()) + .atZone(Constants.ZONE_TOKYO) + .format(Constants.FORMATTER_YMDHMS); + lineData.getXData().add(dateFormatted); + yCommon.add(latestValueBO.getValue()); + } catch (JsonProcessingException e) { + logger.error("LatestValueBO error", e); + } + } + + DeviceInfoExample devExample = new DeviceInfoExample(); + devExample.createCriteria() + .andCompanyIdEqualTo(companyId) + .andDeviceIdEqualTo(lineDataSearchParams.getDeviceId()); + List deviceInfoList = deviceInfoMapperExt.selectByExample(devExample); + if (CollectionUtils.isEmpty(deviceInfoList)) { + return SimpleDataResponse.success(lineDataList); + } + + DeviceInfo deviceInfo = deviceInfoList.get(0); + + // 今天 00:00:00.000 + LocalDate today = LocalDate.now(); + long startOfDay = today + .atStartOfDay(ZoneId.systemDefault()) + .toInstant() + .toEpochMilli(); + String startTs = String.valueOf(startOfDay); + + BaStatusHistoryExample bshExample = new BaStatusHistoryExample(); + BaStatusHistoryExample.Criteria criteria = bshExample.createCriteria(); + criteria.andUpdateTsGreaterThanOrEqualTo(startTs).andDeviceInfoIdEqualTo(deviceInfo.getId()); + + List result = baStatusHistoryMapperExt.selectByExample(bshExample); + if (CollectionUtils.isNotEmpty(result)) { + for (BaStatusHistory item : result) { + String tsStr = item.getUpdateTs(); + if (tsStr == null || tsStr.isEmpty()) { + continue; // 跳过 + } + + long ts; + try { + ts = Long.parseLong(tsStr); + } catch (NumberFormatException e) { + logger.error("Invalid timestamp: {}", tsStr); + continue; // 非法时间戳跳过 + } + + // 毫秒 -> 日本时间 -> 格式化 + String formatted = Instant.ofEpochMilli(ts) + .atZone(Constants.ZONE_TOKYO) + .format(Constants.FORMATTER_YMDHMS); + + lineData.getXData().add(formatted); + yCommon.add(item.getIsRunning()); + } + } + + lineData.getYData().put("common", yCommon); + lineDataList.add(lineData); + + return SimpleDataResponse.success(lineDataList); + } + } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java index fe304cc..67b61e6 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/DeviceDataMeasureServiceImpl.java @@ -17,7 +17,7 @@ import com.dongjian.dashboard.back.model.DeviceRawdataRealtime; import com.dongjian.dashboard.back.model.DeviceRawdataRealtimeExample; import com.dongjian.dashboard.back.service.DeviceDataMeasureService; import com.dongjian.dashboard.back.service.common.CommonOpt; -import com.dongjian.dashboard.back.service.common.LineDataHourAggregator; +//import com.dongjian.dashboard.back.service.common.LineDataHourAggregator; import com.dongjian.dashboard.back.util.CommonUtil; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; @@ -75,9 +75,9 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService { @Override public PageInfo getDataList(MeasureDataSearchParam pageSearchParam, Long companyId, Long userId, Integer languageType) { - if (null == pageSearchParam.getBuildingId()) { - return new PageInfo<>(new ArrayList<>()); - } +// if (null == pageSearchParam.getBuildingId()) { +// return new PageInfo<>(new ArrayList<>()); +// } //list防${}注入 if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) { @@ -148,7 +148,7 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService { } } - ZoneId tokyoZone = ZoneId.of("Asia/Tokyo"); + ZoneId tokyoZone = Constants.ZONE_TOKYO; LocalDate tokyoToday = LocalDate.now(tokyoZone); int year = tokyoToday.getYear(); int month = tokyoToday.getMonthValue(); @@ -236,10 +236,7 @@ public class DeviceDataMeasureServiceImpl implements DeviceDataMeasureService { if (null == searchType) { searchType = 2;//默认全部数据 } - List lineDataList = commonOpt.getLineData(companyId, lineDataSearchParams, 3); - if (1 == searchType && CollectionUtils.isNotEmpty(lineDataList)) { - lineDataList.forEach(LineDataHourAggregator::aggregateByHour); - } + List lineDataList = commonOpt.getMeasureLineData(companyId, searchType, lineDataSearchParams); return SimpleDataResponse.success(lineDataList); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/FavoritedDeviceServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/FavoritedDeviceServiceImpl.java index c8612a6..55ffb20 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/FavoritedDeviceServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/FavoritedDeviceServiceImpl.java @@ -7,16 +7,15 @@ import com.dongjian.dashboard.back.common.response.ResponseCode; import com.dongjian.dashboard.back.common.response.SimpleDataResponse; import com.dongjian.dashboard.back.dao.ex.FavoritedDeviceMapperExt; import com.dongjian.dashboard.back.dto.data.AccumulateDataSearchParam; +import com.dongjian.dashboard.back.dto.data.AlarmDataSearchParam; import com.dongjian.dashboard.back.dto.data.BaStatusDataSearchParam; import com.dongjian.dashboard.back.dto.data.MeasureDataSearchParam; import com.dongjian.dashboard.back.dto.device.FavoritedDeviceSearchParams; import com.dongjian.dashboard.back.dto.device.OptFavoritedDeviceParams; -import com.dongjian.dashboard.back.service.DeviceDataAccumulateService; -import com.dongjian.dashboard.back.service.DeviceDataBaStatusService; -import com.dongjian.dashboard.back.service.DeviceDataMeasureService; -import com.dongjian.dashboard.back.service.FavoritedDeviceService; +import com.dongjian.dashboard.back.service.*; import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.vo.data.DeviceAccumulateData; +import com.dongjian.dashboard.back.vo.data.DeviceAlarmData; import com.dongjian.dashboard.back.vo.data.DeviceBaStatusData; import com.dongjian.dashboard.back.vo.data.DeviceMeasureData; import com.dongjian.dashboard.back.vo.device.FavoritedDeviceVO; @@ -52,6 +51,8 @@ public class FavoritedDeviceServiceImpl implements FavoritedDeviceService { DeviceDataBaStatusService deviceDataBaStatusService; @Autowired DeviceDataMeasureService deviceDataMeasureService; + @Autowired + DeviceDataAlarmService deviceDataAlarmService; @Override @@ -77,6 +78,7 @@ public class FavoritedDeviceServiceImpl implements FavoritedDeviceService { List accumulateDeviceIds = new ArrayList<>(); List measureDeviceIds = new ArrayList<>(); List statusDeviceIds = new ArrayList<>(); + List alarmDeviceIds = new ArrayList<>(); for (FavoritedDeviceVO vo : favoritedDeviceVOList) { Long categoryId = vo.getCategoryId(); @@ -86,6 +88,8 @@ public class FavoritedDeviceServiceImpl implements FavoritedDeviceService { measureDeviceIds.add(vo.getDeviceId()); } else if (Constants.CATEGORY_MAP.get(Constants.CATEGORY_STATUS).contains(categoryId)) { statusDeviceIds.add(vo.getDeviceId()); + } else if (Constants.CATEGORY_MAP.get(Constants.CATEGORY_ALARM).contains(categoryId)) { + alarmDeviceIds.add(vo.getDeviceId()); } } @@ -93,6 +97,7 @@ public class FavoritedDeviceServiceImpl implements FavoritedDeviceService { Map accumulateDataMap = buildAccumulateDataMap(companyId, accumulateDeviceIds); Map measureDataMap = buildMeasureDataMap(companyId, measureDeviceIds); Map statusDataMap = buildStatusDataMap(companyId, statusDeviceIds); + Map alarmDataMap = buildAlarmDataMap(companyId, languageType, alarmDeviceIds); // 按收藏顺序生成结果 for (FavoritedDeviceVO vo : favoritedDeviceVOList) { @@ -106,6 +111,8 @@ public class FavoritedDeviceServiceImpl implements FavoritedDeviceService { data = measureDataMap.get(deviceId); } else if (Constants.CATEGORY_MAP.get(Constants.CATEGORY_STATUS).contains(categoryId)) { data = statusDataMap.get(deviceId); + } else if (Constants.CATEGORY_MAP.get(Constants.CATEGORY_ALARM).contains(categoryId)) { + data = alarmDataMap.get(deviceId); } if (data != null) { @@ -116,6 +123,17 @@ public class FavoritedDeviceServiceImpl implements FavoritedDeviceService { return new PageInfo<>(resultList); } + private Map buildAlarmDataMap(Long companyId, Integer languageType, List deviceIds) { + if (CollectionUtils.isEmpty(deviceIds)) return Collections.emptyMap(); + + AlarmDataSearchParam param = new AlarmDataSearchParam(); + param.setDeviceIdList(deviceIds); + param.setCompanyIdList(List.of(companyId)); + param.setSearchType(4); + return deviceDataAlarmService.handleDeviceAlarmData(languageType, param).stream() + .collect(Collectors.toMap(DeviceAlarmData::getDeviceId, Function.identity(), (existing, replacement) -> replacement)); + } + private Map buildAccumulateDataMap(Long companyId, List deviceIds) { if (CollectionUtils.isEmpty(deviceIds)) return Collections.emptyMap(); diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java index 55fe284..494f8fd 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/OverviewServiceImpl.java @@ -1,18 +1,19 @@ package com.dongjian.dashboard.back.service.impl; import com.dongjian.dashboard.back.common.Constants; -import com.dongjian.dashboard.back.common.language.msg.MsgLanguageChange; import com.dongjian.dashboard.back.common.response.ResponseCode; import com.dongjian.dashboard.back.common.response.SimpleDataResponse; import com.dongjian.dashboard.back.dao.ex.DashboardNotificationMapperExt; -import com.dongjian.dashboard.back.dao.ex.DeviceRawdataRealtimeMapperExt; -import com.dongjian.dashboard.back.model.DashboardNotification; -import com.dongjian.dashboard.back.model.DashboardNotificationExample; +import com.dongjian.dashboard.back.dao.ex.MonitoringPointCategoryMapperExt; +import com.dongjian.dashboard.back.dao.ex.OverviewInfoMapperExt; +import com.dongjian.dashboard.back.dto.monitoringpointcategory.MonitoringPointCategorySearchParams; import com.dongjian.dashboard.back.service.OverviewService; import com.dongjian.dashboard.back.service.common.CommonOpt; import com.dongjian.dashboard.back.vo.dashboardnotification.DashboardNotificationPageVO; +import com.dongjian.dashboard.back.vo.data.OverviewCategoryVO; import com.dongjian.dashboard.back.vo.data.OverviewInfo; import com.dongjian.dashboard.back.vo.data.OverviewVO; +import com.dongjian.dashboard.back.vo.monitoringpointcategory.MonitoringPointCategoryPageVO; import com.dongjian.dashboard.back.weather.JpMeshHourlyForecasts; import com.dongjian.dashboard.back.weather.QueryWeather; import com.fasterxml.jackson.databind.ObjectMapper; @@ -47,11 +48,11 @@ public class OverviewServiceImpl implements OverviewService { @Autowired - private DeviceRawdataRealtimeMapperExt deviceRawdataRealtimeMapperExt; + private OverviewInfoMapperExt overviewInfoMapperExt; @Autowired private DashboardNotificationMapperExt dashboardNotificationMapperExt; - @Autowired - private MsgLanguageChange msgLanguageChange; + @Autowired + private MonitoringPointCategoryMapperExt monitoringPointCategoryMapperExt; @Autowired private CommonOpt commonOpt; @@ -61,21 +62,71 @@ public class OverviewServiceImpl implements OverviewService { buildingMap.put("companyId", companyId); buildingMap.put("bindBuildingIdList", commonOpt.getBindLevelBuildingIdList(userId)); - List buildingInfoList = deviceRawdataRealtimeMapperExt.getBuildingInfo(buildingMap); + List buildingInfoList = overviewInfoMapperExt.getBuildingInfo(buildingMap); if (CollectionUtils.isNotEmpty(buildingInfoList)){ Map paramMap = new HashMap<>(); paramMap.put("companyId", companyId); paramMap.put("categoryIdList", Constants.CATEGORY_MAP.get(Constants.CATEGORY_ALARM)); - List alarmInfoList = deviceRawdataRealtimeMapperExt.getOverviewInfo(paramMap); + List alarmInfoList = overviewInfoMapperExt.getOverviewInfo(paramMap); List overviewVOList = convert(alarmInfoList, utcOffset); mergeOverviewList(buildingInfoList, overviewVOList); + + // 查找楼宇没有的监测点分类 + Map> notExistingCategoryMap = handleMissingMonitoringPointCategory(companyId, buildingInfoList); + mergeMissingMonitoringPointCategory(buildingInfoList, notExistingCategoryMap); } return SimpleDataResponse.success(buildingInfoList); } + private void mergeMissingMonitoringPointCategory(List buildingInfoList, Map> notExistingCategoryMap) { + buildingInfoList.forEach(building -> { + List missingCategoryIds = notExistingCategoryMap.get(building.getBuildingId()); + if (missingCategoryIds != null && !missingCategoryIds.isEmpty()) { + building.setMissingMonitoringPointCategoryList(missingCategoryIds); + } + }); + } + + private Map> handleMissingMonitoringPointCategory(Long companyId, List buildingInfoList) { + //全部分类 + MonitoringPointCategorySearchParams categorySearchParam = new MonitoringPointCategorySearchParams(); + categorySearchParam.setCompanyIdList(List.of(companyId)); + List categoryList = monitoringPointCategoryMapperExt.getListPage(categorySearchParam); + //所有楼宇的监测点分类 + Map allCategoryParamMap = new HashMap<>(); + allCategoryParamMap.put("companyId", companyId); + allCategoryParamMap.put("categoryIdList", Constants.ALL_CATEGORY_IDS); + List existingCategoryList = overviewInfoMapperExt.getExistingCategoryList(allCategoryParamMap); + + Map> existingCategoryMap = + existingCategoryList.stream() + .filter(e -> e.getBuildingId() != null && e.getMonitoringPointCategoryId() != null) + .collect(Collectors.groupingBy( + OverviewCategoryVO::getBuildingId, + Collectors.mapping( + OverviewCategoryVO::getMonitoringPointCategoryId, + Collectors.toSet() + ) + )); + + Map> notExistingCategoryMap = new HashMap<>(); + existingCategoryMap.forEach((buildingId, existingCategoryIds) -> { + List missingCategoryIds = + categoryList.stream() + .map(MonitoringPointCategoryPageVO::getMonitoringPointCategoryId) + .filter(Objects::nonNull) + .filter(id -> !existingCategoryIds.contains(id)) + .collect(Collectors.toList()); + + notExistingCategoryMap.put(buildingId, missingCategoryIds); + }); + + return notExistingCategoryMap; + } + public static void mergeOverviewList(List buildingInfoList, List overviewVOList) { // 构建 buildingId 到 OverviewVO 的映射表 Map overviewMap = overviewVOList.stream() @@ -201,7 +252,7 @@ public class OverviewServiceImpl implements OverviewService { } @Override - public SimpleDataResponse getNotification(Long userId, Long companyId, Integer languageType, Integer utcOffset) { + public SimpleDataResponse> getNotification(Long userId, Long companyId, Integer languageType, Integer utcOffset) { return SimpleDataResponse.success(dashboardNotificationMapperExt.getNotification(companyId)); } diff --git a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/UserServiceImpl.java b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/UserServiceImpl.java index 39217f6..89eb5ef 100644 --- a/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/UserServiceImpl.java +++ b/dongjian-dashboard-back-service/src/main/java/com/dongjian/dashboard/back/service/impl/UserServiceImpl.java @@ -85,6 +85,7 @@ public class UserServiceImpl implements UserService { @Transactional public SimpleDataResponse add(OptUserParam param, Long companyId, Long userId, Integer languageType) { try { + param.setUserType(2); // if (StringUtils.isBlank(param.getLoginName())) { param.setLoginName(param.getUsername()); // } @@ -132,9 +133,9 @@ public class UserServiceImpl implements UserService { loginUrl = webAdminLoginUrl; } optAsync.doSendWork( - msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdSubject") + "【" + basicCompany.getCompanyName() +"】", - MessageFormat.format(msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdContent"), basicUser.getLoginName(), rawPwd, loginUrl), - basicUser.getEmail(), + msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdSubject") + "【" + basicCompany.getCompanyName() +"】", + MessageFormat.format(msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdContent"),basicUser.getLastName()+" "+basicUser.getFirstName(),basicUser.getLoginName(), rawPwd, loginUrl), + basicUser.getEmail(), null); return SimpleDataResponse.success(); @@ -172,6 +173,12 @@ public class UserServiceImpl implements UserService { private SimpleDataResponse checkParam(OptUserParam param, Integer languageType) { + if(StringUtils.isBlank(param.getLastName()) || param.getLastName().length() > 50){ + return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [lastName] error"); + } + if(StringUtils.isBlank(param.getFirstName()) || param.getFirstName().length() > 50){ + return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [firstName] error"); + } if(StringUtils.isBlank(param.getEmail()) || param.getEmail().length() > 100){ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [email] error"); } @@ -331,7 +338,7 @@ public class UserServiceImpl implements UserService { } optAsync.doSendWork( msgLanguageChange.getParameterMapByCode(languageType, "mailResetUserPwdSubject") + "【" + basicCompany.getCompanyName() +"】", - MessageFormat.format(msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdContent"), basicUser.getLoginName(), rawPwd, loginUrl), + MessageFormat.format(msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdContent"),basicUser.getLastName()+" "+basicUser.getFirstName(),basicUser.getLoginName(), rawPwd, loginUrl), basicUser.getEmail(), null); } diff --git a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java index 2a380a1..7cebb6a 100644 --- a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java +++ b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/CommonUtil.java @@ -5,6 +5,9 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -847,4 +850,38 @@ public class CommonUtil { System.out.println(formatDecimal("123.456,7.898", 2)); } + public static String ratio(String a, String b) { + if (StringUtils.isBlank(a) || StringUtils.isBlank(b)) { + return "-"; + } + + a = a.trim(); + b = b.trim(); + + BigDecimal numA; + BigDecimal numB; + try { + numA = new BigDecimal(a); + numB = new BigDecimal(b); + } catch (NumberFormatException e) { + logger.error("参数必须是合法数字字符串", e); + return "-"; + } + + // 除 0 校验 + if (numB.compareTo(BigDecimal.ZERO) == 0) { + logger.error("除数不能为 0"); + return "-"; + } + + BigDecimal result = numA.divide(numB, 2, RoundingMode.HALF_UP); + return result.multiply(new BigDecimal(100)).toPlainString() + "%"; + } + + public static String generateExcelSuffix() { + String date = LocalDate.now(ZoneId.of("Asia/Tokyo")) + .format(DateTimeFormatter.ofPattern("yyyyMMdd")); + long timestampSeconds = System.currentTimeMillis() / 1000; + return "_" + date + "_" + timestampSeconds; + } } diff --git a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DateUtil.java b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DateUtil.java index c28c127..0dd7157 100644 --- a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DateUtil.java +++ b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DateUtil.java @@ -16,6 +16,8 @@ import java.util.*; public class DateUtil { private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_DATE; + + private static final ZoneId JAPAN_ZONE = ZoneId.of("Asia/Tokyo"); public static void main(String[] args) { // 指定的日期时间字符串 @@ -85,4 +87,12 @@ public class DateUtil { LocalDate lastYearDate = getLastYearSameIsoWeekDay(date); return lastYearDate.format(FORMATTER); } + + public static String getYesterdayInJapan() { + DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy_MM_dd"); + LocalDate japanYesterday = LocalDate + .now(JAPAN_ZONE) + .minusDays(1); + return japanYesterday.format(FORMATTER); + } } diff --git a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DurationData.java b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DurationData.java new file mode 100644 index 0000000..8c4c6f2 --- /dev/null +++ b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/DurationData.java @@ -0,0 +1,55 @@ +package com.dongjian.dashboard.back.util; + +import java.util.Locale; +import java.util.ResourceBundle; + +/** + * 持续时间对象,包含结构化时间单位 + */ +public class DurationData { + private long days; + private long hours; + private long minutes; + private long seconds; + + // 构造函数 + public DurationData(long days, long hours, long minutes, long seconds) { + this.days = days; + this.hours = hours; + this.minutes = minutes; + this.seconds = seconds; + } + + // Getters + public long getDays() { return days; } + public long getHours() { return hours; } + public long getMinutes() { return minutes; } + public long getSeconds() { return seconds; } + + // 从毫秒创建 + public static DurationData fromMilliseconds(long ms) { + if (ms <= 0) { + return new DurationData(0, 0, 0, 0); + } + + long totalSeconds = ms / 1000; + long days = totalSeconds / (24 * 3600); + long hours = (totalSeconds % (24 * 3600)) / 3600; + long minutes = (totalSeconds % 3600) / 60; + long seconds = totalSeconds % 60; + + return new DurationData(days, hours, minutes, seconds); + } + + @Override + public String toString() { + return String.format("DurationData{days=%d, hours=%d, minutes=%d, seconds=%d}", + days, hours, minutes, seconds); + } + + public static void main(String[] args){ + DurationData durationData = DurationData.fromMilliseconds(15306504932L); + System.out.println(durationData); + System.out.println(durationData.getDays()); + } +} diff --git a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/IPUtils.java b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/IPUtils.java new file mode 100644 index 0000000..7716cc8 --- /dev/null +++ b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/IPUtils.java @@ -0,0 +1,40 @@ +package com.dongjian.dashboard.back.util; + +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +@Slf4j +public class IPUtils { + + private IPUtils() {} + + public static String getClientIp(HttpServletRequest request) { + if (request == null) { + return ""; + } + + String ip = request.getHeader("X-Forwarded-For"); + if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip.split(",")[0].trim(); + } + + ip = request.getHeader("X-Real-IP"); + if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + ip = request.getHeader("Proxy-Client-IP"); + if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + ip = request.getHeader("WL-Proxy-Client-IP"); + if (StringUtils.isNotBlank(ip) && !"unknown".equalsIgnoreCase(ip)) { + return ip; + } + + return request.getRemoteAddr(); + } +} + diff --git a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/redis/RedisUtil.java b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/redis/RedisUtil.java index 2336799..cb20961 100644 --- a/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/redis/RedisUtil.java +++ b/dongjian-dashboard-back-util/src/main/java/com/dongjian/dashboard/back/util/redis/RedisUtil.java @@ -42,7 +42,7 @@ public class RedisUtil { Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); +// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); diff --git a/dongjian-dashboard-back-util/src/test/java/com/dongjian/dashboard/back/util/Test.java b/dongjian-dashboard-back-util/src/test/java/com/dongjian/dashboard/back/util/Test.java index 429b451..dcfc2b7 100644 --- a/dongjian-dashboard-back-util/src/test/java/com/dongjian/dashboard/back/util/Test.java +++ b/dongjian-dashboard-back-util/src/test/java/com/dongjian/dashboard/back/util/Test.java @@ -7,6 +7,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.regex.Matcher; @@ -22,23 +23,31 @@ public class Test { private final static long ondDayMillis = 3600 * 24 * 1000; private static final String betweenQuotesRegex = "\"([^\"]*)\""; + + private static final String[] suffixes = { "_85", "_85_9003", "_111", "_111_9003", "_S", "_s", "_131_5" }; public static void main(String[] args) throws ParseException{ - long ZeroTime = getTodayZeroTime(); - System.out.println(ZeroTime); - long startTime = ZeroTime - ondDayMillis; - System.out.println(startTime); - long endTime = ZeroTime - 1; - System.out.println(endTime); - - int days = 2; - System.out.println("前"+ days +"天的0点的毫秒级时间戳: " + getMinusZeroTimestamp(days)); - - int mins = 9; - minusInterval(mins); - - System.out.println(CommonUtil.extractContentBetweenQuotes("aurora_cluster_endpoint = \"company-13-aurora-cluster.cluster-cde6q2assvmn.ap-northeast-1.rds.amazonaws.com\"")); - +// long ZeroTime = getTodayZeroTime(); +// System.out.println(ZeroTime); +// long startTime = ZeroTime - ondDayMillis; +// System.out.println(startTime); +// long endTime = ZeroTime - 1; +// System.out.println(endTime); +// +// int days = 2; +// System.out.println("前"+ days +"天的0点的毫秒级时间戳: " + getMinusZeroTimestamp(days)); +// +// int mins = 9; +// minusInterval(mins); +// +// System.out.println(CommonUtil.extractContentBetweenQuotes("aurora_cluster_endpoint = \"company-13-aurora-cluster.cluster-cde6q2assvmn.ap-northeast-1.rds.amazonaws.com\"")); + + if (Arrays.stream(suffixes).anyMatch("AMMM_42_TL_TRED800073_131_5"::endsWith)){ + System.out.println("包含"); + } else { + System.out.println("不包含"); + } + } public static String extractContentBetweenQuotes(String text) {