package com.vincent.rsf.server.system.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.vincent.rsf.server.system.entity.AiPromptTemplate; import com.vincent.rsf.server.system.mapper.AiPromptTemplateMapper; import com.vincent.rsf.server.system.service.AiPromptPublishLogService; import com.vincent.rsf.server.system.service.AiPromptTemplateService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Date; import java.util.List; @Service("aiPromptTemplateService") public class AiPromptTemplateServiceImpl extends ServiceImpl implements AiPromptTemplateService { @Resource private AiPromptPublishLogService aiPromptPublishLogService; @Override public AiPromptTemplate getTenantTemplate(Long tenantId, Long id) { if (tenantId == null || id == null) { return null; } return this.getOne(new LambdaQueryWrapper() .eq(AiPromptTemplate::getTenantId, tenantId) .eq(AiPromptTemplate::getId, id) .last("limit 1")); } @Override public AiPromptTemplate getPublishedTemplate(Long tenantId, String sceneCode) { return this.getOne(new LambdaQueryWrapper() .eq(AiPromptTemplate::getTenantId, tenantId) .eq(AiPromptTemplate::getSceneCode, sceneCode) .eq(AiPromptTemplate::getPublishedFlag, 1) .eq(AiPromptTemplate::getStatus, 1) .orderByDesc(AiPromptTemplate::getVersionNo, AiPromptTemplate::getId) .last("limit 1")); } @Override public List listVersions(Long tenantId, String sceneCode) { return this.list(new LambdaQueryWrapper() .eq(AiPromptTemplate::getTenantId, tenantId) .eq(AiPromptTemplate::getSceneCode, sceneCode) .orderByDesc(AiPromptTemplate::getVersionNo, AiPromptTemplate::getId)); } @Override public boolean publishTemplate(Long tenantId, Long id, Long userId) { AiPromptTemplate target = getTenantTemplate(tenantId, id); if (target == null) { return false; } boolean updated = switchPublishedTemplate(tenantId, userId, target); if (updated) { aiPromptPublishLogService.saveLog(tenantId, userId, target, "publish", "发布 Prompt 版本"); } return updated; } @Override public boolean rollbackTemplate(Long tenantId, Long id, Long userId) { AiPromptTemplate target = getTenantTemplate(tenantId, id); if (target == null) { return false; } boolean updated = switchPublishedTemplate(tenantId, userId, target); if (updated) { aiPromptPublishLogService.saveLog(tenantId, userId, target, "rollback", "回滚到指定 Prompt 版本"); } return updated; } private boolean switchPublishedTemplate(Long tenantId, Long userId, AiPromptTemplate target) { this.update(new LambdaUpdateWrapper() .set(AiPromptTemplate::getPublishedFlag, 0) .eq(AiPromptTemplate::getTenantId, tenantId) .eq(AiPromptTemplate::getSceneCode, target.getSceneCode()) .eq(AiPromptTemplate::getPublishedFlag, 1)); target.setPublishedFlag(1); target.setUpdateBy(userId); target.setUpdateTime(new Date()); return this.updateById(target); } @Override public int nextVersionNo(Long tenantId, String sceneCode) { AiPromptTemplate latest = this.getOne(new LambdaQueryWrapper() .eq(AiPromptTemplate::getTenantId, tenantId) .eq(AiPromptTemplate::getSceneCode, sceneCode) .orderByDesc(AiPromptTemplate::getVersionNo, AiPromptTemplate::getId) .last("limit 1")); return latest == null || latest.getVersionNo() == null ? 1 : latest.getVersionNo() + 1; } @Override public AiPromptTemplate copyTemplate(Long tenantId, Long id, Long userId) { AiPromptTemplate source = getTenantTemplate(tenantId, id); if (source == null) { return null; } Date now = new Date(); AiPromptTemplate copied = new AiPromptTemplate() .setUuid(String.valueOf(System.currentTimeMillis())) .setSceneCode(source.getSceneCode()) .setTemplateName((source.getTemplateName() == null ? source.getSceneCode() : source.getTemplateName()) + "-副本") .setBasePrompt(source.getBasePrompt()) .setToolPrompt(source.getToolPrompt()) .setOutputPrompt(source.getOutputPrompt()) .setVersionNo(nextVersionNo(tenantId, source.getSceneCode())) .setPublishedFlag(0) .setStatus(source.getStatus()) .setDeleted(0) .setTenantId(tenantId) .setCreateBy(userId) .setCreateTime(now) .setUpdateBy(userId) .setUpdateTime(now) .setMemo(source.getMemo()); if (!this.save(copied)) { return null; } aiPromptPublishLogService.saveLog(tenantId, userId, copied, "copy", "复制 Prompt 版本为新草稿"); return copied; } }