Files
monibuca/plugin/gb28181/pkg/civilcodeutil.go

127 lines
2.9 KiB
Go

package gb28181
import (
"strings"
"sync"
)
// CivilCodeUtil 行政区划编码工具类
type CivilCodeUtil struct {
// 用于消息的缓存
civilCodeMap sync.Map // map[string]*CivilCode
}
var (
instance *CivilCodeUtil
once sync.Once
)
// GetInstance 获取单例实例
func GetInstance() *CivilCodeUtil {
once.Do(func() {
instance = &CivilCodeUtil{}
})
return instance
}
// Add 添加多个行政区划编码
func (c *CivilCodeUtil) Add(civilCodeList []*CivilCode) {
if len(civilCodeList) > 0 {
for _, civilCode := range civilCodeList {
c.civilCodeMap.Store(civilCode.Code, civilCode)
}
}
}
// AddOne 添加单个行政区划编码
func (c *CivilCodeUtil) AddOne(civilCode *CivilCode) {
c.civilCodeMap.Store(civilCode.Code, civilCode)
}
// GetParentCode 获取父级编码
func (c *CivilCodeUtil) GetParentCode(code string) *CivilCode {
if len(code) > 8 {
return nil
}
if len(code) == 8 {
parentCode := code[:6]
if value, ok := c.civilCodeMap.Load(parentCode); ok {
return value.(*CivilCode)
}
return nil
}
if value, ok := c.civilCodeMap.Load(code); ok {
civilCode := value.(*CivilCode)
if civilCode.ParentCode == "" {
return nil
}
if parentValue, ok := c.civilCodeMap.Load(civilCode.ParentCode); ok {
return parentValue.(*CivilCode)
}
}
return nil
}
// GetCivilCode 获取行政区划编码对象
func (c *CivilCodeUtil) GetCivilCode(code string) *CivilCode {
if len(code) > 8 {
return nil
}
if value, ok := c.civilCodeMap.Load(code); ok {
return value.(*CivilCode)
}
return nil
}
// GetAllParentCode 获取所有父级编码
func (c *CivilCodeUtil) GetAllParentCode(civilCode string) []*CivilCode {
var civilCodeList []*CivilCode
parentCode := c.GetParentCode(civilCode)
if parentCode != nil {
civilCodeList = append(civilCodeList, parentCode)
allParentCode := c.GetAllParentCode(parentCode.Code)
if len(allParentCode) > 0 {
civilCodeList = append(civilCodeList, allParentCode...)
}
}
return civilCodeList
}
// IsEmpty 判断是否为空
func (c *CivilCodeUtil) IsEmpty() bool {
empty := true
c.civilCodeMap.Range(func(key, value interface{}) bool {
empty = false
return false
})
return empty
}
// Size 获取大小
func (c *CivilCodeUtil) Size() int {
size := 0
c.civilCodeMap.Range(func(key, value interface{}) bool {
size++
return true
})
return size
}
// GetAllChild 获取所有子节点
func (c *CivilCodeUtil) GetAllChild(parent string) []*Region {
var result []*Region
c.civilCodeMap.Range(func(key, value interface{}) bool {
civilCode := value.(*CivilCode)
if parent == "" {
if strings.TrimSpace(civilCode.ParentCode) == "" {
result = append(result, NewRegion(civilCode.Code, civilCode.Name, civilCode.ParentCode))
}
} else if civilCode.ParentCode == parent {
result = append(result, NewRegion(civilCode.Code, civilCode.Name, civilCode.ParentCode))
}
return true
})
return result
}