init: 2026Technology-Competition initial commit

This commit is contained in:
xunhe
2026-08-27 17:35:01 +08:00
commit e2a4d40c9e
311 changed files with 37037 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.ims</groupId>
<artifactId>ims-backend</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>ims-api</artifactId>
<dependencies>
<dependency>
<groupId>com.ims</groupId>
<artifactId>ims-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,24 @@
package com.ims.api.controller;
import com.ims.api.dto.system.LogQueryRequest;
import com.ims.api.dto.system.LogResponse;
import com.ims.api.service.system.LogService;
import com.ims.common.dto.ApiResponse;
import com.ims.common.dto.PageResult;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/logs")
public class LogController {
private final LogService logService;
public LogController(LogService logService) {
this.logService = logService;
}
@GetMapping
public ApiResponse<PageResult<LogResponse>> list(@ModelAttribute LogQueryRequest request) {
return ApiResponse.success(logService.list(request));
}
}
@@ -0,0 +1,42 @@
package com.ims.api.controller;
import com.ims.api.dto.system.PermissionResponse;
import com.ims.api.dto.system.RoleRequest;
import com.ims.api.dto.system.RoleResponse;
import com.ims.api.service.system.RoleService;
import com.ims.common.dto.ApiResponse;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/v1/roles")
public class RoleController {
private final RoleService roleService;
public RoleController(RoleService roleService) {
this.roleService = roleService;
}
@GetMapping
public ApiResponse<List<RoleResponse>> list() {
return ApiResponse.success(roleService.list());
}
@GetMapping("/permissions")
public ApiResponse<List<PermissionResponse>> permissions() {
return ApiResponse.success(roleService.permissions());
}
@PostMapping
public ApiResponse<RoleResponse> create(@RequestBody @Valid RoleRequest request) {
return ApiResponse.success(roleService.create(request));
}
@PutMapping("/{id}")
public ApiResponse<RoleResponse> update(@PathVariable Long id, @RequestBody @Valid RoleRequest request) {
return ApiResponse.success(roleService.update(id, request));
}
}
@@ -0,0 +1,77 @@
package com.ims.api.controller;
import com.ims.api.dto.system.UserRequest;
import com.ims.api.dto.system.UserResponse;
import com.ims.api.service.system.UserService;
import com.ims.common.dto.ApiResponse;
import com.ims.common.dto.PageResult;
import jakarta.validation.Valid;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping
public ApiResponse<PageResult<UserResponse>> list(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int pageSize,
@RequestParam(required = false) String keyword,
@RequestParam(required = false) Long departmentId,
@RequestParam(required = false) Boolean isActive) {
return ApiResponse.success(userService.list(page, pageSize, keyword, departmentId, isActive));
}
@PostMapping
public ApiResponse<UserResponse> create(@RequestBody @Valid UserRequest request) {
return ApiResponse.success(userService.create(request));
}
@PutMapping("/{id}")
public ApiResponse<UserResponse> update(@PathVariable Long id, @RequestBody @Valid UserRequest request) {
return ApiResponse.success(userService.update(id, request));
}
@PutMapping("/{id}/status")
public ApiResponse<Void> toggleStatus(@PathVariable Long id, @RequestParam Boolean isActive) {
userService.updateStatus(id, isActive);
return ApiResponse.success(null);
}
@GetMapping("/export")
public void export(@RequestParam(required = false) String keyword,
@RequestParam(required = false) Long departmentId,
@RequestParam(required = false) Boolean isActive,
HttpServletResponse response) throws IOException {
PageResult<UserResponse> result = userService.list(1, 100000, keyword, departmentId, isActive);
response.setContentType("text/csv;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=users.csv");
response.getWriter().write("\uFEFF");
response.getWriter().write("账号,姓名,邮箱,部门,角色,状态,Agent授权\n");
for (UserResponse u : result.getItems()) {
String roles = u.getRoles() == null ? "" : String.join("|", u.getRoles());
response.getWriter().write(String.join(",",
csv(u.getUserid()), csv(u.getUsername()), csv(u.getEmail()),
csv(u.getDepartmentName()), csv(roles),
Boolean.TRUE.equals(u.getIsActive()) ? "正常" : "禁用",
Boolean.TRUE.equals(u.getAgentAutoExecute()) ? "" : "") + "\n");
}
response.getWriter().flush();
}
private String csv(String s) {
if (s == null) {
return "";
}
return s.contains(",") ? "\"" + s + "\"" : s;
}
}
@@ -0,0 +1,12 @@
package com.ims.api.dto.agent;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class AgentApprovalRequest {
@NotNull
private Boolean approved;
private String comment;
}
@@ -0,0 +1,10 @@
package com.ims.api.dto.agent;
import lombok.Data;
@Data
public class AgentConfigRequest {
private Integer maxSteps;
private Boolean autoExecuteHighRisk;
private Integer userRateLimit;
}
@@ -0,0 +1,10 @@
package com.ims.api.dto.agent;
import lombok.Data;
@Data
public class AgentConfigResponse {
private Integer maxSteps;
private Boolean autoExecuteHighRisk;
private Integer userRateLimit;
}
@@ -0,0 +1,12 @@
package com.ims.api.dto.agent;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class AgentExecuteRequest {
private Long issueId;
@NotBlank
private String goal;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.agent;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AgentExecuteResponse {
private Long planId;
private String status;
private Boolean requiresApproval;
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.agent;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class AgentMemoryRequest {
@NotBlank
private String issueSummary;
@NotBlank
private String solutionSteps;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.agent;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class AgentMemoryResponse {
private Long id;
private String issueSummary;
private String solutionSteps;
private java.math.BigDecimal effectivenessScore;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
@@ -0,0 +1,21 @@
package com.ims.api.dto.agent;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class AgentPlanResponse {
private Long id;
private Long issueId;
private String issueNo;
private String issueTitle;
private String goal;
private String planSteps;
private String status;
private Boolean requiresApproval;
private String approvalStatus;
private String approvalComment;
private String modelProvider;
private LocalDateTime createdAt;
private LocalDateTime completedAt;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.agent;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class AgentSuggestFieldsRequest {
@NotBlank(message = "标题不能为空")
private String title;
private String description;
private Long issueId;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.agent;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class AgentSuggestRequest {
@NotNull
private Long issueId;
@NotBlank
private String goal;
}
@@ -0,0 +1,12 @@
package com.ims.api.dto.ai;
import lombok.Data;
import java.util.List;
@Data
public class AiAnalysisRequest {
private List<Long> issueIds;
private String departmentId;
private String status;
private String phase;
}
@@ -0,0 +1,28 @@
package com.ims.api.dto.ai;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class AiAnalysisResponse {
private Long id;
private Long issueId;
private String issueNo;
private String issueTitle;
private String departmentName;
private String category;
private String keywords;
private String extractedKeywords;
private String rootCause;
private String suggestion;
private String status;
private Integer helpfulCount;
private String promptTemplateId;
private Integer promptVersion;
private String modelProvider;
private String modelName;
private String errorMessage;
private LocalDateTime startedAt;
private LocalDateTime completedAt;
private LocalDateTime createdAt;
}
@@ -0,0 +1,23 @@
package com.ims.api.dto.ai;
import lombok.Data;
@Data
public class AiConfigRequest {
private String provider;
private String ollamaBaseUrl;
private String ollamaChatModel;
private String ollamaEmbeddingModel;
private Float ollamaTemperature;
private Integer ollamaNumPredict;
private String deepseekApiKey;
private String deepseekModel;
private String deepseekEmbeddingModel;
private Boolean autoFallbackEnabled;
private Integer agentMaxSteps;
private Boolean autoExecuteHighRisk;
private Integer userRateLimit;
private Integer chunkSize;
private Integer chunkOverlap;
private Long maxUploadSize;
}
@@ -0,0 +1,22 @@
package com.ims.api.dto.ai;
import lombok.Data;
@Data
public class AiConfigResponse {
private String provider;
private String ollamaBaseUrl;
private String ollamaChatModel;
private String ollamaEmbeddingModel;
private Float ollamaTemperature;
private Integer ollamaNumPredict;
private String deepseekModel;
private String deepseekEmbeddingModel;
private Boolean autoFallbackEnabled;
private Integer agentMaxSteps;
private Boolean autoExecuteHighRisk;
private Integer userRateLimit;
private Integer chunkSize;
private Integer chunkOverlap;
private Long maxUploadSize;
}
@@ -0,0 +1,12 @@
package com.ims.api.dto.ai;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Data
public class AiFeedbackRequest {
@NotNull
private Boolean isHelpful;
private String comment;
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.auth;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class LoginRequest {
@NotBlank(message = "账号不能为空")
private String username;
@NotBlank(message = "密码不能为空")
private String password;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.auth;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class LoginResponse {
private String accessToken;
private String refreshToken;
private Long userId;
private String username;
private String roleName;
}
@@ -0,0 +1,72 @@
package com.ims.api.dto.dashboard;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class DashboardStatsResponse {
private long pendingCount;
private long inProgressCount;
private long pendingConfirmCount;
private long closedCount;
private long todayNewCount;
private long monthlyClosedCount;
private List<CardInfo> cards;
private List<DailyTrend> trend;
private List<StatusCount> statusDistribution;
private List<Activity> recentActivities;
private List<Insight> insights;
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class CardInfo {
private String key;
private long count;
private String changeText;
private String suggestion;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class DailyTrend {
private String date;
private long newCount;
private long resolvedCount;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class StatusCount {
private String status;
private long count;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Activity {
private String userName;
private String action;
private String issueNo;
private String title;
private LocalDateTime createdAt;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Insight {
private String type;
private String title;
private String content;
}
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.imports;
import lombok.Data;
import java.util.List;
@Data
public class AgentValidateResponse {
private boolean usable;
private String usableReason;
private List<ImportSuggestion> suggestions;
private String engine;
private long elapsedMs;
}
@@ -0,0 +1,10 @@
package com.ims.api.dto.imports;
import lombok.Data;
import java.util.List;
@Data
public class ImportConfirmRequest {
private String fileName;
private List<ImportRow> rows;
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.imports;
import lombok.Data;
import java.util.List;
@Data
public class ImportPreviewResponse {
private int total;
private int validCount;
private int errorCount;
private boolean headerValid = true;
private List<ImportRow> rows;
}
@@ -0,0 +1,9 @@
package com.ims.api.dto.imports;
import lombok.Data;
@Data
public class ImportRecordQueryRequest {
private int page = 1;
private int pageSize = 20;
}
@@ -0,0 +1,17 @@
package com.ims.api.dto.imports;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class ImportRecordResponse {
private Long id;
private String fileName;
private Integer totalCount;
private Integer successCount;
private Integer failCount;
private String status;
private String errorLog;
private String operator;
private LocalDateTime createdAt;
}
@@ -0,0 +1,25 @@
package com.ims.api.dto.imports;
import lombok.Data;
import java.util.List;
@Data
public class ImportRow {
private Integer rowNo;
private String title;
private String docType;
private String phase;
private String priority;
private String deadline;
private String reviewDate;
private String subProject;
private String category;
private String impactLevel;
private String description;
private String assigneeUserid;
private String reviewerUserid;
private String validatorUserid;
private String departmentName;
private String status;
private List<String> errors;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.imports;
import lombok.Data;
@Data
public class ImportSuggestion {
private Integer rowNo;
private String field;
private String fieldName;
private String original;
private String suggested;
private String reason;
private String level;
}
@@ -0,0 +1,15 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class AttachmentResponse {
private Long id;
private String fileName;
private Long fileSize;
private String mimeType;
private String filePath;
private String uploadedByName;
private LocalDateTime createdAt;
}
@@ -0,0 +1,11 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.util.List;
@Data
public class BatchAgentRequest {
private List<Long> issueIds;
private String goal;
}
@@ -0,0 +1,11 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.util.List;
@Data
public class BatchAssignRequest {
private List<Long> issueIds;
private Long assigneeId;
}
@@ -0,0 +1,11 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.util.List;
@Data
public class BatchNotifyRequest {
private List<Long> issueIds;
private String content;
}
@@ -0,0 +1,35 @@
package com.ims.api.dto.issue;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class IssueCreateRequest {
@NotBlank(message = "指摘标题不能为空")
@Size(max = 200, message = "指摘标题长度不能超过 200")
private String title;
private String description;
private String phase;
private String subProject;
private String category;
private String impactLevel;
private String impactScope;
private String deployment;
private String pgmNo;
private BigDecimal reviewWorkload;
private BigDecimal responseWorkload;
private String responseContent;
private String ngReason;
private LocalDateTime responseCompletedAt;
private LocalDateTime confirmAt;
private Long assigneeId;
private Long departmentId;
private Long reviewerId;
private Long validatorId;
private String priority;
private String status;
private LocalDateTime deadline;
}
@@ -0,0 +1,20 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class IssueListRequest {
private String status;
private String phase;
private String subProject;
private String priority;
private String impactLevel;
private String keyword;
private Long assigneeId;
private Long departmentId;
private LocalDateTime startDate;
private LocalDateTime endDate;
private int page = 1;
private int pageSize = 20;
}
@@ -0,0 +1,44 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class IssueResponse {
private Long id;
private String issueNo;
private String title;
private String description;
private String status;
private String priority;
private LocalDateTime deadline;
private String phase;
private String subProject;
private String category;
private String impactLevel;
private String impactScope;
private String deployment;
private String pgmNo;
private BigDecimal reviewWorkload;
private BigDecimal responseWorkload;
private String responseContent;
private String ngReason;
private LocalDateTime responseCompletedAt;
private LocalDateTime confirmAt;
private Long creatorId;
private String creatorName;
private Long assigneeId;
private String assigneeName;
private Long departmentId;
private String departmentName;
private Long reviewerId;
private String reviewerName;
private Long validatorId;
private String validatorName;
private String agentStatus;
private Long agentLastPlanId;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
private LocalDateTime closedAt;
}
@@ -0,0 +1,11 @@
package com.ims.api.dto.issue;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class IssueStatusRequest {
@NotBlank
private String status;
private String remark;
}
@@ -0,0 +1,31 @@
package com.ims.api.dto.issue;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class IssueUpdateRequest {
private String title;
private String description;
private String status;
private String priority;
private LocalDateTime deadline;
private String phase;
private String subProject;
private String category;
private String impactLevel;
private String impactScope;
private String deployment;
private String pgmNo;
private BigDecimal reviewWorkload;
private BigDecimal responseWorkload;
private String responseContent;
private String ngReason;
private LocalDateTime responseCompletedAt;
private LocalDateTime confirmAt;
private Long assigneeId;
private Long departmentId;
private Long reviewerId;
private Long validatorId;
}
@@ -0,0 +1,17 @@
package com.ims.api.dto.knowledge;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class KnowledgeDocResponse {
private Long id;
private String name;
private Long fileSize;
private String fileType;
private Integer chunkCount;
private String status;
private String errorMessage;
private String uploadedByName;
private LocalDateTime createdAt;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.knowledge;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class KnowledgeLogQueryRequest {
private Long userId;
private Long issueId;
private LocalDateTime startTime;
private LocalDateTime endTime;
private int page = 1;
private int pageSize = 20;
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.knowledge;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class KnowledgeSearchRequest {
@NotBlank
private String query;
private Integer topK = 5;
private Long issueId;
}
@@ -0,0 +1,11 @@
package com.ims.api.dto.knowledge;
import lombok.Data;
@Data
public class KnowledgeSearchResponse {
private Long chunkId;
private String content;
private String docName;
private Double score;
}
@@ -0,0 +1,15 @@
package com.ims.api.dto.notification;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class NotificationResponse {
private Long id;
private String title;
private String content;
private String type;
private String link;
private Boolean isRead;
private LocalDateTime createdAt;
}
@@ -0,0 +1,17 @@
package com.ims.api.dto.prompt;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PromptLogResponse {
private Long id;
private String requestId;
private String templateId;
private Integer templateVersion;
private String renderedPrompt;
private Integer executionTimeMs;
private String llmModel;
private String modelProvider;
private LocalDateTime createdAt;
}
@@ -0,0 +1,20 @@
package com.ims.api.dto.prompt;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PromptRenderLogResponse {
private Long id;
private String requestId;
private String templateId;
private Integer templateVersion;
private String renderedPrompt;
private String variablesUsed;
private Integer tokensInput;
private Integer tokensOutput;
private Integer executionTimeMs;
private String llmModel;
private String modelProvider;
private LocalDateTime createdAt;
}
@@ -0,0 +1,17 @@
package com.ims.api.dto.prompt;
import lombok.Data;
@Data
public class PromptStatsResponse {
private String templateId;
private String name;
private String category;
private Long useCount;
private Double avgExecutionTimeMs;
private Integer latestVersion;
private Long totalTemplates;
private Long activeTemplates;
private Long totalVersions;
private Long totalRenders;
}
@@ -0,0 +1,22 @@
package com.ims.api.dto.prompt;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class PromptTemplateRequest {
@NotBlank
private String templateId;
@NotBlank
private String name;
@NotBlank
private String category;
@NotBlank
private String content;
private String variables;
private String outputSchema;
}
@@ -0,0 +1,20 @@
package com.ims.api.dto.prompt;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PromptTemplateResponse {
private Long id;
private String templateId;
private String name;
private String category;
private Integer version;
private String content;
private String variables;
private String outputSchema;
private Boolean isActive;
private Boolean isDefault;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.prompt;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.Map;
@Data
public class PromptTestRequest {
@NotBlank
private String templateId;
private Map<String, Object> variables;
}
@@ -0,0 +1,12 @@
package com.ims.api.dto.prompt;
import lombok.Data;
@Data
public class PromptTestResponse {
private String templateId;
private Integer templateVersion;
private String renderedPrompt;
private Integer executionTimeMs;
private Integer tokenEstimate;
}
@@ -0,0 +1,15 @@
package com.ims.api.dto.prompt;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class PromptVersionResponse {
private Long id;
private String templateId;
private Integer version;
private String content;
private String changeLog;
private String createdBy;
private LocalDateTime createdAt;
}
@@ -0,0 +1,13 @@
package com.ims.api.dto.system;
import lombok.Data;
import java.util.List;
@Data
public class DepartmentResponse {
private Long id;
private String name;
private Long parentId;
private Integer sortOrder;
private List<DepartmentResponse> children;
}
@@ -0,0 +1,17 @@
package com.ims.api.dto.system;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class LogQueryRequest {
private String operator;
private LocalDateTime startTime;
private LocalDateTime endTime;
private String actionType;
private String resourceType;
private String keyword;
private String level;
private int page = 1;
private int pageSize = 20;
}
@@ -0,0 +1,14 @@
package com.ims.api.dto.system;
import lombok.Data;
import java.time.LocalDateTime;
@Data
public class LogResponse {
private Long id;
private String operator;
private String action;
private String resource;
private String detail;
private LocalDateTime createdAt;
}
@@ -0,0 +1,11 @@
package com.ims.api.dto.system;
import lombok.Data;
@Data
public class PermissionResponse {
private Long id;
private String code;
private String name;
private String resource;
}
@@ -0,0 +1,19 @@
package com.ims.api.dto.system;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
@Data
public class RoleRequest {
@NotBlank
private String name;
private String description;
private String dataScope;
private Boolean agentAutoExecute;
private List<Long> permissionIds;
}
@@ -0,0 +1,16 @@
package com.ims.api.dto.system;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class RoleResponse {
private Long id;
private String name;
private String description;
private String dataScope;
private Boolean agentAutoExecute;
private List<Long> permissionIds;
private LocalDateTime createdAt;
}
@@ -0,0 +1,26 @@
package com.ims.api.dto.system;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
@Data
public class UserRequest {
@NotBlank
private String userid;
@NotBlank
private String username;
private String email;
private String password;
private Long departmentId;
private List<Long> roleIds;
private Boolean isActive;
private Boolean agentAutoExecute;
}
@@ -0,0 +1,21 @@
package com.ims.api.dto.system;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Data
public class UserResponse {
private Long id;
private String userid;
private String username;
private String email;
private Long departmentId;
private String departmentName;
private Boolean isActive;
private Boolean agentAutoExecute;
private List<Long> roleIds;
private List<String> roles;
private LocalDateTime lastLoginAt;
private LocalDateTime createdAt;
}
@@ -0,0 +1,11 @@
package com.ims.api.service.agent;
import com.ims.api.dto.agent.AgentConfigRequest;
import com.ims.api.dto.agent.AgentConfigResponse;
public interface AgentConfigService {
AgentConfigResponse getConfig();
void updateConfig(AgentConfigRequest request);
}
@@ -0,0 +1,6 @@
package com.ims.api.service.ai;
public interface ChatService {
String chat(String systemPrompt, String userPrompt);
}
@@ -0,0 +1,33 @@
package com.ims.api.service.prompt;
import com.ims.api.dto.prompt.PromptLogResponse;
import com.ims.api.dto.prompt.PromptStatsResponse;
import com.ims.api.dto.prompt.PromptTemplateRequest;
import com.ims.api.dto.prompt.PromptTemplateResponse;
import com.ims.api.dto.prompt.PromptTestRequest;
import com.ims.api.dto.prompt.PromptTestResponse;
import com.ims.api.dto.prompt.PromptVersionResponse;
import com.ims.common.dto.PageResult;
import java.util.List;
public interface PromptService {
PageResult<PromptTemplateResponse> list(int page, int pageSize, String category, String keyword);
PromptTemplateResponse detail(String templateId);
PromptTemplateResponse create(PromptTemplateRequest request, String operatorUsername);
PromptTemplateResponse update(String templateId, PromptTemplateRequest request, String operatorUsername);
void rollback(String templateId, int version, String operatorUsername);
PromptTestResponse test(PromptTestRequest request, String operatorUsername);
List<PromptVersionResponse> versions(String templateId);
PageResult<PromptLogResponse> logs(int page, int pageSize);
PromptStatsResponse stats();
}
@@ -0,0 +1,10 @@
package com.ims.api.service.system;
import com.ims.api.dto.system.DepartmentResponse;
import java.util.List;
public interface DepartmentService {
List<DepartmentResponse> tree();
}
@@ -0,0 +1,24 @@
package com.ims.api.service.system;
import com.ims.api.dto.imports.AgentValidateResponse;
import com.ims.api.dto.imports.ImportConfirmRequest;
import com.ims.api.dto.imports.ImportPreviewResponse;
import com.ims.api.dto.imports.ImportRecordResponse;
import com.ims.api.dto.imports.ImportRow;
import com.ims.common.dto.PageResult;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface ImportService {
byte[] generateTemplate();
ImportPreviewResponse preview(MultipartFile file);
AgentValidateResponse aiValidate(List<ImportRow> rows);
ImportRecordResponse confirm(ImportConfirmRequest request, String operatorUsername);
PageResult<ImportRecordResponse> records(int page, int pageSize);
}
@@ -0,0 +1,10 @@
package com.ims.api.service.system;
import com.ims.api.dto.system.LogQueryRequest;
import com.ims.api.dto.system.LogResponse;
import com.ims.common.dto.PageResult;
public interface LogService {
PageResult<LogResponse> list(LogQueryRequest request);
}
@@ -0,0 +1,18 @@
package com.ims.api.service.system;
import com.ims.api.dto.system.PermissionResponse;
import com.ims.api.dto.system.RoleRequest;
import com.ims.api.dto.system.RoleResponse;
import java.util.List;
public interface RoleService {
List<RoleResponse> list();
List<PermissionResponse> permissions();
RoleResponse create(RoleRequest request);
RoleResponse update(Long id, RoleRequest request);
}
@@ -0,0 +1,16 @@
package com.ims.api.service.system;
import com.ims.api.dto.system.UserRequest;
import com.ims.api.dto.system.UserResponse;
import com.ims.common.dto.PageResult;
public interface UserService {
PageResult<UserResponse> list(int page, int pageSize, String keyword, Long departmentId, Boolean isActive);
UserResponse create(UserRequest request);
UserResponse update(Long id, UserRequest request);
void updateStatus(Long id, Boolean isActive);
}