118 lines
3.8 KiB
Go
118 lines
3.8 KiB
Go
package mohong
|
||
|
||
import (
|
||
"context"
|
||
"strings"
|
||
|
||
"hfb_sys/backend/internal/model"
|
||
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/clause"
|
||
)
|
||
|
||
const (
|
||
configKeyDefaultQrcodeURL = "mohong.default_qrcode_url"
|
||
configKeyGroupWelcomeText = "mohong.group_welcome_text"
|
||
configKeyOrderCopyTemplate = "mohong.order_copy_template"
|
||
|
||
defaultGroupWelcomeText = "订单已支付,请扫码联系客服,并将下方订单信息复制发送给客服。"
|
||
defaultOrderCopyTemplate = "【摸大红订单】\n订单号:{{order_no}}\n下单时间:{{created_at}}\n商品:{{product_title}}\n数量:{{quantity}}\n金额:{{amount}}\n下单人:{{buyer_name}}({{buyer_phone}})"
|
||
)
|
||
|
||
func (r *Repository) GetConfig(ctx context.Context) (*ConfigDTO, error) {
|
||
if r.db == nil {
|
||
return nil, ErrDependencyUnavailable
|
||
}
|
||
keys := []string{configKeyDefaultQrcodeURL, configKeyGroupWelcomeText, configKeyOrderCopyTemplate}
|
||
var rows []model.SystemConfig
|
||
if err := r.db.WithContext(ctx).Where("`key` IN ?", keys).Find(&rows).Error; err != nil {
|
||
return nil, err
|
||
}
|
||
values := map[string]string{}
|
||
for _, row := range rows {
|
||
values[row.Key] = row.Value
|
||
}
|
||
return &ConfigDTO{
|
||
DefaultQrcodeURL: strings.TrimSpace(values[configKeyDefaultQrcodeURL]),
|
||
GroupWelcomeText: firstNonEmpty(values[configKeyGroupWelcomeText], defaultGroupWelcomeText),
|
||
OrderCopyTemplate: firstNonEmpty(values[configKeyOrderCopyTemplate], defaultOrderCopyTemplate),
|
||
}, nil
|
||
}
|
||
|
||
func (r *Repository) UpdateConfig(ctx context.Context, req UpdateConfigRequest) (*ConfigDTO, error) {
|
||
if r.db == nil {
|
||
return nil, ErrDependencyUnavailable
|
||
}
|
||
err := r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
||
if req.DefaultQrcodeURL != nil {
|
||
if err := upsertConfig(tx, configKeyDefaultQrcodeURL, strings.TrimSpace(*req.DefaultQrcodeURL), "摸大红全局默认固定二维码图片URL"); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
if req.GroupWelcomeText != nil {
|
||
if err := upsertConfig(tx, configKeyGroupWelcomeText, strings.TrimSpace(*req.GroupWelcomeText), "摸大红订单群欢迎语"); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
if req.OrderCopyTemplate != nil {
|
||
if err := upsertConfig(tx, configKeyOrderCopyTemplate, strings.TrimSpace(*req.OrderCopyTemplate), "摸大红订单一键复制文案模板"); err != nil {
|
||
return err
|
||
}
|
||
}
|
||
return nil
|
||
})
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
return r.GetConfig(ctx)
|
||
}
|
||
|
||
func upsertConfig(tx *gorm.DB, key, value, description string) error {
|
||
row := model.SystemConfig{
|
||
Key: key,
|
||
Value: value,
|
||
Description: description,
|
||
}
|
||
return tx.Clauses(clause.OnConflict{
|
||
Columns: []clause.Column{{Name: "key"}},
|
||
DoUpdates: clause.AssignmentColumns([]string{"value", "description"}),
|
||
}).Create(&row).Error
|
||
}
|
||
|
||
func firstNonEmpty(values ...string) string {
|
||
for _, v := range values {
|
||
if strings.TrimSpace(v) != "" {
|
||
return strings.TrimSpace(v)
|
||
}
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func (r *Repository) resolveQrcodeURL(tx *gorm.DB, productQrcode string) string {
|
||
productQrcode = strings.TrimSpace(productQrcode)
|
||
if productQrcode != "" {
|
||
return productQrcode
|
||
}
|
||
var cfg model.SystemConfig
|
||
if err := tx.Where("`key` = ?", configKeyDefaultQrcodeURL).First(&cfg).Error; err == nil {
|
||
return strings.TrimSpace(cfg.Value)
|
||
}
|
||
return ""
|
||
}
|
||
|
||
func (r *Repository) loadWelcomeText(tx *gorm.DB) string {
|
||
var cfg model.SystemConfig
|
||
if err := tx.Where("`key` = ?", configKeyGroupWelcomeText).First(&cfg).Error; err == nil && strings.TrimSpace(cfg.Value) != "" {
|
||
return strings.TrimSpace(cfg.Value)
|
||
}
|
||
return defaultGroupWelcomeText
|
||
}
|
||
|
||
func (r *Repository) loadCopyTemplate(tx *gorm.DB) string {
|
||
var cfg model.SystemConfig
|
||
if err := tx.Where("`key` = ?", configKeyOrderCopyTemplate).First(&cfg).Error; err == nil && strings.TrimSpace(cfg.Value) != "" {
|
||
return strings.TrimSpace(cfg.Value)
|
||
}
|
||
return defaultOrderCopyTemplate
|
||
}
|