Merge branch 'develop' of gitee.com:fusenpack/fusenapi into develop

This commit is contained in:
momo 2023-09-08 11:47:59 +08:00
commit c61c8a4933
14 changed files with 97 additions and 9 deletions

1
go.mod
View File

@ -123,4 +123,5 @@ require (
google.golang.org/grpc v1.56.2 // indirect google.golang.org/grpc v1.56.2 // indirect
google.golang.org/protobuf v1.31.0 // indirect google.golang.org/protobuf v1.31.0 // indirect
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
gorm.io/datatypes v1.2.0
) )

2
go.sum
View File

@ -986,6 +986,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gorm.io/datatypes v1.2.0 h1:5YT+eokWdIxhJgWHdrb2zYUimyk0+TaFth+7a0ybzco=
gorm.io/datatypes v1.2.0/go.mod h1:o1dh0ZvjIjhH/bngTpypG6lVRJ5chTBxE09FH/71k04=
gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw= gorm.io/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o= gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64= gorm.io/gorm v1.25.1 h1:nsSALe5Pr+cM3V1qwwQ7rOkw+6UeLrX5O4v3llhHa64=

View File

@ -11,6 +11,7 @@ type FsChangeCode struct {
Code *string `gorm:"default:'';" json:"code"` // Code *string `gorm:"default:'';" json:"code"` //
CreatedAt *int64 `gorm:"default:0;" json:"created_at"` // 创建时间 CreatedAt *int64 `gorm:"default:0;" json:"created_at"` // 创建时间
IsUse *int64 `gorm:"default:0;" json:"is_use"` // 是否使用 1已使用 0未使用 IsUse *int64 `gorm:"default:0;" json:"is_use"` // 是否使用 1已使用 0未使用
Metadata *[]byte `gorm:"default:'';" json:"metadata"` //
} }
type FsChangeCodeModel struct { type FsChangeCodeModel struct {
db *gorm.DB db *gorm.DB

View File

@ -35,6 +35,7 @@ type FsProduct struct {
RecommendProduct *string `gorm:"default:'';" json:"recommend_product"` // RecommendProduct *string `gorm:"default:'';" json:"recommend_product"` //
RecommendProductSort *string `gorm:"default:'';" json:"recommend_product_sort"` // RecommendProductSort *string `gorm:"default:'';" json:"recommend_product_sort"` //
SceneIds *string `gorm:"default:'';" json:"scene_ids"` // SceneIds *string `gorm:"default:'';" json:"scene_ids"` //
IsCustomization *int64 `gorm:"default:0;" json:"is_customization"` // 是否可定制
} }
type FsProductModel struct { type FsProductModel struct {
db *gorm.DB db *gorm.DB

View File

@ -14,6 +14,7 @@ type FsQuotation struct {
PageNum *int64 `gorm:"default:0;" json:"page_num"` // 页数 PageNum *int64 `gorm:"default:0;" json:"page_num"` // 页数
ProductNum *int64 `gorm:"default:0;" json:"product_num"` // 产品数量 ProductNum *int64 `gorm:"default:0;" json:"product_num"` // 产品数量
GiftNum *int64 `gorm:"default:0;" json:"gift_num"` // 赠品数 GiftNum *int64 `gorm:"default:0;" json:"gift_num"` // 赠品数
SequenceNum *string `gorm:"default:'';" json:"sequence_num"` //
Status *int64 `gorm:"default:0;" json:"status"` // 状态位 0停用 1待设计 2设计中 3待报价 4报价中 5完成 Status *int64 `gorm:"default:0;" json:"status"` // 状态位 0停用 1待设计 2设计中 3待报价 4报价中 5完成
Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间 Ctime *int64 `gorm:"default:0;" json:"ctime"` // 添加时间
DesignId *int64 `gorm:"default:0;" json:"design_id"` // 设计人员 DesignId *int64 `gorm:"default:0;" json:"design_id"` // 设计人员

View File

@ -1,9 +1,8 @@
package gmodel package gmodel
import ( import (
"time"
"gorm.io/gorm" "gorm.io/gorm"
"time"
) )
// fs_resource 资源表 // fs_resource 资源表

View File

@ -9,6 +9,7 @@ import (
"time" "time"
"github.com/zeromicro/go-zero/core/logx" "github.com/zeromicro/go-zero/core/logx"
"gorm.io/gorm" "gorm.io/gorm"
) )
@ -146,15 +147,16 @@ func (u *FsUserModel) RegisterByGoogleOAuth(ctx context.Context, token *auth.Reg
// SubscriptionStatus 订阅状态 // SubscriptionStatus 订阅状态
type SubscriptionStatus struct { type SubscriptionStatus struct {
SubEmail bool `json:"all_emails"` SubEmail bool `json:"all_emails"`
ItemMap struct { ItemMap *struct {
} `json:"item_map"` } `json:"item_map"`
} }
// UserProfile 个人信息 // UserProfile 个人信息
type UserProfile struct { type UserProfile struct {
FirstName string `json:"first_name"` FirstName string `json:"first_name"`
LastName string `json:"last_name"` LastName string `json:"last_name"`
Resetaurant string `json:"resetaurant"` Resetaurant string `json:"resetaurant"`
SubStatus SubscriptionStatus `json:"sub_status"`
} }
// 自平台的注册流程 // 自平台的注册流程
@ -188,6 +190,7 @@ func (u *FsUserModel) RegisterByFusen(ctx context.Context, token *auth.RegisterT
// 继承guest_id的资源表 // 继承guest_id的资源表
err = InheritGuestIdResource(tx, user.Id, token.GuestId, func(txResouce, txUserMaterial, txUserInfo *gorm.DB) error { err = InheritGuestIdResource(tx, user.Id, token.GuestId, func(txResouce, txUserMaterial, txUserInfo *gorm.DB) error {
userProfile := &UserProfile{ userProfile := &UserProfile{
FirstName: FirstName, FirstName: FirstName,
LastName: LastName, LastName: LastName,
@ -197,6 +200,9 @@ func (u *FsUserModel) RegisterByFusen(ctx context.Context, token *auth.RegisterT
if err != nil { if err != nil {
return err return err
} }
// txUserInfo.Where("user_id = ?", user.Id).Row().Err()
now := time.Now() now := time.Now()
uinfo := &FsUserInfo{ uinfo := &FsUserInfo{
Module: FsString("profile"), Module: FsString("profile"),
@ -207,9 +213,30 @@ func (u *FsUserModel) RegisterByFusen(ctx context.Context, token *auth.RegisterT
Utime: &now, Utime: &now,
} }
err = txUserInfo.Create(uinfo).Error err = txUserInfo.Where("user_id = ?", uinfo.UserId).Take(nil).Error
if err == gorm.ErrRecordNotFound { // txUserInfo.Statement.Table
return nil
if err != nil {
if err == gorm.ErrRecordNotFound {
err = txUserInfo.Create(uinfo).Error
if err == gorm.ErrRecordNotFound {
return nil
}
}
} else {
updatesql := `UPDATE %s
SET metadata = CASE
WHEN metadata IS NULL THEN ?
ELSE JSON_MERGE_PATCH(metadata, ?)
END
WHERE id = ?;`
updatesql = fmt.Sprintf(updatesql, txUserInfo.Statement.Table)
logx.Error(updatesql)
err = txUserInfo.Raw(updatesql, metadata, metadata, uinfo.UserId).Error
if err != nil {
return err
}
} }
return err return err
}) })
@ -217,6 +244,7 @@ func (u *FsUserModel) RegisterByFusen(ctx context.Context, token *auth.RegisterT
if err == gorm.ErrRecordNotFound { if err == gorm.ErrRecordNotFound {
return nil return nil
} }
return err return err
} }

View File

@ -4,7 +4,9 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"fusenapi/initalize" "fusenapi/initalize"
"fusenapi/model/gmodel"
"fusenapi/utils/check" "fusenapi/utils/check"
"log"
"strings" "strings"
"testing" "testing"
@ -96,3 +98,31 @@ func TestMain(t *testing.T) {
} }
} }
func TestCaseJSON_EXTRACT(t *testing.T) {
userProfile := &gmodel.UserProfile{
FirstName: "FirstName",
LastName: "LastName",
Resetaurant: "Resetaurant",
}
metadata, err := json.Marshal(userProfile)
if err != nil {
panic(err)
}
updatesql := `UPDATE fusen.fs_change_code
SET metadata = CASE
WHEN metadata IS NULL THEN '%s'
ELSE JSON_MERGE_PATCH(metadata, '%s')
END
WHERE id = ?;`
updatesql = fmt.Sprintf(updatesql, metadata, metadata)
log.Println(string(updatesql))
conn := initalize.InitMysql("fsreaderwriter:XErSYmLELKMnf3Dh@tcp(fusen.cdmigcvz3rle.us-east-2.rds.amazonaws.com:3306)/fusen")
// err = conn.Exec(updatesql, 6).Error
log.Println(conn.Model(&gmodel.FsChangeCode{}).Select("id").Where("id = 5").Take(nil).Error)
log.Println(err)
}

View File

@ -193,6 +193,7 @@ func (l *GetRecommandProductListLogic) GetRecommandProductList(req *types.GetRec
Intro: *v.Intro, Intro: *v.Intro,
IsRecommend: isRecommend, IsRecommend: isRecommend,
MinPrice: minPrice, MinPrice: minPrice,
IsCustomization: *productInfo.IsCustomization,
} }
if _, ok := mapTagProp[productInfo.Id]; ok { if _, ok := mapTagProp[productInfo.Id]; ok {
item.CoverDefault = mapTagProp[productInfo.Id] item.CoverDefault = mapTagProp[productInfo.Id]

View File

@ -444,6 +444,7 @@ func (l *GetTagProductListLogic) getTagProducts(req getTagProductsReq) (productL
Recommended: *productInfo.IsRecommend > 0, Recommended: *productInfo.IsRecommend > 0,
Cover: *productInfo.Cover, Cover: *productInfo.Cover,
CoverMetadata: req.MapResourceMetadata[*productInfo.Cover], CoverMetadata: req.MapResourceMetadata[*productInfo.Cover],
IsCustomization: *productInfo.IsCustomization,
} }
if _, ok = req.MapTagProp[productInfo.Id]; ok { if _, ok = req.MapTagProp[productInfo.Id]; ok {
item.CoverDefault = req.MapTagProp[productInfo.Id] item.CoverDefault = req.MapTagProp[productInfo.Id]

View File

@ -217,6 +217,7 @@ func (l *HomePageRecommendProductListLogic) HomePageRecommendProductList(req *ty
SizeNum: uint32(sizeNum), SizeNum: uint32(sizeNum),
MinPrice: minPrice, MinPrice: minPrice,
HaveOptionalFitting: haveOptionalFitting, HaveOptionalFitting: haveOptionalFitting,
IsCustomization: *productInfo.IsCustomization,
} }
if _, ok = mapTagProp[productInfo.Id]; ok { if _, ok = mapTagProp[productInfo.Id]; ok {
item.CoverDefault = mapTagProp[productInfo.Id] item.CoverDefault = mapTagProp[productInfo.Id]

View File

@ -246,6 +246,7 @@ type GetRecommandProductListRsp struct {
Intro string `json:"intro"` Intro string `json:"intro"`
IsRecommend int64 `json:"is_recommend"` IsRecommend int64 `json:"is_recommend"`
MinPrice int64 `json:"min_price"` MinPrice int64 `json:"min_price"`
IsCustomization int64 `json:"is_customization"`
} }
type GetTagProductListReq struct { type GetTagProductListReq struct {
@ -281,6 +282,7 @@ type TagProduct struct {
CoverDefault []CoverDefaultItem `json:"cover_default"` CoverDefault []CoverDefaultItem `json:"cover_default"`
HaveOptionalFitting bool `json:"have_optional_fitting"` HaveOptionalFitting bool `json:"have_optional_fitting"`
Recommended bool `json:"recommended"` Recommended bool `json:"recommended"`
IsCustomization int64 `json:"is_customization"`
} }
type CoverDefaultItem struct { type CoverDefaultItem struct {
@ -409,6 +411,7 @@ type HomePageRecommendProductListRsp struct {
MinPrice int64 `json:"min_price"` MinPrice int64 `json:"min_price"`
CoverDefault []CoverDefaultItem `json:"cover_default"` CoverDefault []CoverDefaultItem `json:"cover_default"`
HaveOptionalFitting bool `json:"have_optional_fitting"` HaveOptionalFitting bool `json:"have_optional_fitting"`
IsCustomization int64 `json:"is_customization"`
} }
type Request struct { type Request struct {

View File

@ -94,6 +94,22 @@ func (w *wsConnectItem) renderImage(data []byte) {
logx.Error("invalid format of websocket render image message", err) logx.Error("invalid format of websocket render image message", err)
return return
} }
//获取产品信息
productInfo, err := w.logic.svcCtx.AllModels.FsProduct.FindOne(w.logic.ctx, renderImageData.RenderData.ProductId)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "该产品不存在", renderImageData.RenderData.ProductId, w.userId, w.guestId, 0, 0, 0, 0)
return
}
w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "获取产品失败", renderImageData.RenderData.ProductId, w.userId, w.guestId, 0, 0, 0, 0)
logx.Error(err)
return
}
//不可定制
if *productInfo.IsCustomization == 0 {
w.renderErrResponse(renderImageData.RenderId, renderImageData.RenderData.TemplateTag, "", "该产品不可定制", renderImageData.RenderData.ProductId, w.userId, w.guestId, 0, 0, 0, 0)
return
}
//获取上传最近的logo //获取上传最近的logo
userMaterial, err := w.logic.svcCtx.AllModels.FsUserMaterial.FindLatestOne(w.logic.ctx, w.userId, w.guestId) userMaterial, err := w.logic.svcCtx.AllModels.FsUserMaterial.FindLatestOne(w.logic.ctx, w.userId, w.guestId)
if err != nil { if err != nil {

View File

@ -298,6 +298,7 @@ type GetRecommandProductListRsp {
Intro string `json:"intro"` Intro string `json:"intro"`
IsRecommend int64 `json:"is_recommend"` IsRecommend int64 `json:"is_recommend"`
MinPrice int64 `json:"min_price"` MinPrice int64 `json:"min_price"`
IsCustomization int64 `json:"is_customization"`
} }
//获取分类产品列表 //获取分类产品列表
type GetTagProductListReq { type GetTagProductListReq {
@ -331,6 +332,7 @@ type TagProduct {
CoverDefault []CoverDefaultItem `json:"cover_default"` CoverDefault []CoverDefaultItem `json:"cover_default"`
HaveOptionalFitting bool `json:"have_optional_fitting"` HaveOptionalFitting bool `json:"have_optional_fitting"`
Recommended bool `json:"recommended"` Recommended bool `json:"recommended"`
IsCustomization int64 `json:"is_customization"`
} }
type CoverDefaultItem { type CoverDefaultItem {
TemplateTag string `json:"template_tag"` TemplateTag string `json:"template_tag"`
@ -451,4 +453,5 @@ type HomePageRecommendProductListRsp {
MinPrice int64 `json:"min_price"` MinPrice int64 `json:"min_price"`
CoverDefault []CoverDefaultItem `json:"cover_default"` CoverDefault []CoverDefaultItem `json:"cover_default"`
HaveOptionalFitting bool `json:"have_optional_fitting"` HaveOptionalFitting bool `json:"have_optional_fitting"`
IsCustomization int64 `json:"is_customization"`
} }