100 lines
3.0 KiB
Go
100 lines
3.0 KiB
Go
package service
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"cmautobuy/admin/model"
|
|
"cmautobuy/admin/repository"
|
|
)
|
|
|
|
const maxSybShopNameLength = 500
|
|
|
|
func ListSybAllowedShops(db *sql.DB, actor *model.User) ([]model.SybAllowedShop, error) {
|
|
if actor == nil || !actor.IsAdmin() {
|
|
return nil, ErrAdminRequired
|
|
}
|
|
return repository.ListSybAllowedShops(db)
|
|
}
|
|
|
|
func CountEnabledSybAllowedShops(db *sql.DB) (int, error) {
|
|
names, err := repository.ListEnabledSybShopNames(db)
|
|
return len(names), err
|
|
}
|
|
|
|
func EnsureEnabledSybAllowedShops(db *sql.DB) error {
|
|
count, err := CountEnabledSybAllowedShops(db)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if count == 0 {
|
|
return &validationError{field: "shop_name", message: "没有启用的顺运宝同步店铺,请先由管理员配置并启用至少一个店铺"}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func CreateSybAllowedShop(db *sql.DB, actor *model.User, rawName string, now time.Time) error {
|
|
if actor == nil || !actor.IsAdmin() {
|
|
return ErrAdminRequired
|
|
}
|
|
name := strings.TrimSpace(rawName)
|
|
if name == "" {
|
|
return &validationError{field: "shop_name", message: "店铺名称不能为空"}
|
|
}
|
|
if len([]rune(name)) > maxSybShopNameLength {
|
|
return &validationError{field: "shop_name", message: "店铺名称最多 500 个字符"}
|
|
}
|
|
id, err := randomID("SHOP-", 16)
|
|
if err != nil {
|
|
return fmt.Errorf("生成店铺编号失败: %w", err)
|
|
}
|
|
at := now.UTC().Format(model.TimeLayout)
|
|
err = repository.InsertSybAllowedShop(db, model.SybAllowedShop{
|
|
ShopID: id, ShopName: name, NormalizedName: name, Enabled: true,
|
|
CreatedByUserID: actor.UserID, CreatedAt: at, UpdatedAt: at,
|
|
})
|
|
if errors.Is(err, repository.ErrSybAllowedShopExists) {
|
|
return &validationError{field: "shop_name", message: "该店铺已经在允许列表中,可直接重新启用"}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func SetSybAllowedShopEnabled(db *sql.DB, actor *model.User, shopID string, enabled bool, now time.Time) error {
|
|
if actor == nil || !actor.IsAdmin() {
|
|
return ErrAdminRequired
|
|
}
|
|
if strings.TrimSpace(shopID) == "" {
|
|
return &validationError{field: "shop_id", message: "店铺编号不能为空"}
|
|
}
|
|
found, err := repository.SetSybAllowedShopEnabled(db, shopID, enabled, now.UTC().Format(model.TimeLayout))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !found {
|
|
return &validationError{field: "shop_id", message: "店铺不存在,请刷新页面后重试"}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// DeleteDisabledSybAllowedShop 永久删除一条已停用配置,不影响历史货运单和同步记录。
|
|
func DeleteDisabledSybAllowedShop(db *sql.DB, actor *model.User, shopID string) error {
|
|
if actor == nil || !actor.IsAdmin() {
|
|
return ErrAdminRequired
|
|
}
|
|
shopID = strings.TrimSpace(shopID)
|
|
if shopID == "" {
|
|
return &validationError{field: "shop_id", message: "店铺编号不能为空"}
|
|
}
|
|
deleted, err := repository.DeleteDisabledSybAllowedShop(db, shopID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if !deleted {
|
|
return &validationError{field: "shop_id", message: "店铺不存在或仍在启用,请刷新页面并先停用后再删除"}
|
|
}
|
|
return nil
|
|
}
|