Bladeren bron

更新!

TRX 1 jaar geleden
bovenliggende
commit
895e456d47

+ 21 - 0
FullCardClient/src/main/java/com/zhongshu/card/client/type/permiss/PermissSendState.java

@@ -0,0 +1,21 @@
+package com.zhongshu.card.client.type.permiss;
+
+import lombok.Getter;
+
+/**
+ * 权限下发的状态
+ */
+public enum PermissSendState {
+    Send("已下发"),
+    SendSuccess("下发成功"),
+    Success("成功"),
+    Failed("失败"),
+    ;
+
+    @Getter
+    private String remark;
+
+    PermissSendState(String remark) {
+        this.remark = remark;
+    }
+}

+ 11 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/devices/DeviceSyncController.java

@@ -1,9 +1,11 @@
 package com.zhongshu.card.server.core.controller.devices;
 
+import com.github.microservice.models.device.DevicePermissSendResponseParam;
 import com.github.microservice.models.device.DeviceSyncListParam;
 import com.github.microservice.models.device.GateWaySyncParam;
 import com.github.microservice.models.hxz.DevicePingInfoParam;
 import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.service.devices.DevicePermissSendLogService;
 import com.zhongshu.card.server.core.service.devices.DeviceSyncFromIotService;
 import io.swagger.v3.oas.annotations.Hidden;
 import io.swagger.v3.oas.annotations.Operation;
@@ -28,6 +30,9 @@ public class DeviceSyncController {
     @Autowired
     DeviceSyncFromIotService deviceSyncFromIotService;
 
+    @Autowired
+    private DevicePermissSendLogService devicePermissSendLogService;
+
     @Operation(summary = "物联网同步设备接口", hidden = true)
     @RequestMapping(value = "syncDevices", method = {RequestMethod.POST})
     public ResultContent syncDevices(@RequestBody DeviceSyncListParam param) {
@@ -52,5 +57,11 @@ public class DeviceSyncController {
         return deviceSyncFromIotService.syncGateWays(param);
     }
 
+    @Operation(summary = "设备权限下发的响应")
+    @RequestMapping(value = "markSendResponse", method = {RequestMethod.POST})
+    public ResultContent markSendResponse(@RequestBody DevicePermissSendResponseParam param) {
+        return devicePermissSendLogService.markSendResponse(param);
+    }
+
 }
 

+ 29 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/devices/DevicePermissSendLogDao.java

@@ -0,0 +1,29 @@
+package com.zhongshu.card.server.core.dao.devices;
+
+import com.github.microservice.components.data.mongo.mongo.dao.MongoDao;
+import com.zhongshu.card.client.type.DataState;
+import com.zhongshu.card.client.type.permiss.PermissSendState;
+import com.zhongshu.card.server.core.dao.devices.extend.DevicePermissDaoExtend;
+import com.zhongshu.card.server.core.domain.devices.DevicePermiss;
+import com.zhongshu.card.server.core.domain.devices.DevicePermissSendLog;
+import com.zhongshu.card.server.core.domain.org.OrganizationUser;
+
+import java.util.List;
+
+/**
+ * 用户设备权限
+ *
+ * @author TRX
+ * @date 2024/3/21
+ */
+public interface DevicePermissSendLogDao extends MongoDao<DevicePermissSendLog> {
+
+    List<DevicePermissSendLog> findByGroupId(String groupId);
+
+    long countByGroupId(String groupId);
+
+    long countByGroupIdAndSendState(String groupId, PermissSendState sendState);
+
+    long countByGroupIdAndIsResponse(String groupId, Boolean isResponse);
+
+}

+ 12 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dataConfig/TtlConfig.java

@@ -0,0 +1,12 @@
+package com.zhongshu.card.server.core.dataConfig;
+
+/**
+ * @author TRX
+ * @date 2024/10/31
+ */
+public class TtlConfig {
+
+    // 权限下发的日志 保存时间
+    public static final Long permissLogTTl = 7 * 24 * 60 * 60 * 1000L;
+
+}

+ 81 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/devices/DevicePermissSendLog.java

@@ -0,0 +1,81 @@
+package com.zhongshu.card.server.core.domain.devices;
+
+import com.github.microservice.components.data.mongo.mongo.domain.SuperEntity;
+import com.zhongshu.card.client.type.permiss.PermissSendState;
+import com.zhongshu.card.server.core.domain.base.SuperMain;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.mongodb.core.index.Indexed;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+import java.util.Date;
+
+/**
+ * 设备权限下发日志
+ *
+ * @author TRX
+ * @date 2024/10/31
+ */
+@Data
+@Document
+@NoArgsConstructor
+@AllArgsConstructor
+public class DevicePermissSendLog extends SuperMain {
+
+    @Schema(description = "下发对应的数据ID")
+    private String dataId;
+
+    @Schema(description = "所属批次ID")
+    private String groupId;
+
+    @Schema(description = "下发服务标志")
+    private String event;
+
+    @Schema(description = "设备ID")
+    private String deviceId;
+
+    @Schema(description = "设备名称")
+    private String deviceName;
+
+    @Schema(description = "设备类型")
+    private String deviceType;
+
+    @Schema(description = "设备所属网关ID")
+    private String gateWayId;
+
+    @Schema(description = "数据管理的用户id")
+    private String userId;
+
+    @Schema(description = "关联的用户名称")
+    private String userName;
+
+    @Schema(description = "下发时间")
+    private String sendTime;
+
+    @Schema(description = "下发的数据")
+    private Object data;
+
+    @Schema(description = "下发状态")
+    private PermissSendState sendState = PermissSendState.Send;
+
+    //----------------------------------响应数据 start ---------------------------
+
+    @Schema(description = "是否响应")
+    private Boolean isResponse = Boolean.FALSE;
+
+    @Schema(description = "下发后响应时间")
+    private Long responseTime;
+
+    @Schema(description = "下发后响应时间,可读")
+    private String responseTimeStr;
+
+    @Schema(description = "响应提示内容")
+    private String responseMsg = "";
+
+    @Schema(description = "过期时间")
+    @Indexed(expireAfterSeconds = 0)
+    private Date ttl;
+
+}

+ 25 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/event/UserInfoChangeSyncEvent.java

@@ -1,9 +1,13 @@
 package com.zhongshu.card.server.core.event;
 
+import com.zhongshu.card.server.core.util.CommonUtil;
 import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.context.ApplicationEvent;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 用户信息发送变化(如:姓名、人脸信息、绑定的卡片等)
@@ -19,9 +23,30 @@ public class UserInfoChangeSyncEvent extends ApplicationEvent {
     @Getter
     private String projectOid;
 
+    @Getter
+    private Map<String, Object> map = new HashMap<String, Object>();
+
     public UserInfoChangeSyncEvent(Object source, List<String> userIds, String projectOid) {
         super(source);
         this.userIds = userIds;
         this.projectOid = projectOid;
     }
+
+    public UserInfoChangeSyncEvent(Object source, List<String> userIds, String projectOid, Map<String, Object> map) {
+        super(source);
+        this.userIds = userIds;
+        this.projectOid = projectOid;
+        this.map = map;
+    }
+
+    public String getGroupId() {
+        String groupId = "";
+        if (map != null && map.containsKey("groupId")) {
+            groupId = (String) map.get("groupId");
+        }
+        if (StringUtils.isEmpty(groupId)) {
+            groupId = CommonUtil.UUID();
+        }
+        return groupId;
+    }
 }

+ 31 - 4
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DevicePermissEventService.java

@@ -12,11 +12,16 @@ import com.github.microservice.models.iot.IotSendParam;
 import com.github.microservice.net.ResultContent;
 import com.github.microservice.types.FunctionType;
 import com.google.common.collect.Lists;
+import com.zhongshu.card.client.utils.DateUtils;
 import com.zhongshu.card.server.core.dao.devices.DeviceInfoDao;
+import com.zhongshu.card.server.core.dao.devices.DevicePermissSendLogDao;
+import com.zhongshu.card.server.core.dataConfig.TtlConfig;
 import com.zhongshu.card.server.core.domain.devices.DeviceInfo;
+import com.zhongshu.card.server.core.domain.devices.DevicePermissSendLog;
 import com.zhongshu.card.server.core.event.DevicePermissChangeEvent;
 import com.zhongshu.card.server.core.event.UserInfoChangeSyncEvent;
 import com.zhongshu.card.server.core.service.openAPI.OpenApiRequestService;
+import com.zhongshu.card.server.core.util.CommonUtil;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
@@ -27,9 +32,7 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
+import java.util.*;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
@@ -63,6 +66,9 @@ public class DevicePermissEventService {
     @Autowired
     private ApplicationContext applicationContext;
 
+    @Autowired
+    private DevicePermissSendLogDao devicePermissSendLogDao;
+
     @Autowired
     private void init(ApplicationContext applicationContext) {
         Runtime.getRuntime().addShutdownHook(new Thread(() -> {
@@ -81,6 +87,12 @@ public class DevicePermissEventService {
         applicationContext.publishEvent(event);
     }
 
+    public void sendUserInfoChangeEvent(String userId, String projectOid, Map<String, Object> map) {
+        UserInfoChangeSyncEvent event = new UserInfoChangeSyncEvent(
+                this, List.of(userId), projectOid, map);
+        applicationContext.publishEvent(event);
+    }
+
     /**
      * 通知用户关联信息发送变化
      *
@@ -153,24 +165,39 @@ public class DevicePermissEventService {
         log.info("userInfoChange; {} {}", projectOid);
         if (StringUtils.isNotEmpty(projectOid) && ObjectUtils.isNotEmpty(userIds[0])) {
             executorService.execute(() -> {
+                String groupId = event.getGroupId();
                 userIds[0] = userIds[0].stream().distinct().collect(Collectors.toList());
                 // 循环用户数据
                 for (String userId : userIds[0]) {
                     List<String> deviceIds = devicePermissService.getUserAllDeviceIds(
                             projectOid, List.of(userId));
+                    // 网关 对应的设备
                     HashMap<String, List<String>> map = deviceGroupByGateWayId(deviceIds);
                     if (!map.isEmpty()) {
+                        List<DevicePermissSendLog> list = new ArrayList<>();
                         // 遍历发送
                         map.keySet().stream().forEach(gateWayId -> {
                             DeviceUsersInfo deviceUsersInfo = new DeviceUsersInfo();
                             deviceUsersInfo.setGateWayId(gateWayId);
                             // 用户数据 (去重)
                             List<ProjectUserPermiss> userPermiss = devicePermissIotService.getUserPermiss(projectOid, userIds[0]);
-
+                            for (ProjectUserPermiss projectUserPermiss : userPermiss) {
+                                projectUserPermiss.setDataId(CommonUtil.UUID());
+                                DevicePermissSendLog sendLog = new DevicePermissSendLog();
+                                sendLog.setGateWayId(gateWayId);
+                                sendLog.setUserId(userId);
+                                sendLog.setGroupId(groupId);
+                                sendLog.setData(projectUserPermiss);
+                                sendLog.setSendTime(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.FORMAT_LONG));
+                                sendLog.setEvent(IotIdentifierConfig.queryDeviceUsersInfo);
+                                sendLog.setTtl(new Date(System.currentTimeMillis() + TtlConfig.permissLogTTl));
+                                list.add(sendLog);
+                            }
                             deviceUsersInfo.setUsers(userPermiss);
                             // 下发用户数据
                             requestDevicesUsersData(deviceUsersInfo, projectOid);
                         });
+                        devicePermissSendLogDao.saveAll(list);
                     }
                 }
             });

+ 51 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/devices/DevicePermissSendLogService.java

@@ -0,0 +1,51 @@
+package com.zhongshu.card.server.core.service.devices;
+
+import cn.hutool.json.JSONUtil;
+import com.github.microservice.models.device.DevicePermissSendResponseParam;
+import com.github.microservice.models.device.DevicePermissSendResponseResult;
+import com.github.microservice.net.ResultContent;
+import com.zhongshu.card.server.core.dao.devices.DevicePermissSendLogDao;
+import com.zhongshu.card.server.core.service.base.SuperService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author TRX
+ * @date 2024/10/31
+ */
+@Slf4j
+@Service
+public class DevicePermissSendLogService extends SuperService {
+
+    @Autowired
+    private DevicePermissSendLogDao devicePermissSendLogDao;
+
+    /**
+     * 下发权限数据的响应
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent markSendResponse(DevicePermissSendResponseParam param) {
+        DevicePermissSendResponseResult result = new DevicePermissSendResponseResult();
+        result.setSuccess();
+
+        return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+    }
+
+    /**
+     * 批次下发的权限是否都已响应
+     *
+     * @param groupId
+     * @return
+     */
+    public Boolean isAllResponse(String groupId) {
+        long all = devicePermissSendLogDao.countByGroupId(groupId);
+        long responseEd = devicePermissSendLogDao.countByGroupIdAndIsResponse(groupId, Boolean.TRUE);
+        if (all == responseEd) {
+            return true;
+        }
+        return false;
+    }
+}

+ 9 - 2
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/CardInfoServiceImpl.java

@@ -38,6 +38,7 @@ import com.zhongshu.card.server.core.service.org.OrganizationUserServiceImpl;
 import com.zhongshu.card.server.core.service.orgManager.OrganizationManagerServiceImpl;
 import com.zhongshu.card.server.core.service.user.UserAccountServiceImpl;
 import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
 import com.zhongshu.card.server.core.util.ExcelUtils;
 import com.zhongshu.card.server.core.util.excel.CommonExeclParam;
 import com.zhongshu.card.server.core.util.excel.CommonExeclTd;
@@ -541,8 +542,11 @@ public class CardInfoServiceImpl extends SuperService implements CardInfoService
         cardInfoLossRecord.setOperationType(CardOperationType.Loss);
         cardInfoLossRecordDao.save(cardInfoLossRecord);
 
+        String groupId = CommonUtil.UUID();
+        Map<String, Object> map = new HashMap<>();
+        map.put("groupId", groupId);
         // 卡片信息发送变化
-        devicePermissEventService.sendUserInfoChangeEvent(cardInfo.getUserId(), cardInfo.getProjectOid());
+        devicePermissEventService.sendUserInfoChangeEvent(cardInfo.getUserId(), cardInfo.getProjectOid(), map);
         return ResultContent.buildSuccess();
     }
 
@@ -640,8 +644,11 @@ public class CardInfoServiceImpl extends SuperService implements CardInfoService
         cardInfoLossRecord.setOperationType(CardOperationType.Enable);
         cardInfoLossRecordDao.save(cardInfoLossRecord);
 
+        String groupId = CommonUtil.UUID();
+        Map<String, Object> map = new HashMap<>();
+        map.put("groupId", groupId);
         // 用户可用卡片发生变化
-        devicePermissEventService.sendUserInfoChangeEvent(cardInfo.getUserId(), cardInfo.getProjectOid());
+        devicePermissEventService.sendUserInfoChangeEvent(cardInfo.getUserId(), cardInfo.getProjectOid(), map);
         return ResultContent.buildSuccess();
     }
 

+ 9 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/projectAbout/OrgUserFaceService.java

@@ -12,6 +12,7 @@ import com.zhongshu.card.server.core.event.UserInfoChangeSyncEvent;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.service.devices.DevicePermissEventService;
 import com.zhongshu.card.server.core.util.BeanUtils;
+import com.zhongshu.card.server.core.util.CommonUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -21,7 +22,9 @@ import org.springframework.context.ApplicationContext;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -80,8 +83,13 @@ public class OrgUserFaceService extends SuperService {
         }
         orgUserFaceDao.save(orgUserFace);
 
+        String groupId = CommonUtil.UUID();
+        Map<String, Object> map = new HashMap<>();
+        map.put("groupId", groupId);
         // 通知人脸信息发送变化
-        devicePermissEventService.sendUserInfoChangeEvent(orgUserFace.getUserId(), orgUserFace.getProjectOid());
+        devicePermissEventService.sendUserInfoChangeEvent(
+                orgUserFace.getUserId(), orgUserFace.getProjectOid(), map);
+
         return ResultContent.buildSuccess();
     }