This commit is contained in:
2025-12-09 18:55:28 +08:00
parent 8d00d67540
commit c23ab8338b
209 changed files with 5445 additions and 3963 deletions

View File

@@ -8,33 +8,34 @@ import (
"fmt"
"strings"
"reflect"
"time"
"ycc-server/common/globalkey"
"github.com/Masterminds/squirrel"
"github.com/google/uuid"
"github.com/pkg/errors"
"github.com/zeromicro/go-zero/core/stores/builder"
"github.com/zeromicro/go-zero/core/stores/cache"
"github.com/zeromicro/go-zero/core/stores/sqlc"
"github.com/zeromicro/go-zero/core/stores/sqlx"
"github.com/zeromicro/go-zero/core/stringx"
"ycc-server/common/globalkey"
)
var (
orderFieldNames = builder.RawFieldNames(&Order{})
orderRows = strings.Join(orderFieldNames, ",")
orderRowsExpectAutoSet = strings.Join(stringx.Remove(orderFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
orderRowsExpectAutoSet = strings.Join(stringx.Remove(orderFieldNames, "`create_time`", "`update_time`"), ",")
orderRowsWithPlaceHolder = strings.Join(stringx.Remove(orderFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
cacheHmOrderIdPrefix = "cache:ycc:order:id:"
cacheHmOrderOrderNoPrefix = "cache:ycc:order:orderNo:"
cacheYccOrderIdPrefix = "cache:ycc:order:id:"
cacheYccOrderOrderNoPrefix = "cache:ycc:order:orderNo:"
)
type (
orderModel interface {
Insert(ctx context.Context, session sqlx.Session, data *Order) (sql.Result, error)
FindOne(ctx context.Context, id int64) (*Order, error)
FindOne(ctx context.Context, id string) (*Order, error)
FindOneByOrderNo(ctx context.Context, orderNo string) (*Order, error)
Update(ctx context.Context, session sqlx.Session, data *Order) (sql.Result, error)
UpdateWithVersion(ctx context.Context, session sqlx.Session, data *Order) error
@@ -48,7 +49,7 @@ type (
FindPageListByPageWithTotal(ctx context.Context, rowBuilder squirrel.SelectBuilder, page, pageSize int64, orderBy string) ([]*Order, int64, error)
FindPageListByIdDESC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMinId, pageSize int64) ([]*Order, error)
FindPageListByIdASC(ctx context.Context, rowBuilder squirrel.SelectBuilder, preMaxId, pageSize int64) ([]*Order, error)
Delete(ctx context.Context, session sqlx.Session, id int64) error
Delete(ctx context.Context, session sqlx.Session, id string) error
}
defaultOrderModel struct {
@@ -57,10 +58,10 @@ type (
}
Order struct {
Id int64 `db:"id"` // 主键ID
OrderNo string `db:"order_no"` // 自生成的订单号
UserId int64 `db:"user_id"` // 用户ID
ProductId int64 `db:"product_id"` // 产品ID软关联到产品表
Id string `db:"id"`
OrderNo string `db:"order_no"` // 自生成的订单号
UserId string `db:"user_id"`
ProductId string `db:"product_id"`
PaymentPlatform string `db:"payment_platform"` // 支付平台(支付宝、微信、苹果内购、其他)
PaymentScene string `db:"payment_scene"` // 支付场景App、H5、微信小程序、公众号
PlatformOrderId sql.NullString `db:"platform_order_id"` // 支付平台订单号
@@ -86,21 +87,38 @@ func newOrderModel(conn sqlx.SqlConn, c cache.CacheConf) *defaultOrderModel {
func (m *defaultOrderModel) Insert(ctx context.Context, session sqlx.Session, data *Order) (sql.Result, error) {
data.DelState = globalkey.DelStateNo
hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, data.Id)
hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo)
m.insertUUID(data)
yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, data.Id)
yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo)
return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, orderRowsExpectAutoSet)
query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, orderRowsExpectAutoSet)
if session != nil {
return session.ExecCtx(ctx, query, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime)
return session.ExecCtx(ctx, query, data.Id, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime)
}
return conn.ExecCtx(ctx, query, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime)
}, hmOrderIdKey, hmOrderOrderNoKey)
return conn.ExecCtx(ctx, query, data.Id, data.OrderNo, data.UserId, data.ProductId, data.PaymentPlatform, data.PaymentScene, data.PlatformOrderId, data.Amount, data.Status, data.DelState, data.Version, data.PayTime, data.RefundTime, data.CloseTime, data.DeleteTime)
}, yccOrderIdKey, yccOrderOrderNoKey)
}
func (m *defaultOrderModel) insertUUID(data *Order) {
t := reflect.TypeOf(data).Elem()
v := reflect.ValueOf(data).Elem()
for i := 0; i < t.NumField(); i++ {
sf := t.Field(i)
if sf.Tag.Get("db") == "id" {
f := v.Field(i)
if f.IsValid() && f.CanSet() && f.Kind() == reflect.String {
if f.String() == "" {
f.SetString(uuid.NewString())
}
}
break
}
}
}
func (m *defaultOrderModel) FindOne(ctx context.Context, id int64) (*Order, error) {
hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, id)
func (m *defaultOrderModel) FindOne(ctx context.Context, id string) (*Order, error) {
yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, id)
var resp Order
err := m.QueryRowCtx(ctx, &resp, hmOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error {
err := m.QueryRowCtx(ctx, &resp, yccOrderIdKey, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) error {
query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", orderRows, m.table)
return conn.QueryRowCtx(ctx, v, query, id, globalkey.DelStateNo)
})
@@ -115,9 +133,9 @@ func (m *defaultOrderModel) FindOne(ctx context.Context, id int64) (*Order, erro
}
func (m *defaultOrderModel) FindOneByOrderNo(ctx context.Context, orderNo string) (*Order, error) {
hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, orderNo)
yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, orderNo)
var resp Order
err := m.QueryRowIndexCtx(ctx, &resp, hmOrderOrderNoKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
err := m.QueryRowIndexCtx(ctx, &resp, yccOrderOrderNoKey, m.formatPrimary, func(ctx context.Context, conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
query := fmt.Sprintf("select %s from %s where `order_no` = ? and del_state = ? limit 1", orderRows, m.table)
if err := conn.QueryRowCtx(ctx, &resp, query, orderNo, globalkey.DelStateNo); err != nil {
return nil, err
@@ -139,15 +157,15 @@ func (m *defaultOrderModel) Update(ctx context.Context, session sqlx.Session, ne
if err != nil {
return nil, err
}
hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, data.Id)
hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo)
yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, data.Id)
yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo)
return m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, orderRowsWithPlaceHolder)
if session != nil {
return session.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id)
}
return conn.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id)
}, hmOrderIdKey, hmOrderOrderNoKey)
}, yccOrderIdKey, yccOrderOrderNoKey)
}
func (m *defaultOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.Session, newData *Order) error {
@@ -162,15 +180,15 @@ func (m *defaultOrderModel) UpdateWithVersion(ctx context.Context, session sqlx.
if err != nil {
return err
}
hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, data.Id)
hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo)
yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, data.Id)
yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo)
sqlResult, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("update %s set %s where `id` = ? and version = ? ", m.table, orderRowsWithPlaceHolder)
if session != nil {
return session.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id, oldVersion)
}
return conn.ExecCtx(ctx, query, newData.OrderNo, newData.UserId, newData.ProductId, newData.PaymentPlatform, newData.PaymentScene, newData.PlatformOrderId, newData.Amount, newData.Status, newData.DelState, newData.Version, newData.PayTime, newData.RefundTime, newData.CloseTime, newData.DeleteTime, newData.Id, oldVersion)
}, hmOrderIdKey, hmOrderOrderNoKey)
}, yccOrderIdKey, yccOrderOrderNoKey)
if err != nil {
return err
}
@@ -387,25 +405,25 @@ func (m *defaultOrderModel) Trans(ctx context.Context, fn func(ctx context.Conte
func (m *defaultOrderModel) SelectBuilder() squirrel.SelectBuilder {
return squirrel.Select().From(m.table)
}
func (m *defaultOrderModel) Delete(ctx context.Context, session sqlx.Session, id int64) error {
func (m *defaultOrderModel) Delete(ctx context.Context, session sqlx.Session, id string) error {
data, err := m.FindOne(ctx, id)
if err != nil {
return err
}
hmOrderIdKey := fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, id)
hmOrderOrderNoKey := fmt.Sprintf("%s%v", cacheHmOrderOrderNoPrefix, data.OrderNo)
yccOrderIdKey := fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, id)
yccOrderOrderNoKey := fmt.Sprintf("%s%v", cacheYccOrderOrderNoPrefix, data.OrderNo)
_, err = m.ExecCtx(ctx, func(ctx context.Context, conn sqlx.SqlConn) (result sql.Result, err error) {
query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
if session != nil {
return session.ExecCtx(ctx, query, id)
}
return conn.ExecCtx(ctx, query, id)
}, hmOrderIdKey, hmOrderOrderNoKey)
}, yccOrderIdKey, yccOrderOrderNoKey)
return err
}
func (m *defaultOrderModel) formatPrimary(primary interface{}) string {
return fmt.Sprintf("%s%v", cacheHmOrderIdPrefix, primary)
return fmt.Sprintf("%s%v", cacheYccOrderIdPrefix, primary)
}
func (m *defaultOrderModel) queryPrimary(ctx context.Context, conn sqlx.SqlConn, v, primary interface{}) error {
query := fmt.Sprintf("select %s from %s where `id` = ? and del_state = ? limit 1", orderRows, m.table)