From 6e9779bd935f5be0f4e02371f76846e291e77142 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=B6=9B?= Date: Sun, 14 Aug 2022 16:14:25 +0800 Subject: [PATCH] =?UTF-8?q?feat(region):=E5=A2=9E=E5=8A=A0=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=85=A8=E9=83=A8=E7=BA=A7=E5=88=AB=E8=A1=8C=E6=94=BF?= =?UTF-8?q?=E5=8C=BA=E5=88=92=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controller/region.go | 16 ++++++++++++++++ repository/region.go | 24 ++++++++++++++++++++++++ service/region.go | 18 ++++++++++++++++++ 3 files changed, 58 insertions(+) create mode 100644 repository/region.go diff --git a/controller/region.go b/controller/region.go index 19268e9..4a4dc4f 100644 --- a/controller/region.go +++ b/controller/region.go @@ -20,6 +20,7 @@ func InitializeRegionController(router *gin.Engine) { } RegionController.Router.GET("/region/:rid", RegionController.FetchRegions) + RegionController.Router.GET("/regions/:rid", RegionController.FetchAllLeveledRegions) } func (_RegionController) FetchRegions(c *gin.Context) { @@ -36,3 +37,18 @@ func (_RegionController) FetchRegions(c *gin.Context) { } result.Json(http.StatusOK, "已经获取到相关的行政区划。", gin.H{"regions": regions}) } + +func (_RegionController) FetchAllLeveledRegions(c *gin.Context) { + result := response.NewResult(c) + requestRegionCode := c.Param("rid") + regions, err := service.RegionService.FetchAllParentRegions(requestRegionCode) + if err != nil { + result.Error(http.StatusInternalServerError, err.Error()) + return + } + if len(regions) == 0 { + result.Json(http.StatusNotFound, "未能获取到相关的行政区划。", gin.H{"regions": make([]string, 0)}) + return + } + result.Json(http.StatusOK, "以及获取到相关的行政区划。", gin.H{"regions": regions}) +} diff --git a/repository/region.go b/repository/region.go new file mode 100644 index 0000000..49d2bc1 --- /dev/null +++ b/repository/region.go @@ -0,0 +1,24 @@ +package repository + +import ( + "electricity_bill_calc/cache" + "electricity_bill_calc/global" + "electricity_bill_calc/model" +) + +type _RegionRepository struct{} + +var RegionRepository _RegionRepository + +func (_RegionRepository) FetchRegion(code string) (*model.Region, error) { + cachedRegion, _ := cache.RetreiveData[model.Region]("region", code) + if cachedRegion != nil { + return cachedRegion, nil + } + region := new(model.Region) + has, err := global.DBConn.ID(code).NoAutoCondition().Get(region) + if has { + cache.CacheData(region, "region", code) + } + return _postProcessSingle(region, has, err) +} diff --git a/service/region.go b/service/region.go index dd85d22..71da886 100644 --- a/service/region.go +++ b/service/region.go @@ -3,6 +3,7 @@ package service import ( "electricity_bill_calc/global" "electricity_bill_calc/model" + "electricity_bill_calc/repository" "xorm.io/builder" ) @@ -19,3 +20,20 @@ func (_RegionService) FetchSubRegions(parent string) ([]model.Region, error) { } return regions, err } + +func (_RegionService) FetchAllParentRegions(code string) ([]model.Region, error) { + regions := make([]model.Region, 0) + region, err := repository.RegionRepository.FetchRegion(code) + if err != nil { + return regions, err + } + regions = append(regions, *region) + for region.Level > 1 { + region, err = repository.RegionRepository.FetchRegion(region.Parent) + if err != nil { + return make([]model.Region, 0), nil + } + regions = append(regions, *region) + } + return regions, nil +}