初始化阶段性代码

master
gitee 1 week ago
parent fa1d9cb794
commit 25e13ed139

@ -102,6 +102,13 @@ public class AuditLogDTO implements Serializable {
this.startTime = LocalDateTime.now();
}
public AuditLogDTO(String recordType, String userId, String appName, String ip) {
this.recordType = recordType;
this.userId = userId;
this.appName = appName;
this.ip = ip;
}
public AuditLog toAuditLog(){
AuditLog auditLog = new AuditLog();
auditLog.setId(id);

@ -1,18 +1,17 @@
package com.supervision.ai.service.hub.config;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.SetBucketLifecycleArgs;
import io.minio.errors.*;
import io.minio.messages.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.List;
/**
* Endpoint URL
@ -22,6 +21,7 @@ import java.util.List;
* @author qmy
* @since 1.0.0
*/
@Slf4j
@Configuration
public class MinioClientConfig {
@ -39,34 +39,20 @@ public class MinioClientConfig {
@Bean
@Primary
public MinioClient minioClient() {
public MinioClient minioClient() throws ServerException, InsufficientDataException, ErrorResponseException,
IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException,
XmlParserException, InternalException {
MinioClient client = MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
try {
client.setBucketLifecycle(
SetBucketLifecycleArgs
.builder()
.config(new LifecycleConfiguration(
List.of(
new LifecycleRule(Status.ENABLED,
null,
new Expiration((ResponseDate) null, 1, null),
new RuleFilter("temp-"),
"TempFileDeleteRule",
null,
null,
null)
)
))
.bucket(bucketName)
.build()
);
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException |
XmlParserException e) {
throw new RuntimeException(e);
// 判断bucket是否存在如果不存在则创建
if (!client.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
log.info("未找到bucket:{},自动创建...", bucketName);
client.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
} else {
log.info("bucket:{}已存在...", bucketName);
}
return client;
}

@ -0,0 +1,28 @@
package com.supervision.ai.service.hub.constant;
import lombok.Getter;
@Getter
public enum ComfyuiRunStatusEnum {
//未开始
NOT_STARTED("0"),
//进行中
RUNNING("1"),
//成功
SUCCESS("2"),
//失败
FAILED("2"),
//取消
CANCELED("3");
private String status;
ComfyuiRunStatusEnum(String status) {
this.status = status;
}
}

@ -0,0 +1,79 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.dto.sys.AppDTO;
import com.supervision.ai.service.hub.service.SysAppService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
*
*/
@RestController
@RequestMapping("/app")
@RequiredArgsConstructor
public class ApplicationController {
private final SysAppService sysAppService;
/**
*
* @param appDTO
* @return
*/
@PostMapping("/save")
public R<String> saveApp(@RequestBody AppDTO appDTO) {
String id = sysAppService.saveApp(appDTO);
return R.ok(id);
}
/**
*
* @param appDTO
* @return
*/
@PostMapping("/update")
public R<Boolean> updateApp(@RequestBody AppDTO appDTO) {
Boolean success = sysAppService.updateApp(appDTO);
return R.ok(success);
}
/**
*
* @param appDTO
* @return
*/
@PostMapping("/delete")
public R<Boolean> deleteApp(@RequestBody AppDTO appDTO) {
Boolean success = sysAppService.deleteApp(appDTO);
return R.ok(success);
}
/**
*
* @param appName
* @param page
* @param pageSize
* @return
*/
@GetMapping("/pageList")
public R<IPage<AppDTO>> pageList(@RequestParam(name = "appName", required = false) String appName,
@RequestParam (name = "page", required = false,defaultValue = "1") Integer page,
@RequestParam (name = "pageSize", required = false,defaultValue = "10") Integer pageSize) {
IPage<AppDTO> appList = sysAppService.pageList(appName, page, pageSize);
return R.ok(appList);
}
/**
* id
* @param id
* @return
*/
@PostMapping("/queryById")
public R<AppDTO> queryById(@RequestParam String id) {
AppDTO app = sysAppService.queryById(id);
return R.ok(app);
}
}

@ -0,0 +1,55 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.aop.AuditLogDTO;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.service.AuditLogService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
*
*/
@RestController
@RequestMapping("/auditLog")
@RequiredArgsConstructor
public class AuditLogController {
private final AuditLogService auditLogService;
/**
*
* @param recordType
* @param userId
* @param appName
* @param ip
* @param page
* @param pageSize
* @return
*/
@RequestMapping("/pageList")
public R<IPage<AuditLogDTO>> pageList(@RequestParam("recordType") String recordType,
@RequestParam("userId") String userId,
@RequestParam("appName") String appName,
@RequestParam("ip") String ip,
@RequestParam (name = "page", required = false,defaultValue = "1") Integer page,
@RequestParam (name = "pageSize", required = false,defaultValue = "10") Integer pageSize) {
AuditLogDTO auditLogDTO = new AuditLogDTO(recordType,userId,appName,ip);
IPage<AuditLogDTO> list = auditLogService.pageList(auditLogDTO,page,pageSize);
return R.ok(list);
}
/**
* id
* @param id
* @return
*/
@RequestMapping("/queryById")
public R<AuditLogDTO> queryById(@RequestParam(name="id") String id) {
AuditLogDTO auditLogDTO = auditLogService.queryById(id);
return R.ok(auditLogDTO);
}
}

@ -1,14 +1,13 @@
package com.supervision.ai.service.hub.controller;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.service.impl.AuthService;
import lombok.Data;
import com.supervision.ai.service.hub.vo.LoginReqVo;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
import java.util.List;
@RestController
@RequestMapping("/auth")
@ -18,20 +17,10 @@ public class AuthController {
private final AuthService authService;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
try {
String token = authService.login(request.getAppName(), request.getPassword());
Map<String, String> response = new HashMap<>();
response.put("token", token);
return ResponseEntity.ok(response);
} catch (RuntimeException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(e.getMessage());
}
}
@Data
public static class LoginRequest {
private String appName;
private String password;
public R<String> login(@RequestBody LoginReqVo loginReqVo) {
Assert.notEmpty(List.of(loginReqVo.getUsername(), loginReqVo.getAppName()), "appName和userName不能同时为空");
String name = StrUtil.isNotEmpty(loginReqVo.getAppName()) ? loginReqVo.getAppName() : loginReqVo.getUsername();
String token = authService.login(name, loginReqVo.getPassword());
return R.ok(token);
}
}

@ -1,48 +0,0 @@
package com.supervision.ai.service.hub.controller;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.service.ComfyUIService;
import com.supervision.ai.service.hub.vo.comfyui.RunPromptReqVo;
import com.supervision.ai.service.hub.vo.comfyui.TaskResultResVo;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@RequestMapping("/model")
@RequiredArgsConstructor
public class ComfyUIController {
private final ComfyUIService comfyUIService;
/**
* prompt
* @param runPromptReqVo prompt
* @return
*/
@PostMapping("/run")
public R<String> runPrompt(@RequestBody RunPromptReqVo runPromptReqVo) {
String taskId = comfyUIService.runPrompt(runPromptReqVo);
return R.ok(taskId);
}
@GetMapping("/getTaskById")
public R<List<TaskResultResVo>> queryHistory(@RequestParam(name = "taskId", required = false) String taskId) {
List<TaskResultResVo> taskResultResVos = comfyUIService.queryHistory(taskId);
return R.ok(taskResultResVos);
}
@PostMapping("/uploadImage")
public R<String> uploadImage(@RequestParam("file") MultipartFile file) throws Exception {
String imageId = comfyUIService.uploadImage(file);
return R.ok(imageId);
}
@GetMapping("/downloadView")
public void downloadView(@RequestParam("fileName") String fileName, HttpServletResponse response) throws Exception {
comfyUIService.downloadView(fileName, response);
}
}

@ -0,0 +1,72 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.dto.sys.FileDTO;
import com.supervision.ai.service.hub.service.SysFileService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
*
*/
@RestController
@RequestMapping("/file")
@RequiredArgsConstructor
public class FileController {
private final SysFileService fileService;
/**
*
* @param file
* @return
*/
@PostMapping("/upload")
public R<String> upload(@RequestPart("file") MultipartFile file) {
String fileId = fileService.upload(file);
return R.ok(fileId);
}
/**
*
* @param fileName
* @param fileType
* @param page
* @param pageSize
* @return
*/
@PostMapping("/pageList")
public R<IPage<FileDTO>> pageList(@RequestParam(name = "fileName", required = false) String fileName,
@RequestParam(name = "fileType", required = false) String fileType,
@RequestParam (name = "page", required = false,defaultValue = "1") Integer page,
@RequestParam (name = "pageSize", required = false,defaultValue = "10") Integer pageSize) {
IPage<FileDTO> list = fileService.pageList(fileName, fileType, page, pageSize);
return R.ok(list);
}
/**
*
* @param id ID
* @return
*/
@PostMapping("/queryById")
public R<FileDTO> queryById(@RequestParam(name = "id") String id) {
FileDTO file = fileService.queryById(id);
return R.ok(file);
}
/**
*
* @param fileId
* @param response
*/
@GetMapping("/downLoad")
public void downLoad(@RequestParam("fileId") String fileId, HttpServletResponse response) {
fileService.downLoad(fileId,response);
}
}

@ -0,0 +1,99 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.comfyui.ComfyUIPromptDTO;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.service.ComfyUIService;
import com.supervision.ai.service.hub.vo.comfyui.RunPromptReqVo;
import com.supervision.ai.service.hub.vo.comfyui.TaskResultResVo;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/model")
@RequiredArgsConstructor
public class ModelController {
private final ComfyUIService comfyUIService;
/**
*
* @param comfyUIPromptDTO
* @return
*/
@PostMapping("/save")
public R<String> saveModel(@RequestBody ComfyUIPromptDTO comfyUIPromptDTO) {
String modelId = comfyUIService.saveModel(comfyUIPromptDTO);
return R.ok(modelId);
}
/**
*
* @param comfyUIPromptDTO
* @return
*/
@PostMapping("/update")
public R<Boolean> updateModel(@RequestBody ComfyUIPromptDTO comfyUIPromptDTO) {
Boolean success = comfyUIService.updateModel(comfyUIPromptDTO);
return R.ok(success);
}
@PostMapping("/delete")
public R<Boolean> deleteModel(@RequestBody ComfyUIPromptDTO comfyUIPromptDTO) {
Boolean success = comfyUIService.deleteModel(comfyUIPromptDTO);
return R.ok(success);
}
@GetMapping("/queryById")
public R<ComfyUIPromptDTO> queryById(@RequestParam(name = "id") String id) {
ComfyUIPromptDTO comfyUIPromptDTO = comfyUIService.queryById(id);
return R.ok(comfyUIPromptDTO);
}
@PostMapping("/pageList")
public R<IPage<ComfyUIPromptDTO>> pageList(@RequestParam(name = "promptName", required = false) String promptName,
@RequestParam(name = "promptType", required = false) String promptType,
@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
IPage<ComfyUIPromptDTO> pageList = comfyUIService.pageList(promptName, promptType, page, pageSize);
return R.ok(pageList);
}
/**
*
* @param runPromptReqVo prompt
* @return
*/
@PostMapping("/executeTask")
public R<String> executeTask(@RequestBody RunPromptReqVo runPromptReqVo) {
String taskId = comfyUIService.executeTask(runPromptReqVo);
return R.ok(taskId);
}
@GetMapping("/getTaskById")
public R<TaskResultResVo> getTaskById(@RequestParam(name = "taskId", required = false) String taskId) {
TaskResultResVo taskResultResVos = comfyUIService.getTaskById(taskId);
return R.ok(taskResultResVos);
}
@GetMapping("/queryTaskPageList")
public R<IPage<TaskResultResVo>> queryTaskPageList(@RequestParam(name = "taskId", required = false) String taskId) {
IPage<TaskResultResVo> taskResultResVos = comfyUIService.queryHistory(taskId);
return R.ok(taskResultResVos);
}
@PostMapping("/uploadImage")
public R<String> uploadImage(@RequestParam("file") MultipartFile file) throws Exception {
String imageId = comfyUIService.uploadImage(file);
return R.ok(imageId);
}
@GetMapping("/downloadView")
public void downloadView(@RequestParam("fileName") String fileName, HttpServletResponse response) throws Exception {
comfyUIService.downloadView(fileName, response);
}
}

@ -0,0 +1,98 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.sys.PermissionDTO;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.service.PermissionService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
*
*/
@RestController
@RequestMapping("/permission")
@RequiredArgsConstructor
public class PermissionController {
private final PermissionService permissionService;
/**
*
* @param permissionDTO
* @return ID
*/
@PostMapping("/save")
public R<String> savePermission(@RequestBody PermissionDTO permissionDTO) {
String permissionId = permissionService.savePermission(permissionDTO);
return R.ok(permissionId);
}
/**
*
* @param permissionDTO
* @return
*/
@PostMapping("/update")
public R<Boolean> updatePermission(@RequestBody PermissionDTO permissionDTO) {
Boolean success = permissionService.updatePermission(permissionDTO);
return R.ok(success);
}
/**
*
* @param permissionDTO
* @return
*/
@PostMapping("/delete")
public R<Boolean> deletePermission(@RequestBody PermissionDTO permissionDTO) {
Boolean success = permissionService.deletePermission(permissionDTO.getId());
return R.ok(success);
}
/**
*
* @param type
* @return
*/
@GetMapping("/query")
public R<List<PermissionDTO>> queryPermission(@RequestParam (name = "type", required = false) String type) {
List<PermissionDTO> list = permissionService.queryPermission(type);
return R.ok(list);
}
/**
*
* @param permissionName
* @param page
* @param pageSize
* @return
*/
@PostMapping("/pageList")
public R<IPage<PermissionDTO>> pageList(@RequestParam (name = "permissionName", required = false) String permissionName,
@RequestParam (name = "page", required = false) Integer page,
@RequestParam(name = "pageSize", required = false) Integer pageSize) {
IPage<PermissionDTO> list = permissionService.pageList(permissionName, page, pageSize);
return R.ok(list);
}
/**
* ID
* @param id
* @return
*/
@GetMapping("/queryById")
public R<PermissionDTO> queryById(@RequestParam(name = "id") String id) {
PermissionDTO permissionDTO = permissionService.queryById(id);
return R.ok(permissionDTO);
}
}

@ -0,0 +1,84 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.dto.sys.SysRoleDTO;
import com.supervision.ai.service.hub.service.SysRoleService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
*
*/
@RestController
@RequestMapping("/role")
@RequiredArgsConstructor
public class RoleController {
private final SysRoleService roleService;
/**
*
* @param roleDTO
* @return ID
*/
@PostMapping("/save")
public R<String> saveRole(@RequestBody SysRoleDTO roleDTO) {
String roleId = roleService.saveRole(roleDTO);
return R.ok(roleId);
}
/**
*
* @param roleDTO
* @return
*/
@PostMapping("/update")
public R<Boolean> updateRole(@RequestBody SysRoleDTO roleDTO) {
Boolean success = roleService.updateRole(roleDTO);
return R.ok(success);
}
/**
*
* @param roleDTO
* @return
*/
@PostMapping("/delete")
public R<Boolean> deleteRole(@RequestBody SysRoleDTO roleDTO) {
Boolean success = roleService.deleteRole(roleDTO.getId());
return R.ok(success);
}
/**
*
* @param roleName
* @param page
* @param pageSize
* @return
*/
@PostMapping("/pageList")
public R<IPage<SysRoleDTO>> pageList(@RequestParam (name = "roleName", required = false) String roleName,
@RequestParam (name = "page", defaultValue = "1", required = false) Integer page,
@RequestParam(name = "pageSize",defaultValue = "10", required = false) Integer pageSize ) {
IPage<SysRoleDTO> list = roleService.pageList(roleName, page, pageSize);
return R.ok(list);
}
/**
* id
* @return
*/
@GetMapping("/queryById")
public R<SysRoleDTO> queryById(@RequestParam(name = "id") String id) {
SysRoleDTO sysRoleDTO = roleService.queryById(id);
return R.ok(sysRoleDTO);
}
}

@ -1,38 +0,0 @@
package com.supervision.ai.service.hub.controller;
import com.supervision.ai.service.hub.domain.SysUser;
import com.supervision.ai.service.hub.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
*
*/
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class SysUserController {
private final SysUserService sysUserService;
/**
*
*
* @return 404
*/
@GetMapping("/me")
public ResponseEntity<?> getCurrentUserDetails() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();
SysUser user = sysUserService.getByUsername(username);
if (user == null) {
return ResponseEntity.status(404).body("用户不存在");
}
return ResponseEntity.ok(user);
}
}

@ -0,0 +1,65 @@
package com.supervision.ai.service.hub.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
import com.supervision.ai.service.hub.service.TaskService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
*
*
*/
@RestController
@RequestMapping("/task")
@RequiredArgsConstructor
public class TaskController {
private final TaskService taskService;
/**
*
* @param taskName
* @param taskType
* @param status
* @param page
* @param pageSize
* @return
*/
@GetMapping("/pageList")
public R<IPage<TaskDTO>> pageList(@RequestParam(name = "taskName", required = false) String taskName,
@RequestParam(name = "taskType", required = false) String taskType,
@RequestParam(name = "status", required = false) String status,
@RequestParam(name = "page", defaultValue = "1") Integer page,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
IPage<TaskDTO> pageList = taskService.pageList(taskName, taskType, status, page, pageSize);
return R.ok(pageList);
}
/**
*
* @param taskIds
* @return
*/
@PostMapping("/cancel")
public R<Boolean> cancelTask(List<String> taskIds) {
Boolean success = taskService.cancelTask(taskIds);
return R.ok(success);
}
/**
*
* @param taskIds
* @return
*/
@PostMapping("/retry")
public R<Boolean> retryTask(List<String> taskIds) {
Boolean success = taskService.retryTask(taskIds);
return R.ok(success);
}
}

@ -0,0 +1,98 @@
package com.supervision.ai.service.hub.controller;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.domain.SysUser;
import com.supervision.ai.service.hub.dto.common.R;
import com.supervision.ai.service.hub.dto.sys.UserDTO;
import com.supervision.ai.service.hub.service.SysUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
*
*/
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
private final SysUserService sysUserService;
/**
*
*
* @return 404
*/
@GetMapping("/me")
public R<SysUser> getCurrentUserDetails() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = authentication.getName();
SysUser user = sysUserService.getByUsername(username);
Assert.notNull(user, "用户不存在");
return R.ok(user);
}
/**
*
* @param user
* @return
*/
@PostMapping("/save")
public R<String> saveUser(UserDTO user) {
String userId = sysUserService.saveUser(user);
return R.ok(userId);
}
/**
*
* @param user
* @return
*/
@PostMapping("/update")
public R<Boolean> updateUser(UserDTO user) {
Boolean success = sysUserService.updateUser(user);
return R.ok(success);
}
/**
*
* @param user
* @return
*/
@PostMapping("/delete")
public R<Boolean> deleteUser(UserDTO user) {
Boolean success = sysUserService.deleteUser(user.getId());
return R.ok(success);
}
/**
*
* @param userName
* @param page
* @param pageSize
* @return
*/
@GetMapping("/pageList")
public R<IPage<UserDTO>> queryList(@RequestParam(name = "userName", required = false) String userName,
@RequestParam (name = "page", required = false,defaultValue = "1") Integer page,
@RequestParam (name = "pageSize", required = false,defaultValue = "10") Integer pageSize) {
IPage<UserDTO> list = sysUserService.pageList(userName, page, pageSize);
return R.ok(list);
}
/**
* ID
* @param id ID
* @return
*/
@GetMapping("/queryById")
public R<UserDTO> queryById(@RequestParam(name = "id") String id) {
UserDTO userDTO = sysUserService.queryById(id);
return R.ok(userDTO);
}
}

@ -38,6 +38,12 @@ public class ComfyuiPrompt implements Serializable {
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject prompt;
/**
* id
*/
private String iconFileId;
/**
* id
*/

@ -1,10 +1,12 @@
package com.supervision.ai.service.hub.domain;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
/**
@ -43,18 +45,25 @@ public class ComfyuiTask implements Serializable {
/**
*
*/
private LocalDate runStartTime;
private LocalDateTime runStartTime;
/**
*
*/
private LocalDate runEndTime;
private LocalDateTime runEndTime;
/**
* webhook url
*/
private String webHook;
private String comfyuiTaskId;
@TableField(typeHandler = FastjsonTypeHandler.class)
private JSONObject prompt;
private String comfyuiServer;
/**
* id
*/

@ -60,7 +60,7 @@ public class ComfyuiTaskParam implements Serializable {
private String paramType;
/**
*
* 1:input 2:select 3:textarea 4. image 5:checkbox 6:radio
*/
private String componentType;

@ -0,0 +1,65 @@
package com.supervision.ai.service.hub.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
*
* @TableName permission
*/
@TableName(value ="permission")
@Data
public class Permission implements Serializable {
/**
* id
*/
@TableId
private String id;
/**
*
*/
private String name;
/**
* 0 1
*/
private String type;
/**
*
*/
private String code;
/**
* id
*/
private String parentId;
/**
*
*/
private String createUserId;
/**
*
*/
private LocalDateTime createTime;
/**
*
*/
private LocalDateTime updateTime;
/**
*
*/
private String updateUserId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data;
/**
@ -33,6 +35,12 @@ public class SysApp implements Serializable {
*/
private Integer status;
/**
* url
*/
@TableField(typeHandler = FastjsonTypeHandler.class)
private List<String> scopes;
/**
* id
*/

@ -14,22 +14,22 @@ import lombok.Data;
@Data
public class SysRole implements Serializable {
/**
*
*
*/
private String id;
/**
*
*
*/
private String roleName;
/**
*
*
*/
private String roleDesc;
/**
*
* code
*/
private String roleCode;

@ -0,0 +1,48 @@
package com.supervision.ai.service.hub.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.Data;
/**
*
* @TableName sys_role_permission
*/
@TableName(value ="sys_role_permission")
@Data
public class SysRolePermission implements Serializable {
/**
* id
*/
private String rId;
/**
* id
*/
private String pId;
/**
*
*/
private String createUserId;
/**
*
*/
private LocalDateTime createTime;
/**
*
*/
private LocalDateTime updateTime;
/**
*
*/
private String updateUserId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -20,7 +20,7 @@ public class SysUser implements Serializable {
private String id;
/**
*
* id
*/
private String appId;

@ -0,0 +1,35 @@
package com.supervision.ai.service.hub.dto.comfyui;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import java.util.List;
@Data
public class ComfyUIPromptDTO {
private String id;
/**
*
*/
private String promptName;
/**
* 0: 1 2
*/
private String promptType;
/**
*
*/
private JSONObject prompt;
/**
* id
*/
private String iconFileId;
private List<ComfyUIPromptParamDTO> params;
}

@ -0,0 +1,57 @@
package com.supervision.ai.service.hub.dto.comfyui;
import lombok.Data;
@Data
public class ComfyUIPromptParamDTO {
/**
* id
*/
private String id;
/**
* id
*/
private String promptId;
/**
* key
*/
private String paramKey;
/**
* json
*/
private String paramPath;
/**
* 0 1 2 3
*/
private Integer paramType;
/**
*
*/
private String componentType;
/**
*
*/
private String label;
/**
*
*/
private Boolean required;
/**
*
*/
private String defaultValue;
/**
*
*/
private Object value;
}

@ -0,0 +1,15 @@
package com.supervision.ai.service.hub.dto.comfyui;
import lombok.Data;
@Data
public class ComfyUITaskResult {
private String id;
private String taskId;
private String fileId;
private String fileName;
}

@ -0,0 +1,60 @@
package com.supervision.ai.service.hub.dto.comfyui;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.concurrent.CopyOnWriteArrayList;
@Data
public class ServerNode {
private String id;
private String host;
private int port;
/**
*
*/
private int failureCount;
/**
*
*/
private int runningTaskCount;
private LocalDateTime lastSelectedTime;
/**
*
*/
private CopyOnWriteArrayList<TaskDTO> runningTasks = new CopyOnWriteArrayList<>();
public ServerNode() {
}
public ServerNode(String id, String host, int port, int failureCount) {
this.id = id;
this.host = host;
this.port = port;
this.failureCount = failureCount;
}
public void incrementFailureCount() {
this.failureCount++;
this.lastSelectedTime = LocalDateTime.now();
}
public void resetFailureCount() {
this.failureCount = 0;
this.lastSelectedTime = LocalDateTime.now();
}
public void addRunningTask(TaskDTO task) {
this.runningTasks.add(task);
}
public void removeRunningTask(TaskDTO task) {
this.runningTasks.remove(task);
}
}

@ -0,0 +1,103 @@
package com.supervision.ai.service.hub.dto.comfyui;
import cn.hutool.core.collection.CollUtil;
import com.alibaba.fastjson.JSONObject;
import com.supervision.ai.service.hub.domain.ComfyuiTask;
import com.supervision.ai.service.hub.domain.ComfyuiTaskParam;
import com.supervision.ai.service.hub.domain.ComfyuiTaskResult;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Data
public class TaskDTO {
private String id;
/**
* id
*/
private String promptId;
/**
* comfyuiid
*/
private String comfyuiTaskId;
private String comfyuiServer;;
/**
* id
*/
private String userId;
/**
* id
*/
private String appId;
/**
* 0123
*/
private String runStatus;
/**
*
*/
private LocalDateTime runStartTime;
/**
*
*/
private LocalDateTime runEndTime;
/**
* webhook url
*/
private String webHook;
private JSONObject prompt;
private List<ComfyuiTaskParam> params = new ArrayList<>();
private List<ComfyUITaskResult> results = new ArrayList<>();
/**
*
*/
private LocalDateTime createTime;
public TaskDTO() {
}
public TaskDTO(ComfyuiTask task, List<ComfyuiTaskParam> params, List<ComfyuiTaskResult> taskResults) {
this.id = task.getId();
this.promptId = task.getPromptId();
this.comfyuiTaskId = task.getComfyuiTaskId();
this.comfyuiServer = task.getComfyuiServer();
this.userId = task.getUserId();
this.appId = task.getAppId();
this.runStatus = task.getRunStatus();
this.runStartTime = task.getRunStartTime();
this.runEndTime = task.getRunEndTime();
this.webHook = task.getWebHook();
this.prompt = task.getPrompt();
this.createTime = task.getCreateTime();
this.params = params;
if (CollUtil.isNotEmpty(taskResults)){
for (ComfyuiTaskResult taskResult : taskResults) {
ComfyUITaskResult result = new ComfyUITaskResult();
result.setId(taskResult.getId());
result.setTaskId(taskResult.getTaskId());
result.setFileId(taskResult.getResultFileId());
this.results.add(result);
}
}
}
}

@ -0,0 +1,29 @@
package com.supervision.ai.service.hub.dto.sys;
import lombok.Data;
import java.util.List;
@Data
public class AppDTO {
private String id;
/**
*
*/
private String appName;
/**
*
*/
private String password;
/**
* 0: 1:
*/
private Integer status;
private List<String> scopes;
}

@ -0,0 +1,24 @@
package com.supervision.ai.service.hub.dto.sys;
import lombok.Data;
@Data
public class FileDTO {
private String id;
/**
*
*/
private String fileName;
/**
*
*/
private String fileSize;
/**
*
*/
private String fileType;
}

@ -0,0 +1,40 @@
package com.supervision.ai.service.hub.dto.sys;
import lombok.Data;
import java.util.List;
@Data
public class PermissionDTO {
/**
* id
*/
private String id;
/**
*
*/
private String name;
/**
* 0 1
*/
private String type;
/**
*
*/
private String code;
/**
* id
*/
private String parentId;
private List<PermissionDTO> children;
}

@ -0,0 +1,34 @@
package com.supervision.ai.service.hub.dto.sys;
import lombok.Data;
import java.util.List;
@Data
public class SysRoleDTO {
/**
*
*/
private String id;
/**
*
*/
private String roleName;
/**
*
*/
private String roleDesc;
/**
* code
*/
private String roleCode;
/**
*
*/
private List<PermissionDTO> permissionList;
}

@ -0,0 +1,34 @@
package com.supervision.ai.service.hub.dto.sys;
import lombok.Data;
import java.util.List;
@Data
public class UserDTO {
private String id;
/**
*id
*/
private String appId;
/**
*
*/
private String userName;
private String password;
/**
* 0: 1:
*/
private String status;
/**
*
*/
private List<SysRoleDTO> roleList;
}

@ -0,0 +1,18 @@
package com.supervision.ai.service.hub.mapper;
import com.supervision.ai.service.hub.domain.Permission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Administrator
* @description permission()Mapper
* @createDate 2025-04-14 16:01:14
* @Entity com.supervision.ai.service.hub.domain.Permission
*/
public interface PermissionMapper extends BaseMapper<Permission> {
}

@ -0,0 +1,18 @@
package com.supervision.ai.service.hub.mapper;
import com.supervision.ai.service.hub.domain.SysRolePermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Administrator
* @description sys_role_permissionMapper
* @createDate 2025-04-14 16:01:04
* @Entity com.supervision.ai.service.hub.domain.SysRolePermission
*/
public interface SysRolePermissionMapper extends BaseMapper<SysRolePermission> {
}

@ -1,5 +1,6 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.aop.AuditLogDTO;
import com.supervision.ai.service.hub.domain.AuditLog;
import com.baomidou.mybatisplus.extension.service.IService;
@ -12,4 +13,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
public interface AuditLogService extends IService<AuditLog> {
void saveAuditLog(AuditLogDTO auditLogDTO);
IPage<AuditLogDTO> pageList(AuditLogDTO auditLogDTO, Integer page, Integer pageSize);
AuditLogDTO queryById(String id);
}

@ -6,6 +6,7 @@ import com.supervision.ai.service.hub.dto.comfyui.PromptRunDTO;
import com.supervision.ai.service.hub.dto.comfyui.ResourceViewDTO;
import java.util.Map;
import java.util.function.Consumer;
public interface ComfyUIApiService {
@ -19,11 +20,14 @@ public interface ComfyUIApiService {
/**
*
* @param promptId id
* @return
* @return completed=true
*/
Map<String,Object> queryHistory(String promptId);
void asyncQueryHistory(String promptId, Consumer<String> callback);
ImageUploadDTO uploadImage(byte[] file, String fileName);
ResourceViewDTO downloadView(String imageId);

@ -1,20 +1,50 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.comfyui.ComfyUIPromptDTO;
import com.supervision.ai.service.hub.vo.comfyui.RunPromptReqVo;
import com.supervision.ai.service.hub.vo.comfyui.TaskResultResVo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public interface ComfyUIService {
String runPrompt(RunPromptReqVo runPromptReqVo);
String executeTask(RunPromptReqVo runPromptReqVo);
List<TaskResultResVo> queryHistory(String promptId);
IPage<TaskResultResVo> queryHistory(String promptId);
/**
*
* @param result
* @return
*/
boolean taskIsCompleted(Map<String, Object> result);
/**
*
* @param result
* @return
*/
List<String> getImageList(Map<String, Object> result);
String uploadImage(MultipartFile file) throws IOException;
void downloadView(String imageId, HttpServletResponse response) throws IOException;
String saveModel(ComfyUIPromptDTO comfyUIPromptDTO);
Boolean updateModel(ComfyUIPromptDTO comfyUIPromptDTO);
Boolean deleteModel(ComfyUIPromptDTO comfyUIPromptDTO);
ComfyUIPromptDTO queryById(String id);
IPage<ComfyUIPromptDTO> pageList(String promptName, String promptType, Integer page, Integer pageSize);
TaskResultResVo getTaskById(String taskId);
}

@ -0,0 +1,160 @@
package com.supervision.ai.service.hub.service;
import cn.hutool.core.bean.BeanPath;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.supervision.ai.service.hub.constant.ComfyuiParamTypeEnum;
import com.supervision.ai.service.hub.constant.ComfyuiRunStatusEnum;
import com.supervision.ai.service.hub.domain.ComfyuiTaskParam;
import com.supervision.ai.service.hub.dto.comfyui.*;
import com.supervision.ai.service.hub.dto.sys.FileDTO;
import com.supervision.ai.service.hub.service.impl.ComfyUIApiServiceImpl;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.stream.Collectors;
@Slf4j
public class ComfyUITaskScheduler {
private final NodeManager nodeManager;
private final SchedulingStrategy strategy;
private final Map<String, ComfyUIApiService> comfyUIApiServiceMap = new ConcurrentHashMap<>();
private ComfyUIService comfyUIService;
private ComfyuiTaskService comfyUITaskService;
private SysFileService sysFileService;
public ComfyUITaskScheduler(NodeManager nodeManager, SchedulingStrategy strategy) {
this.nodeManager = nodeManager;
this.strategy = strategy;
}
/**
*
*/
void executeTask() {
TaskDTO task = strategy.selectNextTask();
if (task == null) {
log.info("executeTask:没有获取到可用的任务....");
return;
}
while (true) {
ServerNode node = nodeManager.selectAvailableNode();
if (null == node) {
log.error("executeTask:没有获取到可用的节点....");
return;
}
// 运行提示词
try {
boolean success = runPrompt(node, task);
if (success) {
log.info("executeTask:任务:{}执行成功", task.getId());
break;
} else {
// 失败后重新选择节点
node = nodeManager.selectAvailableNode();
if (null == node) {
log.error("executeTask:没有获取到可用的节点....");
break;
}
}
} catch (Exception e) {
//todo: 如果是链接异常设置节点
throw new RuntimeException(e);
}
}
}
private boolean runPrompt(ServerNode node,TaskDTO task){
ComfyUIApiService comfyUIApiService = this.getComfyUIApiService(node);
// 设置参数内容
JSONObject prompt = task.getPrompt();
for (ComfyuiTaskParam param : task.getParams()) {
if (StrUtil.equals("4",param.getComponentType())){
// 上传图片
FileDTO fileDTO = sysFileService.queryById(param.getValue());
byte[] bytes = sysFileService.downloadFile(param.getValue());
ImageUploadDTO imageUploadDTO = comfyUIApiService.uploadImage(bytes, param.getValue() + "." + fileDTO.getFileType());
param.setValue(imageUploadDTO.getName());
}
ComfyuiParamTypeEnum comfyuiParamTypeEnum = ComfyuiParamTypeEnum.getByCode(Integer.parseInt(param.getParamType()));
Object value = comfyuiParamTypeEnum.coverType(param.getValue());
log.info("设置参数key{},参数value:{}", param.getParamKey(), value);
BeanPath.create(param.getParamKey()).set(prompt, value);
}
// 运行提示词
PromptRunDTO promptRunDTO = comfyUIApiService.runPrompt(prompt);
Map<String, Object> error = promptRunDTO.getError();
if (CollUtil.isNotEmpty(error)){
// 执行失败
String errorMessage = (String) error.get("message");
log.error("executeTask:任务:{}执行失败,错误信息:{}",task.getId(),errorMessage);
nodeManager.markNodeFailed(node.getId());
return false;
}else {
// 任务提交成功
nodeManager.recoverNode(node.getId());
node.addRunningTask(task);
task.setComfyuiServer(node.getHost()+":"+node.getPort());
task.setRunStatus(ComfyuiRunStatusEnum.RUNNING.getStatus());
task.setRunStartTime(LocalDateTime.now());
comfyUITaskService.updateTaskResult(task);
return true;
}
}
/**
*
*/
void queryTaskResult() {
List<ServerNode> serverNodes = nodeManager.listAllNodes();
for (ServerNode serverNode : serverNodes) {
CopyOnWriteArrayList<TaskDTO> runningTasks = serverNode.getRunningTasks();
for (TaskDTO taskDTO : runningTasks) {
ComfyUIApiService comfyUIApiService = this.getComfyUIApiService(serverNode);
comfyUIApiService.asyncQueryHistory(taskDTO.getComfyuiTaskId(), result -> {
Map<String,Object> taskResult = JSONUtil.toBean(result, HashMap.class);
Map<String,Object> thisResult = (Map<String, Object>) taskResult.get(taskDTO.getComfyuiTaskId());
boolean finish = comfyUIService.taskIsCompleted(thisResult);
if (finish){
// 移除运行中的任务
serverNode.removeRunningTask(taskDTO);
List<String> imageList = comfyUIService.getImageList(thisResult);
List<ComfyUITaskResult> comfyUITaskResults = imageList.stream().map(imageId -> {
ComfyUITaskResult comfyUITaskResult = new ComfyUITaskResult();
comfyUITaskResult.setTaskId(taskDTO.getId());
comfyUITaskResult.setFileName(imageId);
return comfyUITaskResult;
}).collect(Collectors.toList());
taskDTO.setResults(comfyUITaskResults);
taskDTO.setRunStatus(ComfyuiRunStatusEnum.SUCCESS.getStatus());
taskDTO.setRunEndTime(LocalDateTime.now());
comfyUITaskService.updateTaskResult(taskDTO);
comfyUITaskService.notifyWebhook(taskDTO);
}
});
}
}
}
private ComfyUIApiService getComfyUIApiService(ServerNode node) {
return comfyUIApiServiceMap.computeIfAbsent(node.getId(),
id -> new ComfyUIApiServiceImpl(node.getHost(), String.valueOf(node.getPort())));
}
}

@ -3,6 +3,8 @@ package com.supervision.ai.service.hub.service;
import com.supervision.ai.service.hub.domain.ComfyuiTaskParam;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author Administrator
* @description comfyui_task_param(comfyui)Service
@ -10,4 +12,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ComfyuiTaskParamService extends IService<ComfyuiTaskParam> {
List<ComfyuiTaskParam> listByTaskIds(List<String> taskIds);
}

@ -2,6 +2,7 @@ package com.supervision.ai.service.hub.service;
import com.supervision.ai.service.hub.domain.ComfyuiTaskResult;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* @author Administrator
@ -10,4 +11,6 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ComfyuiTaskResultService extends IService<ComfyuiTaskResult> {
List<ComfyuiTaskResult> listByTaskIds(List<String> taskIds);
}

@ -2,6 +2,8 @@ package com.supervision.ai.service.hub.service;
import com.supervision.ai.service.hub.domain.ComfyuiTask;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
import java.util.List;
/**
* @author Administrator
@ -10,4 +12,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface ComfyuiTaskService extends IService<ComfyuiTask> {
void updateTaskResult(TaskDTO taskDTO);
List<TaskDTO> queryNotStartedTask(int size);
void notifyWebhook(TaskDTO taskDTO);
}

@ -0,0 +1,15 @@
package com.supervision.ai.service.hub.service;
import com.supervision.ai.service.hub.dto.comfyui.ServerNode;
import java.util.List;
public interface NodeManager {
ServerNode selectAvailableNode();
void markNodeFailed(String nodeId);
void recoverNode(String nodeId);
List<ServerNode> listAllNodes();
void addNode(ServerNode node);
}

@ -0,0 +1,29 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.domain.Permission;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.ai.service.hub.dto.sys.PermissionDTO;
import java.util.List;
/**
* @author Administrator
* @description permission()Service
* @createDate 2025-04-14 16:01:14
*/
public interface PermissionService extends IService<Permission> {
String savePermission(PermissionDTO permissionDTO);
Boolean updatePermission(PermissionDTO permissionDTO);
Boolean deletePermission(String id);
List<PermissionDTO> queryPermission(String type);
IPage<PermissionDTO> pageList(String permissionName, Integer page, Integer pageSize);
PermissionDTO queryById(String id);
}

@ -0,0 +1,8 @@
package com.supervision.ai.service.hub.service;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
public interface SchedulingStrategy {
TaskDTO selectNextTask();
}

@ -1,7 +1,9 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.domain.SysApp;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.ai.service.hub.dto.sys.AppDTO;
/**
* @author Administrator
@ -16,4 +18,15 @@ public interface SysAppService extends IService<SysApp> {
* @return SysApp
*/
SysApp getByAppName(String appName);
String saveApp(AppDTO appDTO);
Boolean updateApp(AppDTO appDTO);
Boolean deleteApp(AppDTO appDTO);
IPage<AppDTO> pageList(String appName, Integer page, Integer pageSize);
AppDTO queryById(String id);
}

@ -1,7 +1,11 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.domain.SysFile;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.ai.service.hub.dto.sys.FileDTO;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
/**
* @author Administrator
@ -10,4 +14,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface SysFileService extends IService<SysFile> {
String upload(MultipartFile file);
IPage<FileDTO> pageList(String fileName, String fileType ,Integer page, Integer pageSize);
FileDTO queryById(String id);
void downLoad(String fileId, HttpServletResponse response);
byte[] downloadFile(String fileId);
}

@ -0,0 +1,13 @@
package com.supervision.ai.service.hub.service;
import com.supervision.ai.service.hub.domain.SysRolePermission;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author Administrator
* @description sys_role_permissionService
* @createDate 2025-04-14 16:01:04
*/
public interface SysRolePermissionService extends IService<SysRolePermission> {
}

@ -1,7 +1,9 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.domain.SysRole;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.ai.service.hub.dto.sys.SysRoleDTO;
/**
* @author Administrator
@ -10,4 +12,14 @@ import com.baomidou.mybatisplus.extension.service.IService;
*/
public interface SysRoleService extends IService<SysRole> {
String saveRole(SysRoleDTO roleDTO);
Boolean updateRole(SysRoleDTO roleDTO);
Boolean deleteRole(String id);
IPage<SysRoleDTO> pageList(String roleName, Integer page, Integer pageSize);
SysRoleDTO queryById(String id);
}

@ -1,7 +1,9 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.domain.SysUser;
import com.baomidou.mybatisplus.extension.service.IService;
import com.supervision.ai.service.hub.dto.sys.UserDTO;
/**
* @author Administrator
@ -17,4 +19,14 @@ public interface SysUserService extends IService<SysUser> {
* @return SysUser
*/
SysUser getByUsername(String username);
UserDTO queryById(String id);
String saveUser(UserDTO user);
Boolean updateUser(UserDTO user);
Boolean deleteUser(String id);
IPage<UserDTO> pageList(String userName, Integer page, Integer pageSize);
}

@ -0,0 +1,15 @@
package com.supervision.ai.service.hub.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
import java.util.List;
public interface TaskService {
IPage<TaskDTO> pageList(String taskName, String taskType, String status, Integer page, Integer pageSize);
Boolean suspendTask(List<String> taskIds);
Boolean cancelTask(List<String> taskIds);
Boolean retryTask(List<String> taskIds);
}

@ -1,5 +1,6 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.aop.AuditLogDTO;
import com.supervision.ai.service.hub.domain.AuditLog;
@ -25,6 +26,16 @@ public class AuditLogServiceImpl extends ServiceImpl<AuditLogMapper, AuditLog>
AuditLog auditLog = auditLogDTO.toAuditLog();
this.save(auditLog);
}
@Override
public IPage<AuditLogDTO> pageList(AuditLogDTO auditLogDTO, Integer page, Integer pageSize) {
return null;
}
@Override
public AuditLogDTO queryById(String id) {
return null;
}
}

@ -15,7 +15,11 @@ import com.supervision.ai.service.hub.service.ComfyUIApiService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.net.URI;
import java.net.http.HttpClient;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
@Slf4j
@Service
@ -29,6 +33,14 @@ public class ComfyUIApiServiceImpl implements ComfyUIApiService {
private static final ObjectMapper objectMapper = new ObjectMapper();
public ComfyUIApiServiceImpl() {
}
public ComfyUIApiServiceImpl(String comfyUIServiceIp, String comfyUIServicePort) {
this.comfyUIServiceIp = comfyUIServiceIp;
this.comfyUIServicePort = comfyUIServicePort;
}
@Override
public PromptRunDTO runPrompt(JSONObject prompt) {
String url = "http://" + comfyUIServiceIp + ":" + comfyUIServicePort + "/prompt";
@ -54,6 +66,8 @@ public class ComfyUIApiServiceImpl implements ComfyUIApiService {
String url = "http://" + comfyUIServiceIp + ":" + comfyUIServicePort + "/history" + (StrUtil.isEmpty(promptId)? "" : "/"+promptId);
log.info("comfyUI queryHistory 请求地址:{}",url);
HttpRequest header = HttpUtil.createGet(url).header("Accept", "application/json");
HttpResponse response = header.executeAsync();
try (HttpResponse execute = HttpUtil.createGet(url).execute()){
if (execute.isOk()){
String body = execute.body();
@ -68,6 +82,24 @@ public class ComfyUIApiServiceImpl implements ComfyUIApiService {
}
}
@Override
public void asyncQueryHistory(String promptId, Consumer<String> callback) {
String url = "http://" + comfyUIServiceIp + ":" + comfyUIServicePort + "/history" + (StrUtil.isEmpty(promptId)? "" : "/"+promptId);
java.net.http.HttpClient client = HttpClient.newHttpClient();
java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder()
.uri(URI.create(url))
.build();
CompletableFuture<java.net.http.HttpResponse<String>> future = client.sendAsync(request, java.net.http.HttpResponse.BodyHandlers.ofString());
future.thenApply(java.net.http.HttpResponse::body)
.thenAccept(callback)
.exceptionally(ex -> {
log.error("asyncQueryHistory:发送请求失败", ex);
return null;
});
}
@Override
public ImageUploadDTO uploadImage(byte[] file, String fileName) {
String url = "http://" + comfyUIServiceIp + ":" + comfyUIServicePort + "/upload/image";

@ -0,0 +1,95 @@
package com.supervision.ai.service.hub.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.supervision.ai.service.hub.dto.comfyui.ServerNode;
import com.supervision.ai.service.hub.service.NodeManager;
import lombok.extern.slf4j.Slf4j;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
@Slf4j
public class ComfyUINodeManager implements NodeManager {
private List<ServerNode> serverNodes = new ArrayList<>();
private int retryTimeThread = 60;
@Override
public ServerNode selectAvailableNode() {
// 优先选择空闲且没有失败次数的节点
// 如果所有的节点都没有失败次数则选择正在运行次数最小的节点本次规则中选择运行次数为0的节点
// 如果所有的节点都失效,则选择一个静默时间最长的节点
ServerNode selectedNode = null;
for (ServerNode node : serverNodes) {
log.info("开始查找存活且空闲的节点....");
if (node.getRunningTaskCount() == 0 && node.getFailureCount() == 0) {
selectedNode = node;
log.info("查找到存活且空闲的节点host:{}:{}....",node.getId(),node.getPort());
node.setLastSelectedTime(LocalDateTime.now());
break;
}
}
if (null == selectedNode){
log.warn("没有查找到存活且空闲的节点,开始查找已经离线的节点....");
List<ServerNode> failServerNode = new ArrayList<>();
for (ServerNode node : serverNodes) {
if (node.getFailureCount() != 0) {
failServerNode.add(node);
}
}
log.info("所有离线节点个数为:{}",failServerNode.size());
failServerNode.sort(Comparator.comparing(ServerNode::getLastSelectedTime));
ServerNode last = CollUtil.getLast(failServerNode);
// 给失败的节点一次机会
if (last.getLastSelectedTime().plusSeconds(retryTimeThread).isBefore(LocalDateTime.now())) {
log.info("选择失败的节点host:{}:{},上次检查时间是:{}....",last.getId(),last.getPort(),last.getLastSelectedTime());
selectedNode = last;
selectedNode.setLastSelectedTime(LocalDateTime.now());
}
}
return selectedNode;
}
@Override
public void markNodeFailed(String nodeId) {
for (ServerNode node : serverNodes) {
if (node.getId().equals(nodeId)) {
node.incrementFailureCount();
break;
}
}
}
@Override
public void recoverNode(String nodeId) {
for (ServerNode node : serverNodes) {
if (node.getId().equals(nodeId)) {
node.resetFailureCount();
break;
}
}
}
@Override
public List<ServerNode> listAllNodes() {
return this.serverNodes;
}
@Override
public void addNode(ServerNode node) {
// 检查节点是否已经存在
for (ServerNode serverNode : serverNodes) {
if (StrUtil.equals(serverNode.getHost(), node.getHost()) && serverNode.getPort() == node.getPort()) {
// 节点已经存在
log.info("节点已经存在host:{},port:{}", node.getHost(), node.getPort());
return;
}
}
// 添加节点
serverNodes.add(node);
log.info("添加节点成功id:{},host:{},port:{}", node.getId(), node.getHost(), node.getPort());
}
}

@ -5,12 +5,11 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.constant.ComfyuiParamTypeEnum;
import com.supervision.ai.service.hub.domain.ComfyuiPrompt;
import com.supervision.ai.service.hub.domain.ComfyuiPromptParam;
import com.supervision.ai.service.hub.dto.comfyui.ImageUploadDTO;
import com.supervision.ai.service.hub.dto.comfyui.PromptRunDTO;
import com.supervision.ai.service.hub.dto.comfyui.ResourceViewDTO;
import com.supervision.ai.service.hub.dto.comfyui.*;
import com.supervision.ai.service.hub.service.ComfyUIApiService;
import com.supervision.ai.service.hub.service.ComfyUIService;
import com.supervision.ai.service.hub.service.ComfyUIPromptParamService;
@ -42,7 +41,7 @@ public class ComfyUIServiceImpl implements ComfyUIService {
@Override
public String runPrompt(RunPromptReqVo runPromptReqVo) {
public String executeTask(RunPromptReqVo runPromptReqVo) {
Assert.notEmpty(runPromptReqVo.getPromptId(),"promptId不能为空");
boolean exist = comfyuiPromptService.promptExist(runPromptReqVo.getPromptId());
Assert.isTrue(exist,"promptId不存在");
@ -84,16 +83,16 @@ public class ComfyUIServiceImpl implements ComfyUIService {
}
@Override
public List<TaskResultResVo> queryHistory(String promptId) {
public IPage<TaskResultResVo> queryHistory(String promptId) {
Map<String, Object> history = comfyUIApiService.queryHistory(promptId);
if (CollUtil.isEmpty(history)){
return new ArrayList<>();
return null;
}
List<TaskResultResVo> resultResVos = new ArrayList<>();
for (Map.Entry<String, Object> entry : history.entrySet()) {
TaskResultResVo taskResultResVo = new TaskResultResVo();
Object value = entry.getValue();
taskResultResVo.setPromptId(entry.getKey());
taskResultResVo.setModelId(entry.getKey());
if (null != value){
Map<String, Object> status = (Map<String, Object>) ((Map<String, Object>) value).get("status");
Boolean completed = (Boolean) status.get("completed");
@ -103,14 +102,39 @@ public class ComfyUIServiceImpl implements ComfyUIService {
for (Map.Entry<String, Object> outputEntry : outputs.entrySet()) {
Map<String,Object> outputEntryValue = (Map<String, Object>) outputEntry.getValue();
List<Map<String,Object>> images = (List<Map<String, Object>>) outputEntryValue.get("images");
taskResultResVo.setImages(images.stream().map(image -> (String)(image.get("filename"))).collect(Collectors.toList()));
taskResultResVo.setOutputImages(images.stream().map(image -> (String)(image.get("filename"))).collect(Collectors.toList()));
}
}
}
}
resultResVos.add(taskResultResVo);
}
return resultResVos;
return null;
}
@Override
public boolean taskIsCompleted(Map<String, Object> result){
if (CollUtil.isEmpty(result)){
return false;
}
Map<String, Object> status = (Map<String, Object>) ((Map<String, Object>) result).get("status");
return (Boolean) status.get("completed");
}
@Override
public List<String> getImageList(Map<String, Object> result){
List<String> imageList = new ArrayList<>();
if (CollUtil.isNotEmpty(result)){
Map<String, Object> outputs = (Map<String, Object>) result.get("outputs");
if (CollUtil.isNotEmpty(outputs)){
for (Map.Entry<String, Object> outputEntry : outputs.entrySet()) {
Map<String,Object> outputEntryValue = (Map<String, Object>) outputEntry.getValue();
List<Map<String,Object>> images = (List<Map<String, Object>>) outputEntryValue.get("images");
imageList = images.stream().map(image -> (String)(image.get("filename"))).collect(Collectors.toList());
}
}
}
return imageList;
}
@Override
@ -134,4 +158,34 @@ public class ComfyUIServiceImpl implements ComfyUIService {
outputStream.write(resourceViewDTO.getContent());
}
}
@Override
public String saveModel(ComfyUIPromptDTO comfyUIPromptDTO) {
return null;
}
@Override
public Boolean updateModel(ComfyUIPromptDTO comfyUIPromptDTO) {
return null;
}
@Override
public Boolean deleteModel(ComfyUIPromptDTO comfyUIPromptDTO) {
return null;
}
@Override
public ComfyUIPromptDTO queryById(String id) {
return null;
}
@Override
public IPage<ComfyUIPromptDTO> pageList(String promptName, String promptType, Integer page, Integer pageSize) {
return null;
}
@Override
public TaskResultResVo getTaskById(String taskId) {
return null;
}
}

@ -1,10 +1,13 @@
package com.supervision.ai.service.hub.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.ComfyuiTaskParam;
import com.supervision.ai.service.hub.service.ComfyuiTaskParamService;
import com.supervision.ai.service.hub.mapper.ComfyuiTaskParamMapper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author Administrator
@ -15,6 +18,14 @@ import org.springframework.stereotype.Service;
public class ComfyuiTaskParamServiceImpl extends ServiceImpl<ComfyuiTaskParamMapper, ComfyuiTaskParam>
implements ComfyuiTaskParamService{
@Override
public List<ComfyuiTaskParam> listByTaskIds(List<String> taskIds) {
if (CollUtil.isEmpty(taskIds)){
return new ArrayList<>();
}
return this.lambdaQuery()
.in(ComfyuiTaskParam::getTaskId, taskIds).list();
}
}

@ -1,10 +1,13 @@
package com.supervision.ai.service.hub.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.ComfyuiTaskResult;
import com.supervision.ai.service.hub.service.ComfyuiTaskResultService;
import com.supervision.ai.service.hub.mapper.ComfyuiTaskResultMapper;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @author Administrator
@ -15,6 +18,13 @@ import org.springframework.stereotype.Service;
public class ComfyuiTaskResultServiceImpl extends ServiceImpl<ComfyuiTaskResultMapper, ComfyuiTaskResult>
implements ComfyuiTaskResultService{
@Override
public List<ComfyuiTaskResult> listByTaskIds(List<String> taskIds) {
if (CollUtil.isEmpty(taskIds)){
return new ArrayList<>();
}
return this.lambdaQuery().in(ComfyuiTaskResult::getTaskId, taskIds).list();
}
}

@ -1,20 +1,92 @@
package com.supervision.ai.service.hub.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.constant.ComfyuiRunStatusEnum;
import com.supervision.ai.service.hub.domain.ComfyuiTask;
import com.supervision.ai.service.hub.domain.ComfyuiTaskParam;
import com.supervision.ai.service.hub.domain.ComfyuiTaskResult;
import com.supervision.ai.service.hub.dto.comfyui.ComfyUITaskResult;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
import com.supervision.ai.service.hub.service.ComfyuiTaskParamService;
import com.supervision.ai.service.hub.service.ComfyuiTaskResultService;
import com.supervision.ai.service.hub.service.ComfyuiTaskService;
import com.supervision.ai.service.hub.mapper.ComfyuiTaskMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Administrator
* @description comfyui_task(comfyui)Service
* @createDate 2025-04-11 15:51:10
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class ComfyuiTaskServiceImpl extends ServiceImpl<ComfyuiTaskMapper, ComfyuiTask>
implements ComfyuiTaskService{
private final ComfyuiTaskParamService comfyuiTaskParamService;
private final ComfyuiTaskResultService comfyuiTaskResultService;
@Override
public void updateTaskResult(TaskDTO taskDTO) {
}
@Override
public List<TaskDTO> queryNotStartedTask(int size) {
if (size == 0){
return new ArrayList<>();
}
List<ComfyuiTask> comfyuiTaskList = this.lambdaQuery()
.eq(ComfyuiTask::getRunStatus, ComfyuiRunStatusEnum.NOT_STARTED.getStatus())
.orderByAsc(ComfyuiTask::getCreateTime).last("limit " + size).list();
if (CollUtil.isEmpty(comfyuiTaskList)){
return new ArrayList<>();
}
List<String> taskIds = comfyuiTaskList.stream().map(ComfyuiTask::getId).distinct().toList();
Map<String, List<ComfyuiTaskParam>> taskParamMap = comfyuiTaskParamService.listByTaskIds(taskIds)
.stream().collect(Collectors.groupingBy(ComfyuiTaskParam::getTaskId));
Map<String, List<ComfyuiTaskResult>> taskResultMap = comfyuiTaskResultService.listByTaskIds(taskIds)
.stream().collect(Collectors.groupingBy(ComfyuiTaskResult::getTaskId));
return comfyuiTaskList.stream()
.map(comfyuiTask->new TaskDTO(comfyuiTask, taskParamMap.get(comfyuiTask.getId()), taskResultMap.get(comfyuiTask.getId())))
.collect(Collectors.toList());
}
@Override
public void notifyWebhook(TaskDTO taskDTO) {
if (StrUtil.isEmpty(taskDTO.getWebHook())){
log.info("notifyWebhook:没有配置webhook地址taskId:{}",taskDTO.getId());
return;
}
Map<String, Object> boyMap = new HashMap<>();
boyMap.put("taskId", taskDTO.getId());
boyMap.put("status",taskDTO.getRunStatus());
boyMap.put("outputImages", taskDTO.getResults().stream().map(ComfyUITaskResult::getFileId).collect(Collectors.toList()));
HttpRequest request = HttpUtil.createPost(taskDTO.getWebHook())
.header("Content-Type", "application/json")
.body(JSONUtil.toJsonStr(boyMap));
try (HttpResponse execute = request.execute()){
if (execute.getStatus() != 200){
log.error("notifyWebhook:发送webhook失败taskId:{},status:{},response:{}",taskDTO.getId(),taskDTO.getRunStatus(),execute.body());
}
}catch (Exception e){
log.error("notifyWebhook:发送webhook失败taskId:{},status:{},error:{}",taskDTO.getId(),taskDTO.getRunStatus(),e.getMessage());
}
}
}

@ -0,0 +1,39 @@
package com.supervision.ai.service.hub.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
import com.supervision.ai.service.hub.service.ComfyuiTaskService;
import com.supervision.ai.service.hub.service.SchedulingStrategy;
import lombok.extern.slf4j.Slf4j;
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
@Slf4j
public class FifoSchedulingStrategy implements SchedulingStrategy {
private final ComfyuiTaskService comfyuiTaskService;
private final LinkedBlockingQueue<TaskDTO> taskQueue = new LinkedBlockingQueue<>();
public FifoSchedulingStrategy(ComfyuiTaskService comfyuiTaskService) {
this.comfyuiTaskService = comfyuiTaskService;
}
@Override
public TaskDTO selectNextTask() {
if (taskQueue.isEmpty()) {
List<TaskDTO> taskDTOS = comfyuiTaskService.queryNotStartedTask(10);
if (CollUtil.isEmpty(taskDTOS)){
log.info("selectNextTask:未从queryNotStartedTask中获取到可用的元素....");
return null;
}
taskDTOS.sort(Comparator.comparing(TaskDTO::getRunStartTime));
for (TaskDTO taskDTO : taskDTOS) {
taskQueue.offer(taskDTO);
}
}
return taskQueue.poll();
}
}

@ -0,0 +1,55 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.Permission;
import com.supervision.ai.service.hub.dto.sys.PermissionDTO;
import com.supervision.ai.service.hub.service.PermissionService;
import com.supervision.ai.service.hub.mapper.PermissionMapper;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author Administrator
* @description permission()Service
* @createDate 2025-04-14 16:01:14
*/
@Service
public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission>
implements PermissionService{
@Override
public String savePermission(PermissionDTO permissionDTO) {
return null;
}
@Override
public Boolean updatePermission(PermissionDTO permissionDTO) {
return null;
}
@Override
public Boolean deletePermission(String id) {
return null;
}
@Override
public List<PermissionDTO> queryPermission(String type) {
return null;
}
@Override
public IPage<PermissionDTO> pageList(String permissionName, Integer page, Integer pageSize) {
return null;
}
@Override
public PermissionDTO queryById(String id) {
return null;
}
}

@ -1,11 +1,12 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.SysApp;
import com.supervision.ai.service.hub.dto.sys.AppDTO;
import com.supervision.ai.service.hub.service.SysAppService;
import com.supervision.ai.service.hub.mapper.SysAppMapper;
import org.springframework.stereotype.Service;
/**
* @author Administrator
* @description sys_appService
@ -19,6 +20,31 @@ public class SysAppServiceImpl extends ServiceImpl<SysAppMapper, SysApp>
public SysApp getByAppName(String appName) {
return this.lambdaQuery().eq(SysApp::getAppName, appName).one();
}
@Override
public String saveApp(AppDTO appDTO) {
return null;
}
@Override
public Boolean updateApp(AppDTO appDTO) {
return null;
}
@Override
public Boolean deleteApp(AppDTO appDTO) {
return null;
}
@Override
public IPage<AppDTO> pageList(String appName, Integer page, Integer pageSize) {
return null;
}
@Override
public AppDTO queryById(String id) {
return null;
}
}

@ -1,20 +1,73 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.SysFile;
import com.supervision.ai.service.hub.dto.sys.FileDTO;
import com.supervision.ai.service.hub.service.SysFileService;
import com.supervision.ai.service.hub.mapper.SysFileMapper;
import io.minio.GetObjectArgs;
import io.minio.MinioClient;
import io.minio.errors.*;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* @author Administrator
* @description sys_file()Service
* @createDate 2025-04-11 15:51:10
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile>
implements SysFileService{
private final MinioClient minioClient;
@Value("${minio.bucketName}")
private String bucketName;
@Override
public String upload(MultipartFile file) {
return null;
}
@Override
public IPage<FileDTO> pageList(String fileName, String fileType , Integer page, Integer pageSize) {
return null;
}
@Override
public FileDTO queryById(String id) {
return null;
}
@Override
public void downLoad(String fileId, HttpServletResponse response) {
}
@Override
public byte[] downloadFile(String fileId) {
try {
InputStream inputStream = minioClient.getObject(
GetObjectArgs.builder().bucket(bucketName).object(fileId).build());
return inputStream.readAllBytes();
} catch (ErrorResponseException | InsufficientDataException | InternalException | InvalidKeyException |
InvalidResponseException | IOException | NoSuchAlgorithmException | ServerException |
XmlParserException e) {
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,22 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.SysRolePermission;
import com.supervision.ai.service.hub.service.SysRolePermissionService;
import com.supervision.ai.service.hub.mapper.SysRolePermissionMapper;
import org.springframework.stereotype.Service;
/**
* @author Administrator
* @description sys_role_permissionService
* @createDate 2025-04-14 16:01:04
*/
@Service
public class SysRolePermissionServiceImpl extends ServiceImpl<SysRolePermissionMapper, SysRolePermission>
implements SysRolePermissionService{
}

@ -1,7 +1,9 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.SysRole;
import com.supervision.ai.service.hub.dto.sys.SysRoleDTO;
import com.supervision.ai.service.hub.service.SysRoleService;
import com.supervision.ai.service.hub.mapper.SysRoleMapper;
import org.springframework.stereotype.Service;
@ -15,6 +17,30 @@ import org.springframework.stereotype.Service;
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole>
implements SysRoleService{
@Override
public String saveRole(SysRoleDTO roleDTO) {
return null;
}
@Override
public Boolean updateRole(SysRoleDTO roleDTO) {
return null;
}
@Override
public Boolean deleteRole(String id) {
return null;
}
@Override
public IPage<SysRoleDTO> pageList(String roleName, Integer page, Integer pageSize) {
return null;
}
@Override
public SysRoleDTO queryById(String id) {
return null;
}
}

@ -1,7 +1,9 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.ai.service.hub.domain.SysUser;
import com.supervision.ai.service.hub.dto.sys.UserDTO;
import com.supervision.ai.service.hub.service.SysUserService;
import com.supervision.ai.service.hub.mapper.SysUserMapper;
import org.springframework.stereotype.Service;
@ -19,6 +21,31 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
public SysUser getByUsername(String username) {
return this.lambdaQuery().eq(SysUser::getUserName, username).one();
}
@Override
public UserDTO queryById(String id) {
return null;
}
@Override
public String saveUser(UserDTO user) {
return null;
}
@Override
public Boolean updateUser(UserDTO user) {
return null;
}
@Override
public Boolean deleteUser(String id) {
return null;
}
@Override
public IPage<UserDTO> pageList(String userName, Integer page, Integer pageSize) {
return null;
}
}

@ -0,0 +1,39 @@
package com.supervision.ai.service.hub.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.supervision.ai.service.hub.dto.comfyui.TaskDTO;
import com.supervision.ai.service.hub.service.ComfyuiTaskService;
import com.supervision.ai.service.hub.service.TaskService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class TaskServiceImpl implements TaskService {
private final ComfyuiTaskService comfyuiTaskService;
@Override
public IPage<TaskDTO> pageList(String taskName, String taskType, String status, Integer page, Integer pageSize) {
return null;
}
@Override
public Boolean suspendTask(List<String> taskIds) {
return null;
}
@Override
public Boolean cancelTask(List<String> taskIds) {
return null;
}
@Override
public Boolean retryTask(List<String> taskIds) {
return null;
}
}

@ -0,0 +1,14 @@
package com.supervision.ai.service.hub.vo;
import lombok.Data;
@Data
public class LoginReqVo {
// appName 和 username 不能同时为空
private String appName;
private String username;
private String password;
}

@ -1,5 +1,6 @@
package com.supervision.ai.service.hub.vo.comfyui;
import com.supervision.ai.service.hub.dto.comfyui.ComfyUIPromptParamDTO;
import lombok.Data;
import java.util.List;
@ -9,9 +10,17 @@ import java.util.List;
@Data
public class TaskResultResVo {
private String promptId;
private String taskId;
private boolean completed;
private String status;
private List<String> images;
private String modelName;
private String modelType;
private String modelId;
private List<String> outputImages;
private List<ComfyUIPromptParamDTO> taskParams;
}

@ -40,4 +40,4 @@ minio:
endpoint: http:192.168.10.137:9002
accessKey: admin
secretKey: 12345678
bucketName: nxfuhsi
bucketName: ai-service-hub

@ -8,6 +8,7 @@
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="promptName" column="prompt_name" jdbcType="VARCHAR"/>
<result property="promptType" column="prompt_type" jdbcType="VARCHAR"/>
<result property="iconFileId" column="icon_file_id" jdbcType="VARCHAR"/>
<result property="prompt" column="prompt" jdbcType="OTHER" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
@ -16,7 +17,7 @@
</resultMap>
<sql id="Base_Column_List">
id,prompt_name,prompt_type,
id,prompt_name,prompt_type,icon_file_id,
prompt,create_user_id,create_time,
update_time,update_user_id
</sql>

@ -13,6 +13,9 @@
<result property="runStartTime" column="run_start_time" jdbcType="DATE"/>
<result property="runEndTime" column="run_end_time" jdbcType="DATE"/>
<result property="webHook" column="web_hook" jdbcType="VARCHAR"/>
<result property="comfyuiTaskId" column="comfyui_task_id" jdbcType="VARCHAR"/>
<result property="comfyuiServer" column="comfyui_server" jdbcType="VARCHAR"/>
<result property="prompt" column="prompt" jdbcType="VARCHAR" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
@ -21,7 +24,7 @@
<sql id="Base_Column_List">
id,prompt_id,user_id,
app_id,run_status,run_start_time,
app_id,run_status,run_start_time,prompt,comfyui_server,comfyui_task_id,
run_end_time,web_hook,create_user_id,
create_time,update_time,update_user_id
</sql>

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.supervision.ai.service.hub.mapper.PermissionMapper">
<resultMap id="BaseResultMap" type="com.supervision.ai.service.hub.domain.Permission">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="type" column="type" jdbcType="VARCHAR"/>
<result property="code" column="code" jdbcType="VARCHAR"/>
<result property="parentId" column="parent_id" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,name,type,
code,parent_id,create_user_id,
create_time,update_time,update_user_id
</sql>
</mapper>

@ -8,6 +8,7 @@
<result property="id" column="id" jdbcType="VARCHAR"/>
<result property="appName" column="app_name" jdbcType="VARCHAR"/>
<result property="password" column="password" jdbcType="VARCHAR"/>
<result property="scopes" column="scopes" jdbcType="OTHER" typeHandler="com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"/>
<result property="status" column="status" jdbcType="INTEGER"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.supervision.ai.service.hub.mapper.SysRolePermissionMapper">
<resultMap id="BaseResultMap" type="com.supervision.ai.service.hub.domain.SysRolePermission">
<id property="rId" column="r_id" jdbcType="VARCHAR"/>
<result property="pId" column="p_id" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
r_id,p_id,create_user_id,
create_time,update_time,update_user_id
</sql>
</mapper>

@ -31,10 +31,18 @@ public class ComfyUIApiServiceTest {
}
@Test
public void runPromptTest() {
String prompt = "{\"prompt\":{\"4\":{\"inputs\":{\"ckpt_name\":\"sd_xl_base_1.0.safetensors\"},\"class_type\":\"CheckpointLoaderSimple\",\"_meta\":{\"title\":\"Load Checkpoint - BASE\"}},\"5\":{\"inputs\":{\"width\":1024,\"height\":1024,\"batch_size\":1},\"class_type\":\"EmptyLatentImage\",\"_meta\":{\"title\":\"空Latent图像\"}},\"6\":{\"inputs\":{\"text\":\"a cat under the snow with blue eyes, covered by snow, cinematic style, medium shot, professional photo, animal\",\"clip\":[\"4\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"7\":{\"inputs\":{\"text\":\"text, watermark\",\"clip\":[\"4\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"10\":{\"inputs\":{\"add_noise\":\"enable\",\"noise_seed\":2025,\"steps\":25,\"cfg\":8,\"sampler_name\":\"euler\",\"scheduler\":\"normal\",\"start_at_step\":0,\"end_at_step\":20,\"return_with_leftover_noise\":\"enable\",\"model\":[\"4\",0],\"positive\":[\"6\",0],\"negative\":[\"7\",0],\"latent_image\":[\"5\",0]},\"class_type\":\"KSamplerAdvanced\",\"_meta\":{\"title\":\"KSampler (Advanced) - BASE\"}},\"11\":{\"inputs\":{\"add_noise\":\"disable\",\"noise_seed\":0,\"steps\":25,\"cfg\":8,\"sampler_name\":\"euler\",\"scheduler\":\"normal\",\"start_at_step\":20,\"end_at_step\":10000,\"return_with_leftover_noise\":\"disable\",\"model\":[\"12\",0],\"positive\":[\"15\",0],\"negative\":[\"16\",0],\"latent_image\":[\"10\",0]},\"class_type\":\"KSamplerAdvanced\",\"_meta\":{\"title\":\"KSampler (Advanced) - REFINER\"}},\"12\":{\"inputs\":{\"ckpt_name\":\"sd_xl_refiner_1.0.safetensors\"},\"class_type\":\"CheckpointLoaderSimple\",\"_meta\":{\"title\":\"Load Checkpoint - REFINER\"}},\"15\":{\"inputs\":{\"text\":\"evening sunset scenery blue sky nature, glass bottle with a galaxy in it\",\"clip\":[\"12\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"16\":{\"inputs\":{\"text\":\"text, watermark\",\"clip\":[\"12\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"17\":{\"inputs\":{\"samples\":[\"11\",0],\"vae\":[\"12\",2]},\"class_type\":\"VAEDecode\",\"_meta\":{\"title\":\"VAE解码\"}},\"19\":{\"inputs\":{\"filename_prefix\":\"ComfyUI\",\"images\":[\"17\",0]},\"class_type\":\"SaveImage\",\"_meta\":{\"title\":\"保存图像\"}}}}";
public void runPromptTest() throws InterruptedException {
//String prompt = "{\"prompt\":{\"4\":{\"inputs\":{\"ckpt_name\":\"sd_xl_base_1.0.safetensors\"},\"class_type\":\"CheckpointLoaderSimple\",\"_meta\":{\"title\":\"Load Checkpoint - BASE\"}},\"5\":{\"inputs\":{\"width\":1024,\"height\":1024,\"batch_size\":1},\"class_type\":\"EmptyLatentImage\",\"_meta\":{\"title\":\"空Latent图像\"}},\"6\":{\"inputs\":{\"text\":\"a cat under the snow with blue eyes, covered by snow, cinematic style, medium shot, professional photo, animal\",\"clip\":[\"4\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"7\":{\"inputs\":{\"text\":\"text, watermark\",\"clip\":[\"4\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"10\":{\"inputs\":{\"add_noise\":\"enable\",\"noise_seed\":2025,\"steps\":25,\"cfg\":8,\"sampler_name\":\"euler\",\"scheduler\":\"normal\",\"start_at_step\":0,\"end_at_step\":20,\"return_with_leftover_noise\":\"enable\",\"model\":[\"4\",0],\"positive\":[\"6\",0],\"negative\":[\"7\",0],\"latent_image\":[\"5\",0]},\"class_type\":\"KSamplerAdvanced\",\"_meta\":{\"title\":\"KSampler (Advanced) - BASE\"}},\"11\":{\"inputs\":{\"add_noise\":\"disable\",\"noise_seed\":0,\"steps\":25,\"cfg\":8,\"sampler_name\":\"euler\",\"scheduler\":\"normal\",\"start_at_step\":20,\"end_at_step\":10000,\"return_with_leftover_noise\":\"disable\",\"model\":[\"12\",0],\"positive\":[\"15\",0],\"negative\":[\"16\",0],\"latent_image\":[\"10\",0]},\"class_type\":\"KSamplerAdvanced\",\"_meta\":{\"title\":\"KSampler (Advanced) - REFINER\"}},\"12\":{\"inputs\":{\"ckpt_name\":\"sd_xl_refiner_1.0.safetensors\"},\"class_type\":\"CheckpointLoaderSimple\",\"_meta\":{\"title\":\"Load Checkpoint - REFINER\"}},\"15\":{\"inputs\":{\"text\":\"evening sunset scenery blue sky nature, glass bottle with a galaxy in it\",\"clip\":[\"12\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"16\":{\"inputs\":{\"text\":\"text, watermark\",\"clip\":[\"12\",1]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP文本编码\"}},\"17\":{\"inputs\":{\"samples\":[\"11\",0],\"vae\":[\"12\",2]},\"class_type\":\"VAEDecode\",\"_meta\":{\"title\":\"VAE解码\"}},\"19\":{\"inputs\":{\"filename_prefix\":\"ComfyUI\",\"images\":[\"17\",0]},\"class_type\":\"SaveImage\",\"_meta\":{\"title\":\"保存图像\"}}}}";
String prompt = "{\"prompt\":{\"6\":{\"inputs\":{\"text\":\"A young boy stands calmly in the foreground, looking directly at the camera, as a house fire rages in the background. Flames engulf the structure, with smoke billowing into the air. Firefighters in protective gear rush to the scene, a fire truck labeled '38' visible behind them. The girl's neutral expression contrasts sharply with the chaos of the fire, creating a poignant and emotionally charged scene.\",\"clip\":[\"38\",0]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP Text Encode (Positive Prompt)\"}},\"7\":{\"inputs\":{\"text\":\"worst quality, inconsistent motion, blurry, jittery, distorted\",\"clip\":[\"38\",0]},\"class_type\":\"CLIPTextEncode\",\"_meta\":{\"title\":\"CLIP Text Encode (Negative Prompt)\"}},\"8\":{\"inputs\":{\"samples\":[\"72\",0],\"vae\":[\"44\",2]},\"class_type\":\"VAEDecode\",\"_meta\":{\"title\":\"VAE解码\"}},\"38\":{\"inputs\":{\"clip_name\":\"t5xxl_fp16.safetensors\",\"type\":\"ltxv\",\"device\":\"default\"},\"class_type\":\"CLIPLoader\",\"_meta\":{\"title\":\"加载CLIP\"}},\"41\":{\"inputs\":{\"filename_prefix\":\"ComfyUI\",\"fps\":24.000000000000004,\"lossless\":false,\"quality\":90,\"method\":\"default\",\"images\":[\"8\",0]},\"class_type\":\"SaveAnimatedWEBP\",\"_meta\":{\"title\":\"保存动画WEBP\"}},\"44\":{\"inputs\":{\"ckpt_name\":\"ltx-video-2b-v0.9.safetensors\"},\"class_type\":\"CheckpointLoaderSimple\",\"_meta\":{\"title\":\"Checkpoint加载器简易\"}},\"69\":{\"inputs\":{\"frame_rate\":25.000000000000004,\"positive\":[\"77\",0],\"negative\":[\"77\",1]},\"class_type\":\"LTXVConditioning\",\"_meta\":{\"title\":\"LTXV条件\"}},\"71\":{\"inputs\":{\"steps\":50,\"max_shift\":2.0500000000000003,\"base_shift\":0.9500000000000002,\"stretch\":true,\"terminal\":0.10000000000000002,\"latent\":[\"77\",2]},\"class_type\":\"LTXVScheduler\",\"_meta\":{\"title\":\"LTXV调度器\"}},\"72\":{\"inputs\":{\"add_noise\":true,\"noise_seed\":2025,\"cfg\":3,\"model\":[\"44\",0],\"positive\":[\"69\",0],\"negative\":[\"69\",1],\"sampler\":[\"73\",0],\"sigmas\":[\"71\",0],\"latent_image\":[\"77\",2]},\"class_type\":\"SamplerCustom\",\"_meta\":{\"title\":\"自定义采样器\"}},\"73\":{\"inputs\":{\"sampler_name\":\"euler\"},\"class_type\":\"KSamplerSelect\",\"_meta\":{\"title\":\"K采样器选择\"}},\"77\":{\"inputs\":{\"width\":704,\"height\":480,\"length\":161,\"batch_size\":1,\"positive\":[\"6\",0],\"negative\":[\"7\",0],\"vae\":[\"44\",2],\"image\":[\"78\",0]},\"class_type\":\"LTXVImgToVideo\",\"_meta\":{\"title\":\"LTXV图像到视频\"}},\"78\":{\"inputs\":{\"image\":\"8.png\"},\"class_type\":\"LoadImage\",\"_meta\":{\"title\":\"加载图像\"}}}}";
PromptRunDTO res = comfyUIApiService.runPrompt(JSON.parseObject(prompt));
log.info(JSONUtil.toJsonStr(res));
log.info("执行工作流成功res:{}", JSONUtil.toJsonStr(res));
for (int i = 0; i < 50; i++) {
String promptId = res.getPrompt_id();
Map<String, Object> history = comfyUIApiService.queryHistory(promptId);
log.info("查询任务状态:{}",JSONUtil.toJsonStr(history));
Thread.sleep(1000 *1);
}
}
@Test

Loading…
Cancel
Save