From 568e795fe1c9645c8e16858d7db7b463f7ff13b1 Mon Sep 17 00:00:00 2001 From: huanghai <10402852@qq.com> Date: Fri, 17 Jul 2020 12:57:42 +0800 Subject: [PATCH] 'commit' --- dsBaseRpc/DataExchange/DataExchange.go | 113 +++++++++++++----- .../BaseClass/BaseClassDao/BaseClassDao.go | 37 +++++- .../BaseTeacherService/BaseTeacherService.go | 9 ++ 3 files changed, 131 insertions(+), 28 deletions(-) diff --git a/dsBaseRpc/DataExchange/DataExchange.go b/dsBaseRpc/DataExchange/DataExchange.go index 9612c6b5..a75963c6 100644 --- a/dsBaseRpc/DataExchange/DataExchange.go +++ b/dsBaseRpc/DataExchange/DataExchange.go @@ -16,6 +16,9 @@ import ( var db = DbUtil.Engine +//每次获取的条数 +var limit = 100 + // 日志文件路径 var progressFilePath = "/usr/local/SyncDataLogs/" @@ -68,6 +71,52 @@ func init() { 时间:2020-07-16 */ func DataExchange() { + //是不是进行过首次上报,如果没有话,需要执行一次组织机构上报 + //日志文件位置 + logName := progressFilePath + "orgInit.log" + //判断文件是不是存在 + if !FileUtil.PathExists(logName) { + //上报组织机构,读取t_base_organization的SQL脚本 + //SQL内容 + sql := FileUtil.ReadFileContent("./Sql/t_base_organization.sql") + //组织机构是需要按org_type,area_code排序 + orgSql := sql + " order by t1.org_type,t1.area_code" + list, _ := db.SQL(orgSql).Query().List() + + var t tableStruct + for i := range sqlDict { + if sqlDict[i].TableName == "t_base_organization" { + t = sqlDict[i] + break + } + } + var count = 0 + var isFinish = false + for { + if isFinish { + break + } + //利用切片分批次上报 + if len(list) > limit { + success:=PostToServer(t, list[0:limit]) + if !success{ + continue + } + count = count + limit + list = list[limit:] + } else if len(list) > 0 { + PostToServer(t, list) + count = count + len(list) + isFinish = true + } else { + isFinish = true + } + fmt.Println(CommonUtil.GetCurrentTime() + " 同步:成功完成组织机构初始化上报,本次完成" + CommonUtil.ConvertIntToString(count) + "条!") + } + //记录日志,内容为1,表示组织机构初始化上报过了~ + FileUtil.WriteContent(logName, "ok") + } + for { //本轮上报的数量,如果是0,休息5秒后再继续上传 postCount := UploadData() @@ -117,29 +166,8 @@ func UploadData() int { break } //上报到Http Api--->Body--->Post - var ps postStruct - ps.DataSource = sqlDict[i].DataSource - ps.AuthToken = "DSDataex_Token_eb4ab2fea87161dc08fa794a648584c4" - ps.SystemId = "BASE_GO" - - var dsMap = make([]dataStruct, 0) - for k := range list { - var ds dataStruct - ds.Data, _ = CommonUtil.MapToJson(list[k]) - ds.DataId = list[k][sqlDict[i].PrimaryKey].(string) - ds.DelFlag = list[k]["del_flag"].(int64) - ds.OrgId = list[k]["bureau_id"].(string) - dsMap = append(dsMap, ds) - } - ps.Datas = dsMap - //将Struct转为json - jsonBytes, _ := json.Marshal(ps) - msg := string(jsonBytes) - //提交到汇集中心 - p := httpDo("POST", ConfigUtil.DataExchangeUrl, msg) - if !p.Success { - fmt.Println(CommonUtil.GetCurrentTime() + " 同步:上报到数据汇集中心失败,将休息5秒后重试!错误原因:"+p.Message) - time.Sleep(5 * 1e9) + success := PostToServer(sqlDict[i], list) + if !success { continue } //记录上报数量 @@ -162,16 +190,47 @@ func UploadData() int { return postCount } +/** +功能:将数据批量上报到汇集中心 +作者:黄海 +时间:2020-07-17 +*/ +func PostToServer(t tableStruct, list []map[string]interface{}) bool { + //上报到Http Api--->Body--->Post + var ps postStruct + ps.DataSource = t.DataSource + ps.AuthToken = "DSDataex_Token_eb4ab2fea87161dc08fa794a648584c4" + ps.SystemId = "BASE_GO" + + var dsMap = make([]dataStruct, 0) + for k := range list { + var ds dataStruct + ds.Data, _ = CommonUtil.MapToJson(list[k]) + ds.DataId = list[k][t.PrimaryKey].(string) + ds.DelFlag = list[k]["del_flag"].(int64) + ds.OrgId = list[k]["bureau_id"].(string) + dsMap = append(dsMap, ds) + } + ps.Datas = dsMap + //将Struct转为json + jsonBytes, _ := json.Marshal(ps) + msg := string(jsonBytes) + //提交到汇集中心 + p := httpDo("POST", ConfigUtil.DataExchangeUrl, msg) + fmt.Println(CommonUtil.GetCurrentTime() + " 同步:上报到数据汇集中心失败,将休息5秒后重试!错误原因:" + p.Message) + time.Sleep(5 * 1e9) + return p.Success +} + /** * 功能:获取一个表的指定大小的数据 * 作者:黄海 * 时间:2019-01-16 */ func getRecord(tableName string, lastUpdatedTime string, idInt int64) (string, int64, []map[string]interface{}) { - //每次获取的条数 - limit := 100 //SQL内容 sqlPublic := FileUtil.ReadFileContent("./Sql/" + tableName + ".sql") + //时间戳相等的SQL eqSql := sqlPublic + " where t1.last_updated_time =? and t1.id_int>? order by t1.last_updated_time,t1.id_int limit ?" //时间戳大于的SQL @@ -245,8 +304,8 @@ type ResultStruct struct { // 基础方法,这里多用于访问webapi,配合上json转换。此方法可以运行但是不算完善。 func httpDo(method string, url string, msg string) ResultStruct { var p ResultStruct - p.Success=false - p.Message="上报到汇集系统失败!" + p.Success = false + p.Message = "上报到汇集系统失败!" client := &http.Client{} body := bytes.NewBuffer([]byte(msg)) req, err := http.NewRequest(method, diff --git a/dsBaseRpc/RpcService/BaseClass/BaseClassDao/BaseClassDao.go b/dsBaseRpc/RpcService/BaseClass/BaseClassDao/BaseClassDao.go index c4ef7208..622d3bc7 100644 --- a/dsBaseRpc/RpcService/BaseClass/BaseClassDao/BaseClassDao.go +++ b/dsBaseRpc/RpcService/BaseClass/BaseClassDao/BaseClassDao.go @@ -88,7 +88,7 @@ func PageBaseClass(in *BaseClassProto.QueryArg) ([]map[string]interface{}, int32 myBuilder.And(builder.Eq{"t1.stage_id": in.StageId}) myBuilder.And(builder.Eq{"t1.bureau_id": in.BureauId}) //排除某个班级,用在将学生进行调整班级时的需求 - if in.RemoveClassId!=""{ + if in.RemoveClassId != "" { myBuilder.And(builder.Neq{"t1.class_id": in.RemoveClassId}) } //获取拼接完成的SQL语句 @@ -152,3 +152,38 @@ func GetRxnf(schoolId string, stageId string) ([]map[string]interface{}, int32, } return SqlKit.QueryForPk(sql) } + +/** +功能:清除删除人员时,人员对应的班主任信息 +作者:黄海 +时间:2020-07-17 +*/ +func ClearPersonBzr(teacherIds []string) error { + var myBuilder = builder.Dialect(builder.MYSQL).Select("class_id"). + From("t_base_class"). + Where(builder.In("teacher_id", teacherIds)). + And(builder.Eq{"b_use": 1}) + sql, err := myBuilder.ToBoundSQL() + if err != nil { + return err + } + list, _, err := SqlKit.QueryForPk(sql) + if err != nil { + return err + } + var ClassIds []string + for i := range list { + id := list[i]["class_id"].(string) + ClassIds = append(ClassIds, id) + //删除班主任 + tbc := new(models.TBaseClass) + _, err := db.Table(tbc).ID(id).Update(map[string]interface{}{"teacher_id": ""}) + if err != nil { + return err + } + } + //清除Redis缓存 + var selector = SqlKit.GetBean("t_base_class") + SqlKit.DeleteCacheByIds(ClassIds, selector) + return nil +} diff --git a/dsBaseRpc/RpcService/BaseTeacher/BaseTeacherService/BaseTeacherService.go b/dsBaseRpc/RpcService/BaseTeacher/BaseTeacherService/BaseTeacherService.go index 8dbd4b4e..4fce7713 100644 --- a/dsBaseRpc/RpcService/BaseTeacher/BaseTeacherService/BaseTeacherService.go +++ b/dsBaseRpc/RpcService/BaseTeacher/BaseTeacherService/BaseTeacherService.go @@ -4,6 +4,7 @@ import ( "context" "dsBaseRpc/Const" "dsBaseRpc/Const/ErrorConst" + "dsBaseRpc/RpcService/BaseClass/BaseClassDao" "dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationDao" "dsBaseRpc/RpcService/BaseOrganizationManager/BaseOrganizationManagerDao" "dsBaseRpc/RpcService/BaseTeacher/BaseTeacherDao" @@ -189,6 +190,14 @@ func (s *Rpc) DeleteBaseTeacher(ctx context.Context, in *BaseTeacherProto.Delete reply.Message = Const.DataBaseActionError return &reply, err } + //删除人员时,对应的班主任,也要删除一下~ + err=BaseClassDao.ClearPersonBzr(in.Ids) + if err != nil { + LogUtil.Error(ErrorConst.SqlUpdateError, "执行ClearPersonBzr时发生严重错误:"+err.Error()) + reply.Success = false + reply.Message = Const.DataBaseActionError + return &reply, err + } //记录日志 ms, err := BaseTeacherDao.GetByIds(in.Ids) if err != nil {