Browse Source

云平台集成代码提交

fuyuchuan 11 hours ago
parent
commit
cacb4a038e
19 changed files with 148 additions and 87 deletions
  1. 15 13
      service-issue/service-issue-biz/src/main/java/com/usky/issue/controller/web/CloudConfigController.java
  2. 6 5
      service-issue/service-issue-biz/src/main/java/com/usky/issue/controller/web/CloudSyncController.java
  3. 11 3
      service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/CloudAuditEntity.java
  4. 10 6
      service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueCloudConfig.java
  5. 1 1
      service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueOperationLog.java
  6. 1 1
      service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueSyncStatus.java
  7. 2 2
      service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueSyncTask.java
  8. 39 24
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/client/CloudPlatformClient.java
  9. 24 9
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudConfigServiceImpl.java
  10. 1 1
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudOperationLogServiceImpl.java
  11. 3 3
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudSyncServiceImpl.java
  12. 3 3
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudSyncTaskRunnerImpl.java
  13. 0 4
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/SpRtu2017ServiceImpl.java
  14. 19 3
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/support/CloudEntitySupport.java
  15. 5 2
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/CloudConfigResponse.java
  16. 4 3
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/CloudConfigSaveRequest.java
  17. 1 1
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/SyncStatusResponse.java
  18. 2 2
      service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/SyncTaskResponse.java
  19. 1 1
      service-issue/service-issue-biz/src/test/java/com/usky/issue/cloud/service/CloudConfigServiceImplTest.java

+ 15 - 13
service-issue/service-issue-biz/src/main/java/com/usky/issue/controller/web/CloudConfigController.java

@@ -1,6 +1,7 @@
 package com.usky.issue.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.issue.service.vo.CloudConfigResponse;
 import com.usky.issue.service.vo.CloudConfigSaveRequest;
 import com.usky.issue.service.vo.CloudConnectionTestResponse;
@@ -33,37 +34,38 @@ public class CloudConfigController {
     @Autowired
     private CloudConfigService cloudConfigService;
 
+    /**
+     * 获取云平台配置
+     */
     @GetMapping("/config")
     public ApiResult<CloudConfigResponse> getConfig() {
         return ApiResult.success(cloudConfigService.getConfig());
     }
 
+    /**
+     * 保存、修改云平台配置
+     */
     @PutMapping("/config")
     public ApiResult<CloudConfigResponse> saveConfig(
-            @Valid @RequestBody CloudConfigSaveRequest request,
-            @RequestHeader(value = "If-Match", required = false) Integer ifMatch,
-            HttpServletRequest httpRequest) {
-        if (request.getVersion() == null && ifMatch != null) {
-            request.setVersion(ifMatch);
-        }
+            @Valid @RequestBody CloudConfigSaveRequest request, HttpServletRequest httpRequest) {
         return ApiResult.success(cloudConfigService.saveConfig(
-                request, resolveOperator(httpRequest), httpRequest.getRemoteAddr()));
+                request, SecurityUtils.getUsername(), httpRequest.getRemoteAddr()));
     }
 
+
     @PostMapping("/config/testConnection")
     public ApiResult<CloudConnectionTestResponse> testConnection(HttpServletRequest httpRequest) {
         return ApiResult.success(cloudConfigService.testConnection(
-                resolveOperator(httpRequest), httpRequest.getRemoteAddr()));
+                SecurityUtils.getUsername(), httpRequest.getRemoteAddr()));
     }
 
+    /**
+     * 禁用云平台
+     */
     @PostMapping("/config/disable")
     public ApiResult<CloudDisableResponse> disable(HttpServletRequest httpRequest) {
         return ApiResult.success(cloudConfigService.disable(
-                resolveOperator(httpRequest), httpRequest.getRemoteAddr()));
+                SecurityUtils.getUsername(), httpRequest.getRemoteAddr()));
     }
 
-    private String resolveOperator(HttpServletRequest request) {
-        String user = request.getHeader("X-User-Name");
-        return user != null ? user : "system";
-    }
 }

+ 6 - 5
service-issue/service-issue-biz/src/main/java/com/usky/issue/controller/web/CloudSyncController.java

@@ -1,6 +1,7 @@
 package com.usky.issue.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.issue.service.vo.SyncStatusResponse;
 import com.usky.issue.service.vo.SyncTaskResponse;
 import com.usky.issue.service.CloudSyncService;
@@ -35,7 +36,7 @@ public class CloudSyncController {
     @PostMapping("/sync/{type}")
     public ApiResult<SyncTaskResponse> manualSync(@PathVariable String type, HttpServletRequest request) {
         return ApiResult.success(cloudSyncService.triggerManualSync(
-                type, resolveOperator(request), request.getRemoteAddr()));
+                type, SecurityUtils.getUsername(), request.getRemoteAddr()));
     }
 
     @GetMapping("/sync/task/{taskId}")
@@ -43,8 +44,8 @@ public class CloudSyncController {
         return ApiResult.success(cloudSyncService.getTaskProgress(taskId));
     }
 
-    private String resolveOperator(HttpServletRequest request) {
-        String user = request.getHeader("X-User-Name");
-        return user != null ? user : "system";
-    }
+    // private String resolveOperator(HttpServletRequest request) {
+    //     String user = request.getHeader("X-User-Name");
+    //     return user != null ? user : "system";
+    // }
 }

+ 11 - 3
service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/CloudAuditEntity.java

@@ -1,6 +1,7 @@
 package com.usky.issue.domain;
 
 import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -17,9 +18,16 @@ public abstract class CloudAuditEntity implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    private LocalDateTime createdAt;
-    private LocalDateTime updatedAt;
+    private String createBy;
 
-    @TableLogic
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    private String updateBy;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @TableLogic(value = "0", delval = "1")
     private Integer deleted;
 }

+ 10 - 6
service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueCloudConfig.java

@@ -1,9 +1,7 @@
 package com.usky.issue.domain;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -23,8 +21,10 @@ public class IssueCloudConfig extends CloudAuditEntity {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    /** 租户ID */
     private Integer tenantId;
 
+    /** AES-256-GCM加密后的凭证密钥 */
     private String credentialKey;
 
     /** 0禁用 1启用 */
@@ -33,8 +33,12 @@ public class IssueCloudConfig extends CloudAuditEntity {
     /** 0未知 1成功 2失败 */
     private Integer connectionStatus;
 
-    @Version
+    // @Version
     private Integer version;
 
-    private LocalDateTime lastTestAt;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime lastTestTime;
+
+    @TableField(exist = false)
+    private String token;
 }

+ 1 - 1
service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueOperationLog.java

@@ -26,7 +26,7 @@ public class IssueOperationLog extends CloudAuditEntity {
 
     private String operationDetail;
 
-    private String operator;
+    private String createBy;
 
     private String requestIp;
 }

+ 1 - 1
service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueSyncStatus.java

@@ -36,5 +36,5 @@ public class IssueSyncStatus extends CloudAuditEntity {
 
     private Integer unsyncedCount;
 
-    private LocalDateTime lastSyncAt;
+    private LocalDateTime lastSyncTime;
 }

+ 2 - 2
service-issue/service-issue-biz/src/main/java/com/usky/issue/domain/IssueSyncTask.java

@@ -40,7 +40,7 @@ public class IssueSyncTask extends CloudAuditEntity {
 
     private String errorSummary;
 
-    private LocalDateTime startedAt;
+    private LocalDateTime startTime;
 
-    private LocalDateTime finishedAt;
+    private LocalDateTime finishTime;
 }

+ 39 - 24
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/client/CloudPlatformClient.java

@@ -40,67 +40,82 @@ public class CloudPlatformClient {
     }
 
     /**
-     * 测试云平台连接,当前为模拟实现:配置完整即视为可达。
+     * 测试云平台连接
      */
     public boolean testConnection(IssueCloudConfig config) {
         if (config == null || config.getTenantId() == null || config.getCredentialKey() == null) {
             log.warn("云平台配置不完整");
             return false;
         }
-        
+
         try {
             String credential = aesGcmCipher.decrypt(config.getCredentialKey());
             HttpHeaders headers = new HttpHeaders();
             headers.add("X-Tenant-Id", String.valueOf(config.getTenantId()));
             headers.add("X-Api-Key", credential);
+            headers.add("Authorization", "Bearer " + config.getToken());
             String url = apiBaseUrl;
             log.info("测试云平台连接 tenantId={}, url={}", config.getTenantId(), url);
-            
+
             ResponseEntity<String> response = restTemplate.exchange(
                     url, HttpMethod.POST, new HttpEntity<>(headers), String.class);
-            
+
             boolean is2xx = response.getStatusCode().is2xxSuccessful();
             String body = response.getBody();
-            
+
             log.info("云平台连接测试响应: status={}, body={}", response.getStatusCode(), body);
-            
+
             if (!is2xx) {
                 log.warn("云平台返回非2xx状态码: {}", response.getStatusCode());
                 return false;
             }
-            
+
             if (body == null || body.isEmpty()) {
                 log.warn("云平台返回空响应体");
                 return false;
             }
-            
+
             try {
-                com.fasterxml.jackson.databind.JsonNode json = 
-                    new com.fasterxml.jackson.databind.ObjectMapper().readTree(body);
-                
+                com.fasterxml.jackson.databind.JsonNode json =
+                        new com.fasterxml.jackson.databind.ObjectMapper().readTree(body);
+
+                // 1. 检查外层状态码
                 if (json.has("code")) {
-                    int code = json.get("code").asInt(-1);
-                    if (code != 200 && code != 0) {
-                        log.warn("云平台业务层返回错误: code={}, message={}", 
-                                code, json.has("message") ? json.get("message").asText() : "unknown");
+                    String codeStr = json.get("code").asText();
+                    if (!"0".equals(codeStr) && !"200".equals(codeStr)) {
+                        log.warn("云平台接口返回错误码: {}", codeStr);
                         return false;
                     }
                 }
-                
-                if (json.has("success")) {
-                    boolean success = json.get("success").asBoolean(false);
-                    if (!success) {
-                        log.warn("云平台业务层返回失败: {}", body);
-                        return false;
+
+                // 2. 深度检查 data 字段
+                if (json.has("data")) {
+                    com.fasterxml.jackson.databind.JsonNode dataNode = json.get("data");
+                    
+                    // 如果 data 是对象(如连接测试结果)
+                    if (dataNode.isObject()) {
+                        // 检查 success 字段
+                        if (dataNode.has("success") && !dataNode.get("success").asBoolean(false)) {
+                            String msg = dataNode.has("message") ? dataNode.get("message").asText() : "业务失败";
+                            log.warn("云平台业务返回失败: {}", msg);
+                            return false;
+                        }
+                        
+                        // 检查 connectionStatus 字段 (2代表失败)
+                        if (dataNode.has("connectionStatus") && dataNode.get("connectionStatus").asInt(-1) == 2) {
+                            log.warn("云平台连接状态标识为失败");
+                            return false;
+                        }
                     }
                 }
             } catch (Exception e) {
-                log.warn("解析云平台响应失败,按原始HTTP状态码判断: {}", e.getMessage());
+                log.error("解析云平台响应失败: {}", e.getMessage());
+                return false; // 解析失败视为连接异常
             }
-            
+
             log.info("云平台连接测试成功");
             return true;
-            
+
         } catch (org.springframework.web.client.HttpClientErrorException ex) {
             log.error("云平台连接失败 - HTTP客户端错误: {} {}", ex.getStatusCode(), ex.getResponseBodyAsString());
             return false;

+ 24 - 9
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudConfigServiceImpl.java

@@ -69,14 +69,23 @@ public class CloudConfigServiceImpl implements CloudConfigService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public CloudConfigResponse saveConfig(CloudConfigSaveRequest request, String operator, String requestIp) {
+        Integer tenantId = SecurityUtils.getTenantId();
+
+        if (!request.getTenantId().equals(tenantId)) {
+            throw new BusinessException("输入租户ID与登录租户不一致,请确认后重试!");
+        }
+
+        String userName = SecurityUtils.getUsername();
+
         IssueCloudConfig existing = findActiveConfig();
         if (existing == null) {
             IssueCloudConfig created = new IssueCloudConfig();
-            created.setTenantId(Integer.valueOf(request.getTenantId()));
+            created.setTenantId(request.getTenantId());
             created.setCredentialKey(aesGcmCipher.encrypt(request.getCredentialKey()));
             created.setStatus(1);
             created.setConnectionStatus(0);
-            created.setVersion(0);
+            created.setVersion(1);
+            created.setCreateBy(userName);
             CloudEntitySupport.fillOnInsert(created);
             configMapper.insert(created);
             initSyncStatusRows(created.getId());
@@ -85,19 +94,21 @@ public class CloudConfigServiceImpl implements CloudConfigService {
                     "新建配置 tenantId=" + request.getTenantId(), operator, requestIp);
             return toResponse(created);
         }
-        if (request.getVersion() != null && !request.getVersion().equals(existing.getVersion())) {
+        Integer version = existing.getVersion();
+        if (request.getVersion() != null && !request.getVersion().equals(version)) {
             throw new BusinessException("配置版本冲突,请刷新后重试");
         }
-        existing.setTenantId(Integer.valueOf(request.getTenantId()));
+        existing.setTenantId(request.getTenantId());
         existing.setCredentialKey(aesGcmCipher.encrypt(request.getCredentialKey()));
         existing.setStatus(1);
+        existing.setVersion(version + 1);
         CloudEntitySupport.fillOnUpdate(existing);
         int updated = configMapper.updateById(existing);
         if (updated == 0) {
             throw new BusinessException("配置版本冲突,请刷新后重试");
         }
         operationLogService.log(existing.getId(), CloudIntegrationConstants.OPERATION_SAVE_CONFIG,
-                "更新配置 tenantId=" + CredentialMaskUtil.mask(request.getTenantId()), operator, requestIp);
+                "更新配置 tenantId=" + CredentialMaskUtil.mask(String.valueOf(request.getTenantId())), operator, requestIp);
         return toResponse(configMapper.selectById(existing.getId()));
     }
 
@@ -105,9 +116,10 @@ public class CloudConfigServiceImpl implements CloudConfigService {
     @Transactional(rollbackFor = Exception.class)
     public CloudConnectionTestResponse testConnection(String operator, String requestIp) {
         IssueCloudConfig config = requireActiveConfig();
+        config.setToken(SecurityUtils.getToken());
         boolean ok = cloudPlatformClient.testConnection(config);
         config.setConnectionStatus(ok ? 1 : 2);
-        config.setLastTestAt(LocalDateTime.now());
+        config.setLastTestTime(LocalDateTime.now());
         CloudEntitySupport.fillOnUpdate(config);
         configMapper.updateById(config);
         operationLogService.log(config.getId(), CloudIntegrationConstants.OPERATION_TEST_CONNECTION,
@@ -163,7 +175,7 @@ public class CloudConfigServiceImpl implements CloudConfigService {
                         TaskStatusEnum.PENDING.getCode(), TaskStatusEnum.RUNNING.getCode()));
         for (IssueSyncTask task : running) {
             task.setTaskStatus(TaskStatusEnum.CANCELLED.getCode());
-            task.setFinishedAt(LocalDateTime.now());
+            task.setFinishTime(LocalDateTime.now());
             task.setErrorSummary("集成已禁用,任务终止");
             CloudEntitySupport.fillOnUpdate(task);
             syncTaskMapper.updateById(task);
@@ -211,8 +223,11 @@ public class CloudConfigServiceImpl implements CloudConfigService {
         resp.setStatus(config.getStatus());
         resp.setConnectionStatus(config.getConnectionStatus());
         resp.setVersion(config.getVersion());
-        resp.setLastTestAt(config.getLastTestAt());
-        resp.setUpdatedAt(config.getUpdatedAt());
+        resp.setLastTestTime(config.getLastTestTime());
+        resp.setUpdatedTime(config.getUpdateTime());
+        resp.setUpdatedBy(config.getUpdateBy());
+        resp.setCreateTime(config.getCreateTime());
+        resp.setCreateBy(config.getCreateBy());
         return resp;
     }
 }

+ 1 - 1
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudOperationLogServiceImpl.java

@@ -25,7 +25,7 @@ public class CloudOperationLogServiceImpl implements CloudOperationLogService {
         log.setConfigId(configId);
         log.setOperationType(operationType);
         log.setOperationDetail(detail);
-        log.setOperator(operator);
+        log.setCreateBy(operator);
         log.setRequestIp(requestIp);
         CloudEntitySupport.fillOnInsert(log);
         operationLogMapper.insert(log);

+ 3 - 3
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudSyncServiceImpl.java

@@ -160,7 +160,7 @@ public class CloudSyncServiceImpl implements CloudSyncService {
         resp.setSuccessCount(status.getSuccessCount());
         resp.setFailureCount(status.getFailureCount());
         resp.setUnsyncedCount(status.getUnsyncedCount());
-        resp.setLastSyncAt(status.getLastSyncAt());
+        resp.setLastSyncTime(status.getLastSyncTime());
         return resp;
     }
 
@@ -175,8 +175,8 @@ public class CloudSyncServiceImpl implements CloudSyncService {
         resp.setSuccessCount(task.getSuccessCount());
         resp.setFailureCount(task.getFailureCount());
         resp.setErrorSummary(task.getErrorSummary());
-        resp.setStartedAt(task.getStartedAt());
-        resp.setFinishedAt(task.getFinishedAt());
+        resp.setStartTime(task.getStartTime());
+        resp.setFinishTime(task.getFinishTime());
         if (task.getTotalCount() != null && task.getTotalCount() > 0 && task.getProcessedCount() != null) {
             resp.setProgressPercent(task.getProcessedCount() * 100 / task.getTotalCount());
         } else {

+ 3 - 3
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/CloudSyncTaskRunnerImpl.java

@@ -71,7 +71,7 @@ public class CloudSyncTaskRunnerImpl implements CloudSyncTaskRunner {
             return;
         }
         task.setTaskStatus(TaskStatusEnum.RUNNING.getCode());
-        task.setStartedAt(LocalDateTime.now());
+        task.setStartTime(LocalDateTime.now());
         CloudEntitySupport.fillOnUpdate(task);
         syncTaskMapper.updateById(task);
 
@@ -121,7 +121,7 @@ public class CloudSyncTaskRunnerImpl implements CloudSyncTaskRunner {
         if (failure > 0) {
             task.setErrorSummary("部分失败: " + failure + " 条");
         }
-        task.setFinishedAt(LocalDateTime.now());
+        task.setFinishTime(LocalDateTime.now());
         CloudEntitySupport.fillOnUpdate(task);
         syncTaskMapper.updateById(task);
         refreshSyncStatus(task.getConfigId(), type, task);
@@ -140,7 +140,7 @@ public class CloudSyncTaskRunnerImpl implements CloudSyncTaskRunner {
         status.setSuccessCount(task.getSuccessCount());
         status.setFailureCount(task.getFailureCount());
         status.setUnsyncedCount(Math.max(0, task.getTotalCount() - task.getProcessedCount()));
-        status.setLastSyncAt(LocalDateTime.now());
+        status.setLastSyncTime(LocalDateTime.now());
         CloudEntitySupport.fillOnUpdate(status);
         syncStatusMapper.updateById(status);
     }

+ 0 - 4
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/impl/SpRtu2017ServiceImpl.java

@@ -5,19 +5,15 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 
-import com.usky.common.core.exception.BusinessException;
 import com.usky.issue.domain.SpOwner;
 import com.usky.issue.domain.SpRtu2017;
 import com.usky.issue.mapper.SpRtu2017Mapper;
 import com.usky.issue.service.SpOwnerService;
 import com.usky.issue.service.SpRtu2017Service;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Map;
 

+ 19 - 3
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/support/CloudEntitySupport.java

@@ -1,5 +1,8 @@
 package com.usky.issue.service.support;
 
+import com.alibaba.nacos.shaded.io.grpc.netty.shaded.io.netty.util.internal.StringUtil;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.issue.domain.CloudAuditEntity;
 
 import java.time.LocalDateTime;
@@ -17,14 +20,27 @@ public final class CloudEntitySupport {
 
     public static void fillOnInsert(CloudAuditEntity entity) {
         LocalDateTime now = LocalDateTime.now();
-        entity.setCreatedAt(now);
-        entity.setUpdatedAt(now);
+        String username = SecurityUtils.getUsername();
+        if (StringUtils.isBlank(username)) {
+            entity.setCreateBy(username);
+        } else {
+            entity.setCreateBy("system");
+        }
+
+        entity.setCreateTime(now);
+        entity.setUpdateTime(now);
         if (entity.getDeleted() == null) {
             entity.setDeleted(0);
         }
     }
 
     public static void fillOnUpdate(CloudAuditEntity entity) {
-        entity.setUpdatedAt(LocalDateTime.now());
+        entity.setUpdateTime(LocalDateTime.now());
+        String username = SecurityUtils.getUsername();
+        if (StringUtils.isBlank(username)) {
+            entity.setUpdateBy(username);
+        } else {
+            entity.setUpdateBy("system");
+        }
     }
 }

+ 5 - 2
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/CloudConfigResponse.java

@@ -20,6 +20,9 @@ public class CloudConfigResponse {
     private Integer status;
     private Integer connectionStatus;
     private Integer version;
-    private LocalDateTime lastTestAt;
-    private LocalDateTime updatedAt;
+    private LocalDateTime lastTestTime;
+    private LocalDateTime updatedTime;
+    private String updatedBy;
+    private String createBy;
+    private LocalDateTime createTime;
 }

+ 4 - 3
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/CloudConfigSaveRequest.java

@@ -3,6 +3,7 @@ package com.usky.issue.service.vo;
 import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Size;
 
 /**
@@ -14,9 +15,9 @@ import javax.validation.constraints.Size;
 @Data
 public class CloudConfigSaveRequest {
 
-    @NotBlank(message = "租户ID不能为空")
-    @Size(max = 64, message = "租户ID长度不能超过64")
-    private String tenantId;
+    @NotNull(message = "租户ID不能为空")
+    //@Size(max = 64, message = "租户ID长度不能超过64")
+    private Integer tenantId;
 
     @NotBlank(message = "凭证密钥不能为空")
     @Size(max = 256, message = "凭证密钥长度不能超过256")

+ 1 - 1
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/SyncStatusResponse.java

@@ -19,5 +19,5 @@ public class SyncStatusResponse {
     private Integer successCount;
     private Integer failureCount;
     private Integer unsyncedCount;
-    private LocalDateTime lastSyncAt;
+    private LocalDateTime lastSyncTime;
 }

+ 2 - 2
service-issue/service-issue-biz/src/main/java/com/usky/issue/service/vo/SyncTaskResponse.java

@@ -23,6 +23,6 @@ public class SyncTaskResponse {
     private Integer failureCount;
     private String errorSummary;
     private Integer progressPercent;
-    private LocalDateTime startedAt;
-    private LocalDateTime finishedAt;
+    private LocalDateTime startTime;
+    private LocalDateTime finishTime;
 }

+ 1 - 1
service-issue/service-issue-biz/src/test/java/com/usky/issue/cloud/service/CloudConfigServiceImplTest.java

@@ -66,7 +66,7 @@ class CloudConfigServiceImplTest {
         when(aesGcmCipher.decrypt("encrypted-value")).thenReturn("secret");
 
         CloudConfigSaveRequest request = new CloudConfigSaveRequest();
-        request.setTenantId("tenant-001");
+        request.setTenantId(1001);
         request.setCredentialKey("secret");
 
         CloudConfigResponse response = cloudConfigService.saveConfig(request, "admin", "127.0.0.1");