TRX 1 год назад
Родитель
Сommit
ba856b808e
22 измененных файлов с 615 добавлено и 39 удалено
  1. 12 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/operLogs/OperationLogsAddParam.java
  2. 83 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/operLogs/OperationLogsModel.java
  3. 41 0
      FullCardClient/src/main/java/com/zhongshu/card/client/model/operLogs/OperationLogsSearchParam.java
  4. 2 5
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoModel.java
  5. 2 5
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoParam.java
  6. 1 1
      FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoSearch.java
  7. 20 0
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/LoginType.java
  8. 20 0
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/LogsLevel.java
  9. 20 0
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/MessageType.java
  10. 18 0
      FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/ResponseCode.java
  11. 43 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/OperationLogsController.java
  12. 1 1
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/DeviceInfoDao.java
  13. 4 4
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceInfoDaoImpl.java
  14. 15 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/user/OperationLogsDao.java
  15. 15 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/user/extend/OperationLogsDaoExtend.java
  16. 78 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/user/impl/OperationLogsDaoImpl.java
  17. 56 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/operlog/OperationLogs.java
  18. 2 2
      FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/DeviceInfo.java
  19. 25 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java
  20. 13 21
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DeviceInfoServiceImpl.java
  21. 58 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/sync/DeviceSyncFromIotService.java
  22. 86 0
      FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/OperationLogsService.java

+ 12 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/operLogs/OperationLogsAddParam.java

@@ -0,0 +1,12 @@
+package com.zhongshu.card.client.model.operLogs;
+
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/5/29
+ */
+@Data
+public class OperationLogsAddParam {
+
+}

+ 83 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/operLogs/OperationLogsModel.java

@@ -0,0 +1,83 @@
+package com.zhongshu.card.client.model.operLogs;
+
+import com.zhongshu.card.client.model.base.SuperModel;
+import com.zhongshu.card.client.utils.type.LoginType;
+import com.zhongshu.card.client.utils.type.LogsLevel;
+import com.zhongshu.card.client.utils.type.MessageType;
+import com.zhongshu.card.client.utils.type.ResponseCode;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/5/29
+ */
+@Data
+public class OperationLogsModel extends SuperModel {
+
+    @Schema(description = "用户ID")
+    private String uid;
+
+    @Schema(description = "登录名")
+    private String loginName;
+
+    @Schema(description = "用户名称")
+    private String userName;
+
+    @Schema(description = "IP地址")
+    private String ip;
+
+    @Schema(description = "浏览器")
+    private String ua;
+
+    @Schema(description = "日志操作端类型")
+    private LoginType loginType;
+
+    private String loginTypeStr;
+
+    public String getLoginTypeStr() {
+        if (loginType != null) {
+            return loginType.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "日志内容")
+    private String content;
+
+    @Schema(description = "日志级别,重要程度")
+    private LogsLevel level;
+
+    private String levelStr;
+
+    public String getLevelStr() {
+        if (level != null) {
+            return level.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "消息类型")
+    private MessageType messageType;
+
+    private String messageTypeStr;
+
+    public String getMessageTypeStr() {
+        if (messageType != null) {
+            return messageType.getRemark();
+        }
+        return "";
+    }
+
+    @Schema(description = "响应姿态")
+    private ResponseCode responseCode;
+
+    private String responseCodeStr;
+
+    public String getResponseCodeStr() {
+        if (responseCode != null) {
+            return responseCode.getRemark();
+        }
+        return "";
+    }
+}

+ 41 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/model/operLogs/OperationLogsSearchParam.java

@@ -0,0 +1,41 @@
+package com.zhongshu.card.client.model.operLogs;
+
+import com.zhongshu.card.client.model.base.SuperSearch;
+import com.zhongshu.card.client.utils.type.LoginType;
+import com.zhongshu.card.client.utils.type.LogsLevel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/5/29
+ */
+@Data
+public class OperationLogsSearchParam extends SuperSearch {
+    @Schema(description = "用户ID")
+    private String uid;
+
+    @Schema(description = "登录名")
+    private String loginName;
+
+    @Schema(description = "用户名称")
+    private String userName;
+
+    @Schema(description = "IP地址")
+    private String ip;
+
+    @Schema(description = "浏览器")
+    private String ua;
+
+    @Schema(description = "日志操作端类型")
+    private LoginType loginType;
+
+    @Schema(description = "日志级别,重要程度")
+    private LogsLevel level;
+
+    @Schema(description = "数据ID")
+    private String dataId;
+
+    @Schema(description = "日志内容")
+    private String content;
+}

+ 2 - 5
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoModel.java

@@ -12,15 +12,12 @@ import lombok.Data;
  */
 @Data
 public class DeviceInfoModel extends SuperModel {
-    @Schema(description = "设备ID")
+    @Schema(description = "设备ID、设备编号")
     private String deviceId;
 
     @Schema(description = "设备名称")
     private String deviceName;
 
-    @Schema(description = "设备编号")
-    private String code;
-
     @Schema(description = "设备类型,如 消费机 门禁机")
     private DeviceType deviceType;
 
@@ -34,7 +31,7 @@ public class DeviceInfoModel extends SuperModel {
     }
 
     @Schema(description = "网关号")
-    private String gateWayCode;
+    private String gateWayId;
 
     @Schema(description = "所属区域")
     private AreaModel area;

+ 2 - 5
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoParam.java

@@ -12,20 +12,17 @@ import lombok.Data;
  */
 @Data
 public class DeviceInfoParam extends SuperParam {
-    @Schema(description = "设备ID")
+    @Schema(description = "设备ID、设备编号")
     private String deviceId;
 
     @Schema(description = "设备名称")
     private String deviceName;
 
-    @Schema(description = "设备编号")
-    private String code;
-
     @Schema(description = "设备类型,如 消费机 门禁机")
     private DeviceType deviceType;
 
     @Schema(description = "网关号")
-    private String gateWayCode;
+    private String gateWayId;
 
     @Schema(description = "所属区域")
     private String areaId;

+ 1 - 1
FullCardClient/src/main/java/com/zhongshu/card/client/model/school/DeviceInfoSearch.java

@@ -29,7 +29,7 @@ public class DeviceInfoSearch extends SuperSearch {
     private DeviceType deviceType;
 
     @Schema(description = "网关号")
-    private String gateWayCode;
+    private String gateWayId;
 
     @Schema(description = "所属区域")
     private String areaId;

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/LoginType.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.utils.type;
+
+import lombok.Getter;
+
+/**
+ *
+ */
+public enum LoginType {
+    Web("Web端"),
+    Xcx("微信小程序"),
+    GateWay("网关"),
+    ;
+
+    @Getter
+    private String remark;
+
+    LoginType(String remark) {
+        this.remark = remark;
+    }
+}

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/LogsLevel.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.utils.type;
+
+import lombok.Getter;
+
+/**
+ * 日志级别
+ */
+public enum LogsLevel {
+    High("高"),
+    Middle("中"),
+    Low("低"),
+    ;
+
+    @Getter
+    private String remark;
+
+    LogsLevel(String remark) {
+        this.remark = remark;
+    }
+}

+ 20 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/MessageType.java

@@ -0,0 +1,20 @@
+package com.zhongshu.card.client.utils.type;
+
+import lombok.Getter;
+
+/**
+ * 数据类型
+ */
+public enum MessageType {
+    Info("消息"),
+    Warn("警告"),
+    Error("故障"),
+    ;
+
+    @Getter
+    private String remark;
+
+    MessageType(String remark) {
+        this.remark = remark;
+    }
+}

+ 18 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/utils/type/ResponseCode.java

@@ -0,0 +1,18 @@
+package com.zhongshu.card.client.utils.type;
+
+import lombok.Getter;
+
+/**
+ * 响应类型
+ */
+public enum ResponseCode {
+    C200("200"),
+    ;
+
+    @Getter
+    private String remark;
+
+    ResponseCode(String remark) {
+        this.remark = remark;
+    }
+}

+ 43 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/user/OperationLogsController.java

@@ -0,0 +1,43 @@
+package com.zhongshu.card.server.core.controller.user;
+
+import com.github.microservice.auth.security.annotations.ResourceAuth;
+import com.github.microservice.auth.security.type.AuthType;
+import com.zhongshu.card.client.model.operLogs.OperationLogsModel;
+import com.zhongshu.card.client.model.operLogs.OperationLogsSearchParam;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.server.core.service.user.OperationLogsService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.web.PageableDefault;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 日志管理 服务
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+@RequestMapping("/operationLogs")
+@RestController
+@Validated
+@Tag(name = "日志管理")
+public class OperationLogsController {
+
+    @Autowired
+    OperationLogsService operationLogsService;
+
+    @ResourceAuth(value = "user", type = AuthType.User)
+    @Operation(summary = "设备列表-分页查询")
+    @RequestMapping(value = {"page"}, method = {RequestMethod.POST})
+    public ResultContent<Page<OperationLogsModel>> page(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable,
+            @Parameter(required = false) OperationLogsSearchParam param) {
+        return operationLogsService.pageLogs(pageable, param);
+    }
+}

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/DeviceInfoDao.java

@@ -19,5 +19,5 @@ public interface DeviceInfoDao extends MongoDao<DeviceInfo>, DeviceInfoDaoExtend
 
     DeviceInfo findTopById(String id);
 
-    DeviceInfo findTopByCodeAndOid(String code, String oid);
+    DeviceInfo findTopByDeviceIdAndOid(String code, String oid);
 }

+ 4 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/school/impl/DeviceInfoDaoImpl.java

@@ -73,9 +73,9 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
             Pattern pattern = Pattern.compile("^.*" + param.getCode() + ".*$");
             criterias.add(Criteria.where("code").is(pattern));
         }
-        if (StringUtils.isNotEmpty(param.getGateWayCode())) {
-            Pattern pattern = Pattern.compile("^.*" + param.getGateWayCode() + ".*$");
-            criterias.add(Criteria.where("gateWayCode").is(pattern));
+        if (StringUtils.isNotEmpty(param.getGateWayId())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getGateWayId() + ".*$");
+            criterias.add(Criteria.where("gateWayId").is(pattern));
         }
 
         if (StringUtils.isNotEmpty(param.getIp())) {
@@ -92,7 +92,7 @@ public class DeviceInfoDaoImpl extends BaseImpl implements DeviceInfoDaoExtend {
                     Criteria.where("deviceId").regex(pattern),
                     Criteria.where("deviceName").regex(pattern),
                     Criteria.where("code").regex(pattern),
-                    Criteria.where("gateWayCode").regex(pattern),
+                    Criteria.where("gateWayId").regex(pattern),
                     Criteria.where("ip").regex(pattern)
             );
         }

+ 15 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/user/OperationLogsDao.java

@@ -0,0 +1,15 @@
+package com.zhongshu.card.server.core.dao.user;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.server.core.dao.user.extend.OperationLogsDaoExtend;
+import com.zhongshu.card.server.core.domain.operlog.OperationLogs;
+
+/**
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface OperationLogsDao extends MongoDao<OperationLogs>, OperationLogsDaoExtend {
+
+    OperationLogs findTopById(String id);
+
+}

+ 15 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/user/extend/OperationLogsDaoExtend.java

@@ -0,0 +1,15 @@
+package com.zhongshu.card.server.core.dao.user.extend;
+
+import com.zhongshu.card.client.model.operLogs.OperationLogsSearchParam;
+import com.zhongshu.card.server.core.domain.operlog.OperationLogs;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/7/7
+ * @Version: 1.0
+ */
+public interface OperationLogsDaoExtend {
+    Page<OperationLogs> page(Pageable pageable, OperationLogsSearchParam param);
+}

+ 78 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/user/impl/OperationLogsDaoImpl.java

@@ -0,0 +1,78 @@
+package com.zhongshu.card.server.core.dao.user.impl;
+
+import com.github.microservice.components.data.mongo.mongo.helper.DBHelper;
+import com.zhongshu.card.client.model.operLogs.OperationLogsSearchParam;
+import com.zhongshu.card.server.core.dao.BaseImpl;
+import com.zhongshu.card.server.core.dao.user.extend.OperationLogsDaoExtend;
+import com.zhongshu.card.server.core.domain.operlog.OperationLogs;
+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.data.domain.Sort;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * @Author TRX
+ * @CreateDate: 2023/4/12
+ * @Version: 1.0
+ */
+public class OperationLogsDaoImpl extends BaseImpl implements OperationLogsDaoExtend {
+
+    @Autowired
+    private MongoTemplate mongoTemplate;
+
+    @Autowired
+    private DBHelper dbHelper;
+
+    @Override
+    public Page<OperationLogs> page(Pageable pageable, OperationLogsSearchParam param) {
+        Criteria criteria = new Criteria();
+
+        if (StringUtils.isNotEmpty(param.getUid())) {
+            criteria.and("uid").is(param.getUid());
+        }
+
+        if (StringUtils.isNotEmpty(param.getOid())) {
+            criteria.and("oid").is(param.getOid());
+        }
+
+        if (param.getLevel() != null) {
+            criteria.and("level").is(param.getLevel());
+        }
+
+        // 日志关联数据ID
+        if (StringUtils.isNotEmpty(param.getDataId())) {
+            criteria.and("dataId").is(param.getDataId());
+        }
+
+        // 模糊搜索
+        List<Criteria> criterias = new ArrayList<>();
+        if (StringUtils.isNotEmpty(param.getContent())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getContent() + ".*$");
+            criterias.add(Criteria.where("content").is(pattern));
+        }
+        if (StringUtils.isNotEmpty(param.getIp())) {
+            Pattern pattern = Pattern.compile("^.*" + param.getIp() + ".*$");
+            criterias.add(Criteria.where("ip").is(pattern));
+        }
+        if (!CollectionUtils.isEmpty(criterias)) {
+            criteria.andOperator(criterias.toArray(new Criteria[]{}));
+        }
+
+        criteria.and("isDelete").is(Boolean.FALSE);
+        Sort sort = buildSort(param);
+
+        Query query = Query.query(criteria);
+        query.with(sort);
+        return dbHelper.pages(query, pageable, OperationLogs.class);
+    }
+
+}

+ 56 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/operlog/OperationLogs.java

@@ -0,0 +1,56 @@
+package com.zhongshu.card.server.core.domain.operlog;
+
+import com.zhongshu.card.client.utils.type.LoginType;
+import com.zhongshu.card.client.utils.type.LogsLevel;
+import com.zhongshu.card.client.utils.type.MessageType;
+import com.zhongshu.card.client.utils.type.ResponseCode;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/5/27
+ */
+@Data
+public class OperationLogs extends SuperMain {
+
+    @Schema(description = "用户ID")
+    private String uid;
+
+    @Schema(description = "登录名")
+    private String loginName;
+
+    @Schema(description = "用户名称")
+    private String userName;
+
+    @Schema(description = "IP地址")
+    private String ip;
+
+    @Schema(description = "浏览器")
+    private String ua;
+
+    @Schema(description = "日志操作端类型")
+    private LoginType loginType;
+
+    @Schema(description = "日志内容")
+    private String content;
+
+    @Schema(description = "日志级别,重要程度")
+    private LogsLevel level;
+
+    @Schema(description = "时间")
+    private String time;
+
+    @Schema(description = "管理数据ID")
+    private String dataId;
+
+    @Schema(description = "关联保存关联信息")
+    private Object backObj;
+
+    @Schema(description = "消息类型")
+    private MessageType messageType;
+
+    @Schema(description = "响应姿态")
+    private ResponseCode responseCode;
+}

+ 2 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/school/DeviceInfo.java

@@ -22,7 +22,7 @@ import org.springframework.data.mongodb.core.mapping.Document;
 @AllArgsConstructor
 public class DeviceInfo extends SuperMain {
 
-    @Schema(description = "设备ID")
+    @Schema(description = "设备ID、设备号")
     private String deviceId;
 
     @Schema(description = "设备名称")
@@ -35,7 +35,7 @@ public class DeviceInfo extends SuperMain {
     private DeviceType deviceType;
 
     @Schema(description = "网关号")
-    private String gateWayCode;
+    private String gateWayId;
 
     @Schema(description = "所属区域")
     @DBRef(lazy = true)

+ 25 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/base/SuperService.java

@@ -85,6 +85,20 @@ public abstract class SuperService {
         }
     }
 
+    public void initEntityNoCheckOid(SuperMain entity) {
+        if (entity != null) {
+            String oid = entity.getOid();
+            if (StringUtils.isEmpty(oid)) {
+                entity.setOid(getCurrentOid());
+            }
+            if (authHelper != null && authHelper.getCurrentUser() != null) {
+                entity.setCreateUserId(authHelper.getCurrentUser().getUserId());
+                entity.setCreateUserName(authHelper.getCurrentUser().getUserName());
+                entity.setCreatePhone(authHelper.getCurrentUser().getPhone());
+            }
+        }
+    }
+
     /**
      * 填充当前用户和oid信息 (oid为空会抛出异常)
      *
@@ -98,6 +112,17 @@ public abstract class SuperService {
         }
     }
 
+    public void initDefaultUserAndOidNoExcept(SuperParam param) {
+        initDefaultUserParam(param);
+        String oid = param.getOid();
+        if (StringUtils.isEmpty(oid)) {
+            param.setOid(getCurrentOid());
+        }
+        if (param.getId() != null && param.getId().trim().equals("")) {
+            param.setId(null);
+        }
+    }
+
     public void initDefaultUserParam(SuperParam param) {
         if (authHelper != null && authHelper.getCurrentUser() != null && StringUtils.isEmpty(param.getCreateUserId())) {
             param.setCreateUserId(authHelper.getCurrentUser().getUserId());

+ 13 - 21
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/school/DeviceInfoServiceImpl.java

@@ -46,36 +46,28 @@ public class DeviceInfoServiceImpl extends SuperService implements DeviceInfoSer
      */
     @Override
     public ResultContent addDeviceInfo(DeviceInfoParam param) {
-        initDefaultUserAndOid(param);
-        Assert.hasText(param.getCode(), "code不能为空");
-
+        initDefaultUserAndOidNoExcept(param);
+        Assert.hasText(param.getDeviceId(), "deviceId不能为空");
         String oid = param.getOid();
-        DeviceInfo deviceInfo = null;
-        if (StringUtils.isNotEmpty(param.getId())) {
-            deviceInfo = deviceInfoDao.findTopById(param.getId());
-            if (ObjectUtils.isEmpty(deviceInfo)) {
-                return ResultContent.buildFail(String.format(ResultMessage.DATA_NOT_EXIST, param.getId()));
-            }
-            DeviceInfo temp = deviceInfoDao.findTopByCodeAndOid(param.getCode(), oid);
-            if (ObjectUtils.isNotEmpty(temp) && !temp.getId().equals(deviceInfo.getId())) {
-                return ResultContent.buildFail(String.format("设备号已存在:%s", param.getCode()));
-            }
+        if(StringUtils.isEmpty(oid)) {
+            return ResultContent.buildFail("oid不能为空");
+        }
+        String deviceId = param.getDeviceId();
+        DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceIdAndOid(deviceId, oid);
+        if (ObjectUtils.isNotEmpty(deviceInfo)) {
+
         } else {
             deviceInfo = new DeviceInfo();
-            DeviceInfo temp = deviceInfoDao.findTopByCodeAndOid(param.getCode(), oid);
-            if (ObjectUtils.isNotEmpty(temp)) {
-                return ResultContent.buildFail(String.format("设备号已存在:%s", param.getCode()));
-            }
         }
-        BeanUtils.copyProperties(param, deviceInfo);
-        Area area = null;
+        BeanUtils.copyProperties(param, deviceInfo, "id");
+
         if (StringUtils.isNotEmpty(param.getAreaId())) {
-            area = areaDao.findTopById(param.getAreaId());
+            Area area = areaDao.findTopById(param.getAreaId());
             if (ObjectUtils.isEmpty(area)) {
                 return ResultContent.buildFail(String.format("区域ID不存在:%s", param.getAreaId()));
             }
+            deviceInfo.setArea(area);
         }
-        deviceInfo.setArea(area);
         deviceInfoDao.save(deviceInfo);
         return ResultContent.buildSuccess();
     }

+ 58 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/sync/DeviceSyncFromIotService.java

@@ -1,13 +1,27 @@
 package com.zhongshu.card.server.core.service.sync;
 
+import com.github.microservice.models.device.DeviceInfoSyncParam;
 import com.github.microservice.models.device.DeviceSyncListParam;
+import com.zhongshu.card.client.model.school.DeviceInfoParam;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.service.school.DeviceInfoService;
+import com.zhongshu.card.client.utils.type.LogsLevel;
+import com.zhongshu.card.client.utils.type.OrganizationRelationType;
 import com.zhongshu.card.server.core.dao.org.OrganizationDao;
+import com.zhongshu.card.server.core.dao.org.OrganizationRelationDao;
+import com.zhongshu.card.server.core.domain.org.Organization;
+import com.zhongshu.card.server.core.domain.org.OrganizationRelation;
+import com.zhongshu.card.server.core.service.user.OperationLogsService;
+import com.zhongshu.card.server.core.util.BeanUtils;
 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.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @author TRX
  * @date 2024/6/27
@@ -22,6 +36,12 @@ public class DeviceSyncFromIotService {
     @Autowired
     OrganizationDao organizationDao;
 
+    @Autowired
+    OrganizationRelationDao organizationRelationDao;
+
+    @Autowired
+    OperationLogsService operationLogsService;
+
     /**
      * 物联网同步设备
      *
@@ -29,7 +49,45 @@ public class DeviceSyncFromIotService {
      * @return
      */
     public ResultContent syncFromIotDevices(DeviceSyncListParam param) {
+        log.info("syncFromIotDevices");
+        List<DeviceInfoSyncParam> list = param.getList();
+        if (ObjectUtils.isNotEmpty(list)) {
+            for (DeviceInfoSyncParam deviceInfoSyncParam : list) {
+                String projectInfoCode = deviceInfoSyncParam.getProjectInfoCode();
+                List<OrganizationRelation> organizationRelations = new ArrayList<>();
+                // 查询学校绑定的项目
+                if (StringUtils.isNotEmpty(projectInfoCode)) {
+                    Organization project = organizationDao.findTopByCode(projectInfoCode);
+                    if (ObjectUtils.isNotEmpty(project)) {
+                        organizationRelations =
+                                organizationRelationDao.findByRelOrganizationAndRelationType(project, OrganizationRelationType.SchoolToProject);
+                    }
+                }
+                if (ObjectUtils.isNotEmpty(organizationRelations)) {
+                    for (OrganizationRelation relation : organizationRelations) {
+                        // 没有关联的学校信息
+                        DeviceInfoParam deviceInfoParam = new DeviceInfoParam();
+                        BeanUtils.copyProperties(deviceInfoSyncParam, deviceInfoParam);
+                        // 设置学校的Oid
+                        deviceInfoParam.setOid(relation.getMainOrganization().getOid());
+                        ResultContent resultContent = deviceInfoService.addDeviceInfo(deviceInfoParam);
+                        if (resultContent.isSuccess()) {
+                            operationLogsService.addLogs("", LogsLevel.Middle);
+                        } else {
 
+                        }
+                    }
+                } else {
+                    // 没有关联的学校信息
+                    DeviceInfoParam deviceInfoParam = new DeviceInfoParam();
+                    BeanUtils.copyProperties(deviceInfoSyncParam, deviceInfoParam);
+                    ResultContent content = deviceInfoService.addDeviceInfo(deviceInfoParam);
+                    if (content.isFailed()) {
+                        log.error("同步设备出错: {}", content.getMsg());
+                    }
+                }
+            }
+        }
         return ResultContent.buildSuccess();
     }
 

+ 86 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/user/OperationLogsService.java

@@ -0,0 +1,86 @@
+package com.zhongshu.card.server.core.service.user;
+
+import com.github.microservice.components.data.base.util.PageEntityUtil;
+import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
+import com.zhongshu.card.client.model.operLogs.OperationLogsModel;
+import com.zhongshu.card.client.model.operLogs.OperationLogsSearchParam;
+import com.zhongshu.card.client.ret.ResultContent;
+import com.zhongshu.card.client.utils.type.LogsLevel;
+import com.zhongshu.card.server.core.dao.org.UserCountDao;
+import com.zhongshu.card.server.core.dao.user.OperationLogsDao;
+import com.zhongshu.card.server.core.domain.operlog.OperationLogs;
+import com.zhongshu.card.server.core.domain.org.UserAccount;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.DateUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author TRX
+ * @date 2024/5/24
+ */
+@Slf4j
+@Service
+public class OperationLogsService extends SuperService {
+    @Autowired
+    OperationLogsDao operationLogsDao;
+
+    @Autowired
+    UserCountDao userDao;
+
+    public ResultContent addLogs(String content, LogsLevel level) {
+        OperationLogs logs = new OperationLogs();
+        initEntityNoCheckOid(logs);
+        logs.setContent(content);
+        if (level == null) {
+            level = LogsLevel.Low;
+        }
+        logs.setLevel(level);
+        logs.setTime(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
+        operationLogsDao.save(logs);
+        return ResultContent.buildSuccess();
+    }
+
+    public ResultContent addLogs(String content, LogsLevel level, SuperEntity entity) {
+        OperationLogs logs = new OperationLogs();
+        initEntityNoCheckOid(logs);
+        logs.setContent(content);
+        if (level == null) {
+            level = LogsLevel.Low;
+        }
+        logs.setLevel(level);
+        logs.setTime(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
+        if (ObjectUtils.isNotEmpty(entity)) {
+            logs.setDataId(entity.getId());
+            logs.setBackObj(entity);
+        }
+        operationLogsDao.save(logs);
+        return ResultContent.buildSuccess();
+    }
+
+    /**
+     * 日志列表
+     *
+     * @param pageable
+     * @param param
+     * @return
+     */
+    public ResultContent<Page<OperationLogsModel>> pageLogs(Pageable pageable, OperationLogsSearchParam param) {
+        Page<OperationLogs> page = operationLogsDao.page(pageable, param);
+        return ResultContent.buildSuccess(PageEntityUtil.toPageModel(page, this::toModel));
+    }
+
+    public OperationLogsModel toModel(OperationLogs entity) {
+        OperationLogsModel model = new OperationLogsModel();
+        if (ObjectUtils.isNotEmpty(entity)) {
+            BeanUtils.copyProperties(entity, model);
+        }
+        return model;
+    }
+
+}