package StudentDao import ( "dsBigData/Business/Student/StudentModel" "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 GetStudentCountAggsXb(schoolId string) ([]StudentModel.StudentCountXb, 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_student"). Query(boolQuery). Size(0). Aggregation("xb", xbAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var studentCountXbArr []StudentModel.StudentCountXb resCount := gjson.Get(resStr, "xb.buckets.#") totalCount := CommonUtil.ConvertInt64ToString(result.TotalHits()) totalCountFloat, _ := strconv.ParseFloat(totalCount, 64) for i := 0; i < int(resCount.Num); i++ { var studentCountXb StudentModel.StudentCountXb studentCountXb.XbName = gjson.Get(resStr, "xb.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str studentCountXb.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) studentCountXb.Percent = percentString + "%" studentCountXbArr = append(studentCountXbArr, studentCountXb) } return studentCountXbArr, nil } func GetStudentCountAggsXxbxlx(districtCode []string, schoolIds []string, xxbxlxs []string) ([]StudentModel.StudentCountAggsXxbxlx, 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_student"). 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 studentCountAggsXxbxlxArr []StudentModel.StudentCountAggsXxbxlx resCount := gjson.Get(resStr, "xxbxlx.buckets.#") for i := 0; i < int(resCount.Num); i++ { var studentCountAggsXxbxlx StudentModel.StudentCountAggsXxbxlx studentCountAggsXxbxlx.XxbxlxCode = gjson.Get(resStr, "xxbxlx.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str studentCountAggsXxbxlx.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) studentCountAggsXxbxlx.Percent = percentString + "%" studentCountAggsXxbxlxArr = append(studentCountAggsXxbxlxArr, studentCountAggsXxbxlx) } return studentCountAggsXxbxlxArr, nil } func GetStudentCountAggsOrgId(schoolIds []string) ([]StudentModel.StudentCountAggsOrg, 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_student"). 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 StudentCountAggsOrgArr []StudentModel.StudentCountAggsOrg resCount := gjson.Get(resStr, "orgId.buckets.#") for i := 0; i < int(resCount.Num); i++ { var studentCountAggsOrg StudentModel.StudentCountAggsOrg studentCountAggsOrg.OrgId = gjson.Get(resStr, "orgId.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str studentCountAggsOrg.Count = int(gjson.Get(resStr, "orgId.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) StudentCountAggsOrgArr = append(StudentCountAggsOrgArr, studentCountAggsOrg) } return StudentCountAggsOrgArr, nil } func GetStudentCountAggsRxnf(schoolId string, stageId string) ([]StudentModel.StudentCountRxnf, error) { endYear := time.Now().Year() startYear := 0 month := CommonUtil.ConvertStringToInt32(time.Now().Format("1")) if month < 8 { endYear = endYear - 1 } if stageId == "2" { startYear = endYear - 5 } else { startYear = endYear - 2 } orgIdTerm := elastic.NewTermQuery("org_id", schoolId) stageIdTerm := elastic.NewTermQuery("data_content.stage_id", stageId) rxnfRang := elastic.NewRangeQuery("data_content.rxnf").Gte(startYear).Lte(endYear) 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, stageIdTerm, bUseTerm, rxnfRang, enableFlagTerm, delFlagTerm) rxnfHistogramAggregation := elastic.NewHistogramAggregation().Field("data_content.rxnf").MinDocCount(0).ExtendedBounds(float64(startYear), float64(endYear)).Interval(1) result, err := esClient.Search(). Index("user_student"). Query(boolQuery). Aggregation("rxnf", rxnfHistogramAggregation). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var studentCountRxnfArr []StudentModel.StudentCountRxnf resCount := gjson.Get(resStr, "rxnf.buckets.#") for i := 0; i < int(resCount.Num); i++ { var studentCountRxnf StudentModel.StudentCountRxnf studentCountRxnf.Rxnf = CommonUtil.ConverFloat64ToString(gjson.Get(resStr, "rxnf.buckets."+CommonUtil.ConvertIntToString(i)+".key").Num) studentCountRxnf.Count = int(gjson.Get(resStr, "rxnf.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) studentCountRxnfArr = append(studentCountRxnfArr, studentCountRxnf) } return studentCountRxnfArr, nil } /** 功能:根据市或区的编码(也可传单位ID)获取学生总数 */ func GetStudentTotalCount(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) } 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, enableFlagTerm, delFlagTerm, bUseTerm) result, err := esClient.Search(). Index("user_student"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil } /** 功能:根据市或区的编码(也可传单位ID)获取学生当前学期新增数 */ func GetStudentCurrentTermAddCount(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) } 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, enableFlagTerm, delFlagTerm, bUseTerm, createTimeRang) result, err := esClient.Search(). Index("user_student"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil }