重构提取逻辑,新增 area 表
This commit is contained in:
112
web/services/area.go
Normal file
112
web/services/area.go
Normal file
@@ -0,0 +1,112 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"platform/pkg/u"
|
||||
"platform/web/core"
|
||||
m "platform/web/models"
|
||||
q "platform/web/queries"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var Area = &areaService{}
|
||||
|
||||
type areaService struct{}
|
||||
|
||||
func (s *areaService) ListAreas() ([]*m.Area, error) {
|
||||
areas, err := q.Area.
|
||||
Order(q.Area.Level, q.Area.ParentID, q.Area.ID).
|
||||
Find()
|
||||
if err != nil {
|
||||
return nil, core.NewServErr("查询地区失败", err)
|
||||
}
|
||||
return areas, nil
|
||||
}
|
||||
|
||||
func (s *areaService) FindIdByFilter(prov *string, city *string) (*int32, error) {
|
||||
prov = u.N(prov)
|
||||
city = u.N(city)
|
||||
if prov == nil && city == nil {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
switch {
|
||||
case prov != nil && city == nil:
|
||||
area, err := q.Area.
|
||||
Where(
|
||||
q.Area.Level.Eq(int(m.AreaLevelProvince)),
|
||||
q.Area.Name.Eq(*prov),
|
||||
).
|
||||
Order(q.Area.ID).
|
||||
Take()
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, ErrAreaNotExist
|
||||
}
|
||||
if err != nil {
|
||||
return nil, core.NewServErr("查询地区失败", err)
|
||||
}
|
||||
return u.P(area.ID), nil
|
||||
case prov == nil && city != nil:
|
||||
area, err := q.Area.
|
||||
Where(
|
||||
q.Area.Level.Eq(int(m.AreaLevelCity)),
|
||||
q.Area.Name.Eq(*city),
|
||||
).
|
||||
Order(q.Area.ID).
|
||||
Take()
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, ErrAreaNotExist
|
||||
}
|
||||
if err != nil {
|
||||
return nil, core.NewServErr("查询地区失败", err)
|
||||
}
|
||||
return u.P(area.ID), nil
|
||||
default:
|
||||
province, err := q.Area.
|
||||
Where(
|
||||
q.Area.Level.Eq(int(m.AreaLevelProvince)),
|
||||
q.Area.Name.Eq(*prov),
|
||||
).
|
||||
Order(q.Area.ID).
|
||||
Take()
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, ErrAreaNotExist
|
||||
}
|
||||
if err != nil {
|
||||
return nil, core.NewServErr("查询地区失败", err)
|
||||
}
|
||||
|
||||
area, err := q.Area.
|
||||
Where(
|
||||
q.Area.ParentID.Eq(province.ID),
|
||||
q.Area.Level.Eq(int(m.AreaLevelCity)),
|
||||
q.Area.Name.Eq(*city),
|
||||
).
|
||||
Order(q.Area.ID).
|
||||
Take()
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, ErrAreaNotExist
|
||||
}
|
||||
if err != nil {
|
||||
return nil, core.NewServErr("查询地区失败", err)
|
||||
}
|
||||
return u.P(area.ID), nil
|
||||
}
|
||||
}
|
||||
|
||||
func (s *areaService) Get(id int32) (*m.Area, error) {
|
||||
area, err := q.Area.
|
||||
Preload(q.Area.Parent).
|
||||
Where(q.Area.ID.Eq(id)).
|
||||
Take()
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, ErrAreaNotExist
|
||||
}
|
||||
if err != nil {
|
||||
return nil, core.NewServErr("查询地区失败", err)
|
||||
}
|
||||
return area, nil
|
||||
}
|
||||
|
||||
var ErrAreaNotExist = core.NewBizErr("地区不存在")
|
||||
Reference in New Issue
Block a user