package org.ruoyi.system.service.impl;
|
|
import cn.dev33.satoken.exception.NotLoginException;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.math.NumberUtils;
|
import org.ruoyi.common.core.constant.Constants;
|
import org.ruoyi.common.core.domain.model.LoginUser;
|
import org.ruoyi.common.core.service.ConfigService;
|
import org.ruoyi.common.redis.utils.RedisUtils;
|
import org.ruoyi.common.satoken.utils.LoginHelper;
|
import org.ruoyi.system.cofing.OkHttpConfig;
|
import org.ruoyi.system.domain.vo.ppt.*;
|
import org.ruoyi.system.service.IPptService;
|
import org.ruoyi.system.util.HttpUtils;
|
import org.ruoyi.system.util.WddPptApi;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
|
|
import javax.swing.filechooser.FileSystemView;
|
import java.io.File;
|
import java.time.Duration;
|
|
/**
|
* AI-PPTService业务层处理
|
*
|
* @author NSL
|
* @since 2024-12-30
|
*/
|
@RequiredArgsConstructor
|
@Service
|
@Slf4j
|
public class PptServiceImpl implements IPptService {
|
|
private final OkHttpConfig okHttpConfig;
|
private final ConfigService configService;
|
private final IChatCostService chatCostService;
|
|
@Override
|
public void syncStreamGeneratePpt(String title) {
|
// 创建 api token (有效期2小时,同一个 uid 创建时之前的 token 会在10秒内失效)
|
String apiToken = getApiToken();
|
// 生成大纲
|
System.out.println("\n\n========== 正在生成大纲 ==========");
|
String outline = WddPptApi.generateOutline(apiToken, title, null, null);
|
|
// 生成大纲内容
|
System.out.println("\n\n========== 正在生成大纲内容 ==========");
|
String markdown = WddPptApi.generateContent(apiToken, outline, null, null);
|
|
// 随机一个模板
|
System.out.println("\n\n========== 随机选择模板 ==========");
|
String templateId = WddPptApi.randomOneTemplateId(apiToken);
|
System.out.println(templateId);
|
|
// 生成PPT
|
System.out.println("\n\n========== 正在生成PPT ==========");
|
JSONObject pptInfo = WddPptApi.generatePptx(apiToken, templateId, markdown, false);
|
String pptId = pptInfo.getString("id");
|
System.out.println("pptId: " + pptId);
|
System.out.println("ppt主题:" + pptInfo.getString("subject"));
|
System.out.println("ppt封面:" + pptInfo.getString("coverUrl") + "?token=" + apiToken);
|
|
// 下载PPT到桌面
|
System.out.println("\n\n========== 正在下载PPT ==========");
|
JSONObject result = WddPptApi.downloadPptx(apiToken, pptId);
|
String url = result.getString("fileUrl");
|
System.out.println("ppt链接:" + url);
|
String savePath = FileSystemView.getFileSystemView().getHomeDirectory().getAbsolutePath() + File.separator + pptId + ".pptx";
|
try {
|
HttpUtils.download(url, new File(savePath));
|
} catch (Exception e) {
|
|
}
|
System.out.println("ppt下载完成,保存路径:" + savePath);
|
}
|
|
@Override
|
public void selectPptList(PptAllQueryDto pptQueryVo) {
|
String apiToken = getApiToken();
|
// todo 无权限访问
|
JSONObject jsonObject = WddPptApi.listAllPptx(apiToken, JSONUtil.toJsonStr(pptQueryVo));
|
System.out.println(jsonObject);
|
}
|
|
@Override
|
public JSONObject getPptTemplates(PptTemplateQueryDto pptQueryVo) {
|
return WddPptApi.getPptTemplates(getApiToken(), JSONUtil.toJsonStr(pptQueryVo));
|
}
|
|
@Override
|
public SseEmitter generateOutline(PptGenerateOutlineDto generateOutlineDto) {
|
return WddPptApi.sseGenerateOutline(getApiToken(), generateOutlineDto.getSubject(), generateOutlineDto.getDataUrl(), generateOutlineDto.getPrompt());
|
}
|
|
@Override
|
public SseEmitter generateContent(PptGenerateContentDto generateContentDto) {
|
return WddPptApi.sseGenerateContent(getApiToken(), generateContentDto.getOutlineMarkdown(), generateContentDto.getDataUrl(), generateContentDto.getPrompt());
|
}
|
|
@Override
|
public JSONObject generatePptx(PptGeneratePptxDto generatePptxDto) {
|
return WddPptApi.generatePptx(getApiToken(), generatePptxDto.getTemplateId(), generatePptxDto.getOutlineContentMarkdown(), generatePptxDto.isPptxProperty());
|
}
|
|
public String getKey(String key) {
|
return configService.getConfigValue("ppt", key);
|
}
|
|
@Override
|
public String getApiToken() {
|
LoginUser loginUser = null;
|
try {
|
loginUser = LoginHelper.getLoginUser();
|
} catch (Exception e) {
|
throw new NotLoginException(NotLoginException.NOT_TOKEN_MESSAGE, NotLoginException.NOT_TOKEN, NotLoginException.NOT_TOKEN);
|
}
|
String userId = String.valueOf(loginUser.getUserId());
|
// 创建 api token (有效期2小时,同一个 uid 创建时之前的 token 会在10秒内失效)
|
String apiToken = RedisUtils.getCacheObject(Constants.WDD_TOKEN_KEY + userId);
|
if (StrUtil.isEmpty(apiToken)) {
|
apiToken = WddPptApi.createApiToken(getKey("apiKey"), userId, null);
|
RedisUtils.setCacheObject(Constants.WDD_TOKEN_KEY, apiToken, Duration.ofMinutes(Constants.WDD_TOKEN_EXPIRATION));
|
}
|
return apiToken;
|
}
|
|
@Override
|
public void successCallback() {
|
// 扣费
|
chatCostService.taskDeduct("ppt", "AI-PPT", NumberUtils.toDouble(okHttpConfig.getGenerate(), 1.1));
|
}
|
}
|