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("地区不存在")