2025-04-03 13:33:56 +08:00
|
|
|
|
package spark
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
2025-04-03 16:13:22 +08:00
|
|
|
|
"StuAcaWorksAI/dao"
|
2025-04-03 13:33:56 +08:00
|
|
|
|
"StuAcaWorksAI/proto"
|
2025-04-03 14:14:02 +08:00
|
|
|
|
"StuAcaWorksAI/service"
|
2025-04-03 13:33:56 +08:00
|
|
|
|
"StuAcaWorksAI/worker"
|
|
|
|
|
|
"encoding/json"
|
2025-04-03 16:13:22 +08:00
|
|
|
|
"errors"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"io"
|
2025-04-03 13:33:56 +08:00
|
|
|
|
"log"
|
2025-04-03 16:13:22 +08:00
|
|
|
|
"net/http"
|
|
|
|
|
|
"os"
|
2025-04-03 13:33:56 +08:00
|
|
|
|
"strconv"
|
2025-04-03 16:13:22 +08:00
|
|
|
|
"strings"
|
2025-04-03 13:33:56 +08:00
|
|
|
|
"time"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2025-04-03 20:13:53 +08:00
|
|
|
|
func SparkPPTThemeList(model *proto.ModelParam, req proto.GetSparkPPTThemeReq) (proto.SparkPPTThemeListResponse, error) {
|
2025-04-03 13:33:56 +08:00
|
|
|
|
url := "https://zwapi.xfyun.cn/api/ppt/v2/template/list"
|
|
|
|
|
|
headers, err := getSparkRequestHeaders(model.APPID, model.APISecret)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark PPT Theme Error getting headers:", err)
|
2025-04-03 20:13:53 +08:00
|
|
|
|
return proto.SparkPPTThemeListResponse{}, err
|
2025-04-03 13:33:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
//log.Println("Spark PPT Theme headers:", headers)
|
|
|
|
|
|
|
|
|
|
|
|
req_ := proto.PPTThemeRequest{
|
|
|
|
|
|
Style: req.Style,
|
|
|
|
|
|
Color: req.Color,
|
|
|
|
|
|
Industry: req.Industry,
|
|
|
|
|
|
PageNum: 1,
|
|
|
|
|
|
PageSize: 10,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
reqStr, err := json.Marshal(req_)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark PPT Theme Error encoding request:", err)
|
2025-04-03 20:13:53 +08:00
|
|
|
|
return proto.SparkPPTThemeListResponse{}, err
|
2025-04-03 13:33:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark PPT Theme req:", string(reqStr))
|
|
|
|
|
|
|
|
|
|
|
|
err, resp := worker.DoPostRequestJSON(url, reqStr, headers)
|
2025-04-03 20:13:53 +08:00
|
|
|
|
var response proto.SparkPPTThemeListResponse
|
2025-04-03 13:33:56 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark PPT Theme Error:", err)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
err = json.Unmarshal(resp, &response)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark PPT Theme Error decoding response:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark PPT Theme Response:", string(resp))
|
|
|
|
|
|
//log.Println("Spark PPT Theme Response:", response)
|
|
|
|
|
|
return response, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func getSparkRequestHeaders(appId, apiSecret string) (map[string]string, error) {
|
|
|
|
|
|
headers := map[string]string{
|
|
|
|
|
|
"appId": "d3a4647c",
|
|
|
|
|
|
"timestamp": strconv.FormatInt(time.Now().Unix(), 10),
|
|
|
|
|
|
}
|
|
|
|
|
|
algorithm := ApiAuthAlgorithm{}
|
|
|
|
|
|
signature := algorithm.GetSignature(appId, apiSecret, time.Now().Unix())
|
|
|
|
|
|
headers["signature"] = signature
|
|
|
|
|
|
return headers, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 根据用户输入及文档生成大纲,文档可以是docx、doc、txt、pdf格式
|
|
|
|
|
|
func SparkCreateOutlineByDoc(model *proto.ModelParam, userReq *proto.SparkCreateOutlineRequest) (proto.SparkCreateOutlineResponse, error) {
|
|
|
|
|
|
url := "https://zwapi.xfyun.cn/api/ppt/v2/createOutlineByDoc"
|
|
|
|
|
|
headers, err := getSparkRequestHeaders(model.APPID, model.APISecret)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark PPT Theme Error getting headers:", err)
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create outline by doc headers:", headers)
|
|
|
|
|
|
|
|
|
|
|
|
req := proto.SparkCreateOutlineByDocRequest{
|
|
|
|
|
|
Query: userReq.Query,
|
|
|
|
|
|
FileUrl: userReq.FileUrl,
|
|
|
|
|
|
FileName: userReq.FileName,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
reqStr, err := json.Marshal(req)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create outline by doc Error encoding request:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create outline by doc req:", string(reqStr))
|
|
|
|
|
|
|
|
|
|
|
|
err, resp := worker.DoPostRequestForm(url, reqStr, headers)
|
|
|
|
|
|
//log.Println("Spark create outline by doc Response:", string(resp))
|
|
|
|
|
|
var response proto.SparkCreateOutlineResponse
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create outline by doc Error:", err)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
err = json.Unmarshal(resp, &response)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create outline by doc Error decoding response:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create outline by doc Response struct:", response)
|
|
|
|
|
|
return response, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 根据query生成大纲
|
|
|
|
|
|
func SparkCreateOutline(model *proto.ModelParam, userReq *proto.SparkCreateOutlineRequest) (proto.SparkCreateOutlineResponse, error) {
|
|
|
|
|
|
url := "https://zwapi.xfyun.cn/api/ppt/v2/createOutline"
|
|
|
|
|
|
headers, err := getSparkRequestHeaders(model.APPID, model.APISecret)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark PPT Theme Error getting headers:", err)
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create outline by doc headers:", headers)
|
|
|
|
|
|
|
|
|
|
|
|
//自定义内容
|
|
|
|
|
|
req := proto.SparkCreateOutlineByDocRequest{
|
|
|
|
|
|
Query: userReq.Query,
|
|
|
|
|
|
}
|
|
|
|
|
|
reqStr, err := json.Marshal(req)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create PPT Error encoding request:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create PPT req:", string(reqStr))
|
|
|
|
|
|
|
|
|
|
|
|
err, resp := worker.DoPostRequestForm(url, reqStr, headers)
|
|
|
|
|
|
log.Println("Spark create PPT Response:", string(resp))
|
|
|
|
|
|
var response proto.SparkCreateOutlineResponse
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create PPT Error:", err)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
err = json.Unmarshal(resp, &response)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create PPT Error decoding response:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create PPT Response struct:", response)
|
|
|
|
|
|
return response, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-04-03 16:13:22 +08:00
|
|
|
|
func SparkCreatePPTByOutline(model *proto.ModelParam, userReq *proto.SparkCreatePPTByOutlineUserRequest) (proto.SparkCreatePPTResponse, error) {
|
2025-04-03 13:33:56 +08:00
|
|
|
|
url := "https://zwapi.xfyun.cn/api/ppt/v2/createPptByOutline"
|
|
|
|
|
|
headers, err := getSparkRequestHeaders(model.APPID, model.APISecret)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error encoding request:", err)
|
2025-04-03 16:13:22 +08:00
|
|
|
|
return proto.SparkCreatePPTResponse{}, err
|
2025-04-03 13:33:56 +08:00
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create ppt by outline headers:", headers)
|
|
|
|
|
|
|
|
|
|
|
|
req := proto.SparkCreatePptByOutlineRequest{
|
|
|
|
|
|
Query: userReq.Query,
|
|
|
|
|
|
FileUrl: userReq.FileUrl,
|
|
|
|
|
|
FileName: userReq.FileName,
|
|
|
|
|
|
Outline: userReq.Outline,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
reqStr, err := json.Marshal(req)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error encoding request:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create ppt by outline req:", string(reqStr))
|
|
|
|
|
|
|
|
|
|
|
|
err, resp := worker.DoPostRequestJSON(url, reqStr, headers)
|
|
|
|
|
|
log.Println("Spark create ppt by outline Response:", string(resp))
|
2025-04-03 16:13:22 +08:00
|
|
|
|
var response proto.SparkCreatePPTResponse
|
2025-04-03 13:33:56 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error:", err)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
err = json.Unmarshal(resp, &response)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error decoding response:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create ppt by outline Response struct:", response)
|
|
|
|
|
|
return response, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func SparkGetPPTInfoBySID(model *proto.ModelParam, userReq *proto.SparkCreatePPTByOutlineUserRequest) (proto.SparkCreatePPTByOutlineResponse, error) {
|
|
|
|
|
|
url := "https://zwapi.xfyun.cn/api/ppt/v2/progress?sid=" + userReq.Sid
|
|
|
|
|
|
headers, err := getSparkRequestHeaders(model.APPID, model.APISecret)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error encoding request:", err)
|
|
|
|
|
|
return proto.SparkCreatePPTByOutlineResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create ppt by outline headers:", headers)
|
|
|
|
|
|
|
|
|
|
|
|
err, resp := worker.DoGetRequest(url, headers)
|
|
|
|
|
|
log.Println("Spark create ppt by outline Response:", string(resp))
|
|
|
|
|
|
var response proto.SparkCreatePPTByOutlineResponse
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error:", err)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
err = json.Unmarshal(resp, &response)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error decoding response:", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Spark create ppt by outline Response struct:", response)
|
|
|
|
|
|
return response, err
|
|
|
|
|
|
}
|
2025-04-03 14:14:02 +08:00
|
|
|
|
|
|
|
|
|
|
// 处理制作大纲请求
|
2025-04-03 16:13:22 +08:00
|
|
|
|
func SparkDoCreateOutline(userReq *proto.SparkCreateOutlineRequest, base *proto.SparkCreatePPTBaseInfo) (proto.SparkCreateOutlineResponse, error) {
|
2025-04-03 14:14:02 +08:00
|
|
|
|
var modelParam proto.ModelParam
|
|
|
|
|
|
var err error
|
2025-04-03 16:13:22 +08:00
|
|
|
|
//需要保存会话
|
|
|
|
|
|
sessionName := userReq.Query[:10]
|
|
|
|
|
|
err2, sessionID := service.CreateSession(base.UserID, proto.SessionTypeUserCreatePPT, sessionName)
|
|
|
|
|
|
if err2 != nil {
|
|
|
|
|
|
log.Println("Create session error:", err2)
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err2
|
|
|
|
|
|
}
|
|
|
|
|
|
base.SessionID = sessionID
|
2025-04-03 14:14:02 +08:00
|
|
|
|
//获取模型
|
|
|
|
|
|
models, funcs, mferr := service.FindFuncModelListByFunctionV2(userReq.Function)
|
|
|
|
|
|
if mferr != nil {
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, mferr
|
|
|
|
|
|
}
|
|
|
|
|
|
model := models[0]
|
2025-04-03 16:13:22 +08:00
|
|
|
|
base.ModelID = int(model.ID)
|
2025-04-03 14:14:02 +08:00
|
|
|
|
err = json.Unmarshal([]byte(model.Parameter), &modelParam)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
modelParam.Url = model.Url
|
|
|
|
|
|
modelParam.System = funcs[0].Info //系统功能
|
2025-04-03 16:13:22 +08:00
|
|
|
|
//保存消息
|
|
|
|
|
|
userReqStr, err := json.Marshal(userReq)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Error parsing JSON:", err)
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
err3, userMsgID := service.CreateMessage(proto.UserToModelMsgType, int(sessionID), base.UserID, int(model.ID), string(userReqStr), proto.UserToModelPPTMsgType, int(funcs[0].ID))
|
|
|
|
|
|
if err3 != nil {
|
|
|
|
|
|
log.Println("Create message error:", err3, userMsgID)
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err3
|
|
|
|
|
|
}
|
2025-04-03 14:14:02 +08:00
|
|
|
|
|
2025-04-03 16:13:22 +08:00
|
|
|
|
var outline proto.SparkCreateOutlineResponse
|
|
|
|
|
|
//获取大纲
|
2025-04-03 14:14:02 +08:00
|
|
|
|
if userReq.FileUrl == "" {
|
|
|
|
|
|
outline, err = SparkCreateOutline(&modelParam, userReq) //根据query生成大纲
|
|
|
|
|
|
} else {
|
|
|
|
|
|
outline, err = SparkCreateOutlineByDoc(&modelParam, userReq) //根据文档生成大纲
|
|
|
|
|
|
}
|
|
|
|
|
|
//进行保存
|
2025-04-03 16:13:22 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create outline Error:", err)
|
|
|
|
|
|
return outline, err
|
|
|
|
|
|
}
|
|
|
|
|
|
outlineStr, _ := json.Marshal(userReq)
|
|
|
|
|
|
//返回的数据保存
|
|
|
|
|
|
service.CreateAIStreamMsg(base.UserID, base.ModelID, int(base.SessionID), outline, modelParam.Model)
|
|
|
|
|
|
//保存大纲
|
|
|
|
|
|
err3, userMsgID = service.CreateMessage(proto.ModelToUserMsgType, int(sessionID), base.UserID, int(model.ID), string(outlineStr), proto.UserToModelPPTMsgType, int(funcs[0].ID))
|
|
|
|
|
|
if err3 != nil {
|
|
|
|
|
|
log.Println("Create message error:", err3, userMsgID)
|
|
|
|
|
|
return proto.SparkCreateOutlineResponse{}, err3
|
|
|
|
|
|
}
|
2025-04-03 14:14:02 +08:00
|
|
|
|
return outline, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理制作PPT请求
|
2025-04-03 16:13:22 +08:00
|
|
|
|
func SparkDoCreatePPTByOutline(userReq *proto.SparkCreatePPTByOutlineUserRequest, base *proto.SparkCreatePPTBaseInfo) (proto.SparkCreatePPTResponse, error) {
|
|
|
|
|
|
var modelParam proto.ModelParam
|
|
|
|
|
|
var err error
|
|
|
|
|
|
//需要保存会话
|
|
|
|
|
|
if base.SessionID == 0 {
|
|
|
|
|
|
log.Println("session id is 0, create ppt")
|
|
|
|
|
|
return proto.SparkCreatePPTResponse{}, errors.New("create ppt,session id is 0, please create session first")
|
|
|
|
|
|
}
|
|
|
|
|
|
//获取模型
|
|
|
|
|
|
models, funcs, mferr := service.FindFuncModelListByFunctionV2(userReq.Function)
|
|
|
|
|
|
if mferr != nil {
|
|
|
|
|
|
return proto.SparkCreatePPTResponse{}, mferr
|
|
|
|
|
|
}
|
|
|
|
|
|
model := models[0]
|
|
|
|
|
|
base.ModelID = int(model.ID)
|
|
|
|
|
|
err = json.Unmarshal([]byte(model.Parameter), &modelParam)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return proto.SparkCreatePPTResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
modelParam.Url = model.Url
|
|
|
|
|
|
modelParam.System = funcs[0].Info //系统功能
|
|
|
|
|
|
//保存消息
|
|
|
|
|
|
userReqStr, err := json.Marshal(userReq)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Error parsing JSON:", err)
|
|
|
|
|
|
return proto.SparkCreatePPTResponse{}, err
|
|
|
|
|
|
}
|
|
|
|
|
|
err3, userMsgID := service.CreateMessage(proto.UserToModelMsgType, int(base.SessionID), base.UserID, int(model.ID), string(userReqStr), proto.UserToModelPPTMsgType, int(funcs[0].ID))
|
|
|
|
|
|
if err3 != nil {
|
|
|
|
|
|
log.Println("Create message error:", err3, userMsgID)
|
|
|
|
|
|
return proto.SparkCreatePPTResponse{}, err3
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
resp, err4 := SparkCreatePPTByOutline(&modelParam, userReq) //根据大纲生成ppt
|
|
|
|
|
|
if err4 != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error:", err4)
|
|
|
|
|
|
return proto.SparkCreatePPTResponse{}, err4
|
|
|
|
|
|
}
|
|
|
|
|
|
//进行保存
|
|
|
|
|
|
service.CreateAIStreamMsg(base.UserID, base.ModelID, int(base.SessionID), resp, modelParam.Model) //保存消息
|
|
|
|
|
|
//新协程获取ppt制作进度
|
|
|
|
|
|
userReq.Sid = resp.Data.SID
|
|
|
|
|
|
go SparkDoGetPPTInfoBySID(&modelParam, userReq, base)
|
|
|
|
|
|
return resp, err4
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 每3秒查询一次ppt制作情况
|
|
|
|
|
|
func SparkDoGetPPTInfoBySID(modelParam *proto.ModelParam, userReq *proto.SparkCreatePPTByOutlineUserRequest, base *proto.SparkCreatePPTBaseInfo) {
|
|
|
|
|
|
//定时
|
|
|
|
|
|
ticker := time.NewTicker(3 * time.Second)
|
|
|
|
|
|
defer ticker.Stop()
|
|
|
|
|
|
i := 0
|
|
|
|
|
|
for {
|
|
|
|
|
|
select {
|
|
|
|
|
|
case <-ticker.C:
|
|
|
|
|
|
i += 1
|
|
|
|
|
|
if i > 20 {
|
|
|
|
|
|
log.Println("SparkDoGetPPTInfoBySID timeout more 1 min, stop ticker")
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("SparkDoGetPPTInfoBySID ticker")
|
|
|
|
|
|
resp, err := SparkGetPPTInfoBySID(modelParam, userReq) //根据大纲生成ppt
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Spark create ppt by outline Error:", err)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-04-03 16:25:18 +08:00
|
|
|
|
respStr, _ := json.Marshal(resp)
|
2025-04-03 16:13:22 +08:00
|
|
|
|
service.CreateAIStreamMsg(base.UserID, base.ModelID, int(base.SessionID), resp, modelParam.Model) //保存消息
|
2025-04-03 16:25:18 +08:00
|
|
|
|
//添加到消息队列,用于前端查询
|
|
|
|
|
|
key := fmt.Sprintf("user-%d-session-%d-create-pptx", base.UserID, base.SessionID)
|
|
|
|
|
|
worker.SetRedisWithExpire(key, string(respStr), time.Second*60*5) //设置5分钟过期
|
2025-04-03 16:13:22 +08:00
|
|
|
|
if resp.Data.PptStatus == "done" {
|
|
|
|
|
|
log.Println("ppt done")
|
|
|
|
|
|
//下载文件,保存到指定用户的文件
|
|
|
|
|
|
fileName, filePath, err2 := SparkSavePPTFileToUser(resp.Data.PptUrl)
|
|
|
|
|
|
if err2 != nil {
|
|
|
|
|
|
log.Println("Spark save ppt file to user Error:", err2)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
//保存文件路径到数据库
|
2025-04-03 16:32:20 +08:00
|
|
|
|
fileRecord := dao.CreateFile(fileName, userReq.Outline.Title+".pptx", "", filePath, "", 0, base.UserID, false)
|
2025-04-03 16:13:22 +08:00
|
|
|
|
fileAuth := service.CreateUserFile(base.UserID, fileRecord.FileName, int(fileRecord.ID), proto.UserFileTypeFile)
|
|
|
|
|
|
if fileRecord.ID == 0 || fileAuth.ID == 0 {
|
|
|
|
|
|
log.Println("save file info failed", fileRecord.ID, fileAuth.ID)
|
|
|
|
|
|
}
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将下载的文件保存到对应指定用户的文件,并对该会话添加ppt完成消息
|
|
|
|
|
|
func SparkSavePPTFileToUser(fileUrl string) (string, string, error) {
|
|
|
|
|
|
log.Println("Spark save ppt file to user")
|
|
|
|
|
|
//https://bjcdn.openstorage.cn/xinghuo-privatedata/zhiwen/2025-04-02/6ebfc0b2-824a-4acc-a030-01acce938dab/3209de1bca814ac48884e015277360fd.pptx
|
|
|
|
|
|
fileName := fileUrl[strings.LastIndex(fileUrl, "/")+1:]
|
|
|
|
|
|
//文件保存路径
|
|
|
|
|
|
path := service.GetFilePath(proto.FILE_BASE_DIR)
|
|
|
|
|
|
saveFile := path + "/" + fileName
|
|
|
|
|
|
//下载文件
|
|
|
|
|
|
err := DownloadFile(fileUrl, saveFile)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
log.Println("Download file error:", err)
|
|
|
|
|
|
return "", "", err
|
|
|
|
|
|
}
|
|
|
|
|
|
log.Println("Download file success:", fileName)
|
|
|
|
|
|
return fileName, path, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func DownloadFile(url, filePath string) error {
|
|
|
|
|
|
// 创建 HTTP GET 请求
|
|
|
|
|
|
resp, err := http.Get(url)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
// 确保在函数结束时关闭响应体
|
|
|
|
|
|
defer resp.Body.Close()
|
|
|
|
|
|
|
|
|
|
|
|
// 检查 HTTP 响应状态码
|
|
|
|
|
|
if resp.StatusCode != http.StatusOK {
|
|
|
|
|
|
return fmt.Errorf("unexpected status code: %d", resp.StatusCode)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建本地文件
|
|
|
|
|
|
out, err := os.Create(filePath)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return err
|
|
|
|
|
|
}
|
|
|
|
|
|
// 确保在函数结束时关闭文件
|
|
|
|
|
|
defer out.Close()
|
2025-04-03 14:14:02 +08:00
|
|
|
|
|
2025-04-03 16:13:22 +08:00
|
|
|
|
// 将响应体内容复制到本地文件
|
|
|
|
|
|
_, err = io.Copy(out, resp.Body)
|
|
|
|
|
|
return err
|
2025-04-03 14:14:02 +08:00
|
|
|
|
}
|