init: 2026Technology-Competition initial commit
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user