Browse Source

设备层级网关,绑定主从设备

bfzgs 2 years ago
parent
commit
70ab141a70
20 changed files with 467 additions and 325 deletions
  1. 0 1
      .idea/modules.xml
  2. 7 0
      final-common/src/main/java/org/brynhild/graduation/common/constant/DeviceConstant.java
  3. 0 0
      final-device.iml
  4. 26 0
      final-device/src/main/java/org/brynhild/graduation/device/controller/AdminController.groovy
  5. 5 9
      final-device/src/main/java/org/brynhild/graduation/device/controller/TestController.java
  6. 113 84
      final-device/src/main/java/org/brynhild/graduation/device/factory/OperationLogFactory.groovy
  7. 91 76
      final-device/src/main/java/org/brynhild/graduation/device/factory/SpecificationFactory.java
  8. 5 0
      final-device/src/main/java/org/brynhild/graduation/device/service/IAdminService.groovy
  9. 123 3
      final-device/src/main/java/org/brynhild/graduation/device/service/impl/AdminServiceImpl.groovy
  10. 0 8
      final-event.iml
  11. 3 0
      final-persistence/src/main/java/org/brynhild/graduation/persistence/device/entity/Device.java
  12. 31 0
      final-persistence/src/main/java/org/brynhild/graduation/persistence/device/entity/DeviceRelationship.java
  13. 11 0
      final-persistence/src/main/java/org/brynhild/graduation/persistence/device/repository/DeviceRelationshipRepository.groovy
  14. 19 0
      final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/AdminAddRelationship.java
  15. 13 0
      final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/AdminDeleteRelationship.java
  16. 7 0
      final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/BindDevice.java
  17. 13 0
      final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/QueryRelationshipRequest.java
  18. 0 8
      final-trigger.iml
  19. 0 136
      logGenerate.groovy
  20. 0 0
      specificationGenerate.groovy

+ 0 - 1
.idea/modules.xml

@@ -2,7 +2,6 @@
 <project version="4">
   <component name="ProjectModuleManager">
     <modules>
-      <module fileurl="file://$PROJECT_DIR$/final-event.iml" filepath="$PROJECT_DIR$/final-event.iml" />
       <module fileurl="file://$PROJECT_DIR$/final-project-parent.iml" filepath="$PROJECT_DIR$/final-project-parent.iml" />
     </modules>
   </component>

+ 7 - 0
final-common/src/main/java/org/brynhild/graduation/common/constant/DeviceConstant.java

@@ -0,0 +1,7 @@
+package org.brynhild.graduation.common.constant;
+
+public class DeviceConstant {
+    public static final Integer TERMINAL=0;
+    public static final Integer PRIMARY_GATEWAY=1;
+    public static final Integer SECONDARY_GATEWAY=2;
+}

+ 0 - 0
final-builder.iml → final-device.iml


+ 26 - 0
final-device/src/main/java/org/brynhild/graduation/device/controller/AdminController.groovy

@@ -121,6 +121,32 @@ class AdminController {
         return adminService.findSignInRecord(request)
     }
 
+    @PostMapping("/relationship/add")
+    Result addRelationship(@RequestBody @Validated AdminAddRelationship info,BindingResult result,
+    @RequestHeader(AccountConstant.ACCOUNT_HEADER) String token){
+        if (result.hasErrors()) {
+            return verifier.convertToErrors(result)
+        }
+        return adminService.addRelationship(info,token)
+    }
+
+    @PostMapping("/relationship")
+    Result findRelationship(@RequestBody @Validated QueryRelationshipRequest request,BindingResult result){
+        if (result.hasErrors()) {
+            return verifier.convertToErrors(result)
+        }
+        return adminService.findRelationship(request)
+    }
+
+    @DeleteMapping("/relationship")
+    Result deleteRelationship(@RequestBody @Validated AdminDeleteRelationship info,BindingResult result,
+    @RequestHeader(AccountConstant.ACCOUNT_HEADER) String token){
+        if (result.hasErrors()) {
+            return verifier.convertToErrors(result)
+        }
+        return adminService.deleteRelationship(info,token)
+    }
+
 
     @Autowired
     @Resource

+ 5 - 9
final-device/src/main/java/org/brynhild/graduation/device/controller/TestController.java

@@ -1,5 +1,6 @@
 package org.brynhild.graduation.device.controller;
 
+import jakarta.annotation.PostConstruct;
 import org.brynhild.graduation.common.parser.LogGenerator;
 import org.brynhild.graduation.common.parser.SpecificationGenerator;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -12,15 +13,10 @@ import java.io.File;
 @RequestMapping("/test")
 public class TestController {
 
-    @GetMapping("/log")
-    public String generateLog() {
-        return LogGenerator.generate(new File("logGenerate.groovy"), "org.brynhild.graduation.transfer.device") ? "ok" : "error";
+    @PostConstruct
+    public void init(){
+        LogGenerator.generate(new File("logGenerate.groovy"), "org.brynhild.graduation.transfer.device");
+        SpecificationGenerator.generate(new File("specificationGenerate.groovy"), "org.brynhild.graduation.transfer.device");
 
     }
-
-    @GetMapping("/find")
-    public String generateSpecification() {
-        return SpecificationGenerator.generate(new File("specificationGenerate.groovy"), "org.brynhild.graduation.transfer.device") ? "ok" : "error";
-    }
-
 }

+ 113 - 84
final-device/src/main/java/org/brynhild/graduation/device/factory/OperationLogFactory.groovy

@@ -4,6 +4,7 @@ import org.brynhild.graduation.common.utils.StringUtil
 import org.brynhild.graduation.persistence.device.entity.Area
 import org.brynhild.graduation.persistence.device.entity.Credential
 import org.brynhild.graduation.persistence.device.entity.Device
+import org.brynhild.graduation.persistence.device.entity.DeviceRelationship
 import org.brynhild.graduation.persistence.log.entity.OperationLog
 import org.brynhild.graduation.transfer.device.vo.*
 import org.springframework.stereotype.Component
@@ -13,137 +14,165 @@ class OperationLogFactory {
     private final String ln = "\r\n";
 
 
-    OperationLog generateLogWithAdminModifyArea(AdminModifyArea info, Area target) {
-        def log = new OperationLog()
-        def originData = target.toString()
-        def builder = new StringBuilder()
-        if (info.owner != null) {
+    OperationLog generateLogWithAdminAddCredential(AdminAddCredential info,Credential target){
+        def log=new OperationLog()
+        def originData=target.toString()
+        def builder=new StringBuilder()
+        if(info.userId!=null){
+            builder.append("管理员").append("修改了用户id为: ").append(info.userId).append(ln)
+            target.userId = info.userId
+        }
+        if(!StringUtil.isEmpty(info.userCredential)){
+            builder.append("管理员").append("修改了用户身份标识符为: ").append(info.userCredential).append(ln)
+            target.userCredential = info.userCredential
+        }
+        if(info.areaId!=null){
+            builder.append("管理员").append("修改了区域id为: ").append(info.areaId).append(ln)
+            target.areaId = info.areaId
+        }
+        if(info.deviceId!=null){
+            builder.append("管理员").append("修改了设备id为: ").append(info.deviceId).append(ln)
+            target.deviceId = info.deviceId
+        }
+        def newData=info.toString()
+        log.originData=originData
+        log.newData=newData
+        log.description=builder.toString()
+        log
+    }
+
+
+    OperationLog generateLogWithAdminAddRelationship(AdminAddRelationship info, DeviceRelationship target){
+        def log=new OperationLog()
+        def originData=target.toString()
+        def builder=new StringBuilder()
+        if(info.master!=null){
+            builder.append("用户").append("修改了主设备为: ").append(info.master).append(ln)
+            target.master = info.master
+        }
+        if(info.slave!=null){
+            builder.append("用户").append("修改了从设备为: ").append(info.slave).append(ln)
+            target.slave = info.slave
+        }
+        def newData=info.toString()
+        log.originData=originData
+        log.newData=newData
+        log.description=builder.toString()
+        log
+    }
+
+
+    OperationLog generateLogWithAdminModifyArea(AdminModifyArea info,Area target){
+        def log=new OperationLog()
+        def originData=target.toString()
+        def builder=new StringBuilder()
+        if(info.owner!=null){
             builder.append("管理员").append("修改了负责人为: ").append(info.owner).append(ln)
             target.owner = info.owner
         }
-        if (!StringUtil.isEmpty(info.name)) {
+        if(!StringUtil.isEmpty(info.name)){
             builder.append("管理员").append("修改了区域为: ").append(info.name).append(ln)
             target.name = info.name
         }
-        if (!StringUtil.isEmpty(info.note)) {
+        if(!StringUtil.isEmpty(info.note)){
             builder.append("管理员").append("修改了备注信息为: ").append(info.note).append(ln)
             target.note = info.note
         }
-        def newData = info.toString()
-        log.originData = originData
-        log.newData = newData
-        log.description = builder.toString()
+        def newData=info.toString()
+        log.originData=originData
+        log.newData=newData
+        log.description=builder.toString()
         log
     }
 
 
-    OperationLog generateLogWithBindDevice(BindDevice info, Device target) {
-        def log = new OperationLog()
-        def originData = target.toString()
-        def builder = new StringBuilder()
-        if (!StringUtil.isEmpty(info.mac)) {
-            builder.append("管理员").append("修改了mac地址为: ").append(info.mac).append(ln)
-            target.mac = info.mac
+    OperationLog generateLogWithAdminAddArea(AdminAddArea info,Area target){
+        def log=new OperationLog()
+        def originData=target.toString()
+        def builder=new StringBuilder()
+        if(info.owner!=null){
+            builder.append("管理员").append("修改了负责人为: ").append(info.owner).append(ln)
+            target.owner = info.owner
         }
-        if (info.area != null) {
-            builder.append("管理员").append("修改了区域为: ").append(info.area).append(ln)
-            target.area = info.area
+        if(!StringUtil.isEmpty(info.name)){
+            builder.append("管理员").append("修改了区域为: ").append(info.name).append(ln)
+            target.name = info.name
         }
-        if (!StringUtil.isEmpty(info.note)) {
+        if(!StringUtil.isEmpty(info.note)){
             builder.append("管理员").append("修改了备注信息为: ").append(info.note).append(ln)
             target.note = info.note
         }
-        if (!StringUtil.isEmpty(info.name)) {
-            builder.append("管理员").append("修改了设备名称为: ").append(info.name).append(ln)
-            target.name = info.name
-        }
-        def newData = info.toString()
-        log.originData = originData
-        log.newData = newData
-        log.description = builder.toString()
+        def newData=info.toString()
+        log.originData=originData
+        log.newData=newData
+        log.description=builder.toString()
         log
     }
 
 
-    OperationLog generateLogWithAdminModifyDevice(AdminModifyDevice info, Device target) {
-        def log = new OperationLog()
-        def originData = target.toString()
-        def builder = new StringBuilder()
-        if (info.owner != null) {
+    OperationLog generateLogWithAdminModifyDevice(AdminModifyDevice info,Device target){
+        def log=new OperationLog()
+        def originData=target.toString()
+        def builder=new StringBuilder()
+        if(info.owner!=null){
             builder.append("管理员").append("修改了所有者为: ").append(info.owner).append(ln)
             target.owner = info.owner
         }
-        if (info.area != null) {
+        if(info.area!=null){
             builder.append("管理员").append("修改了区域为: ").append(info.area).append(ln)
             target.area = info.area
         }
-        if (!StringUtil.isEmpty(info.name)) {
+        if(!StringUtil.isEmpty(info.name)){
             builder.append("管理员").append("修改了设备名称为: ").append(info.name).append(ln)
             target.name = info.name
         }
-        if (info.active != null) {
+        if(info.active!=null){
             builder.append("管理员").append("修改了激活状态为: ").append(info.active).append(ln)
             target.active = info.active
         }
-        if (!StringUtil.isEmpty(info.note)) {
+        if(!StringUtil.isEmpty(info.note)){
             builder.append("管理员").append("修改了备注信息为: ").append(info.note).append(ln)
             target.note = info.note
         }
-        def newData = info.toString()
-        log.originData = originData
-        log.newData = newData
-        log.description = builder.toString()
+        def newData=info.toString()
+        log.originData=originData
+        log.newData=newData
+        log.description=builder.toString()
         log
     }
 
 
-    OperationLog generateLogWithAdminAddCredential(AdminAddCredential info, Credential target) {
-        def log = new OperationLog()
-        def originData = target.toString()
-        def builder = new StringBuilder()
-        if (info.userId != null) {
-            builder.append("管理员").append("修改了用户id为: ").append(info.userId).append(ln)
-            target.userId = info.userId
-        }
-        if (!StringUtil.isEmpty(info.userCredential)) {
-            builder.append("管理员").append("修改了用户身份标识符为: ").append(info.userCredential).append(ln)
-            target.userCredential = info.userCredential
-        }
-        if (info.areaId != null) {
-            builder.append("管理员").append("修改了区域id为: ").append(info.areaId).append(ln)
-            target.areaId = info.areaId
+    OperationLog generateLogWithBindDevice(BindDevice info,Device target){
+        def log=new OperationLog()
+        def originData=target.toString()
+        def builder=new StringBuilder()
+        if(!StringUtil.isEmpty(info.mac)){
+            builder.append("管理员").append("修改了mac地址为: ").append(info.mac).append(ln)
+            target.mac = info.mac
         }
-        if (info.deviceId != null) {
-            builder.append("管理员").append("修改了设备id为: ").append(info.deviceId).append(ln)
-            target.deviceId = info.deviceId
+        if(info.type!=null){
+            builder.append("管理员").append("修改了设备类型为: ").append(info.type).append(ln)
+            target.type = info.type
         }
-        def newData = info.toString()
-        log.originData = originData
-        log.newData = newData
-        log.description = builder.toString()
-        log
-    }
-
-    OperationLog generateLogWithAdminAddArea(AdminAddArea info, Area target) {
-        def log = new OperationLog()
-        def originData = target.toString()
-        def builder = new StringBuilder()
-        if (info.owner != null) {
-            builder.append("管理员").append("修改了负责人为: ").append(info.owner).append(ln)
-            target.owner = info.owner
-        }
-        if (!StringUtil.isEmpty(info.name)) {
-            builder.append("管理员").append("修改了区域为: ").append(info.name).append(ln)
-            target.name = info.name
+        if(info.area!=null){
+            builder.append("管理员").append("修改了区域为: ").append(info.area).append(ln)
+            target.area = info.area
         }
-        if (!StringUtil.isEmpty(info.note)) {
+        if(!StringUtil.isEmpty(info.note)){
             builder.append("管理员").append("修改了备注信息为: ").append(info.note).append(ln)
             target.note = info.note
         }
-        def newData = info.toString()
-        log.originData = originData
-        log.newData = newData
-        log.description = builder.toString()
+        if(!StringUtil.isEmpty(info.name)){
+            builder.append("管理员").append("修改了设备名称为: ").append(info.name).append(ln)
+            target.name = info.name
+        }
+        def newData=info.toString()
+        log.originData=originData
+        log.newData=newData
+        log.description=builder.toString()
         log
     }
+
+
+
 }

+ 91 - 76
final-device/src/main/java/org/brynhild/graduation/device/factory/SpecificationFactory.java

@@ -2,14 +2,8 @@ package org.brynhild.graduation.device.factory;
 
 import jakarta.persistence.criteria.Predicate;
 import org.brynhild.graduation.common.utils.StringUtil;
-import org.brynhild.graduation.persistence.device.entity.Area;
-import org.brynhild.graduation.persistence.device.entity.Credential;
-import org.brynhild.graduation.persistence.device.entity.Device;
-import org.brynhild.graduation.persistence.device.entity.SignInRecord;
-import org.brynhild.graduation.transfer.device.vo.QueryAreaRequest;
-import org.brynhild.graduation.transfer.device.vo.QueryCredentialRequest;
-import org.brynhild.graduation.transfer.device.vo.QueryDeviceRequest;
-import org.brynhild.graduation.transfer.device.vo.QuerySignInRecordRequest;
+import org.brynhild.graduation.persistence.device.entity.*;
+import org.brynhild.graduation.transfer.device.vo.*;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Component;
 
@@ -20,126 +14,147 @@ import java.util.List;
 public class SpecificationFactory {
 
 
-    public Specification<Area> getAreaSpecification(QueryAreaRequest info) {
+    public Specification<Area> getAreaSpecification(QueryAreaRequest info){
         return (root, query, criteriaBuilder) -> {
-            List<Predicate> predicateList = new ArrayList<>();
-            if (info.getOwner() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("owner").as(Long.class), info.getOwner()));
+            List<Predicate> predicateList=new ArrayList<>();
+            if(info.getOwner()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("owner").as(Long.class),info.getOwner()));
             }
-            if (!StringUtil.isEmpty(info.getName())) {
-                predicateList.add(criteriaBuilder.like(root.get("name").as(String.class), "%" + info.getName() + "%"));
+            if(!StringUtil.isEmpty(info.getName())){
+                predicateList.add(criteriaBuilder.like(root.get("name").as(String.class),"%"+info.getName()+"%"));
             }
-            if (predicateList.isEmpty()) {
+            if(predicateList.isEmpty()){
                 return null;
             }
-            Predicate predicate = predicateList.get(0);
-            for (int i = 1; i < predicateList.size(); i++) {
-                predicate = criteriaBuilder.and(predicate, predicateList.get(i));
+            Predicate predicate=predicateList.get(0);
+            for(int i=1;i<predicateList.size();i++){
+                predicate=criteriaBuilder.and(predicate,predicateList.get(i));
             }
             return predicate;
         };
     }
 
 
-    public Specification<Credential> getCredentialSpecification(QueryCredentialRequest info) {
+    public Specification<Device> getDeviceSpecification(QueryDeviceRequest info){
         return (root, query, criteriaBuilder) -> {
-            List<Predicate> predicateList = new ArrayList<>();
-            if (info.getUserId() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("userId").as(Long.class), info.getUserId()));
+            List<Predicate> predicateList=new ArrayList<>();
+            if(info.getOwner()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("owner").as(Long.class),info.getOwner()));
             }
-            if (!StringUtil.isEmpty(info.getUserCredential())) {
-                predicateList.add(criteriaBuilder.like(root.get("userCredential").as(String.class), "%" + info.getUserCredential() + "%"));
+            if(info.getArea()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("area").as(Long.class),info.getArea()));
             }
-            if (info.getAreaId() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("areaId").as(Long.class), info.getAreaId()));
+            if(!StringUtil.isEmpty(info.getMac())){
+                predicateList.add(criteriaBuilder.like(root.get("mac").as(String.class),"%"+info.getMac()+"%"));
             }
-            if (info.getDeviceId() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("deviceId").as(Long.class), info.getDeviceId()));
+            if(!StringUtil.isEmpty(info.getName())){
+                predicateList.add(criteriaBuilder.like(root.get("name").as(String.class),"%"+info.getName()+"%"));
             }
-            if (!StringUtil.isEmpty(info.getUserName())) {
-                predicateList.add(criteriaBuilder.like(root.get("userName").as(String.class), "%" + info.getUserName() + "%"));
+            if(info.getActive()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("active").as(Boolean.class),info.getActive()));
             }
-            if (!StringUtil.isEmpty(info.getAreaName())) {
-                predicateList.add(criteriaBuilder.like(root.get("areaName").as(String.class), "%" + info.getAreaName() + "%"));
+            if(predicateList.isEmpty()){
+                return null;
             }
-            if (!StringUtil.isEmpty(info.getDeviceName())) {
-                predicateList.add(criteriaBuilder.like(root.get("deviceName").as(String.class), "%" + info.getDeviceName() + "%"));
+            Predicate predicate=predicateList.get(0);
+            for(int i=1;i<predicateList.size();i++){
+                predicate=criteriaBuilder.and(predicate,predicateList.get(i));
             }
-            if (!StringUtil.isEmpty(info.getDeviceMac())) {
-                predicateList.add(criteriaBuilder.like(root.get("deviceMac").as(String.class), "%" + info.getDeviceMac() + "%"));
+            return predicate;
+        };
+    }
+
+
+    public Specification<DeviceRelationship> getDeviceRelationshipSpecification(QueryRelationshipRequest info){
+        return (root, query, criteriaBuilder) -> {
+            List<Predicate> predicateList=new ArrayList<>();
+            if(info.getMaster()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("master").as(Long.class),info.getMaster()));
             }
-            if (info.getActive() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("active").as(Boolean.class), info.getActive()));
+            if(info.getSlave()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("slave").as(Long.class),info.getSlave()));
             }
-            if (predicateList.isEmpty()) {
+            if(predicateList.isEmpty()){
                 return null;
             }
-            Predicate predicate = predicateList.get(0);
-            for (int i = 1; i < predicateList.size(); i++) {
-                predicate = criteriaBuilder.and(predicate, predicateList.get(i));
+            Predicate predicate=predicateList.get(0);
+            for(int i=1;i<predicateList.size();i++){
+                predicate=criteriaBuilder.and(predicate,predicateList.get(i));
             }
             return predicate;
         };
     }
 
 
-    public Specification<SignInRecord> getSignInRecordSpecification(QuerySignInRecordRequest info) {
+    public Specification<SignInRecord> getSignInRecordSpecification(QuerySignInRecordRequest info){
         return (root, query, criteriaBuilder) -> {
-            List<Predicate> predicateList = new ArrayList<>();
-            if (info.getUserId() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("userId").as(Long.class), info.getUserId()));
+            List<Predicate> predicateList=new ArrayList<>();
+            if(info.getUserId()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("userId").as(Long.class),info.getUserId()));
             }
-            if (info.getAreaId() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("areaId").as(Long.class), info.getAreaId()));
+            if(info.getAreaId()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("areaId").as(Long.class),info.getAreaId()));
             }
-            if (info.getDeviceId() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("deviceId").as(Long.class), info.getDeviceId()));
+            if(info.getDeviceId()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("deviceId").as(Long.class),info.getDeviceId()));
             }
-            if (!StringUtil.isEmpty(info.getUserName())) {
-                predicateList.add(criteriaBuilder.like(root.get("userName").as(String.class), "%" + info.getUserName() + "%"));
+            if(!StringUtil.isEmpty(info.getUserName())){
+                predicateList.add(criteriaBuilder.like(root.get("userName").as(String.class),"%"+info.getUserName()+"%"));
             }
-            if (!StringUtil.isEmpty(info.getAreaName())) {
-                predicateList.add(criteriaBuilder.like(root.get("areaName").as(String.class), "%" + info.getAreaName() + "%"));
+            if(!StringUtil.isEmpty(info.getAreaName())){
+                predicateList.add(criteriaBuilder.like(root.get("areaName").as(String.class),"%"+info.getAreaName()+"%"));
             }
-            if (!StringUtil.isEmpty(info.getDeviceName())) {
-                predicateList.add(criteriaBuilder.like(root.get("deviceName").as(String.class), "%" + info.getDeviceName() + "%"));
+            if(!StringUtil.isEmpty(info.getDeviceName())){
+                predicateList.add(criteriaBuilder.like(root.get("deviceName").as(String.class),"%"+info.getDeviceName()+"%"));
             }
-            if (predicateList.isEmpty()) {
+            if(predicateList.isEmpty()){
                 return null;
             }
-            Predicate predicate = predicateList.get(0);
-            for (int i = 1; i < predicateList.size(); i++) {
-                predicate = criteriaBuilder.and(predicate, predicateList.get(i));
+            Predicate predicate=predicateList.get(0);
+            for(int i=1;i<predicateList.size();i++){
+                predicate=criteriaBuilder.and(predicate,predicateList.get(i));
             }
             return predicate;
         };
     }
 
 
-    public Specification<Device> getDeviceSpecification(QueryDeviceRequest info) {
+    public Specification<Credential> getCredentialSpecification(QueryCredentialRequest info){
         return (root, query, criteriaBuilder) -> {
-            List<Predicate> predicateList = new ArrayList<>();
-            if (info.getOwner() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("owner").as(Long.class), info.getOwner()));
+            List<Predicate> predicateList=new ArrayList<>();
+            if(info.getUserId()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("userId").as(Long.class),info.getUserId()));
+            }
+            if(!StringUtil.isEmpty(info.getUserCredential())){
+                predicateList.add(criteriaBuilder.like(root.get("userCredential").as(String.class),"%"+info.getUserCredential()+"%"));
+            }
+            if(info.getAreaId()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("areaId").as(Long.class),info.getAreaId()));
+            }
+            if(info.getDeviceId()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("deviceId").as(Long.class),info.getDeviceId()));
+            }
+            if(!StringUtil.isEmpty(info.getUserName())){
+                predicateList.add(criteriaBuilder.like(root.get("userName").as(String.class),"%"+info.getUserName()+"%"));
             }
-            if (info.getArea() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("area").as(Long.class), info.getArea()));
+            if(!StringUtil.isEmpty(info.getAreaName())){
+                predicateList.add(criteriaBuilder.like(root.get("areaName").as(String.class),"%"+info.getAreaName()+"%"));
             }
-            if (!StringUtil.isEmpty(info.getMac())) {
-                predicateList.add(criteriaBuilder.like(root.get("mac").as(String.class), "%" + info.getMac() + "%"));
+            if(!StringUtil.isEmpty(info.getDeviceName())){
+                predicateList.add(criteriaBuilder.like(root.get("deviceName").as(String.class),"%"+info.getDeviceName()+"%"));
             }
-            if (!StringUtil.isEmpty(info.getName())) {
-                predicateList.add(criteriaBuilder.like(root.get("name").as(String.class), "%" + info.getName() + "%"));
+            if(!StringUtil.isEmpty(info.getDeviceMac())){
+                predicateList.add(criteriaBuilder.like(root.get("deviceMac").as(String.class),"%"+info.getDeviceMac()+"%"));
             }
-            if (info.getActive() != null) {
-                predicateList.add(criteriaBuilder.equal(root.get("active").as(Boolean.class), info.getActive()));
+            if(info.getActive()!=null){
+                predicateList.add(criteriaBuilder.equal(root.get("active").as(Boolean.class),info.getActive()));
             }
-            if (predicateList.isEmpty()) {
+            if(predicateList.isEmpty()){
                 return null;
             }
-            Predicate predicate = predicateList.get(0);
-            for (int i = 1; i < predicateList.size(); i++) {
-                predicate = criteriaBuilder.and(predicate, predicateList.get(i));
+            Predicate predicate=predicateList.get(0);
+            for(int i=1;i<predicateList.size();i++){
+                predicate=criteriaBuilder.and(predicate,predicateList.get(i));
             }
             return predicate;
         };

+ 5 - 0
final-device/src/main/java/org/brynhild/graduation/device/service/IAdminService.groovy

@@ -29,4 +29,9 @@ interface IAdminService {
 
     Result deleteCredential(AdminDeleteCredential info, String token)
 
+    Result addRelationship(AdminAddRelationship info, String token)
+
+    Result findRelationship(QueryRelationshipRequest info)
+
+    Result deleteRelationship(AdminDeleteRelationship info, String token)
 }

+ 123 - 3
final-device/src/main/java/org/brynhild/graduation/device/service/impl/AdminServiceImpl.groovy

@@ -1,6 +1,7 @@
 package org.brynhild.graduation.device.service.impl
 
 import jakarta.annotation.Resource
+import org.aspectj.asm.internal.Relationship
 import org.brynhild.graduation.common.constant.AccountConstant
 import org.brynhild.graduation.common.constant.RedisConstant
 import org.brynhild.graduation.common.transfer.dto.Result
@@ -12,8 +13,10 @@ import org.brynhild.graduation.device.service.IAdminService
 import org.brynhild.graduation.persistence.device.entity.Area
 import org.brynhild.graduation.persistence.device.entity.Credential
 import org.brynhild.graduation.persistence.device.entity.Device
+import org.brynhild.graduation.persistence.device.entity.DeviceRelationship
 import org.brynhild.graduation.persistence.device.repository.AreaRepository
 import org.brynhild.graduation.persistence.device.repository.CredentialRepository
+import org.brynhild.graduation.persistence.device.repository.DeviceRelationshipRepository
 import org.brynhild.graduation.persistence.device.repository.DeviceRepository
 import org.brynhild.graduation.persistence.device.repository.SignInRecordRepository
 import org.brynhild.graduation.persistence.log.entity.OperationLog
@@ -32,6 +35,7 @@ class AdminServiceImpl implements IAdminService {
     private LogSender logSender
 
     private DeviceRepository deviceRepository
+    private DeviceRelationshipRepository relationshipRepository
     private AreaRepository areaRepository
     private CredentialRepository credentialRepository
     private SignInRecordRepository signInRecordRepository
@@ -200,22 +204,133 @@ class AdminServiceImpl implements IAdminService {
         if (optional.isEmpty()) {
             return new Result(false, "目标不存在")
         }
+        def claims = jwtUtil.parseJWT(token)
+        def id = Long.parseLong(claims.getId())
+        def device = optional.get()
+        def name = claims.get(AccountConstant.TOKEN_NAME) asType String
         deviceRepository.logicDelete(info.id)
         def log = new OperationLog()
         log.with {
+            targetName = device.name
+            targetId = device.id
+            operatorId = id
+            operatorName = name
+        }
+        logSender.sendOperationLog(log)
+        return new Result(true,"删除成功")
+    }
 
+    @Override
+    Result deleteArea(AdminDeleteArea info, String token) {
+        def optional = areaRepository.findById(info.id)
+        if (optional.isEmpty()) {
+            return new Result(false, "目标不存在")
+        }
+        def claims = jwtUtil.parseJWT(token)
+        def id = Long.parseLong(claims.getId())
+        def area = optional.get()
+        def name = claims.get(AccountConstant.TOKEN_NAME) asType String
+        areaRepository.logicDelete(info.id)
+        def log = new OperationLog()
+        log.with {
+            targetName = area.name
+            targetId = area.id
+            operatorId = id
+            operatorName = name
+            it.description="管理员删除了区域"
         }
+        logSender.sendOperationLog(log)
+        return new Result(true,"删除成功")
+    }
 
-        return null
+    @Override
+    Result deleteCredential(AdminDeleteCredential info, String token) {
+        def optional = credentialRepository.findById(info.id)
+        if (optional.isEmpty()) {
+            return new Result(false, "目标不存在")
+        }
+        def claims = jwtUtil.parseJWT(token)
+        def id = Long.parseLong(claims.getId())
+        def credential = optional.get()
+        def name = claims.get(AccountConstant.TOKEN_NAME) asType String
+        deviceRepository.logicDelete(info.id)
+        def log = new OperationLog()
+        log.with {
+            targetName = credential.userName
+            targetId = credential.id
+            operatorId = id
+            operatorName = name
+            description="管理员删除了凭证信息"
+        }
+        logSender.sendOperationLog(log)
+        return new Result(true,"删除成功")
     }
 
     @Override
-    Result deleteArea(AdminDeleteArea info, String token) {
+    Result addRelationship(AdminAddRelationship info, String token) {
+        def master=deviceRepository.findById(info.master)
+        def slave=deviceRepository.findById(info.slave)
+        if(master.isEmpty()||slave.isEmpty()){
+            return new Result(false,"相关设备不存在")
+        }
+        master=master.get()
+        slave=slave.get()
+
+        def relationship = relationshipRepository.findRelationshipBySlave(info.slave)
+        if(relationship!=null){
+            return new Result(false,"从设备已被指派")
+        }
+
+        if(master.type<=slave.type){
+            return new Result(false,"指派类型不合法")
+        }
+
+        relationship=new DeviceRelationship()
+        relationship.masterType=master.type
+        def log = operationLogFactory.generateLogWithAdminAddRelationship(info, relationship)
+
+        def claims = jwtUtil.parseJWT(token)
+        def id = Long.parseLong(claims.getId())
+        def name = claims.get(AccountConstant.TOKEN_NAME) asType String
+        relationshipRepository.save(relationship)
+        log.with {
+            targetName = slave.name
+            targetId = slave.id
+            operatorId = id
+            operatorName = name
+        }
+
+        logSender.sendOperationLog(log)
+
         return null
     }
 
     @Override
-    Result deleteCredential(AdminDeleteCredential info, String token) {
+    Result findRelationship(QueryRelationshipRequest info) {
+        return new Result(true,"查询成功",relationshipRepository.findAll(specificationFactory.getDeviceRelationshipSpecification(info)))
+    }
+
+    @Override
+    Result deleteRelationship(AdminDeleteRelationship info, String token) {
+        def optional = relationshipRepository.findById(info.id)
+        if(optional.isEmpty()){
+            return new Result(false,"目标不存在")
+        }
+        def relationship = optional.get()
+        relationshipRepository.logicDelete(info.id)
+        def claims = jwtUtil.parseJWT(token)
+        def id = Long.parseLong(claims.getId())
+        def name = claims.get(AccountConstant.TOKEN_NAME) asType String
+        def log=new OperationLog()
+        log.with {
+            targetName = "${relationship.id}"
+            targetId = info.id
+            operatorId = id
+            operatorName = name
+            description="管理员解除了设备绑定"
+        }
+
+
         return null
     }
 
@@ -278,4 +393,9 @@ class AdminServiceImpl implements IAdminService {
     void setUserRepository(UserRepository userRepository) {
         this.userRepository = userRepository
     }
+    @Autowired
+    @Resource
+    void setRelationshipRepository(DeviceRelationshipRepository relationshipRepository) {
+        this.relationshipRepository = relationshipRepository
+    }
 }

+ 0 - 8
final-event.iml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module version="4">
-  <component name="NewModuleRootManager">
-    <content url="file://$MODULE_DIR$/final-event">
-      <sourceFolder url="file://$MODULE_DIR$/final-event/src/main/groovy" isTestSource="false" />
-    </content>
-  </component>
-</module>

+ 3 - 0
final-persistence/src/main/java/org/brynhild/graduation/persistence/device/entity/Device.java

@@ -38,4 +38,7 @@ public class Device extends LogicDeleteEntity implements Serializable {
 
     @LogFieldDescription("备注信息")
     private String note;
+
+    @LogFieldDescription("设备类型")
+    private Integer type;
 }

+ 31 - 0
final-persistence/src/main/java/org/brynhild/graduation/persistence/device/entity/DeviceRelationship.java

@@ -0,0 +1,31 @@
+package org.brynhild.graduation.persistence.device.entity;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.Table;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import org.brynhild.graduation.common.tag.LogFieldDescription;
+import org.brynhild.graduation.persistence.common.constant.CommonDBStringDefinition;
+import org.brynhild.graduation.persistence.common.entity.LogicDeleteEntity;
+import org.hibernate.annotations.Where;
+
+import java.io.Serializable;
+
+@EqualsAndHashCode(callSuper = true)
+@Entity
+@Table(name = "device_relationship")
+@Data
+@Where(clause = CommonDBStringDefinition.LOGIC_DELETE_WHERE_CLAUSE)
+@NoArgsConstructor
+public class DeviceRelationship extends LogicDeleteEntity implements Serializable {
+    @LogFieldDescription("主设备")
+    private Long master;
+    @LogFieldDescription("从设备")
+    private Long slave;
+    @Column(name = "master_type")
+
+    @LogFieldDescription("主设备类型")
+    private Integer masterType;
+}

+ 11 - 0
final-persistence/src/main/java/org/brynhild/graduation/persistence/device/repository/DeviceRelationshipRepository.groovy

@@ -0,0 +1,11 @@
+package org.brynhild.graduation.persistence.device.repository
+
+import org.aspectj.asm.internal.Relationship
+import org.brynhild.graduation.persistence.common.repository.LogicDeleteRepository
+import org.brynhild.graduation.persistence.device.entity.DeviceRelationship
+import org.springframework.stereotype.Repository
+
+@Repository
+interface DeviceRelationshipRepository extends LogicDeleteRepository<DeviceRelationship>{
+    DeviceRelationship findRelationshipBySlave(Long slave)
+}

+ 19 - 0
final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/AdminAddRelationship.java

@@ -0,0 +1,19 @@
+package org.brynhild.graduation.transfer.device.vo;
+
+import lombok.Data;
+import org.aspectj.asm.internal.Relationship;
+import org.brynhild.graduation.common.tag.Actor;
+import org.brynhild.graduation.common.tag.LogGenerated;
+import org.brynhild.graduation.persistence.device.entity.DeviceRelationship;
+
+import javax.validation.constraints.NotNull;
+
+@LogGenerated(DeviceRelationship.class)
+@Actor
+@Data
+public class AdminAddRelationship {
+    @NotNull
+    private Long master;
+    @NotNull
+    private Long slave;
+}

+ 13 - 0
final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/AdminDeleteRelationship.java

@@ -0,0 +1,13 @@
+package org.brynhild.graduation.transfer.device.vo;
+
+import lombok.Data;
+import org.aspectj.asm.internal.Relationship;
+import org.brynhild.graduation.common.tag.SpecificationGenerated;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+public class AdminDeleteRelationship {
+    @NotNull
+    private Long id;
+}

+ 7 - 0
final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/BindDevice.java

@@ -6,7 +6,10 @@ import org.brynhild.graduation.common.tag.LogFieldIgnore;
 import org.brynhild.graduation.common.tag.LogGenerated;
 import org.brynhild.graduation.persistence.device.entity.Device;
 
+import javax.validation.constraints.Max;
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.PositiveOrZero;
 
 @Data
 @LogGenerated(Device.class)
@@ -17,6 +20,10 @@ public class BindDevice {
     private String code;
     @NotBlank
     private String mac;
+    @NotNull
+    @PositiveOrZero
+    @Max(2)
+    private Integer type;
     private Long area;
     private String note;
     private String name;

+ 13 - 0
final-transfer/src/main/java/org/brynhild/graduation/transfer/device/vo/QueryRelationshipRequest.java

@@ -0,0 +1,13 @@
+package org.brynhild.graduation.transfer.device.vo;
+
+import lombok.Data;
+import org.aspectj.asm.internal.Relationship;
+import org.brynhild.graduation.common.tag.SpecificationGenerated;
+import org.brynhild.graduation.persistence.device.entity.DeviceRelationship;
+
+@Data
+@SpecificationGenerated(DeviceRelationship.class)
+public class QueryRelationshipRequest {
+    private Long master;
+    private Long slave;
+}

+ 0 - 8
final-trigger.iml

@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module version="4">
-  <component name="FacetManager">
-    <facet type="Spring" name="Spring">
-      <configuration />
-    </facet>
-  </component>
-</module>

+ 0 - 136
logGenerate.groovy

@@ -1,136 +0,0 @@
-OperationLog generateLogWithAdminModifyCourse(AdminModifyCourse info, Course target) {
-    def log = new OperationLog()
-    def originData = target.toString()
-    def builder = new StringBuilder()
-    if (!StringUtil.isEmpty(info.name)) {
-        builder.append("用户").append("修改了课程名称为: ").append(info.name).append(ln)
-        target.name = info.name
-    }
-    if (info.credit != null) {
-        builder.append("用户").append("修改了学分为: ").append(info.credit).append(ln)
-        target.credit = info.credit
-    }
-    if (info.department != null) {
-        builder.append("用户").append("修改了开设学院为: ").append(info.department).append(ln)
-        target.department = info.department
-    }
-    if (info.type != null) {
-        builder.append("用户").append("修改了课程类型为: ").append(info.type).append(ln)
-        target.type = info.type
-    }
-    def newData = info.toString()
-    log.originData = originData
-    log.newData = newData
-    log.description = builder.toString()
-    log
-}
-
-
-OperationLog generateLogWithAdminAddCourse(AdminAddCourse info, Course target) {
-    def log = new OperationLog()
-    def originData = target.toString()
-    def builder = new StringBuilder()
-    if (!StringUtil.isEmpty(info.name)) {
-        builder.append("用户").append("修改了课程名称为: ").append(info.name).append(ln)
-        target.name = info.name
-    }
-    if (info.credit != null) {
-        builder.append("用户").append("修改了学分为: ").append(info.credit).append(ln)
-        target.credit = info.credit
-    }
-    if (info.department != null) {
-        builder.append("用户").append("修改了开设学院为: ").append(info.department).append(ln)
-        target.department = info.department
-    }
-    if (info.type != null) {
-        builder.append("用户").append("修改了课程类型为: ").append(info.type).append(ln)
-        target.type = info.type
-    }
-    def newData = info.toString()
-    log.originData = originData
-    log.newData = newData
-    log.description = builder.toString()
-    log
-}
-
-
-OperationLog generateLogWithAdminAddTimeTable(AdminAddTimeTable info, TimeTable target) {
-    def log = new OperationLog()
-    def originData = target.toString()
-    def builder = new StringBuilder()
-    if (info.areaId != null) {
-        builder.append("用户").append("修改了区域id为: ").append(info.areaId).append(ln)
-        target.areaId = info.areaId
-    }
-    if (!StringUtil.isEmpty(info.index)) {
-        builder.append("用户").append("修改了时间点为: ").append(info.index).append(ln)
-        target.index = info.index
-    }
-    if (!StringUtil.isEmpty(info.week)) {
-        builder.append("用户").append("修改了周次为: ").append(info.week).append(ln)
-        target.week = info.week
-    }
-    if (!StringUtil.isEmpty(info.clazz)) {
-        builder.append("用户").append("修改了班级列表为: ").append(info.clazz).append(ln)
-        target.clazz = info.clazz
-    }
-    if (info.courseId != null) {
-        builder.append("用户").append("修改了课程id为: ").append(info.courseId).append(ln)
-        target.courseId = info.courseId
-    }
-    if (info.year != null) {
-        builder.append("用户").append("修改了年份为: ").append(info.year).append(ln)
-        target.year = info.year
-    }
-    if (info.term != null) {
-        builder.append("用户").append("修改了学期为: ").append(info.term).append(ln)
-        target.term = info.term
-    }
-    def newData = info.toString()
-    log.originData = originData
-    log.newData = newData
-    log.description = builder.toString()
-    log
-}
-
-
-OperationLog generateLogWithAdminModifyTimeTable(AdminModifyTimeTable info, TimeTable target) {
-    def log = new OperationLog()
-    def originData = target.toString()
-    def builder = new StringBuilder()
-    if (info.areaId != null) {
-        builder.append("用户").append("修改了区域id为: ").append(info.areaId).append(ln)
-        target.areaId = info.areaId
-    }
-    if (!StringUtil.isEmpty(info.index)) {
-        builder.append("用户").append("修改了时间点为: ").append(info.index).append(ln)
-        target.index = info.index
-    }
-    if (!StringUtil.isEmpty(info.week)) {
-        builder.append("用户").append("修改了周次为: ").append(info.week).append(ln)
-        target.week = info.week
-    }
-    if (!StringUtil.isEmpty(info.clazz)) {
-        builder.append("用户").append("修改了班级列表为: ").append(info.clazz).append(ln)
-        target.clazz = info.clazz
-    }
-    if (info.courseId != null) {
-        builder.append("用户").append("修改了课程id为: ").append(info.courseId).append(ln)
-        target.courseId = info.courseId
-    }
-    if (info.year != null) {
-        builder.append("用户").append("修改了年份为: ").append(info.year).append(ln)
-        target.year = info.year
-    }
-    if (info.term != null) {
-        builder.append("用户").append("修改了学期为: ").append(info.term).append(ln)
-        target.term = info.term
-    }
-    def newData = info.toString()
-    log.originData = originData
-    log.newData = newData
-    log.description = builder.toString()
-    log
-}
-
-

+ 0 - 0
specificationGenerate.groovy