Merge remote-tracking branch 'origin/master' into master-wangwei
This commit is contained in:
commit
903216e1e5
@ -71,4 +71,6 @@ public interface ErrorCodeConstants {
|
||||
|
||||
ErrorCode TRAINING_NOT_EXISTS = new ErrorCode(10029, "训练不存在");
|
||||
|
||||
ErrorCode MODEL_COMPLETIONS_ERROR = new ErrorCode(10030, "模型推理失败");
|
||||
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public class BaseModelController {
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建基座模型")
|
||||
@PreAuthorize("@ss.hasPermission('llm:base-model:create')")
|
||||
public CommonResult<Integer> createBaseModel(@Valid @RequestBody BaseModelSaveReqVO createReqVO) {
|
||||
public CommonResult<Long> createBaseModel(@Valid @RequestBody BaseModelSaveReqVO createReqVO) {
|
||||
return success(baseModelService.createBaseModel(createReqVO));
|
||||
}
|
||||
|
||||
@ -76,7 +76,7 @@ public class BaseModelController {
|
||||
@Operation(summary = "删除基座模型")
|
||||
@Parameter(name = "id", description = "编号", required = true)
|
||||
@PreAuthorize("@ss.hasPermission('llm:base-model:delete')")
|
||||
public CommonResult<Boolean> deleteBaseModel(@RequestParam("id") Integer id) {
|
||||
public CommonResult<Boolean> deleteBaseModel(@RequestParam("id") Long id) {
|
||||
baseModelService.deleteBaseModel(id);
|
||||
return success(true);
|
||||
}
|
||||
@ -85,7 +85,7 @@ public class BaseModelController {
|
||||
@Operation(summary = "获得基座模型")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('llm:base-model:query')")
|
||||
public CommonResult<BaseModelRespVO> getBaseModel(@RequestParam("id") Integer id) {
|
||||
public CommonResult<BaseModelRespVO> getBaseModel(@RequestParam("id") Long id) {
|
||||
BaseModelDO baseModel = baseModelService.getBaseModel(id);
|
||||
return success(BeanUtils.toBean(baseModel, BaseModelRespVO.class));
|
||||
}
|
||||
@ -94,7 +94,7 @@ public class BaseModelController {
|
||||
@Operation(summary = "获取参数模板")
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('llm:base-model:query')")
|
||||
public CommonResult<JSONObject> getParamModel(@RequestParam("id") Integer id) {
|
||||
public CommonResult<JSONObject> getParamModel(@RequestParam("id") Long id) {
|
||||
BaseModelDO baseModel = baseModelService.getBaseModel(id);
|
||||
//todo 获取参数模板api
|
||||
return success(new JSONObject());
|
||||
|
@ -14,7 +14,7 @@ public class BaseModelRespVO {
|
||||
|
||||
@Schema(description = "基座模型唯一标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2828")
|
||||
@ExcelProperty("基座模型唯一标识")
|
||||
private Integer id;
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "基座模型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
|
||||
@ExcelProperty("基座模型名称")
|
||||
|
@ -10,7 +10,7 @@ import javax.validation.constraints.*;
|
||||
public class BaseModelSaveReqVO {
|
||||
|
||||
@Schema(description = "基座模型唯一标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2828")
|
||||
private Integer id;
|
||||
private Long id;
|
||||
|
||||
@Schema(description = "基座模型名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
|
||||
@NotEmpty(message = "基座模型名称不能为空")
|
||||
|
@ -92,4 +92,9 @@ public class ConversationController {
|
||||
BeanUtils.toBean(list, ConversationRespVO.class));
|
||||
}
|
||||
|
||||
@PostMapping("/chat")
|
||||
@Operation(summary = "对话推理接口")
|
||||
public CommonResult<ChatRespVO> chat(@Valid @RequestBody ChatReqVO chatReqVO) {
|
||||
return success(conversationService.chat(chatReqVO));
|
||||
}
|
||||
}
|
@ -0,0 +1,27 @@
|
||||
package cn.iocoder.yudao.module.llm.controller.admin.conversation.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
@Schema(description = "管理后台 - 大模型对话推理聊天 Request VO")
|
||||
@Data
|
||||
public class ChatReqVO {
|
||||
|
||||
@Schema(description = "模型类型", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "模型类型不能为空")
|
||||
private Integer modelType;
|
||||
@Schema(description = "模型ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "模型ID不能为空")
|
||||
private Long modelId;
|
||||
@Schema(description = "应用ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotNull(message = "应用ID不能为空")
|
||||
private Long applicationId;
|
||||
@Schema(description = "对话的内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "对话的内容不能为空")
|
||||
private String prompt;
|
||||
@Schema(description = "对话ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String uuid;
|
||||
}
|
@ -0,0 +1,30 @@
|
||||
package cn.iocoder.yudao.module.llm.controller.admin.conversation.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import lombok.Data;
|
||||
|
||||
import javax.validation.constraints.NotEmpty;
|
||||
|
||||
@Schema(description = "管理后台 - 大模型对话推理聊天 Response VO")
|
||||
@Data
|
||||
public class ChatRespVO {
|
||||
|
||||
@Schema(description = "对话ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
private String uuid;
|
||||
@Schema(description = "模型类型", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "模型类型不能为空")
|
||||
private Integer modelType;
|
||||
@Schema(description = "模型ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "模型ID不能为空")
|
||||
private Long modelId;
|
||||
@Schema(description = "应用ID", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "应用ID不能为空")
|
||||
private Long applicationId;
|
||||
@Schema(description = "对话的内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "对话的内容不能为空")
|
||||
private String prompt;
|
||||
@Schema(description = "回答的内容", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotEmpty(message = "回答的内容不能为空")
|
||||
private String response;
|
||||
|
||||
}
|
@ -1,5 +1,8 @@
|
||||
package cn.iocoder.yudao.module.llm.controller.admin.datarefluxconfig;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelservice.ModelServiceMapper;
|
||||
import cn.iocoder.yudao.module.llm.service.basemodel.BaseModelService;
|
||||
import cn.iocoder.yudao.module.llm.service.modelservice.ModelServiceService;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@ -37,6 +40,10 @@ public class DataRefluxConfigController {
|
||||
|
||||
@Resource
|
||||
private DataRefluxConfigService dataRefluxConfigService;
|
||||
@Resource
|
||||
private ModelServiceService modelServiceService;
|
||||
@Resource
|
||||
private BaseModelService baseModelService;
|
||||
|
||||
@PostMapping("/create")
|
||||
@Operation(summary = "创建数据回流配置")
|
||||
@ -68,7 +75,13 @@ public class DataRefluxConfigController {
|
||||
@PreAuthorize("@ss.hasPermission('llm:data-reflux-config:query')")
|
||||
public CommonResult<DataRefluxConfigRespVO> getDataRefluxConfig(@RequestParam("id") Long id) {
|
||||
DataRefluxConfigDO dataRefluxConfig = dataRefluxConfigService.getDataRefluxConfig(id);
|
||||
return success(BeanUtils.toBean(dataRefluxConfig, DataRefluxConfigRespVO.class));
|
||||
DataRefluxConfigRespVO bean = BeanUtils.toBean(dataRefluxConfig, DataRefluxConfigRespVO.class);
|
||||
if (bean.getModelType()==0){
|
||||
bean.setModelServiceName(modelServiceService.getModelService(bean.getModelServiceId()).getServiceName());
|
||||
}else if (bean.getModelType()==1){
|
||||
bean.setModelServiceName(baseModelService.getBaseModel(bean.getModelServiceId()).getModelName());
|
||||
}
|
||||
return success(bean);
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@ -76,7 +89,19 @@ public class DataRefluxConfigController {
|
||||
@PreAuthorize("@ss.hasPermission('llm:data-reflux-config:query')")
|
||||
public CommonResult<PageResult<DataRefluxConfigRespVO>> getDataRefluxConfigPage(@Valid DataRefluxConfigPageReqVO pageReqVO) {
|
||||
PageResult<DataRefluxConfigDO> pageResult = dataRefluxConfigService.getDataRefluxConfigPage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, DataRefluxConfigRespVO.class));
|
||||
if (pageResult==null){
|
||||
return success(PageResult.empty());
|
||||
}
|
||||
PageResult<DataRefluxConfigRespVO> bean = BeanUtils.toBean(pageResult, DataRefluxConfigRespVO.class);
|
||||
for (DataRefluxConfigRespVO dataRefluxConfigRespVO : bean.getList()){
|
||||
if (dataRefluxConfigRespVO.getModelType()==0){
|
||||
dataRefluxConfigRespVO.setModelServiceName(modelServiceService.getModelService(dataRefluxConfigRespVO.getModelServiceId()).getServiceName());
|
||||
}else if (dataRefluxConfigRespVO.getModelType()==1){
|
||||
dataRefluxConfigRespVO.setModelServiceName(baseModelService.getBaseModel(dataRefluxConfigRespVO.getModelServiceId()).getModelName());
|
||||
}
|
||||
}
|
||||
// PageResult<DataRefluxConfigRespVO> result = bean.setList(bean.getList());
|
||||
return success(bean);
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@ -92,4 +117,4 @@ public class DataRefluxConfigController {
|
||||
BeanUtils.toBean(list, DataRefluxConfigRespVO.class));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -18,8 +18,11 @@ public class DataRefluxConfigPageReqVO extends PageParam {
|
||||
@Schema(description = "模型服务ID", example = "2475")
|
||||
private Long modelServiceId;
|
||||
|
||||
@Schema(description = "模型服务", example = "0")
|
||||
private String modelServiceName;
|
||||
|
||||
@Schema(description = "创建时间")
|
||||
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
|
||||
private LocalDateTime[] createTime;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -20,8 +20,14 @@ public class DataRefluxConfigRespVO {
|
||||
@ExcelProperty("模型服务ID")
|
||||
private Long modelServiceId;
|
||||
|
||||
@Schema(description = "模型服务", example = "0")
|
||||
private String modelServiceName;
|
||||
|
||||
@Schema(description = "是否预知模型(0普通 1官方)", example = "0")
|
||||
private Long modelType;
|
||||
|
||||
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@ExcelProperty("创建时间")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -16,4 +16,7 @@ public class DataRefluxConfigSaveReqVO {
|
||||
@NotNull(message = "模型服务ID不能为空")
|
||||
private Long modelServiceId;
|
||||
|
||||
}
|
||||
@Schema(description = "是否预知模型(0普通 1官方)", example = "0")
|
||||
private Long modelType;
|
||||
|
||||
}
|
||||
|
@ -16,6 +16,13 @@ public class DataRefluxDataSaveReqVO {
|
||||
@NotNull(message = "模型服务ID不能为空")
|
||||
private Long modelServiceId;
|
||||
|
||||
@Schema(description = "数据回流ID", example = "31011")
|
||||
private Long configId;
|
||||
|
||||
@Schema(description = "是否预知模型(0普通 1官方)", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
|
||||
@NotNull(message = "是否预知模型(0普通 1官方)不能为空")
|
||||
private Long modelType;
|
||||
|
||||
@Schema(description = "system")
|
||||
private String system;
|
||||
|
||||
@ -25,4 +32,4 @@ public class DataRefluxDataSaveReqVO {
|
||||
@Schema(description = "Response")
|
||||
private String response;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -67,16 +67,31 @@ public class FineTuningTaskController {
|
||||
@Parameter(name = "id", description = "编号", required = true, example = "1024")
|
||||
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:query')")
|
||||
public CommonResult<FineTuningTaskRespVO> getFineTuningTask(@RequestParam("id") Long id) {
|
||||
FineTuningTaskDO fineTuningTask = fineTuningTaskService.getFineTuningTask(id);
|
||||
return success(BeanUtils.toBean(fineTuningTask, FineTuningTaskRespVO.class));
|
||||
return success(fineTuningTaskService.getFineTuningTask(id));
|
||||
}
|
||||
|
||||
@PutMapping("/stop")
|
||||
@Operation(summary = "停止模型调优 —— 微调任务")
|
||||
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:update')")
|
||||
public CommonResult<Boolean> stopFineTuningTask(@RequestParam("id") Long id) {
|
||||
fineTuningTaskService.stopFineTuningTask(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@PutMapping("start")
|
||||
@Operation(summary = "部署模型调优 —— 微调任务")
|
||||
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:update')")
|
||||
public CommonResult<Boolean> startFineTuningTask(@RequestParam("id") Long id) {
|
||||
fineTuningTaskService.startFineTuningTask(id);
|
||||
return success(true);
|
||||
}
|
||||
|
||||
@GetMapping("/page")
|
||||
@Operation(summary = "获得模型调优 —— 微调任务分页")
|
||||
@PreAuthorize("@ss.hasPermission('llm:fine-tuning-task:query')")
|
||||
public CommonResult<PageResult<FineTuningTaskRespVO>> getFineTuningTaskPage(@Valid FineTuningTaskPageReqVO pageReqVO) {
|
||||
PageResult<FineTuningTaskDO> pageResult = fineTuningTaskService.getFineTuningTaskPage(pageReqVO);
|
||||
return success(BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class));
|
||||
PageResult<FineTuningTaskRespVO> pageResult = fineTuningTaskService.getFineTuningTaskPage1(pageReqVO);
|
||||
return success(pageResult);
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
|
@ -88,4 +88,7 @@ public class FineTuningTaskPageReqVO extends PageParam {
|
||||
@Schema(description = "状态,使用字典(llm_fine_tuning_task_status)", example = "1")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description ="基础模型服务Id")
|
||||
private Long baseModelId;
|
||||
|
||||
}
|
@ -125,5 +125,13 @@ public class FineTuningTaskRespVO {
|
||||
@ExcelProperty(value = "状态,使用字典(llm_fine_tuning_task_status)", converter = DictConvert.class)
|
||||
@DictFormat("llm_fine_tuning_task_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
|
||||
private Integer status;
|
||||
@Schema(description ="基础模型服务Id")
|
||||
private Long baseModelId;
|
||||
|
||||
@Schema(description = "基础模型服务名称")
|
||||
private String baseModelName;
|
||||
|
||||
@Schema(description = "数据集名称")
|
||||
private String datasetName;
|
||||
|
||||
}
|
@ -83,4 +83,7 @@ public class FineTuningTaskSaveReqVO {
|
||||
@NotNull(message = "状态,使用字典(llm_fine_tuning_task_status)不能为空")
|
||||
private Integer status;
|
||||
|
||||
@Schema(description = "基础模型服务Id")
|
||||
private Long baseModelId;
|
||||
|
||||
}
|
@ -77,6 +77,14 @@ public class KnowledgeBaseController {
|
||||
return success(BeanUtils.toBean(pageResult, KnowledgeBaseRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/list")
|
||||
@Operation(summary = "获得知识库分页")
|
||||
@PreAuthorize("@ss.hasPermission('llm:knowledge-base:query')")
|
||||
public CommonResult<List<KnowledgeBaseRespVO>> getKnowledgeBaseList() {
|
||||
List<KnowledgeBaseDO> list = knowledgeBaseService.getKnowledgeBaseList();
|
||||
return success(BeanUtils.toBean(list, KnowledgeBaseRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出知识库 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('llm:knowledge-base:export')")
|
||||
|
@ -79,17 +79,26 @@ public class LabelController {
|
||||
return success(BeanUtils.toBean(pageResult, LabelRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/all")
|
||||
@Operation(summary = "获得标签管理列表所有")
|
||||
@PreAuthorize("@ss.hasPermission('llm:label:query')")
|
||||
public CommonResult<List<LabelRespVO>> getLabelList() {
|
||||
List<LabelDO> list = labelService.getLabelList();
|
||||
return success(BeanUtils.toBean(list, LabelRespVO.class));
|
||||
}
|
||||
|
||||
@GetMapping("/export-excel")
|
||||
@Operation(summary = "导出标签管理 Excel")
|
||||
@PreAuthorize("@ss.hasPermission('llm:label:export')")
|
||||
@ApiAccessLog(operateType = EXPORT)
|
||||
public void exportLabelExcel(@Valid LabelPageReqVO pageReqVO,
|
||||
HttpServletResponse response) throws IOException {
|
||||
HttpServletResponse response) throws IOException {
|
||||
|
||||
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
|
||||
List<LabelDO> list = labelService.getLabelPage(pageReqVO).getList();
|
||||
// 导出 Excel
|
||||
ExcelUtils.write(response, "标签管理.xls", "数据", LabelRespVO.class,
|
||||
BeanUtils.toBean(list, LabelRespVO.class));
|
||||
BeanUtils.toBean(list, LabelRespVO.class));
|
||||
}
|
||||
|
||||
}
|
@ -26,7 +26,7 @@ public class BaseModelDO extends BaseDO {
|
||||
* 基座模型唯一标识
|
||||
*/
|
||||
@TableId
|
||||
private Integer id;
|
||||
private Long id;
|
||||
/**
|
||||
* 基座模型名称
|
||||
*/
|
||||
|
@ -31,5 +31,9 @@ public class DataRefluxConfigDO extends BaseDO {
|
||||
* 模型服务ID
|
||||
*/
|
||||
private Long modelServiceId;
|
||||
/**
|
||||
* 是否预知模型(0普通 1官方)
|
||||
*/
|
||||
private Long modelType;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -31,6 +31,14 @@ public class DataRefluxDataDO extends BaseDO {
|
||||
* 模型服务ID
|
||||
*/
|
||||
private Long modelServiceId;
|
||||
/**
|
||||
* 数据回流ID
|
||||
*/
|
||||
private Long configId;
|
||||
/**
|
||||
* 是否预知模型(0普通 1官方)
|
||||
*/
|
||||
private Long modelType;
|
||||
/**
|
||||
* system
|
||||
*/
|
||||
@ -44,4 +52,4 @@ public class DataRefluxDataDO extends BaseDO {
|
||||
*/
|
||||
private String response;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -135,5 +135,9 @@ public class FineTuningTaskDO extends BaseDO {
|
||||
* 枚举 {@link TODO llm_fine_tuning_task_status 对应的类}
|
||||
*/
|
||||
private Integer status;
|
||||
/**
|
||||
* 基础服务模型Id
|
||||
*/
|
||||
private Long baseModelId;
|
||||
|
||||
}
|
@ -1,13 +1,13 @@
|
||||
package cn.iocoder.yudao.module.llm.dal.mysql.finetuningtask;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.finetuningtask.FineTuningTaskDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.*;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
|
||||
/**
|
||||
* 模型调优 —— 微调任务 Mapper
|
||||
@ -47,4 +47,6 @@ public interface FineTuningTaskMapper extends BaseMapperX<FineTuningTaskDO> {
|
||||
.orderByDesc(FineTuningTaskDO::getId));
|
||||
}
|
||||
|
||||
@Update("update llm_fine_tuning_task set status = #{status} where id = #{id}")
|
||||
void stopStartTask(@Param("id") Long id,@Param("status") int status);
|
||||
}
|
@ -20,7 +20,7 @@ public interface BaseModelService {
|
||||
* @param createReqVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
Integer createBaseModel(@Valid BaseModelSaveReqVO createReqVO);
|
||||
Long createBaseModel(@Valid BaseModelSaveReqVO createReqVO);
|
||||
|
||||
/**
|
||||
* 更新基座模型
|
||||
@ -34,7 +34,7 @@ public interface BaseModelService {
|
||||
*
|
||||
* @param id 编号
|
||||
*/
|
||||
void deleteBaseModel(Integer id);
|
||||
void deleteBaseModel(Long id);
|
||||
|
||||
/**
|
||||
* 获得基座模型
|
||||
@ -42,7 +42,7 @@ public interface BaseModelService {
|
||||
* @param id 编号
|
||||
* @return 基座模型
|
||||
*/
|
||||
BaseModelDO getBaseModel(Integer id);
|
||||
BaseModelDO getBaseModel(Long id);
|
||||
|
||||
/**
|
||||
* 获得基座模型分页
|
||||
|
@ -31,7 +31,7 @@ public class BaseModelServiceImpl implements BaseModelService {
|
||||
private BaseModelMapper baseModelMapper;
|
||||
|
||||
@Override
|
||||
public Integer createBaseModel(BaseModelSaveReqVO createReqVO) {
|
||||
public Long createBaseModel(BaseModelSaveReqVO createReqVO) {
|
||||
// 插入
|
||||
BaseModelDO baseModel = BeanUtils.toBean(createReqVO, BaseModelDO.class);
|
||||
baseModelMapper.insert(baseModel);
|
||||
@ -49,21 +49,22 @@ public class BaseModelServiceImpl implements BaseModelService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteBaseModel(Integer id) {
|
||||
public void deleteBaseModel(Long id) {
|
||||
// 校验存在
|
||||
validateBaseModelExists(id);
|
||||
// 删除
|
||||
baseModelMapper.deleteById(id);
|
||||
}
|
||||
|
||||
private void validateBaseModelExists(Integer id) {
|
||||
private void validateBaseModelExists(Long id) {
|
||||
if (baseModelMapper.selectById(id) == null) {
|
||||
throw exception(BASE_MODEL_NOT_EXISTS);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public BaseModelDO getBaseModel(Integer id) {
|
||||
public BaseModelDO getBaseModel(Long id) {
|
||||
|
||||
return baseModelMapper.selectById(id);
|
||||
}
|
||||
|
||||
@ -75,7 +76,7 @@ public class BaseModelServiceImpl implements BaseModelService {
|
||||
@Override
|
||||
public List<BaseModelDO> getBaseModelList() {
|
||||
LambdaQueryWrapper<BaseModelDO> queryWrapper = new LambdaQueryWrapper<>();
|
||||
queryWrapper.eq(BaseModelDO::getIsActive,0);
|
||||
queryWrapper.eq(BaseModelDO::getIsActive,1);
|
||||
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(queryWrapper);
|
||||
return baseModelDOS;
|
||||
}
|
||||
|
@ -52,4 +52,5 @@ public interface ConversationService {
|
||||
*/
|
||||
PageResult<ConversationDO> getConversationPage(ConversationPageReqVO pageReqVO);
|
||||
|
||||
ChatRespVO chat(@Valid ChatReqVO chatReqVO);
|
||||
}
|
@ -1,11 +1,21 @@
|
||||
package cn.iocoder.yudao.module.llm.service.conversation;
|
||||
|
||||
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
|
||||
import cn.iocoder.yudao.module.llm.service.basemodel.BaseModelService;
|
||||
import cn.iocoder.yudao.module.llm.service.http.ModelService;
|
||||
import cn.iocoder.yudao.module.llm.service.http.vo.ModelCompletionsReqVO;
|
||||
import cn.iocoder.yudao.module.llm.service.http.vo.ModelCompletionsRespVO;
|
||||
import com.alibaba.excel.util.StringUtils;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.conversation.vo.*;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.conversation.ConversationDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
@ -28,6 +38,17 @@ public class ConversationServiceImpl implements ConversationService {
|
||||
|
||||
@Resource
|
||||
private ConversationMapper conversationMapper;
|
||||
@Resource
|
||||
private StringRedisTemplate stringRedisTemplate;
|
||||
@Resource
|
||||
private ModelService modelService;
|
||||
@Resource
|
||||
private BaseModelService baseModelService;
|
||||
|
||||
// 聊天会话历史记录缓存Key
|
||||
private final static String CHAT_HIStORY_REDIS_KEY = "llm:chat:history";
|
||||
// 聊天会话历史记录缓存时间
|
||||
private final static Long CHAT_HISTORY_REDIS_EXPIRE_SECONDS = 60 * 60 * 24L;
|
||||
|
||||
@Override
|
||||
public Integer createConversation(ConversationSaveReqVO createReqVO) {
|
||||
@ -71,4 +92,44 @@ public class ConversationServiceImpl implements ConversationService {
|
||||
return conversationMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public ChatRespVO chat(ChatReqVO chatReqVO) {
|
||||
if (StringUtils.isBlank(chatReqVO.getUuid())) {
|
||||
// 如果没有uuid,就生成一个
|
||||
chatReqVO.setUuid(UUID.randomUUID().toString());
|
||||
}
|
||||
String model = null;
|
||||
if (Objects.equals(1, chatReqVO.getModelType())) {
|
||||
// 预制模型
|
||||
BaseModelDO baseModelDO = baseModelService.getBaseModel(chatReqVO.getModelId());
|
||||
if (baseModelDO == null) {
|
||||
throw exception(BASE_MODEL_NOT_EXISTS);
|
||||
}
|
||||
model = baseModelDO.getModelName();
|
||||
}
|
||||
ModelCompletionsReqVO.ModelCompletionsMessage message = new ModelCompletionsReqVO.ModelCompletionsMessage();
|
||||
message.setRole("user");
|
||||
message.setContent(chatReqVO.getPrompt());
|
||||
// TODO: 聊天推理
|
||||
List<String> messageHistoryList = stringRedisTemplate.opsForList().range(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), 0, -1);
|
||||
List<ModelCompletionsReqVO.ModelCompletionsMessage> messages = new ArrayList<>();
|
||||
if (messageHistoryList != null && !messageHistoryList.isEmpty()) {
|
||||
for (String messageHistory : messageHistoryList) {
|
||||
messages.add(JsonUtils.parseObject(messageHistory, ModelCompletionsReqVO.ModelCompletionsMessage.class));
|
||||
}
|
||||
}
|
||||
messages.add(message);
|
||||
ModelCompletionsReqVO modelCompletionsReqVO = new ModelCompletionsReqVO();
|
||||
modelCompletionsReqVO.setMessages(messages);
|
||||
modelCompletionsReqVO.setModel(model);
|
||||
ModelCompletionsRespVO modelCompletionsRespVO = modelService.modelCompletions(modelCompletionsReqVO);
|
||||
if (modelCompletionsRespVO == null) {
|
||||
throw exception(MODEL_COMPLETIONS_ERROR);
|
||||
}
|
||||
ChatRespVO chatRespVO = BeanUtils.toBean(chatReqVO, ChatRespVO.class);
|
||||
chatRespVO.setResponse(modelCompletionsRespVO.getAnswer());
|
||||
// 将聊天记录放入缓存
|
||||
stringRedisTemplate.opsForList().rightPush(CHAT_HIStORY_REDIS_KEY + ":" + chatReqVO.getUuid(), JsonUtils.toJsonString(message));
|
||||
return chatRespVO;
|
||||
}
|
||||
}
|
@ -1,11 +1,20 @@
|
||||
package cn.iocoder.yudao.module.llm.service.datarefluxconfig;
|
||||
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.modelservice.ModelServiceMapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.datarefluxconfig.vo.*;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.datarefluxconfig.DataRefluxConfigDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
@ -28,6 +37,10 @@ public class DataRefluxConfigServiceImpl implements DataRefluxConfigService {
|
||||
|
||||
@Resource
|
||||
private DataRefluxConfigMapper dataRefluxConfigMapper;
|
||||
@Resource
|
||||
private ModelServiceMapper modelServiceMapper;
|
||||
@Resource
|
||||
private BaseModelMapper baseModelMapper;
|
||||
|
||||
@Override
|
||||
public Long createDataRefluxConfig(DataRefluxConfigSaveReqVO createReqVO) {
|
||||
@ -68,7 +81,30 @@ public class DataRefluxConfigServiceImpl implements DataRefluxConfigService {
|
||||
|
||||
@Override
|
||||
public PageResult<DataRefluxConfigDO> getDataRefluxConfigPage(DataRefluxConfigPageReqVO pageReqVO) {
|
||||
return dataRefluxConfigMapper.selectPage(pageReqVO);
|
||||
LambdaQueryWrapper<ModelServiceDO> like = new LambdaQueryWrapper<ModelServiceDO>().like(ModelServiceDO::getServiceName, pageReqVO.getModelServiceName());
|
||||
List<ModelServiceDO> modelServiceDOS = modelServiceMapper.selectList(like);
|
||||
List<Long> collect = modelServiceDOS.stream().map(ModelServiceDO::getId).collect(Collectors.toList());
|
||||
LambdaQueryWrapper<BaseModelDO> wrapper = new LambdaQueryWrapper<BaseModelDO>().like(BaseModelDO::getModelName, pageReqVO.getModelServiceName());
|
||||
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(wrapper);
|
||||
List<Long> collect1 = baseModelDOS.stream().map(BaseModelDO::getId).collect(Collectors.toList());
|
||||
LambdaQueryWrapperX<DataRefluxConfigDO> wrapperX = new LambdaQueryWrapperX<DataRefluxConfigDO>()
|
||||
.eqIfPresent(DataRefluxConfigDO::getModelServiceId, pageReqVO.getModelServiceId())
|
||||
.betweenIfPresent(DataRefluxConfigDO::getCreateTime, pageReqVO.getCreateTime())
|
||||
.orderByDesc(DataRefluxConfigDO::getId);
|
||||
if (collect.size()==0&&collect1.size()==0&&pageReqVO.getModelServiceName()!=null){
|
||||
return null;
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(collect) || ObjectUtil.isNotEmpty(collect1)) {
|
||||
wrapperX.and(w -> {
|
||||
if (ObjectUtil.isNotEmpty(collect)) {
|
||||
w.or().in(DataRefluxConfigDO::getModelServiceId, collect).eq(DataRefluxConfigDO::getModelType, 0);
|
||||
}
|
||||
if (ObjectUtil.isNotEmpty(collect1)) {
|
||||
w.or().in(DataRefluxConfigDO::getModelServiceId, collect1).eq(DataRefluxConfigDO::getModelType, 1);
|
||||
}
|
||||
});
|
||||
}
|
||||
return dataRefluxConfigMapper.selectPage(pageReqVO,wrapperX);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ public interface FineTuningTaskService {
|
||||
* @param id 编号
|
||||
* @return 模型调优 —— 微调任务
|
||||
*/
|
||||
FineTuningTaskDO getFineTuningTask(Long id);
|
||||
FineTuningTaskRespVO getFineTuningTask(Long id);
|
||||
|
||||
/**
|
||||
* 获得模型调优 —— 微调任务分页
|
||||
@ -52,4 +52,23 @@ public interface FineTuningTaskService {
|
||||
*/
|
||||
PageResult<FineTuningTaskDO> getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 获得模型调优 —— 微调任务分页
|
||||
*
|
||||
* @param pageReqVO 分页查询
|
||||
* @return 模型调优 —— 微调任务分页
|
||||
*/
|
||||
PageResult<FineTuningTaskRespVO> getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO);
|
||||
|
||||
/**
|
||||
* 停止微调任务
|
||||
* @param id
|
||||
*/
|
||||
void stopFineTuningTask(Long id);
|
||||
|
||||
/**
|
||||
* 部署微调任务
|
||||
* @param id
|
||||
*/
|
||||
void startFineTuningTask(Long id);
|
||||
}
|
@ -1,12 +1,21 @@
|
||||
package cn.iocoder.yudao.module.llm.service.finetuningtask;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper;
|
||||
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetMapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
import javax.annotation.Resource;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import cn.iocoder.yudao.module.llm.controller.admin.finetuningtask.vo.*;
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.finetuningtask.FineTuningTaskDO;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
@ -30,6 +39,10 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService {
|
||||
|
||||
@Resource
|
||||
private FineTuningTaskMapper fineTuningTaskMapper;
|
||||
@Resource
|
||||
private BaseModelMapper baseModelMapper;
|
||||
@Resource
|
||||
private DatasetMapper datasetMapper;
|
||||
|
||||
@Override
|
||||
public Long createFineTuningTask(FineTuningTaskSaveReqVO createReqVO) {
|
||||
@ -68,12 +81,71 @@ public class FineTuningTaskServiceImpl implements FineTuningTaskService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public FineTuningTaskDO getFineTuningTask(Long id) {
|
||||
return fineTuningTaskMapper.selectById(id);
|
||||
public FineTuningTaskRespVO getFineTuningTask(Long id) {
|
||||
FineTuningTaskDO fineTuningTaskDO = fineTuningTaskMapper.selectById(id);
|
||||
FineTuningTaskRespVO result = BeanUtils.toBean(fineTuningTaskDO, FineTuningTaskRespVO.class);
|
||||
Long dataset = fineTuningTaskDO.getDataset();
|
||||
if (dataset != null) {
|
||||
DatasetDO datasetDO = datasetMapper.selectById(dataset);
|
||||
result.setDatasetName(datasetDO.getDatasetName());
|
||||
}
|
||||
Long baseModelId = fineTuningTaskDO.getBaseModelId();
|
||||
if (baseModelId != null) {
|
||||
BaseModelDO baseModelDO = baseModelMapper.selectById(baseModelId);
|
||||
result.setBaseModelName(baseModelDO.getModelName());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@Override
|
||||
public PageResult<FineTuningTaskRespVO> getFineTuningTaskPage1(FineTuningTaskPageReqVO pageReqVO) {
|
||||
PageResult<FineTuningTaskDO> pageResult = fineTuningTaskMapper.selectPage(pageReqVO);
|
||||
PageResult<FineTuningTaskRespVO> result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class);
|
||||
if (CollectionUtils.isNotEmpty(pageResult.getList())){
|
||||
List<Long> modelIds = pageResult.getList().stream().map(FineTuningTaskDO::getBaseModelId).collect(Collectors.toList());
|
||||
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(new LambdaQueryWrapper<BaseModelDO>()
|
||||
.in(BaseModelDO::getId, modelIds));
|
||||
Map<Long, BaseModelDO> longModelServiceDOMap = cn.iocoder.yudao.framework.common.util.collection.
|
||||
CollectionUtils.convertMap(baseModelDOS, BaseModelDO::getId);
|
||||
result.getList().forEach(item->{
|
||||
BaseModelDO baseModelDO = longModelServiceDOMap.get(item.getBaseModelId());
|
||||
if(baseModelDO != null){
|
||||
item.setBaseModelName(baseModelDO.getModelName());
|
||||
}
|
||||
});
|
||||
List<Long> dataSetlIds = pageResult.getList().stream().map(FineTuningTaskDO::getDataset).collect(Collectors.toList());
|
||||
List<DatasetDO> datasetDOS = datasetMapper.selectList(new LambdaQueryWrapper<DatasetDO>().in(DatasetDO::getId, dataSetlIds));
|
||||
Map<Long, DatasetDO> datasetDOMap = cn.iocoder.yudao.framework.common.util.collection.
|
||||
CollectionUtils.convertMap(datasetDOS, DatasetDO::getId);
|
||||
result.getList().forEach(item->{
|
||||
DatasetDO datasetDO = datasetDOMap.get(item.getDataset());
|
||||
if(datasetDO != null){
|
||||
item.setDatasetName(datasetDO.getDatasetName());
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 停止服务
|
||||
* @param id
|
||||
*/
|
||||
@Override
|
||||
public void stopFineTuningTask(Long id) {
|
||||
fineTuningTaskMapper.stopStartTask(id,0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startFineTuningTask(Long id) {
|
||||
fineTuningTaskMapper.stopStartTask(id,1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<FineTuningTaskDO> getFineTuningTaskPage(FineTuningTaskPageReqVO pageReqVO) {
|
||||
PageResult<FineTuningTaskDO> pageResult = fineTuningTaskMapper.selectPage(pageReqVO);
|
||||
PageResult<FineTuningTaskRespVO> result = BeanUtils.toBean(pageResult, FineTuningTaskRespVO.class);
|
||||
|
||||
return fineTuningTaskMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
|
@ -5,11 +5,13 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
|
||||
import cn.iocoder.yudao.module.llm.framework.backend.config.LLMBackendProperties;
|
||||
import cn.iocoder.yudao.module.llm.service.http.vo.*;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class ModelService {
|
||||
|
||||
@ -44,7 +46,10 @@ public class ModelService {
|
||||
if (StringUtils.isBlank(req.getModel())) {
|
||||
req.setModel(DEFAULT_MODEL_ID);
|
||||
}
|
||||
log.info("url: {}", llmBackendProperties.getModelCompletions());
|
||||
log.info("request: {}", req);
|
||||
String result = HttpUtils.post(llmBackendProperties.getModelCompletions(), null, JSON.toJSONString(req));
|
||||
log.info("response: {}", result);
|
||||
if (StringUtils.isBlank(result)) {
|
||||
return null;
|
||||
}
|
||||
|
@ -3,12 +3,14 @@ package cn.iocoder.yudao.module.llm.service.http.vo;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
public class ModelCompletionsReqVO {
|
||||
|
||||
private String model;
|
||||
|
@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.llm.controller.admin.knowledgebase.vo.KnowledgeBa
|
||||
import cn.iocoder.yudao.module.llm.dal.dataobject.knowledgebase.KnowledgeBaseDO;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 知识库 Service 接口
|
||||
@ -52,4 +53,5 @@ public interface KnowledgeBaseService {
|
||||
*/
|
||||
PageResult<KnowledgeBaseDO> getKnowledgeBasePage(KnowledgeBasePageReqVO pageReqVO);
|
||||
|
||||
List<KnowledgeBaseDO> getKnowledgeBaseList();
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
|
||||
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.KNOWLEDGE_BASE_NOT_EXISTS;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 知识库 Service 实现类
|
||||
@ -68,4 +69,9 @@ public class KnowledgeBaseServiceImpl implements KnowledgeBaseService {
|
||||
return knowledgeBaseMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<KnowledgeBaseDO> getKnowledgeBaseList() {
|
||||
return knowledgeBaseMapper.selectList();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageParam;
|
||||
|
||||
import javax.validation.Valid;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 标签管理 Service 接口
|
||||
@ -52,5 +53,7 @@ public interface LabelService {
|
||||
* @return 标签管理分页
|
||||
*/
|
||||
PageResult<LabelDO> getLabelPage(LabelPageReqVO pageReqVO);
|
||||
// 获取所有标签
|
||||
List<LabelDO> getLabelList();
|
||||
|
||||
}
|
@ -72,4 +72,9 @@ public class LabelServiceImpl implements LabelService {
|
||||
return labelMapper.selectPage(pageReqVO);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<LabelDO> getLabelList() {
|
||||
return labelMapper.selectList();
|
||||
}
|
||||
|
||||
}
|
@ -1,11 +1,17 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
|
||||
public class UserStudentExcelVO {
|
||||
|
||||
@ExcelProperty("登录账号")
|
||||
|
@ -1,11 +1,17 @@
|
||||
package cn.iocoder.yudao.module.system.controller.admin.user.vo.user;
|
||||
|
||||
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
|
||||
import com.alibaba.excel.annotation.ExcelProperty;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
@Data
|
||||
@ExcelIgnoreUnannotated
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
|
||||
public class UserTeacherExcelVO {
|
||||
|
||||
@ExcelProperty("登录账号")
|
||||
|
Loading…
x
Reference in New Issue
Block a user