You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

572 lines
18 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
}