@@ -1,22 +1,18 @@
package consumer
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"fusenapi/constants"
"fusenapi/initalize"
"fusenapi/model/gmodel"
"fusenapi/server/render/internal/svc"
"fusenapi/utils/curl "
"fusenapi/utils/file"
"fusenapi/service/repositories "
"fusenapi/utils/hash"
"fusenapi/utils/websocket_data"
"github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm"
"io/ioutil"
"strconv"
"time"
)
@@ -55,7 +51,7 @@ func (m *MqConsumerRenderAssemble) Run(ctx context.Context, data []byte) error {
return nil //不返回错误就删除消息
}
rabbitmq := initalize . RabbitMqHandle { }
//获取模板(产品第一个sku 的模板)
//获取模板(模板标签下的对一个物料的 的模板)
productTemplate , err := svcCtx . AllModels . FsProductTemplateV2 . FindOneByProductIdTagIdWithSizeTable ( ctx , parseInfo . RenderData . ProductId , fmt . Sprintf ( "%d" , parseInfo . RenderData . TemplateTagId ) )
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
@@ -65,23 +61,45 @@ func (m *MqConsumerRenderAssemble) Run(ctx context.Context, data []byte) error {
logx . Error ( "failed to get template info:" , err )
return nil //不返回错误就删除消息
}
combineImage := "" //刀版图
combineHash := hash . JsonHashKey ( parseInfo ) //区别于云渲染的taskid,这个用获取刀版图缓存
//获取该hash值下有没有对应的资源
resource , err := svcCtx . AllModels . FsResource . FindOneById ( ctx , combineHash )
if err != nil && ! errors . Is ( err , gorm . ErrRecordNotFound ) {
logx . Error ( "failed to get resource : ", err )
return nil //不返回错误就删除消息
time . Now ( ) . UTC ( )
resourceKey := hash . JsonHashKey ( parseInfo )
combineParam := map [ string ] interface { } {
"logo_url" : parseInfo . RenderData . Logo ,
"website" : "" ,
"slogan ": "" ,
"address" : "" ,
"phone" : "" ,
"colors" : [ ] string { } ,
"template_tagid" : "b1a" ,
"is_crop" : false ,
"shape" : "rectangle" ,
"ratio" : 0 ,
"line" : "" ,
"other" : "" ,
"other1" : "" ,
}
//如果不存在,则请求生成刀版图
if errors . Is ( err , gorm . ErrRecordNotFound ) {
combineImage , err = getCombineImage ( ctx , svcCtx , parseInfo , productTemplate , c ombineHash )
if err != nil {
return nil //不返回错误就删除消息
}
combineParamBytes , _ := json . Marshal ( combineParam )
//获取刀版图
res , err : = svcCtx . Repositories . ImageHandle . LogoCombine ( ctx , & repositories . LogoC ombineReq {
ResourceKey : resourceKey ,
TemplateId : productTemplate . Id ,
CombineParam : string ( combineParamBytes ) ,
UserId : parseInfo . RenderData . UserId ,
GuestId : parseInfo . RenderData . GuestId ,
} )
if err != nil {
logx . Error ( "合成刀版图失败:" , err )
return nil
}
combineImage := "" //刀版图
if res != nil && res . ResourceUrl != nil {
combineImage = * res . ResourceUrl
} else {
combineImage = * resource . ResourceUrl
logx . Error ( "合成刀版图失败,合成的刀版图是空指针:" , err )
return nil
}
logx . Info ( "合成刀版图成功" )
//获取渲染设置信息
element , err := svcCtx . AllModels . FsProductTemplateElement . FindOneByModelId ( ctx , * productTemplate . ModelId )
if err != nil {
@@ -167,106 +185,3 @@ func (m *MqConsumerRenderAssemble) Run(ctx context.Context, data []byte) error {
logx . Info ( "发送渲染组装数据到unity成功" )
return nil
}
// 获取刀版图
func getCombineImage ( ctx context . Context , svcCtx * svc . ServiceContext , parseInfo websocket_data . AssembleRenderData , productTemplate * gmodel . FsProductTemplateV2 , combineHash string ) ( image string , err error ) {
if productTemplate . TemplateInfo == nil || * productTemplate . TemplateInfo == "" {
logx . Error ( "product template info`template_info is empty" )
return "" , errors . New ( "product template info`template_info is empty" )
}
//反序列化替换其中一些参数
var combineInfo map [ string ] interface { }
if err = json . Unmarshal ( [ ] byte ( * productTemplate . TemplateInfo ) , & combineInfo ) ; err != nil {
logx . Error ( "failed to parse json:template_info:" , err )
return "" , err
}
//需要替换的参数
replaceData := map [ string ] interface { } {
"logo_url" : parseInfo . RenderData . Logo ,
"website" : parseInfo . RenderData . Website ,
"slogan" : parseInfo . RenderData . Slogan ,
"address" : parseInfo . RenderData . Address ,
"phone" : parseInfo . RenderData . Phone ,
"colors" : [ ] string { } ,
"template_tagid" : [ ] string { "b1a" } ,
"is_crop" : false ,
"shape" : "" ,
"ratio" : 0 ,
"line" : "" ,
"other" : "" ,
"other1" : "" ,
}
//获取用户素材信息
if parseInfo . RenderData . UserMaterialId > 0 {
userMaterial , err := svcCtx . AllModels . FsUserMaterial . FindOneById ( ctx , parseInfo . RenderData . UserMaterialId )
if err != nil {
if errors . Is ( err , gorm . ErrRecordNotFound ) {
logx . Error ( "user material not exists:" , parseInfo . RenderData . UserMaterialId )
return "" , errors . New ( "user material not exists" )
}
logx . Error ( "err failed to get user material info" )
}
if userMaterial . Metadata != nil && * userMaterial . Metadata != "" {
//解析元数据
var materialMetaData map [ string ] interface { }
if err = json . Unmarshal ( [ ] byte ( * userMaterial . Metadata ) , & materialMetaData ) ; err != nil {
logx . Error ( "failed to parse user material`matadata: " , err )
return "" , err
}
//赋值
replaceData [ "colors" ] = materialMetaData [ "colors" ]
replaceData [ "logo_url" ] = materialMetaData [ "logo_url" ]
replaceData [ "shape" ] = materialMetaData [ "shape" ]
replaceData [ "is_crop" ] = materialMetaData [ "is_crop" ]
replaceData [ "ratio" ] = materialMetaData [ "ratio" ]
replaceData [ "line" ] = materialMetaData [ "line" ]
replaceData [ "other" ] = materialMetaData [ "other" ]
replaceData [ "other1" ] = materialMetaData [ "other1" ]
}
}
combineInfo [ "param_data" ] = replaceData
postData , _ := json . Marshal ( combineInfo )
//请求合成图片
url := svcCtx . Config . PythonApi . CombineImageUrl
header := make ( map [ string ] string )
header [ "content-type" ] = "application/json"
/*f, _ := os.Create("a.txt")
defer f.Close()
f.Write(postData)*/
httpRsp , err := curl . ApiCall ( url , "POST" , header , bytes . NewReader ( postData ) , time . Second * 20 )
if err != nil {
logx . Error ( "failed to combine logo:" , err )
return "" , err
}
defer httpRsp . Body . Close ( )
bytes , err := ioutil . ReadAll ( httpRsp . Body )
if err != nil {
logx . Error ( "failed to read python api rsp body:" , err )
return "" , err
}
var pythonApiInfo pythonApiRsp
if err = json . Unmarshal ( bytes , & pythonApiInfo ) ; err != nil {
logx . Error ( "failed to parse python api rsp:" , err )
return "" , err
}
//fmt.Println("× × × × × × × × × × × × × × × × × × × × : ", pythonApiInfo)
//上传刀版图
var upload = file . Upload {
Ctx : ctx ,
MysqlConn : svcCtx . MysqlConn ,
AwsSession : svcCtx . AwsSession ,
}
uploadRes , err := upload . UploadFileByBase64 ( & file . UploadBaseReq {
FileHash : combineHash ,
FileData : pythonApiInfo . Result ,
UploadBucket : 1 ,
ApiType : 2 ,
UserId : parseInfo . RenderData . UserId ,
GuestId : parseInfo . RenderData . GuestId ,
} )
if err != nil {
logx . Error ( "上传刀版图到s3失败:" , err )
return "" , err
}
return uploadRes . ResourceUrl , nil
}