Files
arenax-server/internal/logic/store/store.go
2025-06-11 16:01:00 +08:00

155 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package store
import (
"context"
"github.com/gogf/gf/v2/database/gdb"
"server/internal/consts"
"server/internal/dao"
"server/internal/model"
"server/internal/model/do"
"server/internal/service"
"server/utility/ecode"
"server/utility/snowid"
)
type sStore struct {
}
func New() service.IStore {
return &sStore{}
}
func init() {
service.RegisterStore(New())
}
func (s *sStore) List(ctx context.Context, in *model.StoreListIn) (out *model.StoreListOut, err error) {
// 1. 初始化返回数据
list := make([]model.Store, 0)
var total int
if err = dao.Stores.Ctx(ctx).Page(in.Page, in.Size).ScanAndCount(&list, &total, false); err != nil {
return nil, ecode.Fail.Sub("门店列表获取失败")
}
return &model.StoreListOut{
List: list,
Total: total,
}, nil
}
func (s *sStore) Create(ctx context.Context, in *model.StoreCreateIn) (out *model.CreateOut, err error) {
out = &model.CreateOut{}
// 1. 检查门店名称是否重复
exist, err := dao.Stores.Ctx(ctx).Where(do.Stores{Name: in.Name}).Exist()
if err != nil {
return nil, ecode.Fail.Sub("新增门店查重出现异常")
}
if exist {
return nil, ecode.Params.Sub("门店名称已存在")
}
// 2. 使用事务处理数据插入
if err = dao.Stores.Transaction(ctx, func(ctx context.Context, tx gdb.TX) (err error) {
// 2.1 根据商户 id 获取所属的商户
value, err := dao.MerchantAdmins.Ctx(ctx).WherePri(in.OperatorId).Fields(dao.MerchantAdmins.Columns().MerchantId).Value()
if err != nil {
return ecode.Fail.Sub("获取商户ID出现异常")
}
// 2,2 生成门店的相关信息
code, err := snowid.GetSnowClient().GenerateStoreCode()
if err != nil {
return ecode.Fail.Sub("生成门店ID出现异常")
}
// 2.3 插入门店数据
id, err := tx.Model(dao.Stores.Table()).Data(do.Stores{
MerchantId: value.Int(),
StoreCode: code,
Name: in.Name,
Address: in.Address,
ContactName: in.ContactName,
ContactPhone: in.ContactPhone,
}).InsertAndGetId()
if err != nil {
return ecode.Fail.Sub("新增门店出现异常")
}
// TODO 生成门店主管理账号,密码通知方式
// 2.5 插入门店管理员数据
_, err = tx.Model(dao.StoreAdmins.Table()).Data(do.StoreAdmins{
StoreId: id,
}).Insert()
if err != nil {
return ecode.Fail.Sub("新增门店管理员出现异常")
}
out.Id = id
return nil
}); err != nil {
return nil, err
}
return
}
func (s *sStore) Update(ctx context.Context, in *model.StoreUpdateIn) (out *model.UpdateOut, err error) {
exist, err := dao.Stores.Ctx(ctx).WherePri(in.Id).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询门店出现异常")
}
if !exist {
return nil, ecode.Params.Sub("门店不存在")
}
if in.OperatorId == 0 || (in.OperatorRole != consts.MerchantRoleCode && in.OperatorRole != consts.StoreRoleCode) {
return nil, ecode.InvalidOperation.Sub("无权限操作")
}
if in.Name != "" {
exist, err = dao.Stores.Ctx(ctx).Where(dao.Stores.Columns().Name, in.Name).WhereNot(dao.Stores.Columns().Id, in.Id).Exist()
if err != nil {
return nil, ecode.Fail.Sub("检查门店名称出现异常")
}
if exist {
return nil, ecode.Params.Sub("门店名称已存在")
}
}
_, err = dao.Stores.Ctx(ctx).WherePri(in.Id).Data(do.Stores{
Name: in.Name,
Address: in.Address,
ContactName: in.ContactName,
ContactPhone: in.ContactPhone, // TODO暂定可以直接修改后续可能需要验证手机号
Status: in.Status,
}).Update()
if err != nil {
return nil, ecode.Fail.Sub("更新门店出现异常")
}
return &model.UpdateOut{Success: true}, nil
}
func (s *sStore) Delete(ctx context.Context, in *model.StoreDeleteIn) (out *model.DeleteOut, err error) {
exist, err := dao.Stores.Ctx(ctx).WherePri(in.Id).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询门店出现异常")
}
if !exist {
return nil, ecode.Params.Sub("门店不存在")
}
if in.OperatorId == 0 || (in.OperatorRole != consts.MerchantRoleCode) {
return nil, ecode.InvalidOperation.Sub("无权限操作")
}
// TODO: 是否需要检查门店下存在未发放奖励等
return &model.DeleteOut{Success: true}, nil
}
func (s *sStore) Info(ctx context.Context, in *model.StoreInfoIn) (out *model.StoreInfoOut, err error) {
exist, err := dao.Stores.Ctx(ctx).Where(do.Stores{Id: in.Id}).Exist()
if err != nil {
return nil, ecode.Fail.Sub("查询门店出现异常")
}
if !exist {
return nil, ecode.Params.Sub("门店不存在")
}
// TODO 获取门店信息等相关信息
return
}