diff --git a/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java b/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java index 190a08d69..fb622efdc 100644 --- a/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java +++ b/yudao-module-llm/yudao-module-llm-api/src/main/java/cn/iocoder/yudao/module/llm/enums/ErrorCodeConstants.java @@ -39,7 +39,9 @@ public interface ErrorCodeConstants { */ - ErrorCode PROMPT_TEMPLATES_NOT_EXISTS = new ErrorCode(10016, "模板信息不存在"); + ErrorCode PROMPT_TEMPLATES_NOT_EXISTS = new ErrorCode(100_1000, "模板信息不存在"); + + ErrorCode PROMPT_TEMPLATES_EXISTS = new ErrorCode(100_1001, "模板信息已存在"); ErrorCode PROMPT_TEMPLATES_APPLICATIONS_NOT_EXISTS = new ErrorCode(10017, "模板信息不存在"); diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/PromptTemplatesController.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/PromptTemplatesController.java index ed28006fe..eb2a6934b 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/PromptTemplatesController.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/PromptTemplatesController.java @@ -29,7 +29,7 @@ import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.*; import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplates.PromptTemplatesDO; import cn.iocoder.yudao.module.llm.service.prompttemplates.PromptTemplatesService; -@Tag(name = "管理后台 - Prompt 模板表,用于记录每个模板的信息") +@Tag(name = "管理后台 - Prompt模板") @RestController @RequestMapping("/llm/prompt-templates") @Validated @@ -39,14 +39,14 @@ public class PromptTemplatesController { private PromptTemplatesService promptTemplatesService; @PostMapping("/create") - @Operation(summary = "创建Prompt 模板表,用于记录每个模板的信息") + @Operation(summary = "创建Prompt模板") @PreAuthorize("@ss.hasPermission('llm:prompt-templates:create')") public CommonResult createPromptTemplates(@Valid @RequestBody PromptTemplatesSaveReqVO createReqVO) { return success(promptTemplatesService.createPromptTemplates(createReqVO)); } @PutMapping("/update") - @Operation(summary = "更新Prompt 模板表,用于记录每个模板的信息") + @Operation(summary = "更新Prompt模板") @PreAuthorize("@ss.hasPermission('llm:prompt-templates:update')") public CommonResult updatePromptTemplates(@Valid @RequestBody PromptTemplatesSaveReqVO updateReqVO) { promptTemplatesService.updatePromptTemplates(updateReqVO); @@ -54,7 +54,7 @@ public class PromptTemplatesController { } @DeleteMapping("/delete") - @Operation(summary = "删除Prompt 模板表,用于记录每个模板的信息") + @Operation(summary = "删除Prompt模板") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('llm:prompt-templates:delete')") public CommonResult deletePromptTemplates(@RequestParam("id") Long id) { @@ -63,33 +63,37 @@ public class PromptTemplatesController { } @GetMapping("/get") - @Operation(summary = "获得Prompt 模板表,用于记录每个模板的信息") + @Operation(summary = "Prompt模板详情") @Parameter(name = "id", description = "编号", required = true, example = "1024") @PreAuthorize("@ss.hasPermission('llm:prompt-templates:query')") public CommonResult getPromptTemplates(@RequestParam("id") Long id) { - PromptTemplatesDO promptTemplates = promptTemplatesService.getPromptTemplates(id); - return success(BeanUtils.toBean(promptTemplates, PromptTemplatesRespVO.class)); + return success(promptTemplatesService.getPromptTemplates(id)); } @GetMapping("/page") - @Operation(summary = "获得Prompt 模板表,用于记录每个模板的信息分页") + @Operation(summary = "分页查询Prompt模板") @PreAuthorize("@ss.hasPermission('llm:prompt-templates:query')") public CommonResult> getPromptTemplatesPage(@Valid PromptTemplatesPageReqVO pageReqVO) { - PageResult pageResult = promptTemplatesService.getPromptTemplatesPage(pageReqVO); - return success(BeanUtils.toBean(pageResult, PromptTemplatesRespVO.class)); + return success(promptTemplatesService.getPromptTemplatesPage(pageReqVO)); } @GetMapping("/export-excel") - @Operation(summary = "导出Prompt 模板表,用于记录每个模板的信息 Excel") + @Operation(summary = "导出Prompt模板") @PreAuthorize("@ss.hasPermission('llm:prompt-templates:export')") @ApiAccessLog(operateType = EXPORT) public void exportPromptTemplatesExcel(@Valid PromptTemplatesPageReqVO pageReqVO, HttpServletResponse response) throws IOException { pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = promptTemplatesService.getPromptTemplatesPage(pageReqVO).getList(); + List list = promptTemplatesService.getPromptTemplatesPage(pageReqVO).getList(); + List excelList = BeanUtils.toBean(list, PromptTemplatesExcelVO.class); + for(PromptTemplatesExcelVO excelVO : excelList){ + // TODO 从字典模块查询 + excelVO.setTemplateCategoryDisplay(""); + excelVO.setTag(""); + } // 导出 Excel - ExcelUtils.write(response, "Prompt 模板表,用于记录每个模板的信息.xls", "数据", PromptTemplatesRespVO.class, - BeanUtils.toBean(list, PromptTemplatesRespVO.class)); + ExcelUtils.write(response, "Prompt模板信息.xls", "数据", + PromptTemplatesExcelVO.class, excelList); } } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesExcelVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesExcelVO.java new file mode 100644 index 000000000..0cbccc7a6 --- /dev/null +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesExcelVO.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.List; + +@Data +@ExcelIgnoreUnannotated +public class PromptTemplatesExcelVO { + @ExcelProperty("模板名称") + private String name; + + private Integer templateCategory; + + @ExcelProperty("模板分类") + private String templateCategoryDisplay; + + private List tagIds; + + @ExcelProperty("标签") + private String tag; + + @ExcelProperty("模板内容") + private String templateText; + + @ExcelProperty("使用量") + private int usedCount; + + @ExcelProperty("关联应用") + private int applicationCount; + + @ExcelProperty("创建时间") + private LocalDateTime createTime; +} \ No newline at end of file diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesRespVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesRespVO.java index 2a740b280..e855243ec 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesRespVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesRespVO.java @@ -13,19 +13,17 @@ import com.alibaba.excel.annotation.*; public class PromptTemplatesRespVO { @Schema(description = "Prompt 模板ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20922") - @ExcelProperty("Prompt 模板ID") private Long id; @Schema(description = "Prompt 模板名称", example = "王五") - @ExcelProperty("Prompt 模板名称") + @ExcelProperty("模板名称") private String name; @Schema(description = "模板分类,使用字典(llm_prompt_template_category)") - @ExcelProperty("模板分类,使用字典(llm_prompt_template_category)") + @ExcelProperty("模板分类") private Integer templateCategory; @Schema(description = "模板框架,使用字典(llm_prompt_template_framework)") - @ExcelProperty("模板框架,使用字典(llm_prompt_template_framework)") private Integer templateFramework; @Schema(description = "模板内容") @@ -33,15 +31,27 @@ public class PromptTemplatesRespVO { private String templateText; @Schema(description = "变量标识符,使用字典(llm_variable_identifier)") - @ExcelProperty("变量标识符,使用字典(llm_variable_identifier)") private Integer variableIdentifier; @Schema(description = "模板类型(1 - 预制模板、2 - 自定义模板)", example = "1") - @ExcelProperty("模板类型(1 - 预制模板、2 - 自定义模板)") private Integer templateType; @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) @ExcelProperty("创建时间") private LocalDateTime createTime; + @Schema(description = "标签Id列表", example = "[1, 2, 3]") + private List tagIds; + + @Schema(description = "应用Id列表", example = "[1, 2, 3]") + private List applicationIds; + + @Schema(description = "使用量") + @ExcelProperty("使用量") + private int usedCount; + + @Schema(description = "关联应用") + @ExcelProperty("关联应用") + private int applicationCount; + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesSaveReqVO.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesSaveReqVO.java index 3ce00a852..296801586 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesSaveReqVO.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/controller/admin/prompttemplates/vo/PromptTemplatesSaveReqVO.java @@ -30,4 +30,10 @@ public class PromptTemplatesSaveReqVO { @Schema(description = "模板类型(1 - 预制模板、2 - 自定义模板)", example = "1") private Integer templateType; + @Schema(description = "标签Id列表", example = "[1, 2, 3]") + private List tagIds; + + @Schema(description = "应用Id列表", example = "[1, 2, 3]") + private List applicationIds; + } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesService.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesService.java index 913258977..67b1c920f 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesService.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesService.java @@ -42,7 +42,7 @@ public interface PromptTemplatesService { * @param id 编号 * @return Prompt 模板表,用于记录每个模板的信息 */ - PromptTemplatesDO getPromptTemplates(Long id); + PromptTemplatesRespVO getPromptTemplates(Long id); /** * 获得Prompt 模板表,用于记录每个模板的信息分页 @@ -50,6 +50,6 @@ public interface PromptTemplatesService { * @param pageReqVO 分页查询 * @return Prompt 模板表,用于记录每个模板的信息分页 */ - PageResult getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO); + PageResult getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO); } diff --git a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java index 85873f0aa..b540cba93 100644 --- a/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java +++ b/yudao-module-llm/yudao-module-llm-biz/src/main/java/cn/iocoder/yudao/module/llm/service/prompttemplates/PromptTemplatesServiceImpl.java @@ -1,11 +1,18 @@ package cn.iocoder.yudao.module.llm.service.prompttemplates; +import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesapplications.PromptTemplatesApplicationsDO; +import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatestags.PromptTemplatesTagsDO; +import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatesapplications.PromptTemplatesApplicationsMapper; +import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatestags.PromptTemplatesTagsMapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.prompttemplates.vo.*; import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplates.PromptTemplatesDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; @@ -28,12 +35,38 @@ public class PromptTemplatesServiceImpl implements PromptTemplatesService { @Resource private PromptTemplatesMapper promptTemplatesMapper; + @Resource + private PromptTemplatesTagsMapper promptTemplatesTagsMapper; + @Resource + private PromptTemplatesApplicationsMapper promptTemplatesApplicationsMapper; @Override public Long createPromptTemplates(PromptTemplatesSaveReqVO createReqVO) { + this.isNameDuplicate(createReqVO.getName()); // 插入 PromptTemplatesDO promptTemplates = BeanUtils.toBean(createReqVO, PromptTemplatesDO.class); + promptTemplates.setTemplateType(2); promptTemplatesMapper.insert(promptTemplates); + List tagIds = createReqVO.getTagIds(); + if(tagIds!=null && !tagIds.isEmpty()) { + List tagDOList = tagIds.stream() + .map(p->PromptTemplatesTagsDO.builder() + .tagId(Long.valueOf(p)) + .promptTemplateId(promptTemplates.getId()) + .build()) + .collect(Collectors.toList()); + this.promptTemplatesTagsMapper.insertBatch(tagDOList, 1); + } + List applicationIds = createReqVO.getApplicationIds(); + if(applicationIds!=null && !applicationIds.isEmpty()) { + List applicationDOList = applicationIds.stream() + .map(p->PromptTemplatesApplicationsDO.builder() + .applicationId(Long.valueOf(p)) + .promptTemplateId(promptTemplates.getId()) + .build()) + .collect(Collectors.toList()); + this.promptTemplatesApplicationsMapper.insertBatch(applicationDOList, 1); + } // 返回 return promptTemplates.getId(); } @@ -45,6 +78,30 @@ public class PromptTemplatesServiceImpl implements PromptTemplatesService { // 更新 PromptTemplatesDO updateObj = BeanUtils.toBean(updateReqVO, PromptTemplatesDO.class); promptTemplatesMapper.updateById(updateObj); + Map deleteCondition = new HashMap<>(1); + deleteCondition.put("prompt_template_id", updateReqVO.getId()); + this.promptTemplatesTagsMapper.deleteByMap(deleteCondition); + List tagIds = updateReqVO.getTagIds(); + if(tagIds!=null && !tagIds.isEmpty()) { + List tagDOList = tagIds.stream() + .map(p->PromptTemplatesTagsDO.builder() + .tagId(Long.valueOf(p)) + .promptTemplateId(updateReqVO.getId()) + .build()) + .collect(Collectors.toList()); + this.promptTemplatesTagsMapper.insertBatch(tagDOList, 1); + } + this.promptTemplatesApplicationsMapper.deleteByMap(deleteCondition); + List applicationIds = updateReqVO.getApplicationIds(); + if(applicationIds!=null && !applicationIds.isEmpty()) { + List applicationDOList = applicationIds.stream() + .map(p->PromptTemplatesApplicationsDO.builder() + .applicationId(Long.valueOf(p)) + .promptTemplateId(updateReqVO.getId()) + .build()) + .collect(Collectors.toList()); + this.promptTemplatesApplicationsMapper.insertBatch(applicationDOList, 1); + } } @Override @@ -53,6 +110,10 @@ public class PromptTemplatesServiceImpl implements PromptTemplatesService { validatePromptTemplatesExists(id); // 删除 promptTemplatesMapper.deleteById(id); + Map condition = new HashMap<>(1); + condition.put("prompt_template_id", id); + this.promptTemplatesTagsMapper.deleteByMap(condition); + this.promptTemplatesApplicationsMapper.deleteByMap(condition); } private void validatePromptTemplatesExists(Long id) { @@ -61,14 +122,53 @@ public class PromptTemplatesServiceImpl implements PromptTemplatesService { } } - @Override - public PromptTemplatesDO getPromptTemplates(Long id) { - return promptTemplatesMapper.selectById(id); + private void isNameDuplicate(String name) { + List templateDOList = this.promptTemplatesMapper.selectList("name", name); + if(templateDOList!=null && templateDOList.size()>0) { + throw exception(PROMPT_TEMPLATES_EXISTS); + } } @Override - public PageResult getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO) { - return promptTemplatesMapper.selectPage(pageReqVO); + public PromptTemplatesRespVO getPromptTemplates(Long id) { + PromptTemplatesDO templatesDO = this.promptTemplatesMapper.selectById(id); + if(templatesDO == null) { + return null; + } + PromptTemplatesRespVO promptTemplates = BeanUtils.toBean(templatesDO, PromptTemplatesRespVO.class); + List tagDOList = this.promptTemplatesTagsMapper + .selectList("prompt_template_id", id); + if(tagDOList!=null && !tagDOList.isEmpty()) { + List tagIds = tagDOList.stream() + .map(p->p.getId().toString()) + .collect(Collectors.toList()); + promptTemplates.setTagIds(tagIds); + } + List applicationDOList = this.promptTemplatesApplicationsMapper + .selectList("prompt_template_id", id); + if(applicationDOList!=null && !applicationDOList.isEmpty()) { + List applicationIds = applicationDOList.stream() + .map(p->p.getId().toString()) + .collect(Collectors.toList()); + promptTemplates.setApplicationIds(applicationIds); + } + return promptTemplates; + } + + @Override + public PageResult getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO) { + PageResult pageDoList = this.promptTemplatesMapper.selectPage(pageReqVO); + PageResult pageRespList = BeanUtils.toBean(pageDoList, PromptTemplatesRespVO.class); + List templatesRespList = pageRespList.getList(); + for(PromptTemplatesRespVO respVO : templatesRespList) { + // TODO 使用量查询暂时设置为0 + respVO.setUsedCount(0); + Long applicationCount = this.promptTemplatesApplicationsMapper.selectCount( + new QueryWrapper() + .eq("prompt_template_id", respVO.getId())); + respVO.setApplicationCount(Integer.valueOf(applicationCount.toString())); + } + return pageRespList; } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java index a83c33c71..bd8f24b05 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserStudentExcelVO.java @@ -9,7 +9,7 @@ import lombok.Data; public class UserStudentExcelVO { @ExcelProperty("登录账号") - private String userName; + private String username; @ExcelProperty("学生姓名") private String nickname; diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java index 7e49aaa02..4a3986fb1 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserTeacherExcelVO.java @@ -9,7 +9,7 @@ import lombok.Data; public class UserTeacherExcelVO { @ExcelProperty("登录账号") - private String userName; + private String username; @ExcelProperty("教职工号") private String userNo;