@@ -2,27 +2,13 @@ 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
|
||||
mappings, err := repository.ListEnabledSybShopMappings(db)
|
||||
return len(mappings), err
|
||||
}
|
||||
|
||||
func EnsureEnabledSybAllowedShops(db *sql.DB) error {
|
||||
@@ -31,69 +17,7 @@ func EnsureEnabledSybAllowedShops(db *sql.DB) error {
|
||||
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 &validationError{field: "shop_name", message: "没有启用的顺运宝同步店铺,请先由管理员在店铺管理中配置并启用至少一个 SYB 店铺"}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user