Merge remote-tracking branch 'xnjz/master'

This commit is contained in:
zhangtao 2024-12-30 21:06:12 +08:00
commit 8c5c26722d
9 changed files with 189 additions and 30 deletions

View File

@ -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, "模板信息不存在");

View File

@ -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<Long> 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<Boolean> 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<Boolean> 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<PromptTemplatesRespVO> 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<PageResult<PromptTemplatesRespVO>> getPromptTemplatesPage(@Valid PromptTemplatesPageReqVO pageReqVO) {
PageResult<PromptTemplatesDO> 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<PromptTemplatesDO> list = promptTemplatesService.getPromptTemplatesPage(pageReqVO).getList();
List<PromptTemplatesRespVO> list = promptTemplatesService.getPromptTemplatesPage(pageReqVO).getList();
List<PromptTemplatesExcelVO> 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);
}
}

View File

@ -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<String> tagIds;
@ExcelProperty("标签")
private String tag;
@ExcelProperty("模板内容")
private String templateText;
@ExcelProperty("使用量")
private int usedCount;
@ExcelProperty("关联应用")
private int applicationCount;
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -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<String> tagIds;
@Schema(description = "应用Id列表", example = "[1, 2, 3]")
private List<String> applicationIds;
@Schema(description = "使用量")
@ExcelProperty("使用量")
private int usedCount;
@Schema(description = "关联应用")
@ExcelProperty("关联应用")
private int applicationCount;
}

View File

@ -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<String> tagIds;
@Schema(description = "应用Id列表", example = "[1, 2, 3]")
private List<String> applicationIds;
}

View File

@ -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<PromptTemplatesDO> getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO);
PageResult<PromptTemplatesRespVO> getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO);
}

View File

@ -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<String> tagIds = createReqVO.getTagIds();
if(tagIds!=null && !tagIds.isEmpty()) {
List<PromptTemplatesTagsDO> tagDOList = tagIds.stream()
.map(p->PromptTemplatesTagsDO.builder()
.tagId(Long.valueOf(p))
.promptTemplateId(promptTemplates.getId())
.build())
.collect(Collectors.toList());
this.promptTemplatesTagsMapper.insertBatch(tagDOList, 1);
}
List<String> applicationIds = createReqVO.getApplicationIds();
if(applicationIds!=null && !applicationIds.isEmpty()) {
List<PromptTemplatesApplicationsDO> 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<String, Object> deleteCondition = new HashMap<>(1);
deleteCondition.put("prompt_template_id", updateReqVO.getId());
this.promptTemplatesTagsMapper.deleteByMap(deleteCondition);
List<String> tagIds = updateReqVO.getTagIds();
if(tagIds!=null && !tagIds.isEmpty()) {
List<PromptTemplatesTagsDO> 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<String> applicationIds = updateReqVO.getApplicationIds();
if(applicationIds!=null && !applicationIds.isEmpty()) {
List<PromptTemplatesApplicationsDO> 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<String, Object> 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<PromptTemplatesDO> templateDOList = this.promptTemplatesMapper.selectList("name", name);
if(templateDOList!=null && templateDOList.size()>0) {
throw exception(PROMPT_TEMPLATES_EXISTS);
}
}
@Override
public PageResult<PromptTemplatesDO> 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<PromptTemplatesTagsDO> tagDOList = this.promptTemplatesTagsMapper
.selectList("prompt_template_id", id);
if(tagDOList!=null && !tagDOList.isEmpty()) {
List<String> tagIds = tagDOList.stream()
.map(p->p.getId().toString())
.collect(Collectors.toList());
promptTemplates.setTagIds(tagIds);
}
List<PromptTemplatesApplicationsDO> applicationDOList = this.promptTemplatesApplicationsMapper
.selectList("prompt_template_id", id);
if(applicationDOList!=null && !applicationDOList.isEmpty()) {
List<String> applicationIds = applicationDOList.stream()
.map(p->p.getId().toString())
.collect(Collectors.toList());
promptTemplates.setApplicationIds(applicationIds);
}
return promptTemplates;
}
@Override
public PageResult<PromptTemplatesRespVO> getPromptTemplatesPage(PromptTemplatesPageReqVO pageReqVO) {
PageResult<PromptTemplatesDO> pageDoList = this.promptTemplatesMapper.selectPage(pageReqVO);
PageResult<PromptTemplatesRespVO> pageRespList = BeanUtils.toBean(pageDoList, PromptTemplatesRespVO.class);
List<PromptTemplatesRespVO> templatesRespList = pageRespList.getList();
for(PromptTemplatesRespVO respVO : templatesRespList) {
// TODO 使用量查询暂时设置为0
respVO.setUsedCount(0);
Long applicationCount = this.promptTemplatesApplicationsMapper.selectCount(
new QueryWrapper<PromptTemplatesApplicationsDO>()
.eq("prompt_template_id", respVO.getId()));
respVO.setApplicationCount(Integer.valueOf(applicationCount.toString()));
}
return pageRespList;
}
}

View File

@ -9,7 +9,7 @@ import lombok.Data;
public class UserStudentExcelVO {
@ExcelProperty("登录账号")
private String userName;
private String username;
@ExcelProperty("学生姓名")
private String nickname;

View File

@ -9,7 +9,7 @@ import lombok.Data;
public class UserTeacherExcelVO {
@ExcelProperty("登录账号")
private String userName;
private String username;
@ExcelProperty("教职工号")
private String userNo;