Browse Source

feat(图谱算法,修改新的算法)

Roc 4 years ago
parent
commit
8bbceebcb0
2 changed files with 144 additions and 5 deletions
  1. 1 0
      .gitignore
  2. 143 5
      services/industry_map.go

+ 1 - 0
.gitignore

@@ -9,3 +9,4 @@
 /lastupdate.tmp
 /*.zip
 /riot-index
+/hongze_cygx

+ 143 - 5
services/industry_map.go

@@ -60,7 +60,7 @@ func GetIndustryMap() {
 
 
 func GetIndustryTree()(rootNode *models.CygxIndustryMapItems, err error) {
-	fmt.Println("start")
+	//fmt.Println("start")
 	list, err := models.GetCygxIndustryMapByParentId(0)
 	if err != nil {
 		fmt.Println("GetCygxIndustryMapByParentId Err:",err.Error())
@@ -73,11 +73,11 @@ func GetIndustryTree()(rootNode *models.CygxIndustryMapItems, err error) {
 		return
 	}
 	MakeTree(allNodes, rootNode)
-	resultJson,err:=json.Marshal(rootNode)
-	fmt.Println("Err:",err)
-	fmt.Println("allNodes:",string(resultJson))
+	//resultJson,err:=json.Marshal(rootNode)
+	//fmt.Println("Err:",err)
+	//fmt.Println("allNodes:",string(resultJson))
 	//utils.FileLog.Info("allNodes:%s",string(resultJson))
-	fmt.Println("end")
+	//fmt.Println("end")
 	return
 }
 
@@ -335,6 +335,144 @@ func randSlice(slice []*models.CygxIndustryMapItems) {
 	}
 	return
 }
+
+
+//获取行业图谱切片(v2版本,调整时间:2021-03-19 18:02:07)
+func GetIndustryMapNameSliceV2(industryName string)(nameSlice []string,err error){
+	tree,err := GetIndustryTree()
+	if err != nil{
+		fmt.Println("获取树失败")
+		return
+	}
+
+	//fmt.Println(tree)
+
+	//已经存在的行业id的map集合
+	hasIdMap := make(map[int]string)
+	itemList,err := models.GetFirstCygxIndustryListByName(industryName)
+	if err != nil{
+		fmt.Println("获取数据失败,",err)
+		return
+	}
+	//找不到对应的数据
+	if len(itemList) <= 0{
+		return
+	}
+	industryMapList := make(map[int][]*models.CygxIndustryMapItems)
+	for _,item := range itemList{
+		industryMapList[item.Level] = append(industryMapList[item.Level],item)
+	}
+
+	//将查出来的根节点数据的key取出来,放在切片中,并对该切片做正序排列
+	var sortIndustryList []int
+	for k, _ := range industryMapList {
+		sortIndustryList = append(sortIndustryList, k)
+	}
+	sort.Ints(sortIndustryList)
+
+	//最底层节点的数据集合
+	list := industryMapList[sortIndustryList[0]]
+	//fmt.Println(list)
+	//return
+
+	otherChildMapSlice := map[int][]*models.CygxIndustryMapItems{}
+
+	//多个节点时,额外处理
+	if len(list) > 1{
+		for _,item := range list{
+			hasIdMap[item.IndustryMapId]=""
+			//将自己的节点给加进去
+			otherChildMapSlice[0] = append(otherChildMapSlice[0],item)
+
+			//获取上级
+			var tmpParentSlice []*models.CygxIndustryMapItems
+			tmpParentSlice,_ = parentTreeToSlice(tree,item,0,tmpParentSlice,hasIdMap)
+			//父节点
+			parentItem := tmpParentSlice[len(tmpParentSlice)-1]
+			hasIdMap[parentItem.IndustryMapId]=""
+			otherChildMapSlice[1] = append(otherChildMapSlice[1],parentItem)
+		}
+	}else{
+		//匹配到单个节点
+		item := list[0]
+		hasIdMap[item.IndustryMapId]=""
+		//将自己的节点给加进去
+		otherChildMapSlice[0] = append(otherChildMapSlice[0],item)
+		childTree := getChildTree(tree,item)
+
+		//如果是命中到最后一层节点
+		if len(childTree.Children) == 0{
+			//获取上级
+			var tmpParentSlice []*models.CygxIndustryMapItems
+			tmpParentSlice,_ = parentTreeToSlice(tree,item,0,tmpParentSlice,hasIdMap)
+			//父节点
+			parentItem := tmpParentSlice[len(tmpParentSlice)-1]
+			hasIdMap[parentItem.IndustryMapId]=""
+			otherChildMapSlice[1] = append(otherChildMapSlice[1],parentItem)
+
+			//兄弟节点
+			siblingTreeToSliceV2(parentItem,item,hasIdMap,2,otherChildMapSlice)
+		}else{
+			//如果不是命中到最后一层节点
+			otherChildMapSlice[1] = append(otherChildMapSlice[1],childTree.Children...)
+		}
+	}
+
+	//return
+	var tmpSlice []*models.CygxIndustryMapItems
+
+	//将其他规律数据的key取出来,放在切片中,并对该切片做正序排列
+	var sortList []int
+	for k, _ := range otherChildMapSlice {
+		sortList = append(sortList, k)
+	}
+	sort.Ints(sortList)
+
+	//遍历该切片,根据下标key获取对应的数据,并插入到主数据中
+	for _,v := range sortList{
+		tmpChildSlice := otherChildMapSlice[v]
+		randSlice(tmpChildSlice)
+		tmpSlice = append(tmpSlice,tmpChildSlice...)
+		//fmt.Println(k,"=====")
+		//for _,tmpV := range otherChildMapSlice[v]{
+		//	fmt.Println(tmpV.IndustryMapName)
+		//}
+	}
+	//名字切片
+	for _,v := range tmpSlice{
+		//fmt.Println("k===",k,"=======v=======",v)
+		nameSlice = append(nameSlice,v.IndustryMapName)
+	}
+
+	//fmt.Println(nameSlice)
+	//fmt.Println(strings.Join(nameSlice,","))
+	//utils.FileLog.Info("allNodes:%s",strings.Join(nameSlice,","))
+	return
+}
+
+//获取兄弟级树
+func siblingTreeToSliceV2(rootNode *models.CygxIndustryMapItems,nowNode *models.CygxIndustryMapItems,hasIdMap map[int]string,depth int,otherChildMapSlice map[int][]*models.CygxIndustryMapItems)(maxDepth int)  {
+	if rootNode.Children != nil{
+		depth++
+		maxDepth = depth
+		for _,v := range rootNode.Children {
+			//如果父级id一致的情况下,那么代表这是兄弟节点或者是自己了
+			if v.ParentId == nowNode.ParentId{
+				//判断是否已经录入,如果已经录入,那么不处理
+				if _,ok := hasIdMap[v.IndustryMapId];ok==false{
+					otherChildMapSlice[depth] = append(otherChildMapSlice[depth],v)
+					hasIdMap[v.IndustryMapId] = ""
+				}
+			}else{
+				returnDepth := siblingTreeToSliceV2(v,nowNode,hasIdMap,depth,otherChildMapSlice)
+				if returnDepth > maxDepth{
+					maxDepth = returnDepth
+				}
+			}
+		}
+	}
+	return
+}
 //region数据修复
 func FixData(){
 	tree,err := GetIndustryTree()