# 系统更新日志 ## 2025-12-24 ### 新增接口 #### 1. 房间设备访问日志写入接口 **接口地址**: `/Upgrade/WriteRoomVisitLog` **请求方式**: `POST` **请求参数**: | 参数名 | 类型 | 必填 | 描述 | | --- | --- | --- | --- | | HotelID | string | 是 | 酒店ID | | RoomNumber | string | 是 | 房号 | | EquipmentList | List | 是 | 设备信息列表 | **EquipmentInfo 数据结构**: | 参数名 | 类型 | 必填 | 描述 | | --- | --- | --- | --- | | EquipmentStatus | string | 否 | 设备状态 | | FaultDescription | string | 否 | 故障描述 | | DevName | string | 否 | 设备名称 | **返回结果**: ```json { "Status": 1, // 1成功,0失败,-1异常 "Message": "写入成功", // 操作结果描述 "Count": 2 // 成功插入的记录数 } ``` **功能描述**: 该接口用于向数据库表 `tbl_roomvisitlogform` 写入房间设备访问日志,支持批量写入多个设备的信息。UpdateDate 由服务器自动生成,格式为 `yyyy-MM-dd HH:mm:ss`。 **实现说明 / 变更**: - 修复说明:修复了 Controller 中原先使用匿名对象列表通过 Ado.ExecuteCommand 插入导致的不稳定/编译隐患,改为使用 SqlSugar 的 `Insertable` 批量插入 POCO(写入到 `tbl_roomvisitlogform`),返回实际插入的行数(Count)。 - 校验:当 `HotelID` 或 `RoomNumber` 为空,或 `EquipmentList` 为空时,接口返回 `Status=0` 并给出相应错误消息。 - 时间字段:`UpdateDate` 由服务器生成,客户端无需提供。 **使用示例**: ```javascript // 请求示例 fetch('/Upgrade/WriteRoomVisitLog', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: JSON.stringify({ HotelID: '123', RoomNumber: '101', EquipmentList: [ { EquipmentStatus: '正常', DevName: '灯光设备' }, { EquipmentStatus: '故障', FaultDescription: '无法正常开关', DevName: '空调设备' } ] }) }) .then(response => response.json()) .then(data => { console.log(data); // 输出示例:{"Status":1,"Message":"写入成功","Count":2} }); ``` **开发人员**: 系统开发团队 **备注**: - 本次更新修复了导致编译或插入异常的实现方式,现已使用稳定的批量插入方案。 - `Count` 字段表示成功写入数据库的行数。 #### 2. 房间设备访问日志查询接口 **接口地址**: `/Upgrade/QueryRoomVisitLog` **请求方式**: `POST` **请求参数**: | 参数名 | 类型 | 必填 | 描述 | | --- | --- | --- | --- | | HotelID | string | 是 | 酒店ID | | RoomNumber | string | 是 | 房号 | | StartTime | string | 否 | 开始时间(格式:yyyy-MM-dd HH:mm:ss) | | EndTime | string | 否 | 结束时间(格式:yyyy-MM-dd HH:mm:ss) | **返回结果**: ```json { "Status": 1, // 1成功,0失败,-1异常 "Message": "查询成功", // 操作结果描述 "Data": [ { "ID": 1, "HotelID": "123", "RoomNumber": "101", "EquipmentStatus": "正常", "FaultDescription": null, "UpdateDate": "2025-12-24 10:30:00", "DevName": "灯光设备" }, { "ID": 2, "HotelID": "123", "RoomNumber": "101", "EquipmentStatus": "故障", "FaultDescription": "无法正常开关", "UpdateDate": "2025-12-24 10:31:00", "DevName": "空调设备" } ] } ``` **功能描述**: 该接口用于查询房间设备访问日志,根据酒店ID、房号和时间范围进行筛选。若 `StartTime`/`EndTime` 未提供,则返回该房间全部记录;若提供则按时间过滤并按 `UpdateDate` 降序返回。 **实现说明 / 变更**: - 修复说明:解决了原实现中使用匿名类型在不同条件下重新赋值导致的编译错误(CS0029),改为使用可变参数集合并对时间参数做格式校验。 - 时间参数行为: - `StartTime` / `EndTime` 必须为 `yyyy-MM-dd HH:mm:ss` 格式;格式错误时接口返回 `Status=0` 并带提示信息(例如:`StartTime 格式错误,应为 yyyy-MM-dd HH:mm:ss`)。 - 支持单边过滤:仅传 `StartTime` 表示 `UpdateDate >= StartTime`;仅传 `EndTime` 表示 `UpdateDate <= EndTime`;同时传则表示 `StartTime <= UpdateDate <= EndTime`。 **使用示例**: ```javascript // 查询指定时间范围内的记录 fetch('/Upgrade/QueryRoomVisitLog', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: JSON.stringify({ HotelID: '123', RoomNumber: '101', StartTime: '2025-12-24 00:00:00', EndTime: '2025-12-24 23:59:59' }) }) .then(response => response.json()) .then(data => { console.log(data); // 输出查询结果 }); // 查询所有记录 fetch('/Upgrade/QueryRoomVisitLog', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: JSON.stringify({ HotelID: '123', RoomNumber: '101' }) }) .then(response => response.json()) .then(data => { console.log(data); // 输出查询结果 }); ``` **开发人员**: 系统开发团队 **备注**: 该接口用于查询房间设备的访问和状态信息,支持按时间范围筛选,方便进行历史记录查询和分析。