From add2093e9034ecd52f3e5f3c8e06b2f6bd18b635 Mon Sep 17 00:00:00 2001 From: "zhczyx@163.com" Date: Mon, 1 Jun 2026 11:23:55 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E6=95=B0=E6=8D=AE=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=8F=8A=E7=9B=B8=E5=85=B3=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现了通过设备ID和时间范围查询设备数据的功能,包括: 1. 新增查询参数DTO和返回值VO 2. 在CommonService中添加接口定义并实现查询逻辑 3. 在CommonController中添加对外接口路由 4. 补充完整的技能文档和OpenAPI接口文档 --- .DS_Store | Bin 0 -> 10244 bytes .../business/controller/CommonController.java | 9 + .../dto/data/QueryDeviceDataParams.java | 19 ++ .../business/vo/data/DeviceDataVO.java | 41 +++ .../business/service/CommonService.java | 3 + .../service/impl/CommonServiceImpl.java | 122 +++++++++ document/.DS_Store | Bin 0 -> 6148 bytes .../openapis/query-device-data-openapi.json | 236 +++++++++++++++++ document/skills/.DS_Store | Bin 0 -> 6148 bytes document/skills/eaon_query-device-data.zip | Bin 0 -> 3850 bytes document/skills/query-device-data/SKILL.md | 239 ++++++++++++++++++ 11 files changed, 669 insertions(+) create mode 100644 .DS_Store create mode 100644 data-center-business-model/src/main/java/com/techsor/datacenter/business/dto/data/QueryDeviceDataParams.java create mode 100644 data-center-business-model/src/main/java/com/techsor/datacenter/business/vo/data/DeviceDataVO.java create mode 100644 document/.DS_Store create mode 100644 document/openapis/query-device-data-openapi.json create mode 100644 document/skills/.DS_Store create mode 100644 document/skills/eaon_query-device-data.zip create mode 100644 document/skills/query-device-data/SKILL.md diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1f8ec3ddc44805426fab0ea7644e83d56b04d435 GIT binary patch literal 10244 zcmeI1&ubGw6vy9~G!3+cf*$-)a1S1YR%;KvsE2JyLGU12@#LXD5^E*NmZb6O{sCS* zcoQrlEsCO45fu+!q=+IOJo*oah#tI(e&5WPyzQoi?55De%rf&fJ8#~5`LLPY_d-N! zvQZo(@`xyp&T_CHLz~9)++%Hzy)pu+u%5~bW7G3NWhtiVE;s^?fFs}tI0BBqZXtkY zHn)7Ak#2MZ905n5Nr3kU51plNWoV?{Ixy%I05Xfqy5W3~Par)jeJevFF@vVeQb@B@ z*%U*W<+$!yJ>SaENVA-jO+J+MtZas&w0GF|v^pu@NH;nHjzF9M=k8fLP7Ab1%QAn@ z3{35nbCsY_m@5Z!xRyV6a^}&U#~TyT`QoW~FDMYe!&N z%u3&XZ(ZuYXM9IATHf1hNdH8i;eZao_be@=AES9hQN?+QYWOrq4XPuyDn8e7@O(fO z9065jti6@5={*`5#Fs@3_VvydNR+XF-C zElPgt#ql?mU&=To$L?8`JcpnBVxIdu;K_GtAPMI7{rr-|hGcf7aQ}s6)^RM7QW`sw zOK$W8b2-=n7yd=^4pNS=Dct;&)Q;qH~KDl>;%qI^%0q&Cqo_G4GDDM}d-*4OL$nQ21TBf?<%F}yGqZ-kJZidGM?|*)BjmVY{*!)(vflWeAN4P260qqDN2O{Bs(L0 zPppkUd>(2R&Dqv-IzB7?X`60v1RMcJz!7i+x=SEq%z0e@pW6EW|L!_<)*JyxU{?`P z*}`;T5+T{zdMr4uwR`9@=-gN@G*U0Ypv&=)x*U%WT#i4A&bm6Ox97f deviceIds; + + @Schema(description = "Start time, Unix milliseconds timestamp", example = "1709870240425", required = true) + private Long startTime; + + @Schema(description = "End time, Unix milliseconds timestamp", example = "1709889240425", required = true) + private Long endTime; +} \ No newline at end of file diff --git a/data-center-business-model/src/main/java/com/techsor/datacenter/business/vo/data/DeviceDataVO.java b/data-center-business-model/src/main/java/com/techsor/datacenter/business/vo/data/DeviceDataVO.java new file mode 100644 index 0000000..36d8200 --- /dev/null +++ b/data-center-business-model/src/main/java/com/techsor/datacenter/business/vo/data/DeviceDataVO.java @@ -0,0 +1,41 @@ +package com.techsor.datacenter.business.vo.data; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class DeviceDataVO { + + @Schema(description = "Device ID", example = "FFFF0001") + private String deviceId; + + @Schema(description = "Device name", example = "温度传感器") + private String deviceName; + + @Schema(description = "Raw data JSON", example = "{\"temp\":25.5}") + private String rawData; + + @Schema(description = "Device data values, comma-separated", example = "25.5") + private String dataValue; + + @Schema(description = "Receive timestamp (milliseconds)", example = "1709870240425") + private Long receiveTs; + + @Schema(description = "Status", example = "UP") + private String status; + + @Schema(description = "Alert level", example = "1") + private String alertLevel; + + @Schema(description = "Alert content", example = "温度异常") + private String alertContent; + + @Schema(description = "Building info", example = "东京建物日本桥ビル") + private String buildingInfo; + + @Schema(description = "Floor info", example = "3F") + private String floorInfo; + + @Schema(description = "Space info", example = "会議室A") + private String spaceInfo; +} \ No newline at end of file diff --git a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/CommonService.java b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/CommonService.java index 6dc56ff..c23a720 100644 --- a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/CommonService.java +++ b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/CommonService.java @@ -16,6 +16,7 @@ import com.techsor.datacenter.business.dto.common.DatacenterV1QueryParams; import com.techsor.datacenter.business.dto.common.GetFileTemporaryParams; import com.techsor.datacenter.business.dto.common.QueryBuilding; import com.techsor.datacenter.business.dto.common.QueryDataFor2D3D; +import com.techsor.datacenter.business.dto.data.QueryDeviceDataParams; import com.techsor.datacenter.business.dto.device.ApiAlarmDeviceSearchParams; import com.techsor.datacenter.business.dto.device.ApiRiliDeviceSearchParams; import com.techsor.datacenter.business.dto.device.DeviceSearchParams; @@ -88,4 +89,6 @@ public interface CommonService { SimpleDataResponse querySpaceInfoList(String authorization, ApiSpaceSearchParams searchParams); + SimpleDataResponse queryDeviceData(String apikey, QueryDeviceDataParams params); + } diff --git a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/CommonServiceImpl.java b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/CommonServiceImpl.java index 28034fd..d1671a7 100644 --- a/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/CommonServiceImpl.java +++ b/data-center-business-service/src/main/java/com/techsor/datacenter/business/service/impl/CommonServiceImpl.java @@ -7,6 +7,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.MessageFormat; +import java.time.ZoneId; import java.time.Duration; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @@ -78,6 +79,7 @@ import com.techsor.datacenter.business.dto.common.DatacenterV1QueryParams; import com.techsor.datacenter.business.dto.common.GetFileTemporaryParams; import com.techsor.datacenter.business.dto.common.QueryBuilding; import com.techsor.datacenter.business.dto.common.QueryDataFor2D3D; +import com.techsor.datacenter.business.dto.data.QueryDeviceDataParams; import com.techsor.datacenter.business.dto.device.ApiAlarmDeviceSearchParams; import com.techsor.datacenter.business.dto.device.ApiRiliDeviceSearchParams; import com.techsor.datacenter.business.dto.device.DeviceSearchParams; @@ -103,6 +105,7 @@ import com.techsor.datacenter.business.vo.device.ApiAlarmDeviceInfoVO; import com.techsor.datacenter.business.vo.device.ApiCancelAlarmDeviceInfoVO; import com.techsor.datacenter.business.vo.device.ApiRiliDeviceInfoVO; import com.techsor.datacenter.business.vo.device.DeviceVO; +import com.techsor.datacenter.business.vo.data.DeviceDataVO; import com.techsor.datacenter.business.vo.space.ApiSpaceWithAssetVO; import com.techsor.datacenter.business.vo.version.VersionVO; @@ -1977,4 +1980,123 @@ public class CommonServiceImpl implements CommonService { return SimpleDataResponse.success(deviceInfoVOs); } + + @Override + public SimpleDataResponse queryDeviceData(String apikey, QueryDeviceDataParams params) { + try { + if (CollectionUtils.isEmpty(params.getDeviceIds())) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "[deviceIds] is required"); + } + if (null == params.getStartTime()) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "[startTime] is required"); + } + if (null == params.getEndTime()) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "[endTime] is required"); + } + + long startTime = params.getStartTime(); + long endTime = params.getEndTime(); + + if (startTime < 10000000000L) { + startTime = startTime * 1000; + } + if (endTime < 10000000000L) { + endTime = endTime * 1000; + } + + if (startTime > endTime) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "startTime must be before endTime"); + } + + if (endTime - startTime > 7 * 24 * 60 * 60 * 1000L) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "Time range must not exceed 7 days"); + } + + Map paramMap = new HashMap<>(); + paramMap.put("apikey", apikey); + ApikeyInfo2 apikeyInfo = commonOpt.getAuroraInfoByApikey(paramMap); + + if (null == apikeyInfo) { + return SimpleDataResponse.fail(ResponseCode.MSG_ERROR, "Apikey is invalid"); + } + + apikeyInfo.setAuroraPassword(DESUtil.decrypt(apikeyInfo.getAuroraPassword(), Constants.DES_SALT)); + apikeyInfo.setAuroraUsername(DESUtil.decrypt(apikeyInfo.getAuroraUsername(), Constants.DES_SALT)); + + List dateList = DateUtils.getDatesBetween(startTime, endTime, ZoneId.of("Asia/Tokyo"), "yyyy_MM_dd"); + + List resultList = new ArrayList<>(); + + Class.forName("com.mysql.cj.jdbc.Driver"); + try (Connection conn = DriverManager.getConnection( + MessageFormat.format(Constants.AURORA_URL_FORMAT, apikeyInfo.getAuroraUrl()), + apikeyInfo.getAuroraUsername(), apikeyInfo.getAuroraPassword())) { + + StringBuilder inClause = new StringBuilder(); + for (int i = 0; i < params.getDeviceIds().size(); i++) { + inClause.append("?"); + if (i < params.getDeviceIds().size() - 1) { + inClause.append(","); + } + } + + for (String dateStr : dateList) { + String table = "rawData_" + dateStr; + String sql = "select * from " + table + + " where deviceId in (" + inClause + ") and ? <= receive_ts and receive_ts <= ?" + + " order by receive_ts desc, hashId desc"; + + logger.info("queryDeviceData sql:{}", sql); + + try (PreparedStatement preparedStatement = conn.prepareStatement(sql)) { + int idx = 1; + for (String deviceId : params.getDeviceIds()) { + preparedStatement.setString(idx++, deviceId); + } + preparedStatement.setLong(idx++, startTime); + preparedStatement.setLong(idx, endTime); + + ResultSet result = preparedStatement.executeQuery(); + + while (result.next()) { + DeviceDataVO vo = new DeviceDataVO(); + vo.setDeviceId(result.getString("deviceId")); + vo.setDeviceName(result.getString("deviceTypeName")); + vo.setRawData(result.getString("rawData")); + + String rawDataStr = result.getString("rawData"); + if (StringUtils.isNotBlank(rawDataStr)) { + try { + JSONObject rawDataObj = JSON.parseObject(rawDataStr); + List valueList = new ArrayList<>(); + for (String key : rawDataObj.keySet()) { + valueList.add(rawDataObj.get(key)); + } + vo.setDataValue(StringUtils.join(valueList, ",")); + } catch (Exception ignored) { + } + } + + vo.setReceiveTs(result.getLong("receive_ts")); + vo.setStatus(result.getString("status")); + vo.setAlertLevel(result.getString("alertLevel")); + vo.setAlertContent(result.getString("alertContent")); + vo.setBuildingInfo(result.getString("buildingInfo")); + vo.setFloorInfo(result.getString("floorInfo")); + vo.setSpaceInfo(result.getString("spaceInfo")); + resultList.add(vo); + } + } + } + } + + return SimpleDataResponse.success(resultList); + + } catch (Exception e) { + logger.error("queryDeviceData error", e); + return SimpleDataResponse.fail(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG); + } + } + + } diff --git a/document/.DS_Store b/document/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e87a7d088badc82f210d6c90814eb9de9d538ba2 GIT binary patch literal 6148 zcmeHKI|>3Z5S>vG!N$@uSMUZw^aOhW3qeFtP_*94b9pr1e41so(?;IF^;wq1zKL}UUtl!py{vwicP4KkuYILs4+?y)?L3Q&PRP{6(q1#Vaq+d%(xVDJ_II6~MBbMGa9#R9;Z z*ajj3)1U%_s@Y;_&=D`0R}c{U>M7p)&Dj8 zL;v3;aYY5Fz+Wk#qgAt7;z?OsdylhPTi_eGs`Ml&mQ{N{4I@ZnG}!$Qa}nw0V(ji0@izJ^P@mTDIf); zz^4NCeW-N9mN*3Zr-Q*q0OE{kH?Dn_AXZBdTjCJN46Ou}7}Sy@MhQCeHS1d95Eyh6 zKbiN*lS@u0#ZPCxdO1o9RFnczV64DlY!}x5FX%ta|6`JNQa}p)D+S7Ib+uaZm9n=^ yUe0=LrQgs$jJ00Q;H{YGt(Y5Y#iw8Ds;zmwB@Tg3XWr>V{Ro&YGAZyE3cLf`(jj61 literal 0 HcmV?d00001 diff --git a/document/skills/eaon_query-device-data.zip b/document/skills/eaon_query-device-data.zip new file mode 100644 index 0000000000000000000000000000000000000000..8e36cdf7e703e2e3b31de1fc2d634f35730f733b GIT binary patch literal 3850 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 Ndw2fM^6Y` | 是 | 设备ID列表,由用户提供 | +| `startTime` | `Long` | 是 | 开始时间戳(毫秒,也支持秒级自动转换),由用户提供或根据用户描述计算 | +| `endTime` | `Long` | 是 | 结束时间戳(毫秒,也支持秒级自动转换),与 startTime 跨度不能超过7天,由用户提供或根据用户描述计算 | + +## 返回数据 + +返回 `SimpleDataResponse>`,其中 `data` 为设备数据列表: + +| 字段 | 类型 | 说明 | +|------|:----:|------| +| `deviceId` | String | 设备ID | +| `deviceName` | String | 设备名称 | +| `rawData` | String | 原始数据 JSON | +| `dataValue` | String | 从 rawData 解析出的数值,逗号拼接 | +| `receiveTs` | Long | 接收时间戳(毫秒) | +| `status` | String | 状态 | +| `alertLevel` | String | 告警级别 | +| `alertContent` | String | 告警内容 | +| `buildingInfo` | String | 楼宇信息 | +| `floorInfo` | String | 楼层信息 | +| `spaceInfo` | String | 空间信息 | + +## 调用示例 + +### 请求 + +``` +POST /common/queryDeviceData +Apikey: <用户提供的Apikey> +Referer: <服务端域名,例如 https://bilplartform-stg.ifmservice.jp> +``` + +```json +{ + "deviceIds": ["FFFF0001", "FFFF0002"], + "startTime": 1709870240425, + "endTime": 1709889240425 +} +``` + +### 成功响应 + +```json +{ + "code": 0, + "msg": "success", + "data": [ + { + "deviceId": "FFFF0001", + "deviceName": "温度传感器", + "rawData": "{\"temp\":25.5}", + "dataValue": "25.5", + "receiveTs": 1709870240425, + "status": "UP", + "alertLevel": null, + "alertContent": null, + "buildingInfo": "东京建物日本桥ビル", + "floorInfo": "3F", + "spaceInfo": "会議室A" + } + ] +} +``` + +### 错误响应示例 + +```json +{ + "code": 20001, + "msg": "[deviceIds] is required", + "data": null +} +``` + +## 自然语言用例映射 + +### 用例1:查询某设备最近N天的数据 + +> 用户说:**"查一下设备FFFF0001最近3天的数据"** + +``` +步骤: +1. 假设 Today's date = 2026-06-01 +2. 计算 startTime = 2026-05-30 00:00:00 JST → 毫秒时间戳 +3. 计算 endTime = 2026-06-01 23:59:59 JST → 毫秒时间戳 +4. deviceIds = ["FFFF0001"] +5. 调用接口 +``` + +### 用例2:查询多个设备特定日期的数据 + +> 用户说:**"查询FFFF0001和FT0002在2024年1月1日的数据"** + +``` +步骤: +1. 计算 startTime = 2024-01-01 00:00:00 JST → 毫秒时间戳 +2. 计算 endTime = 2024-01-01 23:59:59 JST → 毫秒时间戳 +3. deviceIds = ["FFFF0001", "FT0002"] +4. 调用接口 +``` + +### 用例3:查询设备今天的数据 + +> 用户说:**"看看FT0001今天的监测数据"** + +``` +步骤: +1. 假设 Today's date = 2026-06-01 +2. 计算 startTime = 2026-06-01 00:00:00 JST → 毫秒时间戳 +3. 计算 endTime = 当前时间 JST → 毫秒时间戳 +4. deviceIds = ["FT0001"] +5. 调用接口 +``` + +## 注意事项 + +1. `startTime` 和 `endTime` 支持毫秒和秒级时间戳(< 10000000000L 时自动按秒处理) +2. 时间跨度不能超过 **7 天**,否则接口会返回错误 +3. 跨天查询时自动查询多张 `rawData_yyyy_MM_dd` 分表并合并结果 +4. 使用 Apikey 认证,与 `/common/queryDeviceInfo` 相同的方式 +5. 所有时间计算都基于 `Asia/Tokyo` 时区 +6. Apikey 和所有请求参数均**不设置默认值**,缺失时需向用户询问补齐 +7. **Referer 头必传**:请求必须携带 `Referer` 头,否则被 `CrosXssFilter` 过滤器拦截返回 403。Referer 值需与服务端配置的 `accessControlAllowOrigin` 匹配(通常为服务域名本身,如 `https://bilplartform-stg.ifmservice.jp`) \ No newline at end of file From 3f46640569f9519b4b2052b7beee14112c11a15d Mon Sep 17 00:00:00 2001 From: "zhczyx@163.com" Date: Thu, 11 Jun 2026 01:12:41 +0800 Subject: [PATCH 2/4] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=97=A5?= =?UTF-8?q?=E8=AF=AD=E5=8C=BA=E5=AF=BC=E5=85=A5=E6=A8=A1=E6=9D=BF=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复了日语版设备、楼宇、楼层信息导入模板的内容,同时清理了多余的.DS_Store缓存文件 --- .../src/main/resources/.DS_Store | Bin 0 -> 6148 bytes .../resources/template/jp/deviceInfo_jp.xlsx | Bin 11265 -> 11242 bytes .../jp/only_building_info_template_jp.xlsx | Bin 10589 -> 10617 bytes .../jp/only_floor_info_template_jp.xlsx | Bin 10464 -> 10493 bytes document/.DS_Store | Bin 6148 -> 8196 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 data-center-business-controller/src/main/resources/.DS_Store diff --git a/data-center-business-controller/src/main/resources/.DS_Store b/data-center-business-controller/src/main/resources/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..eb030025ac4ca6b7cd632e750bdc6a3a7468dc3a GIT binary patch literal 6148 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 XqXfbI02At8j*WmZ3e8%D_zC$3p$$sw diff --git a/data-center-business-controller/src/main/resources/template/jp/only_floor_info_template_jp.xlsx b/data-center-business-controller/src/main/resources/template/jp/only_floor_info_template_jp.xlsx index ff8564a202b1cdb7b32ff9e381c0ad7fbad24277..5f8caae28e17d654558ce9523ed9a897aec24cf8 100644 GIT binary patch delta 2457 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 b62}H$&~V@hS{@R3^6%pe8qTUFejN8-7{X}! diff --git a/document/.DS_Store b/document/.DS_Store index e87a7d088badc82f210d6c90814eb9de9d538ba2..75398f4f70ba29f7a0816385cac6dba0b9e95473 100644 GIT binary patch literal 8196 zcmeHMTWl3Y7@luh%C5L{+Hxs$fu$7$0VxP7H*?xk2<29!#h$iEIhPeyw!7u*Ij5Bn zsqqqtQ4@{E;N?l;E$NeYW1>N$4{8injq$}>OpFgE8ubN?|Lp7`w%9jARCbb?Z*Kq0 z*?+!oW@is$46Vi7D#q#=V;V(?Vj3lX6J)!L7X%*FR1kvf8FN|S2Bl=i^)narjw@mh z#2$z}5PKl@Kh^%h6wws}%ADFQ*_|*E;fO+I&Y;X0qL~rhP!P^ec2?M( zA)zo%V-Lh0xX=Ug?q04M$j zx}DBZJLpXhciF=QnU{vyyzjcZ{lJkU_M{4vHKlq3KVL|OS}6*(P&YB^NpOe3M`sjNRRKo1$Hx}>>T6Yp#L<-|MEL7`*N z_R2pgX|`)xZ*VA`w>ySBJ72cgscGT*QoS_UoO23(UU{R@yiwD7@2D<9d($6*{H`tEX7K!!+LDQCTu|mc4H4ZaR3f( z#bFF#1b5(0+=UZ(2oK{CJc`HhG*00eJd07hf>-f6-oR;mfDiEzKF3%18sFkO{DQMM zhd;Q^Yk3`?!58zDyqT}!8+aS<<~_WZ_wjw)<{ls7$N1gq5qNZHvHhxCPWe5Qo2b4) z_4SOuIf?qLt?gU4ZQt>qRNoiXN^i4f*DqYWtavaDAzRq9xi%rzUE3`h2Y@=bM-2Or0f6snmzp``C ziTDk$un232>`Al}(fe>Skv)wJk$nI@25|&OaSXTPI8pxu?!*0f01x6ZoWv7&5>FBF zpTqNb0WacZBL8bd|I>H}@8Ugtj58R+r}!+C!4LQuzeg`$>^!k|l_{+-tRF}0QfJua!|OQV`9BOPZ&6oilZbFcA=Oa0=pO>)t9*R^$LD{@zDqax6L>ie AfB*mh delta 131 zcmZp1XfcprU|?W$DortDU=RQ@Ie-{MGqg=C6q~50D9Q+A12Ir6hoQJExF|0tKQDb^ zq59?|v89X~8?Li1X6N7#WCm#gs^SI`u0Y(jvG6 Date: Thu, 11 Jun 2026 13:24:48 +0800 Subject: [PATCH 3/4] feat(building): add kvm url field for building add kvm_url column to basic_building table, and add related parameters, return fields and mybatis mappings for building kvm url management --- .../src/main/resources/.DS_Store | Bin 6148 -> 8196 bytes .../db/migration/V86__building_kvm_url.sql | 1 + .../src/main/resources/template/.DS_Store | Bin 0 -> 8196 bytes .../mappers/auto/BasicBuildingMapper.xml | 27 +++++-- .../mappers/ex/BasicBuildingMapperExt.xml | 7 +- .../dto/building/OptBuildingParams.java | 3 + .../business/model/BasicBuilding.java | 25 +++++++ .../business/model/BasicBuildingExample.java | 70 ++++++++++++++++++ .../business/vo/building/BuildingPageVO.java | 3 + .../service/impl/BuildingServiceImpl.java | 3 + 10 files changed, 132 insertions(+), 7 deletions(-) create mode 100644 data-center-business-controller/src/main/resources/db/migration/V86__building_kvm_url.sql create mode 100644 data-center-business-controller/src/main/resources/template/.DS_Store diff --git a/data-center-business-controller/src/main/resources/.DS_Store b/data-center-business-controller/src/main/resources/.DS_Store index eb030025ac4ca6b7cd632e750bdc6a3a7468dc3a..6097932bcd8fc721ef97df66a2c74e49c4fb8cd2 100644 GIT binary patch literal 8196 zcmeHMTWl0n7(U-=fmu7TQ%a$QS-P-7q@_}^H6Q`DH*PHyX)D`;h25Q@9Xp+^JG0xC zNNjw-3&tlC@%o}hV~j=(`l1Plw?{)76T$;gVvLC}4bx`A{0EDG9 z>=$~bJizyf1(*nMN}}&dYs%~afh&R(1Ja%BF)^Jm5#W?W>CPbC8G@Y=WGL`=C%>3K zogpDHY(oY@2Iey$a(6}K>}-^c-I%|p?QEK{l5~2^wp_2V@e+7R>4Jrel*k=rs(PoM z>`x9HI{fevP0PFH0n<)-R>5pfd8T_rD|d&p(Z*0nq<>+~nRVy5JPo6UJ`{<=wvwvr1h7Ta}? z31{~qGv^XUBJY(~$JVU7=e|u_TXyW(cVJqpSX`-Asml%)EZ0igX5YAFc*FfEH)A@6 z!e1_>6+y$D)p#dTg*$*;z}}~wjRw}-sE&;#bRyMYF#~S z&{_9p4Y8V`olzpbW$kKRKO`(|Ig?sLQT*Y$dR^^xi3u$gOx)0@s=XtYV`y$fx;8bd zdY_$2o3>^|q}%2PRQ+HuD&2DeqIdNPw89i^kV!B}gXt`CZByHc*#J!U%ek-iD` z-buCrcQ}+D^2j(yI~vkUAJyTX2Ezq4!XFL0DVK?Q11i*=~OdNkmEY)2RNp&R?r4->~Q zgfZkXjtNZS2|S6X@eEGkdAx*I@G4%zTX-KI;6r?bPw^$b!q@l~m+?J*z!m(0Kkz56 za?Y3VD!!E0@)%#m>vB5@srfQnF7b80{Le} z6d2vLd)J=MuD$;S1zs!{np;w}bXoPPwe^k7o42)Ik4+iOGx2+)Dtsx-5|A$iKUC&~ zv4}@Kx>Ai5Q)eG($ed7woV7)Ac3fSfkcPAcvU|5$r;vKIg|gca-Jpb&DeqtbW+fZkUxM!IE+CYK?;vx1fy^${3mf7kKqI!$5Rykr|>ME!wWc# z7x6OQz?&q2xA6`M;0!*-Cpe39IFBy^DO@BW{Dj};1oyrq@0Kti?tUuOBLD9w{`hJ^4ylo(^8iHQ%&3;NB@9-+lEzGy^ul9_L2 zzVF-F?{~j%rn4o4KvPy`SE0d7DM~_RptAE%Pqx za3Vw?L?A>UL?A>UMBv|m0G`>rNJY+lp$*#*fe?ZJB?5eZh+^e39>@tH{jCEV{|bPT zUjh7rea1T|qk)VEazaSdU;*KZQn*5J#Q@=s^U=UA9>@tHg*$=Z@&Uoh5Zq9}Umc$x z_00*yg$&yefe?Ya5#Z@V$q_P|%Dba?-rrrXzWxf(lF}J7XGxM&CLKr|cJc{N^RjM} zmg(c8PRFrQg}#>BZyNbQR@v;>o@Uxc#&bc zNs51p;GtYAgd*QprYH}n$)03yU;lwY#inz z-D$_lj@YOvPis~>i^j%Q%SxEX47XPs>omqZ-sg_#jAL2*9M|+r$L>jb#Z<{&*U5Oz z{&SNiE+rl?hcDMY%AMW)M#e=c%kRvtjxJsP@S63Twr=0Ow_}o($VlzH7b(=}6; z(UmuK?{JUirVU#+?V(;o*7nRprje1$p-%3!wGm@-{(^-SYDBFm<|VP1l+32g$Fin( zbh4s+4qLoLRr+;|b&sR-r|ImRB>S3WOH{RwYnn3#wz?$w)3qy9rPDtf~Wi**4Af z+D8o=U+K$W?H#D=bq{M9qdkw*3uaq!*8e?mo;z*RP0!&J7*%*5r4sWb{TUZ7OxeQixrp`yP(JYzK?M%UN01t1$`j-;Z{Q$NDFBr z2gxuQCnv~R@+x_oTqK{6OXM=SMsASr$gtxL{=h(DZ|wgGlnVuo1RFD-xa4yaW269|m9$G&lmoFakDG{wN%S$6*|v zfTxi1XW(gg2A+en@I1T-ufgj``#0e&B>g$~5YEE|xCocv(}4b0k^JAmPtyp!cN(EN z(S1Va5*gca>>(T%$UoKeULTc+0IK=@e_QeI|Mz;B;roXOgb4fz0#MqLXlX)&V%r?Q zYe%sj#L5e|n-J1>!Dh;b036@`havW(Xv%%!ft(N$XR!R^9|Hd3U)|yPAD;jJ<@5h{ DwXb*= literal 0 HcmV?d00001 diff --git a/data-center-business-dao/src/main/resources/mappers/auto/BasicBuildingMapper.xml b/data-center-business-dao/src/main/resources/mappers/auto/BasicBuildingMapper.xml index 191a97d..e79e68d 100644 --- a/data-center-business-dao/src/main/resources/mappers/auto/BasicBuildingMapper.xml +++ b/data-center-business-dao/src/main/resources/mappers/auto/BasicBuildingMapper.xml @@ -26,6 +26,7 @@ + building_id, company_id, `name`, address, flag, create_time, creator_id, modify_time, modifier_id, udf_building_id, building_bucket, thumbnail_num, show_switch_2d3d, brief_introduction, - latitude, longitude, retain_alert, salesforce_primary_id, site_manager, king_contract_no + latitude, longitude, retain_alert, salesforce_primary_id, site_manager, king_contract_no, kvm_url