package logic //云渲染回调 import ( "context" "encoding/json" "fmt" "fusenapi/server/websocket/internal/svc" "fusenapi/server/websocket/internal/types" "fusenapi/utils/auth" "fusenapi/utils/basic" "fusenapi/utils/file" "fusenapi/utils/websocket_data" "time" "github.com/zeromicro/go-zero/core/logx" ) type RenderNotifyLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewRenderNotifyLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RenderNotifyLogic { return &RenderNotifyLogic{ Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx, } } // 处理进入前逻辑w,r // func (l *RenderNotifyLogic) BeforeLogic(w http.ResponseWriter, r *http.Request) { // } // 处理逻辑后 w,r 如:重定向, resp 必须重新处理 // func (l *RenderNotifyLogic) AfterLogic(w http.ResponseWriter, r *http.Request, resp *basic.Response) { // // httpx.OkJsonCtx(r.Context(), w, resp) // } func (l *RenderNotifyLogic) RenderNotify(req *types.RenderNotifyReq, userinfo *auth.UserInfo) (resp *basic.Response) { unityRenderEndTime := time.Now().UTC().UnixMilli() logx.Info("收到unity返回的渲染消息") //解析数据 var info websocket_data.ToUnityIdStruct if err := json.Unmarshal([]byte(req.TaskId), &info); err != nil { logx.Error("解析taskId错误") return resp.SetStatusWithMessage(basic.CodeRequestParamsErr, "failed to parse param taskId !!!!") } //发出去的时间必须是大于服务启动的时间才参与统计 if info.RenderBeginTime > serverStartTime { //logx.Info("任务时间:", info.RenderBeginTime, "服务器启动时间:", serverStartTime) //统计unity处理数 decreaseUnityRequestCount(info.UserId, info.GuestId) if req.Code != 0 { //统计unity失败处理数 increaseUnityErrorCount(info.UserId, info.GuestId) } } //重新赋值(很重要) wid := info.Wid requestId := info.RequestId unityRenderBeginTime := info.RenderBeginTime //获取连接 value, wsConnectOk := mapConnPool.Load(wid) var ws wsConnectItem if wsConnectOk { ws = value.(wsConnectItem) } if req.Code == 0 { //渲染成功 //上传文件 var upload = file.Upload{ Ctx: l.ctx, MysqlConn: l.svcCtx.MysqlConn, AwsSession: l.svcCtx.AwsSession, } uploadRes, err := upload.UploadFileByBase64(&file.UploadBaseReq{ Source: "unity cloud render", FileHash: info.TaskId, FileData: req.Image, Metadata: "", UploadBucket: 1, ApiType: 2, UserId: info.UserId, GuestId: info.GuestId, FileByte: nil, }) if err != nil { logx.Error("渲染回调上传文件失败:", err) if ws.conn != nil { //发送错误信息给前端 ws.renderErrResponse(requestId, info.TemplateTag, info.TaskId, "unity图片上传错误", 0, 0, 0, 0, 0, 0, 0) } return resp.SetStatusWithMessage(basic.CodeFileUploadErr, "failed to upload render resource image") } uploadUnityRenderImageTakesTime := time.Now().UTC().UnixMilli() - unityRenderEndTime //转换unity真实处理时间 duration, err := time.Parse("15:04:05.9999999", req.CostTime) if err != nil { fmt.Println("解析时间错误:", err) return resp.SetStatusWithMessage(basic.CodeFileUploadErr, "转换unity时间错误") } // 将时间对象转换为毫秒数 unityRealTakesTime := duration.Nanosecond() / 1e6 + duration.Second()*1000 + duration.Minute() * 6000 + duration.Hour()*3600000 if ws.conn != nil { //发送到出口 ws.sendRenderResultData(websocket_data.RenderImageRspMsg{ RequestId: requestId, Image: uploadRes.ResourceUrl, RenderProcessTime: &websocket_data.RenderProcessTime{ UnityRenderTakesTime: fmt.Sprintf("%dms", unityRenderEndTime-unityRenderBeginTime), UploadUnityRenderImageTakesTime: fmt.Sprintf("%dms", uploadUnityRenderImageTakesTime), UnityTakesTime: fmt.Sprintf("%dms",unityRealTakesTime), }, }) logx.Info("渲染回调成功,渲染结果图片为:", uploadRes.ResourceUrl) return resp.SetStatusWithMessage(basic.CodeOK, "success") } logx.Info("渲染成功但找不到ws连接") return resp.SetStatusWithMessage(basic.CodeOK, "success:but websocket connect not found") } //渲染失败走下面 if ws.conn != nil { //发送错误信息给前端 ws.renderErrResponse(requestId, info.TemplateTag, info.TaskId, "unity云渲染错误:"+req.Msg, 0, 0, 0, 0, 0, 0, 0) //发送给前端重发消息 ws.requestResendRenderResponse(websocket_data.RequestBrowserResendRenderEvent{ RequestId: info.RequestId, Description: "unity require resend", }) logx.Info("渲染失败且发送了失败信息:", req.Msg) } else { logx.Info("渲染失败且找不到ws连接") } return resp.SetStatusWithMessage(basic.CodeOK, "success") }