package SchoolDao import ( "dsBigData/Business/School/SchoolModel" "dsBigData/Utils/CommonUtil" "dsBigData/Utils/EsUtil" "encoding/json" "github.com/olivere/elastic/v7" "github.com/tidwall/gjson" "strings" "time" ) var esClient = EsUtil.EsClient var CTX = EsUtil.CTX func PageEduAssistInfoByDistrictCode(districtCode string) ([]SchoolModel.EduAssist, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) districtCodeTerm := elastic.NewTermQuery("district_code", districtCode) orgTypeTerm := elastic.NewTermQuery("org_type", "3") bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) boolQuery := elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, districtCodeTerm, orgTypeTerm, bUseTerm) result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(1000). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Hits) if err != nil { return nil, err } var eduAssistArr []SchoolModel.EduAssist resStr := string(resByte) resCount := gjson.Get(resStr, "total.value") for i := 0; i < int(resCount.Num); i++ { var eduAssist SchoolModel.EduAssist eduAssist.EduAssistId = gjson.Get(resStr, "hits."+CommonUtil.ConvertIntToString(i)+"._source.data_content.org_id").Str eduAssist.EduAssistName = gjson.Get(resStr, "hits."+CommonUtil.ConvertIntToString(i)+"._source.data_content.org_name").Str eduAssistArr = append(eduAssistArr, eduAssist) } return eduAssistArr, nil } /** 功能:根据区编码获取该区下的学校列表 作者:吴缤 日期:2020-06-30 xxbxlxm -1:全部 */ func PageSchoolInfoByDistrictCode(districtCode string, xxbxlxm string) ([]SchoolModel.School, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) districtCodeTerm := elastic.NewTermQuery("district_code", districtCode) orgTypeTerm := elastic.NewTermQuery("org_type", "2") var boolQuery *elastic.BoolQuery if xxbxlxm == "-1" { boolQuery = elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, districtCodeTerm, orgTypeTerm) } else { xxbxlxmTerm := elastic.NewTermQuery("school_type", xxbxlxm) boolQuery = elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, districtCodeTerm, orgTypeTerm, xxbxlxmTerm) } result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(1000). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Hits) if err != nil { return nil, err } var schoolArr []SchoolModel.School resStr := string(resByte) resCount := gjson.Get(resStr, "total.value") for i := 0; i < int(resCount.Num); i++ { var school SchoolModel.School school.SchoolId = gjson.Get(resStr, "hits."+CommonUtil.ConvertIntToString(i)+"._source.data_content.org_id").Str school.SchoolName = gjson.Get(resStr, "hits."+CommonUtil.ConvertIntToString(i)+"._source.data_content.org_name").Str schoolArr = append(schoolArr, school) } return schoolArr, nil } func AggsDistrictStatEduAssist(districtCodeArr []string) ([]SchoolModel.EduAssistCountAggsDistrict, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) orgTypeTerm := elastic.NewTermQuery("org_type", "3") interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(districtCodeArr) cityCodeTerms := elastic.NewTermsQuery("district_code", interfaceArr...) boolQuery := elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, cityCodeTerms, orgTypeTerm) districtCodeAggs := elastic. NewTermsAggregation(). Field("district_code"). Size(50) result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(0). Aggregation("district", districtCodeAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var eduAssistCountAggsDistrictArr []SchoolModel.EduAssistCountAggsDistrict resCount := gjson.Get(resStr, "district.buckets.#") for i := 0; i < int(resCount.Num); i++ { var eduAssistCountAggsDistrict SchoolModel.EduAssistCountAggsDistrict eduAssistCountAggsDistrict.AreaCode = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str eduAssistCountAggsDistrict.Count = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Raw eduAssistCountAggsDistrictArr = append(eduAssistCountAggsDistrictArr, eduAssistCountAggsDistrict) } return eduAssistCountAggsDistrictArr, nil } func AggsDistrictStatSchoolCount(districtCodeArr []string) ([]SchoolModel.SchoolCountAggsDistrict, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) orgTypeTerm := elastic.NewTermQuery("org_type", "2") interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(districtCodeArr) cityCodeTerm := elastic.NewTermsQuery("district_code", interfaceArr...) boolQuery := elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, cityCodeTerm, orgTypeTerm) districtCodeAggs := elastic. NewTermsAggregation(). Field("district_code"). Size(50) result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(0). Aggregation("district", districtCodeAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var schoolCountAggsDistrictArr []SchoolModel.SchoolCountAggsDistrict resCount := gjson.Get(resStr, "district.buckets.#") for i := 0; i < int(resCount.Num); i++ { var schoolCountAggsDistrict SchoolModel.SchoolCountAggsDistrict schoolCountAggsDistrict.AreaCode = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str schoolCountAggsDistrict.Count = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Raw schoolCountAggsDistrictArr = append(schoolCountAggsDistrictArr, schoolCountAggsDistrict) } return schoolCountAggsDistrictArr, nil } func AggsXxbxlxStatSchoolCountByDistrictCode(districtCode string) ([]SchoolModel.SchoolCountAggsXxbxlx, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) orgTypeTerm := elastic.NewTermQuery("org_type", "2") districtCodeTerm := elastic.NewTermQuery("district_code", districtCode) boolQuery := elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, orgTypeTerm, districtCodeTerm) xxbxlxAggs := elastic. NewTermsAggregation(). Field("school_type"). Size(50) result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(0). Aggregation("xxbxlx", xxbxlxAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var schoolCountAggsXxbxlxArr []SchoolModel.SchoolCountAggsXxbxlx resCount := gjson.Get(resStr, "xxbxlx.buckets.#") for i := 0; i < int(resCount.Num); i++ { var schoolCountAggsXxbxlx SchoolModel.SchoolCountAggsXxbxlx schoolCountAggsXxbxlx.Xxbxlxm = gjson.Get(resStr, "xxbxlx.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str schoolCountAggsXxbxlx.Count = gjson.Get(resStr, "xxbxlx.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Raw schoolCountAggsXxbxlxArr = append(schoolCountAggsXxbxlxArr, schoolCountAggsXxbxlx) } return schoolCountAggsXxbxlxArr, nil } /** 功能:聚合区统计学校数量 作者:吴缤 日期:2020-07-02 districtCodes:一个或多个区编码 aggsXxbxlx:是否需要办学类型的子聚合 true:需要 false:不需要 */ func GetSchoolCountAggsDistrict(districtCodeArr []string, aggsXxbxlx bool) ([]SchoolModel.SchoolCountAggsDistrict, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) orgTypeTerm := elastic.NewTermQuery("org_type", "2") interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(districtCodeArr) cityCodeTerm := elastic.NewTermsQuery("district_code", interfaceArr...) boolQuery := elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, cityCodeTerm, orgTypeTerm) districtCodeAggs := elastic. NewTermsAggregation(). Field("district_code"). Size(50). CollectionMode("breadth_first") if aggsXxbxlx { xxbxlxAggs := elastic. NewTermsAggregation(). Field("school_type"). Size(20) districtCodeAggs.SubAggregation("xxbxlx", xxbxlxAggs) } result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(0). Aggregation("district", districtCodeAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var schoolCountAggsDistrictArr []SchoolModel.SchoolCountAggsDistrict resCount := gjson.Get(resStr, "district.buckets.#") for i := 0; i < int(resCount.Num); i++ { var schoolCountAggsDistrict SchoolModel.SchoolCountAggsDistrict schoolCountAggsDistrict.AreaCode = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str schoolCountAggsDistrict.Count = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Raw XxbxlxArr := make([]SchoolModel.SchoolCountAggsXxbxlx, 0) if aggsXxbxlx { xxbxlxCount := gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".xxbxlx.buckets.#") for j := 0; j < int(xxbxlxCount.Num); j++ { var xxbxlx SchoolModel.SchoolCountAggsXxbxlx xxbxlx.Xxbxlxm = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".xxbxlx.buckets."+CommonUtil.ConvertIntToString(j)+".key").Str xxbxlx.Count = gjson.Get(resStr, "district.buckets."+CommonUtil.ConvertIntToString(i)+".xxbxlx.buckets."+CommonUtil.ConvertIntToString(j)+".doc_count").Raw XxbxlxArr = append(XxbxlxArr, xxbxlx) } } //schoolCountAggsDistrict.Xxbxlx = XxbxlxArr schoolCountAggsDistrictArr = append(schoolCountAggsDistrictArr, schoolCountAggsDistrict) } return schoolCountAggsDistrictArr, nil } func PageStageBySchoolId(schoolId string) ([]SchoolModel.Stage, 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) stagAggs := elastic. NewTermsAggregation(). Field("data_content.stage_id"). Size(10) result, err := esClient.Search(). Index("user_student"). Query(boolQuery). Size(0). Aggregation("stag", stagAggs). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Aggregations) resStr := string(resByte) var stageArr []SchoolModel.Stage resCount := gjson.Get(resStr, "stag.buckets.#") for i := 0; i < int(resCount.Num); i++ { var stage SchoolModel.Stage stageId := gjson.Get(resStr, "stag.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str stageName := "" stage.StageId = stageId switch stageId { case "2": stageName = "小学" break case "3": stageName = "初中" break case "4": stageName = "高中" break } stage.StageName = stageName stageArr = append(stageArr, stage) } return stageArr, nil } /** 功能:根据市或区的编码(也可传单位ID)和机构类型获取总数 */ func GetOrgTotalCount(areaCode string, orgType 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.org_type", orgType) 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("org_school"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil } /** 功能:根据市或区的编码和机构类型获取当前学期新增数 */ func GetOrgCurrentTermAddCount(areaCode string, orgType 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.org_type", orgType) 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("org_school"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil } /** 功能:根据学校ID获取班级总数 */ func GetClassTotalCount(schoolId string) (int, error) { orgIdTerm := elastic.NewTermQuery("org_id", schoolId) enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) boolQuery := elastic.NewBoolQuery().Must(orgIdTerm, enableFlagTerm, delFlagTerm, bUseTerm) result, err := esClient.Search(). Index("org_class"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil } /** 功能:根据学校ID获取班级当前学期新增数 */ func GetClassCurrentTermAddCount(schoolId 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" orgIdTerm := elastic.NewTermQuery("org_id", schoolId) 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(orgIdTerm, enableFlagTerm, delFlagTerm, bUseTerm, createTimeRang) result, err := esClient.Search(). Index("org_class"). Query(boolQuery). TrackTotalHits(true). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil } func GetBaseAccessTop(areaCode string, topNum string) ([]SchoolModel.BaseAccessTopAggsOrgId, error) { var areaCodeTerm *elastic.TermQuery if strings.HasSuffix(areaCode, "00") { //市 areaCodeTerm = elastic.NewTermQuery("city_code", areaCode) } else { //区 areaCodeTerm = elastic.NewTermQuery("district_code", areaCode) } enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) boolQuery := elastic.NewBoolQuery().Must(areaCodeTerm, enableFlagTerm, delFlagTerm) orgIdAggs := elastic. NewTermsAggregation(). Field("org_id"). Size(CommonUtil.ConvertStringToInt(topNum)) result, err := esClient.Search(). Index("log_login"). 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 baseAccessTopAggsOrgIdArr []SchoolModel.BaseAccessTopAggsOrgId resCount := gjson.Get(resStr, "orgId.buckets.#") for i := 0; i < int(resCount.Num); i++ { var baseAccessTopAggsOrgId SchoolModel.BaseAccessTopAggsOrgId baseAccessTopAggsOrgId.OrgId = gjson.Get(resStr, "orgId.buckets."+CommonUtil.ConvertIntToString(i)+".key").Str baseAccessTopAggsOrgId.Count = int(gjson.Get(resStr, "orgId.buckets."+CommonUtil.ConvertIntToString(i)+".doc_count").Num) baseAccessTopAggsOrgIdArr = append(baseAccessTopAggsOrgIdArr, baseAccessTopAggsOrgId) } return baseAccessTopAggsOrgIdArr, nil } func GetOrgInfoByOrgIds(orgIds []string) ([]SchoolModel.Org, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) interfaceArr := CommonUtil.ConvertStringArrToInterfaceArr(orgIds) orgIdTerms := elastic.NewTermsQuery("org_id", interfaceArr...) boolQuery := elastic.NewBoolQuery().Must(enableFlagTerm, delFlagTerm, bUseTerm, orgIdTerms) result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(100). Do(CTX) if err != nil { return nil, err } resByte, err := json.Marshal(result.Hits) resStr := string(resByte) var orgArr []SchoolModel.Org resCount := gjson.Get(resStr, "total.value") for i := 0; i < int(resCount.Num); i++ { var org SchoolModel.Org org.OrgId = gjson.Get(resStr, "hits."+CommonUtil.ConvertIntToString(i)+"._source.data_content.org_id").Str org.OrgName = gjson.Get(resStr, "hits."+CommonUtil.ConvertIntToString(i)+"._source.data_content.org_name").Str orgArr = append(orgArr, org) } return orgArr, nil } /** 功能:根据市编码获取学校数量 */ func GetCityDirectlySchoolCount(cityCode string) (int, error) { enableFlagTerm := elastic.NewTermQuery("enable_flag", 1) delFlagTerm := elastic.NewTermQuery("del_flag", 0) bUseTerm := elastic.NewTermQuery("data_content.b_use", 1) districtCodeTerm := elastic.NewTermQuery("district_code", cityCode) orgTypeTerm := elastic.NewTermQuery("org_type", "2") boolQuery := elastic.NewBoolQuery().Must(districtCodeTerm, orgTypeTerm, enableFlagTerm, delFlagTerm, bUseTerm) result, err := esClient.Search(). Index("org_school"). Query(boolQuery). Size(0). Do(CTX) if err != nil { return 0, err } return int(result.TotalHits()), nil }