113 lines
2.4 KiB
Go
113 lines
2.4 KiB
Go
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("地区不存在")
|