TRX 1 سال پیش
والد
کامیت
c44ae9dd77

+ 80 - 22
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceUseRecordModel.java

@@ -1,12 +1,19 @@
 package com.zhongshu.card.client.model.devices;
 
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.github.microservice.models.type.DeviceType;
+import com.github.microservice.types.deviceUse.OperateState;
+import com.github.microservice.types.deviceUse.OperateType;
 import com.zhongshu.card.client.model.base.SuperModel;
-import com.zhongshu.card.client.model.school.CardInfoModel;
+import com.zhongshu.card.client.model.org.UserCountSimpleModel;
+import com.zhongshu.card.client.model.school.CardInfoStoreModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.util.Date;
+
 /**
  * @author TRX
  * @date 2024/10/21
@@ -16,27 +23,78 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class DeviceUseRecordModel extends SuperModel {
 
+    @Schema(description = "mqtt推送生成的业务数据ID")
+    private String mqttDataId;
+
+    @Schema(description = "token")
+    private String token;
+
+    @Schema(description = "关联的项目名称")
+    private String projectName;
+
+    //----------------------------设备信息start ---------------------
+
+    @Schema(description = "操作模式,卡片、人脸、密码、指纹...")
+    private OperateType operateType;
+
+    @Schema(description = "操作记录结果")
+    private OperateState operateState;
+
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "设备类型")
+    private DeviceType deviceType;
+
+    @Schema(description = "设备信息")
+    private DeviceInfoStoreModel deviceInfo;
+
+    @Schema(description = "网关ID")
+    private String gateWayId;
+
+    @Schema(description = "设备所属机构oid")
+    private String beLongOid;
+
+    @Schema(description = "设备所属机构name")
+    private String beLongName;
+
+    //----------------------卡片信息 start-------------------
+
+    @Schema(description = "10进制卡序列号(实体卡号或虚拟卡号)")
+    private String cardNo;
+
     @Schema(description = "卡片信息")
-    private CardInfoModel cardInfoModel;
-
-    @Schema(description = "开门模式(0:刷卡 1:人脸认证 2:指纹 3:密码)")
-    private Integer mode;
-
-    private String modeStr;
-
-    public String getModeStr() {
-        if (mode != null) {
-            if (mode == 0) {
-                return "刷卡";
-            } else if (mode == 1) {
-                return "人脸认证";
-            } else if (mode == 2) {
-                return "指纹";
-            } else if (mode == 3) {
-                return "密码";
-            }
-        }
-        return "";
-    }
+    private CardInfoStoreModel cardInfo;
+
+    //------------------用户信息 start-------------------
+    @Schema(description = "用户userId")
+    private String userId;
+
+    @Schema(description = "用户信息")
+    public UserCountSimpleModel userAccount;
+
+    @Schema(description = "使用时间 2024-09-12 20:40:00")
+    private String time;
+
+    @Schema(description = "时间")
+    private Long timestamp;
+
+    //-----------------------验证是否通过
+
+    @Schema(description = "创建时间,可阅读的")
+    private String createTimeStr;
+
+    @Schema(description = "提示信息")
+    private String msg = "";
+
+    @JsonProperty("IsOffLine")
+    @Schema(description = "是否是离线使用")
+    private Boolean isOffLine = Boolean.FALSE;
+
+    @Schema(description = "过期时间")
+    private Date ttl;
+
+    @Schema(description = "关联的数据")
+    private Object data;
 
 }

+ 19 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/devices/DeviceUseRecordSearch.java

@@ -1,6 +1,8 @@
 package com.zhongshu.card.client.model.devices;
 
 import com.github.microservice.models.type.DeviceType;
+import com.github.microservice.types.deviceUse.OperateState;
+import com.github.microservice.types.deviceUse.OperateType;
 import com.zhongshu.card.client.model.base.SuperSearch;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.AllArgsConstructor;
@@ -24,5 +26,22 @@ public class DeviceUseRecordSearch extends SuperSearch {
     @Schema(description = "设备类型")
     private DeviceType deviceType;
 
+    @Schema(description = "操作模式,卡片、人脸、密码、指纹...")
+    private OperateType operateType;
+
+    @Schema(description = "操作记录结果")
+    private OperateState operateState;
+
+    @Schema(description = "网关ID")
+    private String gateWayId;
+
+    @Schema(description = "设备所属机构oid")
+    private String beLongOid;
+
+    @Schema(description = "10进制卡序列号(实体卡号或虚拟卡号)")
+    private String cardNo;
+
+    @Schema(description = "用户userId")
+    private String userId;
 
 }

+ 17 - 23
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DeviceUseRecordController.java

@@ -2,11 +2,10 @@ package com.zhongshu.card.server.core.controller.devices;
 
 import com.github.microservice.auth.security.annotations.ResourceAuth;
 import com.github.microservice.auth.security.type.AuthType;
-import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
 import com.github.microservice.net.ResultContent;
 import com.zhongshu.card.client.model.base.IDParam;
-import com.zhongshu.card.client.model.devices.*;
-import com.zhongshu.card.client.service.school.DeviceInfoService;
+import com.zhongshu.card.client.model.devices.DeviceUseRecordModel;
+import com.zhongshu.card.client.model.devices.DeviceUseRecordSearch;
 import com.zhongshu.card.server.core.service.devices.DeviceUseRecordService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -16,10 +15,10 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.web.PageableDefault;
 import org.springframework.util.Assert;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import java.util.List;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
  * 设备使用日志
@@ -32,34 +31,29 @@ import java.util.List;
 @Tag(name = "平台-设备使用日志")
 public class DeviceUseRecordController {
 
-    @Autowired
-    private DeviceInfoService deviceInfoService;
-
     @Autowired
     private DeviceUseRecordService deviceUseRecordService;
 
     @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "根据设备数据ID 设备详情", description = "根据设备数据ID 设备详情")
-    @RequestMapping(value = "getDeviceById", method = {RequestMethod.POST})
-    public ResultContent<DeviceInfoMoreModel> getDeviceById(@RequestBody IDParam param) {
-        return this.deviceInfoService.getDeviceDetail(param.getId());
+    @Operation(summary = "设备使用详情", description = "设备使用详情")
+    @RequestMapping(value = "getDetail", method = {RequestMethod.POST})
+    public ResultContent getDetail(@RequestBody IDParam param) {
+        return this.deviceUseRecordService.getDetail(param.getId());
     }
 
     @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "删除设备", description = "删除设备")
-    @RequestMapping(value = "deleteDeviceInfo", method = {RequestMethod.POST})
-    public ResultContent deleteDeviceInfo(@RequestBody IDParam param) {
-        return this.deviceInfoService.deleteDeviceInfo(param.getId());
+    @Operation(summary = "删除设备使用记录", description = "删除设备使用记录")
+    @RequestMapping(value = "deleteById", method = {RequestMethod.POST})
+    public ResultContent deleteById(@RequestBody IDParam param) {
+        return this.deviceUseRecordService.deleteById(param.getId());
     }
 
     @ResourceAuth(value = "user", type = AuthType.User)
-    @Operation(summary = "设备列表-分页查询", description = "设备列表-分页查询")
+    @Operation(summary = "设备使用记录列表-分页查询", description = "设备使用记录列表-分页查询")
     @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
-    public ResultContent<Page<DeviceInfoModel>> page(
-            @Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
-            @Parameter(required = false) DeviceInfoSearch param) {
+    public ResultContent<Page<DeviceUseRecordModel>> page(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) DeviceUseRecordSearch param) {
         Assert.hasText(param.getProjectOid(), "projectOid不能为空");
-        return deviceInfoService.page(param, pageable);
+        return deviceUseRecordService.page(param, pageable);
     }
 
 }

+ 14 - 9
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/gateDoor/GateDoorController.java

@@ -2,21 +2,17 @@ package com.zhongshu.card.server.core.controller.gateDoor;
 
 
 import com.github.microservice.models.gateDoor.OnLineParam;
-import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
-import com.github.microservice.models.hxz.*;
+import com.github.microservice.models.gateDoor.gateDoor.GateDoorIotParam;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.service.devices.DeviceUseRecordService;
 import com.zhongshu.card.server.core.service.gateDoor.GateDoorService;
-import com.zhongshu.card.server.core.service.hxz.HxzService;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 @Slf4j
 @RestController
@@ -26,8 +22,11 @@ import org.springframework.web.bind.annotation.RestController;
 public class GateDoorController {
 
     @Autowired
-    GateDoorService gateDoorService;
-    
+    private GateDoorService gateDoorService;
+
+    @Autowired
+    private DeviceUseRecordService deviceUseRecordService;
+
     /**
      * 设备上线通知
      */
@@ -46,4 +45,10 @@ public class GateDoorController {
         return gateDoorService.offLine(param);
     }
 
+    @Operation(summary = "门闸 认证识别人员信息上传", description = "门闸 认证识别人员信息上传")
+    @RequestMapping(value = "recPush", method = {RequestMethod.POST})
+    public ResultContent recPush(@RequestBody GateDoorIotParam param) {
+        return this.deviceUseRecordService.gateDoorUseRecord(param);
+    }
+
 }

+ 0 - 12
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/openAPI/ProjectOpenAPIController.java

@@ -53,16 +53,4 @@ public class ProjectOpenAPIController {
         return devicePermissIotService.getDeviceAboutUserInfos(param);
     }
 
-    @Operation(summary = "物联网添加设备使用日志(通用不带复杂的业务)", description = "物联网添加设备使用日志")
-    @RequestMapping(value = "saveDeviceLogs", method = {RequestMethod.POST})
-    public ResultContent saveDeviceLogs(@RequestBody GateDoorUseParam param) {
-        return this.deviceUseRecordService.saveDeviceLogs(param);
-    }
-
-    @Operation(summary = "门闸 认证识别人员信息上传", description = "认证识别人员信息上传")
-    @RequestMapping(value = "recPush", method = {RequestMethod.POST})
-    public ResultContent recPush(@RequestBody GateDoorUseParam param) {
-        return this.deviceUseRecordService.saveDeviceLogs(param);
-    }
-
 }

+ 24 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/impl/DeviceUseRecordDaoImpl.java

@@ -50,6 +50,30 @@ public class DeviceUseRecordDaoImpl extends BaseImpl implements DeviceUseRecordD
             criteria.and("deviceType").is(param.getDeviceType());
         }
 
+        if (param.getOperateType() != null) {
+            criteria.and("operateType").is(param.getOperateType());
+        }
+
+        if (param.getOperateState() != null) {
+            criteria.and("operateState").is(param.getOperateState());
+        }
+
+        if (StringUtils.isNotEmpty(param.getGateWayId())) {
+            criteria.and("gateWayId").is(param.getGateWayId());
+        }
+
+        if (StringUtils.isNotEmpty(param.getBeLongOid())) {
+            criteria.and("beLongOid").is(param.getBeLongOid());
+        }
+
+        if (StringUtils.isNotEmpty(param.getCardNo())) {
+            criteria.and("cardNo").is(param.getCardNo());
+        }
+
+        if (StringUtils.isNotEmpty(param.getUserId())) {
+            criteria.and("userId").is(param.getUserId());
+        }
+
         // 模糊搜索
         List<Criteria> criterias = new ArrayList<>();
         if (StringUtils.isNotEmpty(param.getDeviceId())) {

+ 15 - 9
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DeviceUseRecords.java

@@ -2,6 +2,8 @@ package com.zhongshu.card.server.core.domain.devices;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.github.microservice.models.type.DeviceType;
+import com.github.microservice.types.deviceUse.OperateState;
+import com.github.microservice.types.deviceUse.OperateType;
 import com.zhongshu.card.client.model.devices.DeviceInfoStoreModel;
 import com.zhongshu.card.client.model.org.UserCountSimpleModel;
 import com.zhongshu.card.client.model.school.CardInfoStoreModel;
@@ -34,7 +36,17 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "token")
     private String token;
 
+    @Schema(description = "关联的项目名称")
+    private String projectName;
+
     //----------------------------设备信息start ---------------------
+
+    @Schema(description = "操作模式,卡片、人脸、密码、指纹...")
+    private OperateType operateType;
+
+    @Schema(description = "操作记录结果")
+    private OperateState operateState;
+
     @Schema(description = "设备ID")
     private String deviceId;
 
@@ -68,26 +80,17 @@ public class DeviceUseRecords extends SuperMain {
     @Schema(description = "用户信息")
     public UserCountSimpleModel userAccount;
 
-    @Schema(description = "使用模式(0:刷卡 1:人脸认证 2:指纹 3:密码)")
-    private Integer mode;
-
     @Schema(description = "使用时间 2024-09-12 20:40:00")
     private String time;
 
     @Schema(description = "时间")
     private Long timestamp;
 
-    @Schema(description = "人脸内容")
-    private String pic;
-
     //-----------------------验证是否通过
 
     @Schema(description = "创建时间,可阅读的")
     private String createTimeStr;
 
-    @Schema(description = "使用是否验证通过")
-    private Boolean isPassed = Boolean.TRUE;
-
     @Schema(description = "提示信息")
     private String msg = "";
 
@@ -99,4 +102,7 @@ public class DeviceUseRecords extends SuperMain {
     @Indexed(expireAfterSeconds = 0)
     private Date ttl;
 
+    @Schema(description = "关联的数据")
+    private Object data;
+
 }

+ 115 - 40
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DeviceUseRecordService.java

@@ -1,18 +1,28 @@
 package com.zhongshu.card.server.core.service.devices;
 
 import cn.hutool.json.JSONUtil;
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.github.microservice.models.gateDoor.gateDoor.GateDoorIotParam;
+import com.github.microservice.models.gateDoor.use.GateDoorInfoParam;
 import com.github.microservice.models.gateDoor.use.GateDoorUseParam;
 import com.github.microservice.models.gateDoor.use.GateDoorUseResult;
 import com.github.microservice.net.ResultContent;
+import com.github.microservice.types.deviceUse.OperateState;
+import com.github.microservice.types.deviceUse.OperateType;
+import com.zhongshu.card.client.model.devices.DeviceInfoModel;
+import com.zhongshu.card.client.model.devices.DeviceInfoSearch;
 import com.zhongshu.card.client.model.devices.DeviceUseRecordModel;
+import com.zhongshu.card.client.model.devices.DeviceUseRecordSearch;
 import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
 import com.zhongshu.card.server.core.dao.devices.DevicePermissDao;
 import com.zhongshu.card.server.core.dao.devices.DeviceUseRecordDao;
+import com.zhongshu.card.server.core.dao.org.OrganizationDao;
 import com.zhongshu.card.server.core.dao.org.UserCountDao;
 import com.zhongshu.card.server.core.dao.school.CardInfoDao;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
 import com.zhongshu.card.server.core.domain.devices.DeviceUseRecords;
+import com.zhongshu.card.server.core.domain.org.Organization;
 import com.zhongshu.card.server.core.domain.org.UserAccount;
 import com.zhongshu.card.server.core.domain.school.CardInfo;
 import com.zhongshu.card.server.core.service.base.SuperService;
@@ -24,8 +34,12 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
+
 /**
  * @author TRX
  * @date 2024/10/21
@@ -58,25 +72,92 @@ public class DeviceUseRecordService extends SuperService {
     @Autowired
     private DeviceInfoServiceImpl deviceInfoService;
 
+    @Autowired
+    private OrganizationDao organizationDao;
+
+    private static Long ttlTime = 60 * 24 * 60 * 60 * 1000L;
+
+    /**
+     * 门闸的开门使用的 参数
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent gateDoorUseRecord(GateDoorIotParam param) {
+        GateDoorUseResult result = new GateDoorUseResult();
+        GateDoorInfoParam info = param.getInfo();
+        log.info("闸机使用记录 gateDoorUseRecord...");
+        if (ObjectUtils.isNotEmpty(info)) {
+            // 封装记录日志参数
+            GateDoorUseParam useParam = new GateDoorUseParam();
+            useParam.setMqttDataId(param.getMqttDataId());
+            useParam.setDeviceId(param.getDeviceId());
+            useParam.setGateWayId(param.getGateWayId());
+
+            String VerifyStatus = info.getVerifyStatus();
+            if (StringUtils.isNotEmpty(VerifyStatus)) {
+                if ("1".equals(VerifyStatus)) {
+                    // 成功
+                    useParam.setOperateState(OperateState.Success);
+                } else if ("2".equals(VerifyStatus)) {
+                    // 失败
+                    useParam.setOperateState(OperateState.Failed);
+                } else {
+                    // 未知
+                    useParam.setOperateState(OperateState.Unknown);
+                }
+            } else {
+                // 未知
+                useParam.setOperateState(OperateState.Unknown);
+            }
+            // 使用操作方式
+            if (StringUtils.isNotEmpty(info.getPic())) {
+                // 人脸形式
+                useParam.setOperateType(OperateType.Face);
+            } else {
+                String cardNum2 = info.getCardNum2();
+                if (StringUtils.isNotEmpty(cardNum2)) {
+                    useParam.setOperateType(OperateType.Card);
+                    useParam.setCardNo(cardNum2);
+                }
+            }
+            if (useParam.getOperateType() == null) {
+                useParam.setOperateType(OperateType.Unknown);
+            }
+            useParam.setTime(info.getTime());
+            useParam.setUserId(info.getCustomId());
+            useParam.setIsOffLine(param.getIsOffLine());
+            useParam.setData(param);
+            ResultContent<DeviceUseRecords> resultContent = saveDeviceLogs(useParam);
+            if (resultContent.isSuccess()) {
+                result.setSuccess("成功");
+            } else {
+                result.setFailed(resultContent.getMsg());
+            }
+        } else {
+            result.setFailed("数据为空");
+        }
+        return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+    }
+
     /**
      * 设备使用日志 (物联网来的数据)
      *
      * @param param
      * @return
      */
-    public ResultContent saveDeviceLogs(GateDoorUseParam param) {
+    public ResultContent<DeviceUseRecords> saveDeviceLogs(GateDoorUseParam param) {
         // 返回数据
-        GateDoorUseResult result = new GateDoorUseResult();
         String mqttDataId = param.getMqttDataId();
+        DeviceUseRecords deviceUseRecord = null;
         log.info("saveDeviceUseRecord mqttDataId: {}", mqttDataId);
         if (StringUtils.isNotEmpty(mqttDataId)) {
-            DeviceUseRecords deviceUseRecord = init(mqttDataId);
+            deviceUseRecord = init(mqttDataId);
             if (ObjectUtils.isNotEmpty(deviceUseRecord)) {
                 BeanUtils.copyProperties(param, deviceUseRecord);
                 String deviceId = param.getDeviceId();
                 String cardNo = param.getCardNo();
                 String userId = param.getUserId();
-
                 String projectOid = "";
                 DeviceInfo deviceInfo = null;
                 if (StringUtils.isNotEmpty(deviceId)) {
@@ -100,7 +181,7 @@ public class DeviceUseRecordService extends SuperService {
                 CardInfo cardInfo = null;
                 if (StringUtils.isNotEmpty(cardNo)) {
                     cardInfo = cardInfoDao.findByCode(cardNo);
-                    if (ObjectUtils.isNotEmpty(cardInfo)) {
+                    if (StringUtils.isEmpty(userId) && ObjectUtils.isNotEmpty(cardInfo)) {
                         userId = cardInfo.getUserId();
                     }
                 }
@@ -116,51 +197,23 @@ public class DeviceUseRecordService extends SuperService {
                 }
                 deviceUseRecord.setUserId(userId);
                 deviceUseRecord.setUserAccount(userAccountService.toSimpleModel(userAccount));
-
                 if (StringUtils.isNotEmpty(param.getTime())) {
                     deviceUseRecord.setTimestamp(DateUtils.timeToLong(param.getTime(), DateUtils.FORMAT_LONG));
                 }
                 deviceUseRecord.setProjectOid(projectOid);
-                // 是否是离线的日志(离线的话已经操作了,不能验证数据)
-                Boolean isOffLine = param.getIsOffLine();
-                if (isOffLine == null) {
-                    isOffLine = Boolean.FALSE;
-                }
-                deviceUseRecord.setIsOffLine(isOffLine);
-                if (isOffLine != null && isOffLine) {
-                    Boolean isPassed = param.getIsPassed();
-                    if (isPassed == null) {
-                        isPassed = Boolean.FALSE;
-                    }
-                    // 离线的数据
-                    deviceUseRecord.setIsPassed(isPassed);
-                    if (isPassed) {
-                        deviceUseRecord.setMsg("操作成功");
-                    } else {
-                        deviceUseRecord.setMsg("验证失败");
-                    }
-                } else {
-                    // 在线验证
-                    checkUseDeviceData(deviceUseRecord);
-                }
-
-                // 最后的返回判断
-                if (deviceUseRecord.getIsPassed() != null && deviceUseRecord.getIsPassed()) {
-                    // 成功
-                    result.setSuccess();
-                } else {
-                    // 失败
-                    result.setFailed(deviceUseRecord.getMsg());
+                Organization organization = organizationDao.findTopByOid(projectOid);
+                if (ObjectUtils.isNotEmpty(organization)) {
+                    deviceUseRecord.setProjectName(organization.getName());
                 }
+                deviceUseRecord.setTtl(new Date(System.currentTimeMillis() + ttlTime));
                 deviceUseRecordDao.save(deviceUseRecord);
             } else {
-                result.setFailed("数据已处理");
+                return ResultContent.buildFail("数据初始失败");
             }
         } else {
-            result.setFailed("mqttDataId为空");
+            return ResultContent.buildFail("mqttDataId为空");
         }
-        result.setMqttDataId(mqttDataId);
-        return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+        return ResultContent.buildSuccess(deviceUseRecord);
     }
 
     public DeviceUseRecords init(String mqttDataId) {
@@ -248,6 +301,28 @@ public class DeviceUseRecordService extends SuperService {
 //        }
     }
 
+    public ResultContent<Page<DeviceUseRecordModel>> page(DeviceUseRecordSearch param, Pageable pageable) {
+        Page<DeviceUseRecords> page = deviceUseRecordDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.concurrent2PageModel(page, this::toModel));
+    }
+
+    public ResultContent getDetail(String id) {
+        DeviceUseRecords entity = deviceUseRecordDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format("数据不存在"));
+        }
+        return ResultContent.buildSuccess(toModel(entity));
+    }
+
+    public ResultContent deleteById(String id) {
+        DeviceUseRecords entity = deviceUseRecordDao.findTopById(id);
+        if (ObjectUtils.isEmpty(entity)) {
+            return ResultContent.buildFail(String.format("数据不存在"));
+        }
+        deviceUseRecordDao.delete(entity);
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 模型转换
      *