feat: 删除已停用的同步店铺 (#197)
This commit is contained in:
@@ -78,3 +78,22 @@ func SetSybAllowedShopEnabled(db *sql.DB, actor *model.User, shopID string, enab
|
||||
}
|
||||
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
|
||||
}
|
||||
|
||||
@@ -22,6 +22,18 @@ func TestSybAllowedShop_管理员维护与精确去重(t *testing.T) {
|
||||
if err := CreateSybAllowedShop(db, admin, " qwg8fkb044 ", now); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := repository.UpsertSybOrder(db, model.SybOrder{
|
||||
SybID: "SHOP-HISTORY", OrderNo: "ORDER-HISTORY", ShopName: "qwg8fkb044",
|
||||
Quantity: 1, SybData: `{}`, CreatedAt: model.NowISO(), UpdatedAt: model.NowISO(),
|
||||
}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := repository.CreateSybSyncRun(db, model.SybSyncRun{
|
||||
RunID: "SHOP-RUN-HISTORY", UserID: admin.UserID, DateFrom: "2026-08-12",
|
||||
DateTo: "2026-08-12", Status: model.SybSyncRunning, StartedAt: model.NowISO(),
|
||||
}); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
rows, err := ListSybAllowedShops(db, admin)
|
||||
if err != nil || len(rows) != 1 || rows[0].ShopName != "qwg8fkb044" || !rows[0].Enabled {
|
||||
t.Fatalf("新增结果错误: rows=%+v err=%v", rows, err)
|
||||
@@ -38,6 +50,25 @@ func TestSybAllowedShop_管理员维护与精确去重(t *testing.T) {
|
||||
if err := EnsureEnabledSybAllowedShops(db); !IsValidationError(err) {
|
||||
t.Fatalf("空白名单应阻止同步: %v", err)
|
||||
}
|
||||
if err := DeleteDisabledSybAllowedShop(db, admin, rows[0].ShopID); err != nil {
|
||||
t.Fatalf("删除已停用店铺失败: %v", err)
|
||||
}
|
||||
if list, err := ListSybAllowedShops(db, admin); err != nil || len(list) != 0 {
|
||||
t.Fatalf("删除后仍存在: rows=%+v err=%v", list, err)
|
||||
}
|
||||
if count, err := repository.CountSybOrdersTotal(db); err != nil || count != 1 {
|
||||
t.Fatalf("删除配置不应影响历史货运单: count=%d err=%v", count, err)
|
||||
}
|
||||
if count, err := repository.CountSybSyncRuns(db); err != nil || count != 1 {
|
||||
t.Fatalf("删除配置不应影响同步记录: count=%d err=%v", count, err)
|
||||
}
|
||||
if err := CreateSybAllowedShop(db, admin, "qwg8fkb044", now.Add(2*time.Minute)); err != nil {
|
||||
t.Fatalf("删除后应允许重新新增同名店铺: %v", err)
|
||||
}
|
||||
newRows, _ := ListSybAllowedShops(db, admin)
|
||||
if err := DeleteDisabledSybAllowedShop(db, admin, newRows[0].ShopID); !IsValidationError(err) {
|
||||
t.Fatalf("启用店铺必须拒绝删除: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestSybAllowedShop_采购员不能管理(t *testing.T) {
|
||||
@@ -48,4 +79,7 @@ func TestSybAllowedShop_采购员不能管理(t *testing.T) {
|
||||
if _, err := ListSybAllowedShops(nil, purchaser); !errors.Is(err, ErrAdminRequired) {
|
||||
t.Fatalf("采购员读取管理列表应被拒绝: %v", err)
|
||||
}
|
||||
if err := DeleteDisabledSybAllowedShop(nil, purchaser, "SHOP-1"); !errors.Is(err, ErrAdminRequired) {
|
||||
t.Fatalf("采购员删除应被拒绝: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user