[update] 标签管理 使用状态从启用变为停用时检查Prompt模版备份是否使用该标签

This commit is contained in:
Liuyang 2025-01-16 11:20:13 +08:00
parent 76e2076be2
commit e0cde07a5e
5 changed files with 105 additions and 45 deletions

View File

@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesbackup.PromptTemplatesBackupDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplatesbackup.vo.*;
import org.apache.ibatis.annotations.Param;
/**
* Prompt模板备份 Mapper
@ -30,4 +31,11 @@ public interface PromptTemplatesBackupMapper extends BaseMapperX<PromptTemplates
.orderByDesc(PromptTemplatesBackupDO::getId));
}
}
/**
* 根据 标签id 获取 模版备份
*
* @param labelId 标签id
* @return 模版备份
*/
List<PromptTemplatesBackupDO> getPromptTemplateBackByLabelId (@Param("labelId") Long labelId);
}

View File

@ -6,10 +6,10 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.llm.controller.admin.label.vo.LabelPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.label.vo.LabelSaveReqVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.label.LabelDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplates.PromptTemplatesDO;
import cn.iocoder.yudao.module.llm.dal.mysql.label.LabelMapper;
import cn.iocoder.yudao.module.llm.service.application.ApplicationService;
import cn.iocoder.yudao.module.llm.service.prompttemplates.PromptTemplatesService;
import cn.iocoder.yudao.module.llm.service.prompttemplatesbackup.PromptTemplatesBackupService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import org.springframework.context.annotation.Lazy;
@ -46,6 +46,10 @@ public class LabelServiceImpl implements LabelService {
@Resource
private PromptTemplatesService promptTemplatesService;
@Lazy
@Resource
private PromptTemplatesBackupService promptTemplatesBackupService;
@Override
public Long createLabel (LabelSaveReqVO createReqVO) {
validateLabelNameExists(createReqVO);
@ -100,7 +104,7 @@ public class LabelServiceImpl implements LabelService {
// 检查标签是否在 Prompt 模版中有使用
validateLabelUsesInPromptTemplate(id, labelName);
// 检查标签是否在 Prompt 模版备份中有使用
// validateLabelUsesInPromptTemplateBackup(id, labelName);
validateLabelUsesInPromptTemplateBackup(id, labelName);
}
/**
@ -131,6 +135,20 @@ public class LabelServiceImpl implements LabelService {
}
}
/**
* 检查标签是否在 Prompt模版备份 有使用
*
* @param id 标签id
* @param name 标签名称
*/
private void validateLabelUsesInPromptTemplateBackup (Long id, String name) {
Map<Long, String> template = promptTemplatesBackupService.getPromptTemplateBackByLabelId(id);
if (CollectionUtils.isNotEmpty(template)) {
String msg = String.format("标签【%s】在 Prompt模版备份 %s 有使用请先取消Prompt模版备份", name, template.values());
throw exception(new ErrorCode(10004_003, msg));
}
}
@Override
public void deleteLabel (Long id) {
// 校验存在

View File

@ -58,4 +58,11 @@ public interface PromptTemplatesBackupService {
void unbackupPromptTemplates(PromptTemplatesBackupSaveReqVO updateReqVO);
/**
* 根据 标签id 获取 模版备份
*
* @param labelId 标签id
* @return 模版备份
*/
Map<Long, String> getPromptTemplateBackByLabelId (Long labelId);
}

View File

@ -1,47 +1,40 @@
package cn.iocoder.yudao.module.llm.service.prompttemplatesbackup;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.AbilityFramework;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.BriefFramework;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.PromptTemplatesRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplates.vo.SampleFramework;
import cn.iocoder.yudao.module.llm.dal.dataobject.application.ApplicationDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.label.LabelDO;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplatesbackup.vo.PromptTemplatesBackupPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplatesbackup.vo.PromptTemplatesBackupRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplatesbackup.vo.PromptTemplatesBackupSaveReqVO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplates.PromptTemplatesDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesapplications.PromptTemplatesApplicationsDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesapplicationsbackup.PromptTemplatesApplicationsBackupDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesbackup.PromptTemplatesBackupDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatestags.PromptTemplatesTagsDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatestagsbackup.PromptTemplatesTagsBackupDO;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplates.PromptTemplatesMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatesapplications.PromptTemplatesApplicationsMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatesapplicationsbackup.PromptTemplatesApplicationsBackupMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatesbackup.PromptTemplatesBackupMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatestags.PromptTemplatesTagsMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatestagsbackup.PromptTemplatesTagsBackupMapper;
import cn.iocoder.yudao.module.llm.service.application.ApplicationService;
import cn.iocoder.yudao.module.llm.service.label.LabelService;
import cn.iocoder.yudao.module.system.api.dict.DictDataApi;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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 javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import cn.iocoder.yudao.module.llm.controller.admin.prompttemplatesbackup.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesbackup.PromptTemplatesBackupDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.llm.dal.mysql.prompttemplatesbackup.PromptTemplatesBackupMapper;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.PROMPT_TEMPLATESBACKUP_EXISTS;
import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.PROMPT_TEMPLATES_BACKUP_NOT_EXISTS;
/**
* Prompt模板备份 Service 实现类
@ -50,7 +43,7 @@ import static cn.iocoder.yudao.module.llm.enums.ErrorCodeConstants.*;
*/
@Service
@Validated
public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupService {
public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupService {
@Resource
private PromptTemplatesMapper promptTemplatesMapper;
@ -72,7 +65,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
private ApplicationService applicationService;
@Override
public Long createPromptTemplatesBackup(PromptTemplatesBackupSaveReqVO createReqVO) {
public Long createPromptTemplatesBackup (PromptTemplatesBackupSaveReqVO createReqVO) {
// 插入
PromptTemplatesBackupDO promptTemplatesBackup = BeanUtils.toBean(createReqVO, PromptTemplatesBackupDO.class);
promptTemplatesBackupMapper.insert(promptTemplatesBackup);
@ -80,7 +73,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
Long srcId = createReqVO.getSrcId();
LambdaQueryWrapper<PromptTemplatesTagsDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PromptTemplatesTagsDO::getPromptTemplateId,srcId);
queryWrapper.eq(PromptTemplatesTagsDO::getPromptTemplateId, srcId);
List<PromptTemplatesTagsDO> promptTemplatesTagsDOS = promptTemplatesTagsMapper.selectList(queryWrapper);
for (PromptTemplatesTagsDO promptTemplatesTagsDO : promptTemplatesTagsDOS) {
PromptTemplatesTagsBackupDO tagsBackupDO = new PromptTemplatesTagsBackupDO();
@ -90,7 +83,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
}
LambdaQueryWrapper<PromptTemplatesApplicationsDO> query = new LambdaQueryWrapper<>();
query.eq(PromptTemplatesApplicationsDO::getPromptTemplateId,srcId);
query.eq(PromptTemplatesApplicationsDO::getPromptTemplateId, srcId);
List<PromptTemplatesApplicationsDO> promptTemplatesApplicationsDOS = promptTemplatesApplicationsMapper.selectList(query);
for (PromptTemplatesApplicationsDO promptTemplatesApplicationsDO : promptTemplatesApplicationsDOS) {
PromptTemplatesApplicationsBackupDO applicationsBackupDO = new PromptTemplatesApplicationsBackupDO();
@ -103,7 +96,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
}
@Override
public void updatePromptTemplatesBackup(PromptTemplatesBackupSaveReqVO updateReqVO) {
public void updatePromptTemplatesBackup (PromptTemplatesBackupSaveReqVO updateReqVO) {
// 校验存在
validatePromptTemplatesBackupExists(updateReqVO.getId());
// 更新
@ -112,30 +105,30 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
}
@Override
public void deletePromptTemplatesBackup(Long id) {
public void deletePromptTemplatesBackup (Long id) {
// 校验存在
validatePromptTemplatesBackupExists(id);
// 删除
promptTemplatesBackupMapper.deleteById(id);
LambdaQueryWrapper<PromptTemplatesTagsBackupDO> wrapper = new LambdaQueryWrapperX<>();
wrapper.eq(PromptTemplatesTagsBackupDO::getPromptTemplateId,id);
wrapper.eq(PromptTemplatesTagsBackupDO::getPromptTemplateId, id);
promptTemplatesTagsBackupMapper.delete(wrapper);
LambdaQueryWrapper<PromptTemplatesApplicationsBackupDO> wrapper1 = new LambdaQueryWrapperX<>();
wrapper1.eq(PromptTemplatesApplicationsBackupDO::getPromptTemplateId,id);
wrapper1.eq(PromptTemplatesApplicationsBackupDO::getPromptTemplateId, id);
promptTemplatesApplicationsBackupMapper.delete(wrapper1);
}
private void validatePromptTemplatesBackupExists(Long id) {
private void validatePromptTemplatesBackupExists (Long id) {
if (promptTemplatesBackupMapper.selectById(id) == null) {
throw exception(PROMPT_TEMPLATES_BACKUP_NOT_EXISTS);
}
}
@Override
public PromptTemplatesBackupRespVO getPromptTemplatesBackup(Long id) {
public PromptTemplatesBackupRespVO getPromptTemplatesBackup (Long id) {
PromptTemplatesBackupDO templatesDO = this.promptTemplatesBackupMapper.selectById(id);
if (templatesDO == null) {
@ -193,7 +186,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
List<PromptTemplatesApplicationsBackupDO> applicationDOList = this.promptTemplatesApplicationsBackupMapper
.selectList("prompt_template_id", id);
Map<Long, String> appMap = applicationService.getApplicatioMap();
Map<Long, String> appMap = applicationService.getApplicatioMap();
if (CollectionUtils.isNotEmpty(applicationDOList)) {
// 过滤 applicationDOList appMap 中不存在的 applicationIds只保留存在的
@ -212,13 +205,13 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
}
@Override
public PageResult<PromptTemplatesBackupRespVO> getPromptTemplatesBackupPage(PromptTemplatesBackupPageReqVO pageReqVO) {
public PageResult<PromptTemplatesBackupRespVO> getPromptTemplatesBackupPage (PromptTemplatesBackupPageReqVO pageReqVO) {
PageResult<PromptTemplatesBackupDO> pageDoList = this.promptTemplatesBackupMapper.selectPage(pageReqVO);
PageResult<PromptTemplatesBackupRespVO> pageRespList = BeanUtils.toBean(pageDoList, PromptTemplatesBackupRespVO.class);
List<PromptTemplatesBackupRespVO> templatesRespList = pageRespList.getList();
for(PromptTemplatesBackupRespVO respVO : templatesRespList) {
for (PromptTemplatesBackupRespVO respVO : templatesRespList) {
// TODO 使用量查询暂时设置为0
respVO.setUsedCount(0);
try {
@ -243,7 +236,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
respVO.setTagNames(labelNameList);
}
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
try {
@ -251,7 +244,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
List<PromptTemplatesApplicationsBackupDO> applicationDOList = this.promptTemplatesApplicationsBackupMapper
.selectList("prompt_template_id", respVO.getId());
Map<Long, String> appMap = applicationService.getApplicatioMap();
Map<Long, String> appMap = applicationService.getApplicatioMap();
if (CollectionUtils.isNotEmpty(applicationDOList)) {
// 过滤 applicationDOList appMap 中不存在的 applicationIds只保留存在的
@ -267,7 +260,7 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
.collect(Collectors.toList());
respVO.setApplicationNames(appNameList);
}
} catch(Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
}
@ -275,24 +268,24 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
}
@Override
public void isBackup(Long srcId) {
public void isBackup (Long srcId) {
List<PromptTemplatesBackupDO> templateBackupDOList = this.promptTemplatesBackupMapper.selectList("src_id", srcId);
if(templateBackupDOList!=null && !templateBackupDOList.isEmpty()) {
if (templateBackupDOList != null && !templateBackupDOList.isEmpty()) {
throw exception(PROMPT_TEMPLATESBACKUP_EXISTS);
}
}
@Override
public PromptTemplatesBackupDO getPromptTemplatesBackupBySrcId(Long srcId) {
public PromptTemplatesBackupDO getPromptTemplatesBackupBySrcId (Long srcId) {
List<PromptTemplatesBackupDO> templateBackupDOList = this.promptTemplatesBackupMapper.selectList("src_id", srcId);
if(templateBackupDOList==null || templateBackupDOList.isEmpty()) {
if (templateBackupDOList == null || templateBackupDOList.isEmpty()) {
return null;
}
return templateBackupDOList.get(0);
}
@Override
public void unbackupPromptTemplates(PromptTemplatesBackupSaveReqVO updateReqVO) {
public void unbackupPromptTemplates (PromptTemplatesBackupSaveReqVO updateReqVO) {
Long srcId = updateReqVO.getSrcId();
PromptTemplatesDO promptTemplatesDO = new PromptTemplatesDO();
promptTemplatesDO.setId(srcId);
@ -304,4 +297,24 @@ public class PromptTemplatesBackupServiceImpl implements PromptTemplatesBackupSe
}
/**
* 根据 标签id 获取 模版备份
*
* @param labelId 标签id
* @return 模版备份
*/
@Override
public Map<Long, String> getPromptTemplateBackByLabelId (Long labelId) {
if (labelId == null) {
return Collections.emptyMap();
}
List<PromptTemplatesBackupDO> templatesDO = this.promptTemplatesBackupMapper.getPromptTemplateBackByLabelId(labelId);
if (CollectionUtils.isEmpty(templatesDO)) {
return Collections.emptyMap();
}
return templatesDO.stream().collect(Collectors.toMap(PromptTemplatesBackupDO::getId, PromptTemplatesBackupDO::getName));
}
}

View File

@ -9,4 +9,18 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>
<!-- 根据 标签id 获取 模版备份 -->
<select id="getPromptTemplateBackByLabelId"
resultType="cn.iocoder.yudao.module.llm.dal.dataobject.prompttemplatesbackup.PromptTemplatesBackupDO">
SELECT
lptb.id,
lptb.name
FROM
llm_prompt_templates_backup lptb
LEFT JOIN llm_prompt_templates_tags_backup lpttb ON lptb.id = lpttb.prompt_template_id
WHERE
lpttb.tag_id = 28
AND lptb.deleted = FALSE
AND lpttb.deleted = FALSE
</select>
</mapper>