作者 陈志颖

feat:添加订单产品领域模型

... ... @@ -101,3 +101,11 @@ func CreateDividendsReturnedOrderRepository(options map[string]interface{}) (dom
}
return repository.NewDividendsReturnedOrderRepository(transactionContext)
}
func CreateOrderGoodRepository(options map[string]interface{}) (domain.OrderGoodRepository, error) {
var transactionContext *pg.TransactionContext
if value, ok := options["transactionContext"]; ok {
transactionContext = value.(*pg.TransactionContext)
}
return repository.NewOrderGoodRepository(transactionContext)
}
... ...
package domain
import "time"
// OrderGood 订单产品领域实体(包括分红订单、分红退货单)
type OrderGood struct {
// 订单产品
OrderGoodId int64 `json:"orderGoodId,string"`
// 订单产品金额
OrderGoodAmount float64 `json:"orderGoodAmount"`
// 订单产品名称
OrderGoodName string `json:"orderGoodName"`
// 订单产品单价
OrderGoodPrice float64 `json:"orderGoodPrice"`
// 订单产品数量
OrderGoodQuantity int64 `json:"orderGoodQuantity,string"`
// 关联分红订单号
DividendsOrderNumber int64 `json:"dividendsOrderNumber,string"`
// 关联的共创合约编号
CooperationContractNumber string `json:"cooperationContractNumber"`
// 订单产品费用
OrderGoodExpense float64 `json:"orderGoodExpense"`
// 创建时间
CreatedAt time.Time `json:"createdAt"`
// 删除时间
DeletedAt time.Time `json:"deletedAt"`
// 更新时间
UpdatedAt time.Time `json:"updatedAt"`
}
type OrderGoodRepository interface {
Save(orderGood *OrderGood) (*OrderGood, error)
Remove(orderGood *OrderGood) (*OrderGood, error)
FindOne(queryOptions map[string]interface{}) (*OrderGood, error)
Find(queryOptions map[string]interface{}) (int64, []*OrderGood, error)
}
func (orderGood *OrderGood) Identify() interface{} {
if orderGood.OrderGoodId == 0 {
return nil
}
return orderGood.OrderGoodId
}
func (orderGood *OrderGood) Update(data map[string]interface{}) error {
if orderGoodAmount, ok := data["orderGoodAmount"]; ok {
orderGood.OrderGoodAmount = orderGoodAmount.(float64)
}
if orderGoodName, ok := data["orderGoodName"]; ok {
orderGood.OrderGoodName = orderGoodName.(string)
}
if orderGoodPrice, ok := data["orderGoodPrice"]; ok {
orderGood.OrderGoodPrice = orderGoodPrice.(float64)
}
if orderGoodQuantity, ok := data["orderGoodQuantity"]; ok {
orderGood.OrderGoodQuantity = orderGoodQuantity.(int64)
}
if dividendsOrderNumber, ok := data["dividendsOrderNumber"]; ok {
orderGood.DividendsOrderNumber = dividendsOrderNumber.(int64)
}
if cooperationContractNumber, ok := data["cooperationContractNumber"]; ok {
orderGood.CooperationContractNumber = cooperationContractNumber.(string)
}
if orderGoodExpense, ok := data["orderGoodExpense"]; ok {
orderGood.OrderGoodExpense = orderGoodExpense.(float64)
}
if updatedAt, ok := data["updatedAt"]; ok {
orderGood.UpdatedAt = updatedAt.(time.Time)
}
return nil
}
... ...
package models
import "time"
type OrderGood struct {
tableName string `comment:"订单产品领域实体(包括分红订单、分红退货单)" pg:"order_goods,alias:order_good"`
// 订单产品
OrderGoodId int64 `comment:"订单产品" pg:"pk:order_good_id"`
// 订单产品金额
OrderGoodAmount float64 `comment:"订单产品金额"`
// 订单产品名称
OrderGoodName string `comment:"订单产品名称"`
// 订单产品单价
OrderGoodPrice float64 `comment:"订单产品单价"`
// 订单产品数量
OrderGoodQuantity int64 `comment:"订单产品数量"`
// 关联分红订单号
DividendsOrderNumber int64 `comment:"关联分红订单号"`
// 关联的共创合约编号
CooperationContractNumber string `comment:"关联的共创合约编号"`
// 订单产品费用
OrderGoodExpense float64 `comment:"订单产品费用"`
// 创建时间
CreatedAt time.Time `comment:"创建时间"`
// 删除时间
DeletedAt time.Time `comment:"删除时间"`
// 更新时间
UpdatedAt time.Time `comment:"更新时间"`
}
... ...
package transform
import (
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/pg/models"
)
func TransformToOrderGoodDomainModelFromPgModels(orderGoodModel *models.OrderGood) (*domain.OrderGood, error) {
return &domain.OrderGood{
OrderGoodId: orderGoodModel.OrderGoodId,
OrderGoodAmount: orderGoodModel.OrderGoodAmount,
OrderGoodName: orderGoodModel.OrderGoodName,
OrderGoodPrice: orderGoodModel.OrderGoodPrice,
OrderGoodQuantity: orderGoodModel.OrderGoodQuantity,
DividendsOrderNumber: orderGoodModel.DividendsOrderNumber,
CooperationContractNumber: orderGoodModel.CooperationContractNumber,
OrderGoodExpense: orderGoodModel.OrderGoodExpense,
CreatedAt: orderGoodModel.CreatedAt,
DeletedAt: orderGoodModel.DeletedAt,
UpdatedAt: orderGoodModel.UpdatedAt,
}, nil
}
... ...
package repository
import (
"fmt"
"github.com/go-pg/pg/v10"
"github.com/linmadan/egglib-go/persistent/pg/sqlbuilder"
pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
"github.com/linmadan/egglib-go/utils/snowflake"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/domain"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/pg/models"
"gitlab.fjmaimaimai.com/allied-creation/allied-creation-cooperation/pkg/infrastructure/pg/transform"
)
type OrderGoodRepository struct {
transactionContext *pgTransaction.TransactionContext
}
func (repository *OrderGoodRepository) nextIdentify() (int64, error) {
IdWorker, err := snowflake.NewIdWorker(1)
if err != nil {
return 0, err
}
id, err := IdWorker.NextId()
return id, err
}
func (repository *OrderGoodRepository) Save(orderGood *domain.OrderGood) (*domain.OrderGood, error) {
sqlBuildFields := []string{
"order_good_id",
"order_good_amount",
"order_good_name",
"order_good_price",
"order_good_quantity",
"dividends_order_number",
"cooperation_contract_number",
"order_good_expense",
"created_at",
"deleted_at",
"updated_at",
}
insertFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
insertPlaceHoldersSnippet := sqlbuilder.SqlPlaceHoldersSnippet(sqlBuildFields)
returningFieldsSnippet := sqlbuilder.SqlFieldsSnippet(sqlBuildFields)
updateFields := sqlbuilder.RemoveSqlFields(sqlBuildFields, "orderGood_id")
updateFieldsSnippet := sqlbuilder.SqlUpdateFieldsSnippet(updateFields)
tx := repository.transactionContext.PgTx
if orderGood.Identify() == nil {
orderGoodId, err := repository.nextIdentify()
if err != nil {
return orderGood, err
} else {
orderGood.OrderGoodId = orderGoodId
}
if _, err := tx.QueryOne(
pg.Scan(
&orderGood.OrderGoodId,
&orderGood.OrderGoodAmount,
&orderGood.OrderGoodName,
&orderGood.OrderGoodPrice,
&orderGood.OrderGoodQuantity,
&orderGood.DividendsOrderNumber,
&orderGood.CooperationContractNumber,
&orderGood.OrderGoodExpense,
&orderGood.CreatedAt,
&orderGood.DeletedAt,
&orderGood.UpdatedAt,
),
fmt.Sprintf("INSERT INTO order_goods (%s) VALUES (%s) RETURNING %s", insertFieldsSnippet, insertPlaceHoldersSnippet, returningFieldsSnippet),
orderGood.OrderGoodId,
orderGood.OrderGoodAmount,
orderGood.OrderGoodName,
orderGood.OrderGoodPrice,
orderGood.OrderGoodQuantity,
orderGood.DividendsOrderNumber,
orderGood.CooperationContractNumber,
orderGood.OrderGoodExpense,
orderGood.CreatedAt,
orderGood.DeletedAt,
orderGood.UpdatedAt,
); err != nil {
return orderGood, err
}
} else {
if _, err := tx.QueryOne(
pg.Scan(
&orderGood.OrderGoodId,
&orderGood.OrderGoodAmount,
&orderGood.OrderGoodName,
&orderGood.OrderGoodPrice,
&orderGood.OrderGoodQuantity,
&orderGood.DividendsOrderNumber,
&orderGood.CooperationContractNumber,
&orderGood.OrderGoodExpense,
&orderGood.CreatedAt,
&orderGood.DeletedAt,
&orderGood.UpdatedAt,
),
fmt.Sprintf("UPDATE order_goods SET %s WHERE order_good_id=? RETURNING %s", updateFieldsSnippet, returningFieldsSnippet),
orderGood.OrderGoodId,
orderGood.OrderGoodAmount,
orderGood.OrderGoodName,
orderGood.OrderGoodPrice,
orderGood.OrderGoodQuantity,
orderGood.DividendsOrderNumber,
orderGood.CooperationContractNumber,
orderGood.OrderGoodExpense,
orderGood.CreatedAt,
orderGood.DeletedAt,
orderGood.UpdatedAt,
orderGood.Identify(),
); err != nil {
return orderGood, err
}
}
return orderGood, nil
}
func (repository *OrderGoodRepository) Remove(orderGood *domain.OrderGood) (*domain.OrderGood, error) {
tx := repository.transactionContext.PgTx
orderGoodModel := new(models.OrderGood)
orderGoodModel.OrderGoodId = orderGood.Identify().(int64)
if _, err := tx.Model(orderGoodModel).WherePK().Delete(); err != nil {
return orderGood, err
}
return orderGood, nil
}
func (repository *OrderGoodRepository) FindOne(queryOptions map[string]interface{}) (*domain.OrderGood, error) {
tx := repository.transactionContext.PgTx
orderGoodModel := new(models.OrderGood)
query := sqlbuilder.BuildQuery(tx.Model(orderGoodModel), queryOptions)
query.SetWhereByQueryOption("order_good.order_good_id = ?", "orderGoodId")
if err := query.First(); err != nil {
if err.Error() == "pg: no rows in result set" {
return nil, fmt.Errorf("没有此资源")
} else {
return nil, err
}
}
if orderGoodModel.OrderGoodId == 0 {
return nil, nil
} else {
return transform.TransformToOrderGoodDomainModelFromPgModels(orderGoodModel)
}
}
func (repository *OrderGoodRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.OrderGood, error) {
tx := repository.transactionContext.PgTx
var orderGoodModels []*models.OrderGood
orderGoods := make([]*domain.OrderGood, 0)
query := sqlbuilder.BuildQuery(tx.Model(&orderGoodModels), queryOptions)
query.SetOffsetAndLimit(20)
query.SetOrderDirect("order_good_id", "DESC")
if count, err := query.SelectAndCount(); err != nil {
return 0, orderGoods, err
} else {
for _, orderGoodModel := range orderGoodModels {
if orderGood, err := transform.TransformToOrderGoodDomainModelFromPgModels(orderGoodModel); err != nil {
return 0, orderGoods, err
} else {
orderGoods = append(orderGoods, orderGood)
}
}
return int64(count), orderGoods, nil
}
}
func NewOrderGoodRepository(transactionContext *pgTransaction.TransactionContext) (*OrderGoodRepository, error) {
if transactionContext == nil {
return nil, fmt.Errorf("transactionContext参数不能为nil")
} else {
return &OrderGoodRepository{
transactionContext: transactionContext,
}, nil
}
}
... ...