|
@@ -4,13 +4,33 @@ package analysis
|
|
|
import (
|
|
|
. "api"
|
|
|
"db"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "jfw/modules/common/src/qfw/util/jy"
|
|
|
"log"
|
|
|
qutil "qfw/util"
|
|
|
- "qfw/util/jy"
|
|
|
+ dfa "qfw/util/dfa"
|
|
|
+ "qfw/util/elastic"
|
|
|
+
|
|
|
+ //"qfw/util/jy"
|
|
|
+ "sort"
|
|
|
+ "strconv"
|
|
|
"strings"
|
|
|
+ "time"
|
|
|
"util"
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ INDEX = "forecast"
|
|
|
+ TYPE = "forecast"
|
|
|
+ bidSearch_sort = `{"yucetime":-1}`
|
|
|
+ findfields = `"title"`
|
|
|
+
|
|
|
+ view_maxPageNum = 20
|
|
|
+ view_pageSize = 50
|
|
|
+ bidSearch_field = ``
|
|
|
+)
|
|
|
+
|
|
|
//预测详情页
|
|
|
func (this *Analysis) ForPContent() {
|
|
|
defer qutil.Catch()
|
|
@@ -94,6 +114,35 @@ func (this *Analysis) ForPContent() {
|
|
|
this.ServeJson(NewResult(rData, errMsg))
|
|
|
}
|
|
|
|
|
|
+//预测详情页
|
|
|
+// func (this *Analysis) ForPContent() {
|
|
|
+// defer qutil.Catch()
|
|
|
+// userId, _ := this.GetSession("userId").(string)
|
|
|
+// rData, errMsg := func() (interface{}, error) {
|
|
|
+// id := this.GetString("id") //项目预测id
|
|
|
+// // keys := this.GetString("keys") //关键词
|
|
|
+// if id == "" { //}|| keys == "" {
|
|
|
+// return -1, nil
|
|
|
+// }
|
|
|
+// id = util.DecodeId(id)
|
|
|
+// data := elastic.GetById(INDEX, TYPE, id)
|
|
|
+// if len(*data) > 0 {
|
|
|
+// res := ForecastInfo{}
|
|
|
+// res.Buyer = qutil.ObjToString((*data)[0]["buyer"])
|
|
|
+// res.Createtime = qutil.Int64All((*data)[0]["yucetime"])
|
|
|
+// // res.Purchasing = (*data)[0]["results"].([]string)
|
|
|
+// res.Title = qutil.ObjToString((*data)[0]["title"])
|
|
|
+// res.Jyhref = qutil.ObjToString((*data)[0]["jyhref"])
|
|
|
+// return res, nil
|
|
|
+// }
|
|
|
+// return 0, nil
|
|
|
+// }()
|
|
|
+// if errMsg != nil {
|
|
|
+// log.Printf("%s 获取此预测项目信息出错-%s", userId, errMsg)
|
|
|
+// }
|
|
|
+// this.ServeJson(NewResult(rData, errMsg))
|
|
|
+// }
|
|
|
+
|
|
|
//list
|
|
|
func (this *Analysis) ForPList() {
|
|
|
defer qutil.Catch()
|
|
@@ -106,7 +155,9 @@ func (this *Analysis) ForPList() {
|
|
|
msg := ""
|
|
|
code := 0
|
|
|
list := []map[string]interface{}{}
|
|
|
+ flist := []map[string]interface{}{}
|
|
|
count := 0
|
|
|
+ var fcount int64 = 0
|
|
|
userId, _ := this.GetSession("userId").(string)
|
|
|
main_userId, _, _ := util.MainUserId(userId, "", 0)
|
|
|
isSubCount := false
|
|
@@ -114,20 +165,23 @@ func (this *Analysis) ForPList() {
|
|
|
if userId != main_userId {
|
|
|
isSubCount = true
|
|
|
}
|
|
|
+ pageNum, _ := this.GetInteger("pageNum")
|
|
|
+ o_member_jy := &map[string]interface{}{}
|
|
|
//查库获得大会员用户的信息
|
|
|
o_mb, ok := db.Mgo.FindById(C_User, main_userId, `{"o_member_jy":1}`)
|
|
|
if ok && o_mb != nil && (*o_mb) != nil {
|
|
|
if (*o_mb)["o_member_jy"] != nil {
|
|
|
- pageNum, _ := this.GetInteger("pageNum")
|
|
|
- list, count = getNewProjects(main_userId, pageNum)
|
|
|
- o_member_jy := qutil.ObjToMap((*o_mb)["o_member_jy"])
|
|
|
+ // list, count = getNewProjects(main_userId, pageNum)
|
|
|
+ o_member_jy = qutil.ObjToMap((*o_mb)["o_member_jy"])
|
|
|
+ //项目预测检索库
|
|
|
+ flist, fcount = getNewForecast(main_userId, pageNum, *o_member_jy)
|
|
|
if pageNum == 1 {
|
|
|
if (*o_member_jy)["a_items"] != nil {
|
|
|
a_items := qutil.ObjArrToMapArr((*o_member_jy)["a_items"].([]interface{}))
|
|
|
- if len(a_items) == 0 {
|
|
|
+ if len(a_items) == 0 || a_items[0]["a_key"] == nil || len(a_items[0]["a_key"].([]interface{})) == 0 {
|
|
|
msg = "暂无设置订阅关键词,无法进行预测"
|
|
|
code = 1
|
|
|
- } else if list == nil || len(list) == 0 {
|
|
|
+ } else if (list == nil || len(list) == 0) && len(flist) == 0 {
|
|
|
msg = "您设置的订阅关键词无法进行预测"
|
|
|
code = 2
|
|
|
}
|
|
@@ -145,8 +199,8 @@ func (this *Analysis) ForPList() {
|
|
|
regMap.Data = map[string]interface{}{
|
|
|
"msg": msg,
|
|
|
"code": code,
|
|
|
- "list": list,
|
|
|
- "count": count,
|
|
|
+ "list": forecastMerge(list, flist),
|
|
|
+ "count": int64(count) + fcount,
|
|
|
"isSubCount": isSubCount,
|
|
|
}
|
|
|
} else {
|
|
@@ -156,6 +210,61 @@ func (this *Analysis) ForPList() {
|
|
|
this.ServeJson(regMap)
|
|
|
}
|
|
|
|
|
|
+type ForecastInfo struct {
|
|
|
+ Buyer string `json:"buyer"`
|
|
|
+ Id string `json:"id"`
|
|
|
+ Purchasing []string `json:"purchasing"`
|
|
|
+ Title string `json:"title"`
|
|
|
+ Createtime int64 `json:"createtime"`
|
|
|
+ Keys string `json:"keys"`
|
|
|
+ Jyhref string `json:"jyhref"`
|
|
|
+}
|
|
|
+
|
|
|
+//合并去重
|
|
|
+func forecastMerge(r, f []map[string]interface{}) []*ForecastInfo {
|
|
|
+ var idMap = map[string]bool{}
|
|
|
+ var res = []*ForecastInfo{}
|
|
|
+ var isSort = 0
|
|
|
+ if len(r) > 0 {
|
|
|
+ isSort = isSort + 1
|
|
|
+ for _, rv := range r {
|
|
|
+ idMap[qutil.ObjToString(rv["id"])] = true
|
|
|
+ res = append(res, &ForecastInfo{
|
|
|
+ Buyer: qutil.ObjToString(rv["buyer"]),
|
|
|
+ Id: util.EncodeId(qutil.ObjToString(rv["id"])),
|
|
|
+ Purchasing: rv["results"].([]string),
|
|
|
+ Title: qutil.ObjToString(rv["title"]),
|
|
|
+ Createtime: qutil.Int64All(rv["createtime"]),
|
|
|
+ Keys: "",
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if len(f) > 0 {
|
|
|
+ isSort = isSort + 1
|
|
|
+ for _, fv := range f {
|
|
|
+ if idMap[qutil.ObjToString(fv["id"])] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ res = append(res, &ForecastInfo{
|
|
|
+ Buyer: qutil.ObjToString(fv["buyer"]),
|
|
|
+ Id: util.EncodeId(qutil.ObjToString(fv["id"])),
|
|
|
+ Purchasing: fv["results"].([]string),
|
|
|
+ Title: qutil.ObjToString(fv["title"]),
|
|
|
+ Createtime: qutil.Int64All(fv["yucetime"]),
|
|
|
+ Jyhref: qutil.ObjToString(fv["jyhref"]),
|
|
|
+ Keys: "",
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //
|
|
|
+ if isSort > 1 {
|
|
|
+ sort.Slice(res, func(i, j int) bool {
|
|
|
+ return res[i].Createtime > res[j].Createtime
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
//getData
|
|
|
func getNewProjects(userId string, cpage int) ([]map[string]interface{}, int) {
|
|
|
if cpage == 0 {
|
|
@@ -172,9 +281,8 @@ func getNewProjects(userId string, cpage int) ([]map[string]interface{}, int) {
|
|
|
}, `{"createtime":-1}`, `{"buyer":1,"results":1,"createtime":1,"title":1,"id":1}`, false, (cpage-1)*FP_Limit, FP_Limit)
|
|
|
if ok && data != nil && len(*data) > 0 {
|
|
|
for _, ov := range *data {
|
|
|
- createtime := ov["createtime"]
|
|
|
- ov["createtime"] = qutil.FormatDateWithObj(&createtime, qutil.Date_Short_Layout)
|
|
|
- ov["id"] = util.EncodeId(ov["id"].(string))
|
|
|
+ ov["createtime"] = qutil.Float64All(ov["createtime"]) //qutil.FormatDateWithObj(&createtime, qutil.Date_Short_Layout)
|
|
|
+ // ov["id"] = util.EncodeId(ov["id"].(string))
|
|
|
ov["results"] = keysfilter(qutil.ObjArrToMapArr(ov["results"].([]interface{})))
|
|
|
delete(ov, "_id")
|
|
|
}
|
|
@@ -184,7 +292,7 @@ func getNewProjects(userId string, cpage int) ([]map[string]interface{}, int) {
|
|
|
}
|
|
|
|
|
|
//过滤 去重 处理特殊符号
|
|
|
-func keysfilter(result []map[string]interface{}) (res []map[string]interface{}) {
|
|
|
+func keysfilter(result []map[string]interface{}) (res []string) {
|
|
|
if len(result) > 0 {
|
|
|
var keysMap = map[string]bool{}
|
|
|
L:
|
|
@@ -198,9 +306,274 @@ func keysfilter(result []map[string]interface{}) (res []map[string]interface{})
|
|
|
keysMap[strings.ReplaceAll(kv, "+", "、")] = true
|
|
|
_keys = append(_keys, strings.ReplaceAll(kv, "+", "、"))
|
|
|
}
|
|
|
- rv["keys"] = strings.Split(strings.Join(_keys, "、"), " ")
|
|
|
- res = append(res, rv)
|
|
|
+ // rv["keys"] = strings.Split(strings.Join(_keys, "、"), " ")
|
|
|
+ res = append(res, strings.Split(strings.Join(_keys, "、"), " ")...)
|
|
|
}
|
|
|
}
|
|
|
return res
|
|
|
}
|
|
|
+
|
|
|
+var d *dfa.DFA = &dfa.DFA{}
|
|
|
+
|
|
|
+//
|
|
|
+func getNewForecast(userId string, pageNum int, o_member_jy map[string]interface{}) (list []map[string]interface{}, count int64) {
|
|
|
+ if userId == "" {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sql := getSqlObjFromId(o_member_jy)
|
|
|
+ if sql == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ keys := []string{}
|
|
|
+ keyIsexists := map[string]bool{}
|
|
|
+ for _, v := range sql.Keyword {
|
|
|
+ var keys_one []string
|
|
|
+ for _, k := range v.Keyword {
|
|
|
+ keys_one = append(keys_one, k)
|
|
|
+ }
|
|
|
+ for _, k := range v.Appended {
|
|
|
+ keys_one = append(keys_one, k)
|
|
|
+ }
|
|
|
+ if keyIsexists[strings.Join(keys_one, "+")] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ keyIsexists[strings.Join(keys_one, "+")] = true
|
|
|
+ keys = append(keys, strings.Join(keys_one, "+"))
|
|
|
+ }
|
|
|
+ if len(keys) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ qstr := GetMemberForecastSql(sql)
|
|
|
+ count = elastic.Count(INDEX, TYPE, qstr)
|
|
|
+ list = *elastic.GetAllByNgram(INDEX, TYPE, qstr, findfields, bidSearch_sort, bidSearch_field, (pageNum-1)*FP_Limit, FP_Limit, 0, false)
|
|
|
+ if list != nil {
|
|
|
+ d.AddWord(keys...)
|
|
|
+ for _, v := range list {
|
|
|
+ var rsArr = []string{}
|
|
|
+ var rsArrRes = []string{}
|
|
|
+ if v["results"] != nil {
|
|
|
+ results := qutil.ObjArrToMapArr(v["results"].([]interface{}))
|
|
|
+ rsvMap := map[string]bool{}
|
|
|
+ for _, rsv := range results {
|
|
|
+ rsArr = append(rsArr, d.Analy(rsv["purchasing"].(string))...)
|
|
|
+ }
|
|
|
+ for _, rv := range rsArr {
|
|
|
+ if rsvMap[strings.Join(rsArr, "+")] {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ rsArrRes = append(rsArrRes, rv)
|
|
|
+ rsvMap[strings.Join(rsArr, "+")] = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ v["results"] = rsArrRes
|
|
|
+ v["id"] = qutil.ObjToString(v["_id"])
|
|
|
+ v["yucetime"] = qutil.Int64All(v["yucetime"].(float64))
|
|
|
+ }
|
|
|
+ d.Clear()
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//获取大会员forecast 检索库查询语句
|
|
|
+func GetMemberForecastSql(scd *util.ViewCondition) string {
|
|
|
+ query := `{"query":{"bool":{"must":[%s],"should":[%s],"minimum_should_match": %d}}}`
|
|
|
+ query_bool_should := `{"bool":{"should":[%s],"minimum_should_match": 1}}`
|
|
|
+ multi_match := `{"multi_match": {"query": %s,"type": "phrase", "fields": [%s]}}`
|
|
|
+ query_bool_must_and := `{"bool":{"must":[%s]%s}}`
|
|
|
+ query_must_exists := `{"bool":{"should":{"filtered":{"filter":{"bool":{"must":[{"exists":{"field":"yuceendtime"}},{"range":{"yuceendtime":{"lte":%d}}}]}}}}}}`
|
|
|
+
|
|
|
+ bools := []string{}
|
|
|
+ musts := []string{}
|
|
|
+ //预测时间最新三个月
|
|
|
+ musts = append(musts, fmt.Sprintf(`{"range":{"yucetime":{"gte":%d}}}`, time.Now().AddDate(0, -3, 0).Unix()), fmt.Sprintf(query_must_exists, time.Now().Unix()))
|
|
|
+ //省份
|
|
|
+ areaCity := []string{}
|
|
|
+ if len(scd.Area) > 0 {
|
|
|
+ areaquery := `{"terms":{"area":[`
|
|
|
+ for k, v := range scd.Area {
|
|
|
+ if k > 0 {
|
|
|
+ areaquery += `,`
|
|
|
+ }
|
|
|
+ areaquery += `"` + v + `"`
|
|
|
+ }
|
|
|
+ areaquery += `]}}`
|
|
|
+ areaCity = append(areaCity, areaquery)
|
|
|
+ }
|
|
|
+
|
|
|
+ //城市
|
|
|
+ if len(scd.City) > 0 {
|
|
|
+ areaquery := `{"terms":{"city":[`
|
|
|
+ for k, v := range scd.City {
|
|
|
+ if k > 0 {
|
|
|
+ areaquery += `,`
|
|
|
+ }
|
|
|
+ areaquery += `"` + v + `"`
|
|
|
+ }
|
|
|
+ areaquery += `]}}`
|
|
|
+ areaCity = append(areaCity, areaquery)
|
|
|
+ }
|
|
|
+ if len(areaCity) > 0 {
|
|
|
+ musts = append(musts, fmt.Sprintf(query_bool_should, strings.Join(areaCity, ",")))
|
|
|
+ }
|
|
|
+ // if len(scd.Subtype) > 0 {
|
|
|
+ // subquery := `{"terms":{"subtype":[`
|
|
|
+ // for k, v := range scd.Subtype {
|
|
|
+ // if k > 0 {
|
|
|
+ // subquery += `,`
|
|
|
+ // }
|
|
|
+ // subquery += `"` + v + `"`
|
|
|
+ // }
|
|
|
+ // subquery += `]}}`
|
|
|
+ // musts = append(musts, subquery)
|
|
|
+ // }
|
|
|
+ if len(scd.Buyerclass) > 0 {
|
|
|
+ Buyerclass := `{"terms":{"buyerclass":[`
|
|
|
+ for k, v := range scd.Buyerclass {
|
|
|
+ if k > 0 {
|
|
|
+ Buyerclass += `,`
|
|
|
+ }
|
|
|
+ Buyerclass += `"` + v + `"`
|
|
|
+ }
|
|
|
+ Buyerclass += `]}}`
|
|
|
+ musts = append(musts, Buyerclass)
|
|
|
+ }
|
|
|
+ boolsNum := 0 //should
|
|
|
+ if len(scd.Keyword) > 0 {
|
|
|
+ boolsNum = 1
|
|
|
+ multi_match = fmt.Sprintf(multi_match, "%s", `"results.purchasing.mypurchasing"`)
|
|
|
+
|
|
|
+ for _, v := range scd.Keyword {
|
|
|
+ shoulds := []string{}
|
|
|
+ must_not := []string{}
|
|
|
+ //附加词
|
|
|
+ for _, vv := range v.Keyword {
|
|
|
+ shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, vv := range v.Appended {
|
|
|
+ shoulds = append(shoulds, fmt.Sprintf(multi_match, "\""+vv+"\""))
|
|
|
+ }
|
|
|
+
|
|
|
+ //排除词
|
|
|
+ for _, vv := range v.Exclude {
|
|
|
+ must_not = append(must_not, fmt.Sprintf(multi_match, "\""+vv+"\""))
|
|
|
+ }
|
|
|
+
|
|
|
+ //添加
|
|
|
+ if len(shoulds) > 0 {
|
|
|
+ notStr := ""
|
|
|
+ if len(must_not) > 0 {
|
|
|
+ notStr = fmt.Sprintf(`,"must_not":[%s]`, strings.Join(must_not, ","))
|
|
|
+ }
|
|
|
+ bools = append(bools, fmt.Sprintf(query_bool_must_and, strings.Join(shoulds, ","), notStr))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ qstr := fmt.Sprintf(query, strings.Join(musts, ","), strings.Join(bools, ","), boolsNum)
|
|
|
+ log.Println("------qstr", qstr)
|
|
|
+ return qstr
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+
|
|
|
+//member_jy
|
|
|
+func getSqlObjFromId(o_member_jy map[string]interface{}) *util.ViewCondition {
|
|
|
+ if o_member_jy["a_items"] == nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+ a_items := []interface{}{}
|
|
|
+ if o_member_jy["a_items"] != nil {
|
|
|
+ a_items = o_member_jy["a_items"].([]interface{})
|
|
|
+ }
|
|
|
+ a_buyerclass := []interface{}{}
|
|
|
+ if o_member_jy["a_buyerclass"] != nil {
|
|
|
+ a_buyerclass = o_member_jy["a_buyerclass"].([]interface{})
|
|
|
+ }
|
|
|
+ if len(a_buyerclass) > 0 && qutil.IntAllDef(o_member_jy["i_matchbuyerclass_other"], 1) == 1 && len(a_items) > 0 {
|
|
|
+ a_buyerclass = append(a_buyerclass, "其它")
|
|
|
+ }
|
|
|
+ a_infotype := []interface{}{}
|
|
|
+ if o_member_jy["a_infotype"] != nil {
|
|
|
+ a_infotype = o_member_jy["a_infotype"].([]interface{})
|
|
|
+ }
|
|
|
+ o_area := map[string]interface{}{}
|
|
|
+ if o_member_jy["o_area"] != nil {
|
|
|
+ o_area = o_member_jy["o_area"].(map[string]interface{})
|
|
|
+ }
|
|
|
+ return &util.ViewCondition{
|
|
|
+ Keyword: getKeyWordArr(a_items, "", -1),
|
|
|
+ Buyerclass: qutil.ObjArrToStringArr(a_buyerclass),
|
|
|
+ Subtype: qutil.ObjArrToStringArr(a_infotype),
|
|
|
+ Area: getStringArrFromDbResult(o_area, 1),
|
|
|
+ City: getStringArrFromDbResult(o_area, 2),
|
|
|
+ SelectType: strconv.Itoa(qutil.IntAll(o_member_jy["i_matchway"])),
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+//关键词 附加词 排除词
|
|
|
+func getKeyWordArr(a_items []interface{}, item string, index int) (arr []util.ViewKeyWord) {
|
|
|
+ if a_items == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range a_items {
|
|
|
+ vm, _ := v.(map[string]interface{})
|
|
|
+ if item != "" && index >= 0 && item != qutil.ObjToString(vm["s_item"]) {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if vm["a_key"] == nil {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ kwsArr := vm["a_key"]
|
|
|
+ for i, k := range kwsArr.([]interface{}) {
|
|
|
+ if item != "" && index >= 0 && i != index {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ kw := util.ViewKeyWord{}
|
|
|
+ b, e := json.Marshal(k)
|
|
|
+ if e != nil {
|
|
|
+ log.Println(e.Error())
|
|
|
+ }
|
|
|
+ json.Unmarshal(b, &kw)
|
|
|
+ if kw.MatchWay == 1 {
|
|
|
+ for _, kk := range kw.Keyword {
|
|
|
+ arr = append(arr, util.ViewKeyWord{
|
|
|
+ Keyword: []string{kk},
|
|
|
+ Exclude: kw.Exclude,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ for _, kk := range kw.Appended {
|
|
|
+ arr = append(arr, util.ViewKeyWord{
|
|
|
+ Keyword: []string{kk},
|
|
|
+ Exclude: kw.Exclude,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ arr = append(arr, kw)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+//
|
|
|
+func getStringArrFromDbResult(area map[string]interface{}, i int) (arr []string) {
|
|
|
+ if area == nil {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ var eareArr []string
|
|
|
+ var cityArr []string
|
|
|
+ for k, v := range area {
|
|
|
+ if len(v.([]interface{})) > 0 {
|
|
|
+ cityArr = append(cityArr, qutil.ObjArrToStringArr(v.([]interface{}))...)
|
|
|
+ } else {
|
|
|
+ eareArr = append(eareArr, k)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if i == 1 {
|
|
|
+ arr = eareArr
|
|
|
+ } else {
|
|
|
+ arr = cityArr
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|