package TeacherDao import ( "dsBigData/Business/Teacher/TeacherModel" "dsBigData/Utils/CommonUtil" "dsBigData/Utils/EsUtil" "encoding/json" "fmt" "github.com/olivere/elastic/v7" "github.com/tidwall/gjson" "strconv" "strings" "time" ) var esClient = EsUtil.EsClient var CTX = EsUtil.CTX func GetTeacherCountAggsXb(schoolId string) ([]TeacherModel.TeacherCountXb, error) { orgIdTerm := elastic.NewTermQuery("org_id", schoolId) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr([]string{"男", "女"}) xbTerms := elastic.NewTermsQuery("data_content.xbm", interfaceArr...) boolQuery := elastic.NewBoolQuery().Must(orgIdTerm, bUseTerm, enableFlagTerm, delFlagTerm, xbTerms) xbAggs := elastic. NewTermsAggregation(). Field("data_content.xbm"). Size(10) result, err := esClient.Search(). Index("user_teacher"). Query(boolQuery). Size(0). Aggregation("xb", xbAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) totalCount := CommonUtil.ConvertInt64ToString(result.TotalHits()) totalCountFloat, _ := strconv.ParseFloat(totalCount, 64) var teacherCountXbArr []TeacherModel.TeacherCountXb resCount := gjson.Get(resStr, "xb.buckets.#") for i := 0; i < int(resCount.Num); i++ { var teacherCountXb TeacherModel.TeacherCountXb teacherCountXb.XbName = gjson.Get(resStr, "xb.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str teacherCountXb.Count = int(gjson.Get(resStr, "xb.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) percent := gjson.Get(resStr, "xb.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num / totalCountFloat * 100 percentFloat, _ := strconv.ParseFloat(fmt.Sprintf("%.0f", percent), 64) percentString := CommonUtil.ConverFloat64ToString(percentFloat) teacherCountXb.Percent = percentString + "%" teacherCountXbArr = append(teacherCountXbArr, teacherCountXb) } return teacherCountXbArr, nil } func GetTeacherCountAggsXxbxlxByCityOrDistrict(districtCode []string, schoolIds []string, xxbxlxs []string) ([]TeacherModel.TeacherCountAggsXxbxlx, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(xxbxlxs) xxbxlxTerms := elastic.NewTermsQuery("school_type", interfaceArr...) var boolQuery *elastic.BoolQuery if len(districtCode) > 0 { interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(districtCode) districtCodeTerms := elastic.NewTermsQuery("district_code", interfaceArr...) boolQuery = elastic.NewBoolQuery().Must(districtCodeTerms, enableFlagTerm, delFlagTerm, bUseTerm, xxbxlxTerms) } else if len(schoolIds) > 0 { interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(schoolIds) orgIdTerms := elastic.NewTermsQuery("org_id", interfaceArr...) boolQuery = elastic.NewBoolQuery().Must(orgIdTerms, enableFlagTerm, delFlagTerm, bUseTerm, xxbxlxTerms) } xxbxlxAggs := elastic. NewTermsAggregation(). Field("school_type"). Size(50) result, err := esClient.Search(). Index("user_teacher"). Query(boolQuery). Size(0). Aggregation("xxbxlx", xxbxlxAggs). TrackTotalHits(true). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) totalCount := CommonUtil.ConvertInt64ToString(result.TotalHits()) totalCountFloat, _ := strconv.ParseFloat(totalCount, 64) var teacherCountAggsXxbxlxArr []TeacherModel.TeacherCountAggsXxbxlx resCount := gjson.Get(resStr, "xxbxlx.buckets.#") for i := 0; i < int(resCount.Num); i++ { var teacherCountAggsXxbxlx TeacherModel.TeacherCountAggsXxbxlx teacherCountAggsXxbxlx.XxbxlxCode = gjson.Get(resStr, "xxbxlx.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str teacherCountAggsXxbxlx.Count = int(gjson.Get(resStr, "xxbxlx.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) percent := gjson.Get(resStr, "xxbxlx.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num / totalCountFloat * 100 percentFloat, _ := strconv.ParseFloat(fmt.Sprintf("%.0f", percent), 64) percentString := CommonUtil.ConverFloat64ToString(percentFloat) teacherCountAggsXxbxlx.Percent = percentString + "%" teacherCountAggsXxbxlxArr = append(teacherCountAggsXxbxlxArr, teacherCountAggsXxbxlx) } return teacherCountAggsXxbxlxArr, nil } func GetTeacherCountAggsOrgId(schoolIds []string) ([]TeacherModel.TeacherCountAggsOrg, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(schoolIds) orgIdTerms := elastic.NewTermsQuery("org_id", interfaceArr...) boolQuery := elastic.NewBoolQuery().Must(orgIdTerms, enableFlagTerm, delFlagTerm, bUseTerm, orgIdTerms) orgIdAggs := elastic. NewTermsAggregation(). Field("org_id"). Size(1000) result, err := esClient.Search(). Index("user_teacher"). Query(boolQuery). Size(0). Aggregation("orgId", orgIdAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var teacherCountAggsOrgArr []TeacherModel.TeacherCountAggsOrg resCount := gjson.Get(resStr, "orgId.buckets.#") for i := 0; i < int(resCount.Num); i++ { var teacherCountAggsOrg TeacherModel.TeacherCountAggsOrg teacherCountAggsOrg.OrgId = gjson.Get(resStr, "orgId.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str teacherCountAggsOrg.Count = int(gjson.Get(resStr, "orgId.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) teacherCountAggsOrgArr = append(teacherCountAggsOrgArr, teacherCountAggsOrg) } return teacherCountAggsOrgArr, nil } func GetTeacherCountAggsBzlb(schoolId string, bzlbs []string) ([]TeacherModel.TeacherCountAggsBzlb, error) { orgIdTerm := elastic.NewTermQuery("org_id", schoolId) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) boolQuery := elastic.NewBoolQuery().Must(orgIdTerm, bUseTerm, enableFlagTerm, delFlagTerm) bzlbAggs := elastic. NewTermsAggregation(). Field("data_content.bzlbm"). Size(10) result, err := esClient.Search(). Index("user_teacher"). Query(boolQuery). Size(0). Aggregation("bzlb", bzlbAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var teacherCountAggsBzlbArr []TeacherModel.TeacherCountAggsBzlb resCount := gjson.Get(resStr, "bzlb.buckets.#") for i := 0; i < int(resCount.Num); i++ { var teacherCountAggsBzlb TeacherModel.TeacherCountAggsBzlb teacherCountAggsBzlb.BzlbCode = gjson.Get(resStr, "bzlb.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str teacherCountAggsBzlb.Count = int(gjson.Get(resStr, "bzlb.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) teacherCountAggsBzlbArr = append(teacherCountAggsBzlbArr, teacherCountAggsBzlb) } return teacherCountAggsBzlbArr, nil } /** 功能:根据市或区的编码(也可传单位ID)获取教职工总数 */ func GetTeacherTotalCount(areaCode string) (int, error) { var areaCodeTerm *elastic.TermQuery if len(areaCode) == 6 { if strings.HasSuffix(areaCode, "00") { //市 areaCodeTerm = elastic.NewTermQuery("city_code", areaCode) } else { //区 areaCodeTerm = elastic.NewTermQuery("district_code", areaCode) } } else { areaCodeTerm = elastic.NewTermQuery("org_id", areaCode) } orgTypeTerm := elastic.NewTermQuery("data_content.identity_id", 5) enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) boolQuery := elastic.NewBoolQuery().Must(areaCodeTerm, orgTypeTerm, enableFlagTerm, delFlagTerm, bUseTerm) result, err := esClient.Search(). Index("user_teacher"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil } /** 功能:根据市或区的编码(也可传单位ID)获取教职工当前学期新增数 */ func GetTeacherCurrentTermAddCount(areaCode string) (int, error) { endYearStr := CommonUtil.ConvertIntToString(time.Now().Year()) month := CommonUtil.ConvertStringToInt32(time.Now().Format("1")) monthStr := "08" if month >= 3 && month <= 7 { monthStr = "03" } createTime := endYearStr + "/" + monthStr + "/01 00:00:01" var areaCodeTerm *elastic.TermQuery if len(areaCode) == 6 { if strings.HasSuffix(areaCode, "00") { //市 areaCodeTerm = elastic.NewTermQuery("city_code", areaCode) } else { //区 areaCodeTerm = elastic.NewTermQuery("district_code", areaCode) } } else { areaCodeTerm = elastic.NewTermQuery("org_id", areaCode) } orgTypeTerm := elastic.NewTermQuery("data_content.identity_id", 5) enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) createTimeRang := elastic.NewRangeQuery("data_content.create_time").Gte(createTime) boolQuery := elastic.NewBoolQuery().Must(areaCodeTerm, orgTypeTerm, enableFlagTerm, delFlagTerm, bUseTerm, createTimeRang) result, err := esClient.Search(). Index("user_teacher"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil }