package BaseClassDao import ( "dsBaseRpc/RpcService/BaseClass/BaseClassProto" "dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationDao" "dsBaseRpc/Utils/CommonUtil" "dsBaseRpc/Utils/DbUtil" "dsBaseRpc/Utils/SqlKit" "dsBaseRpc/models" "errors" "github.com/xormplus/builder" ) var db = DbUtil.Engine //记录操作日志 func ActionLog(ms []models.TBaseClass, actionCode string, actionPersonId string, actionIp string) error { msLog := make([]models.TBaseClassLog, len(ms)) for i := range ms { CommonUtil.CopyFields(ms[i], &msLog[i]) msLog[i].LogId = CommonUtil.GetUUID() msLog[i].ActionCode = actionCode msLog[i].ActionIpAddress = actionIp msLog[i].ActionPersonId = actionPersonId } //批量保存 _, err := db.Insert(msLog) return err } //通过主键集合,查找对应的实体bean集合 func GetByIds(ids []string) ([]models.TBaseClass, error) { ms := make([]models.TBaseClass, 0) err := db.In("class_id", ids).Find(&ms) if err != nil { return nil, err } return ms, nil } //判断是不是有在指定班号范围内的班级 func CheckClassNumValid(schoolId string, stageId int32, rxnf int32, startBh int32, endBh int32) (bool, error) { classModel := new(models.TBaseClass) //between是包含边界值 total, err := db.Where("bureau_id=? and b_use=1 and stage_id=? and rxnf=? and (bh between ? and ?)", schoolId, stageId, rxnf, startBh, endBh).Count(classModel) if err != nil { return false, err } if total > 0 { return false, nil } else { return true, nil } } //批量增加 func AddBaseClass(ms []models.TBaseClass) (int64, error) { return db.Insert(ms) } //修改 func UpdateBaseClass(model models.TBaseClass, ForceUpdateFields []string) (int64, error) { //1、清除Redis缓存 var ids = []string{model.ClassId} var selector = SqlKit.GetBean("t_base_class") SqlKit.DeleteCacheByIds(ids, selector) //2、计算本次操作,有哪些字段需要更新 NeedUpdateFields := CommonUtil.GetNeedUpdateFields(model) //3、合并强制更新的字段 ForceUpdateFields = append(ForceUpdateFields, NeedUpdateFields...) //4、去重 ForceUpdateFields = CommonUtil.RemoveDuplicatesAndEmpty(ForceUpdateFields) //5、更新操作,强制更新这些列 affected, err := db.ID(model.ClassId).Cols(ForceUpdateFields...).Update(model) return affected, err } /** 功能:指定单位(部门)下是不是存在班级 作者:黄海 时间:2020-07-27 */ func ExistClass(orgId string) (bool, error) { var sql string if BaseOrganizationDao.IsBuMen(orgId) { sql = `select count(*) as c from t_base_class where b_use=1 and org_id=?` } else { sql = `select count(*) as c from t_base_class where b_use=1 and bureau_id=?` } list, err := db.SQL(sql, orgId).Query().List() if err != nil { return false, err } if list[0]["c"].(int64) > 0 { return true, nil } else { return false, nil } } //分页查询 func PageBaseClass(in *BaseClassProto.QueryArg) ([]map[string]interface{}, int32, error) { //接收传入参数 var limit = int(in.Limit) var offset = int((in.Page - 1) * in.Limit) var myBuilder = builder.Dialect(builder.MYSQL).Select("t1.*,ifnull(t3.xm,'') as teacher_name,(select count(1) from t_base_student as t2 where t1.class_id=t2.class_id and t2.b_use=1) as student_count").From("t_base_class as t1") myBuilder.LeftJoin("t_base_teacher as t3", "t1.teacher_id=t3.person_id") myBuilder.Where(builder.Eq{"t1.b_use": 1}) myBuilder.And(builder.Eq{"t1.rxnf": in.Rxnf}) myBuilder.And(builder.Eq{"t1.stage_id": in.StageId}) myBuilder.And(builder.Eq{"t1.bureau_id": in.BureauId}) //排除某个班级,用在将学生进行调整班级时的需求 if in.RemoveClassId != "" { myBuilder.And(builder.Neq{"t1.class_id": in.RemoveClassId}) } //获取拼接完成的SQL语句 sql, err := myBuilder.OrderBy("t1.bh asc").Limit(limit, offset).ToBoundSQL() if err != nil { return nil, 0, err } //调用多查询字段通用方法 list, count, err := SqlKit.Query(sql) return list, count, err } //根据学校ID获取学部(学段)信息 func GetStage(schoolId string) ([]map[string]interface{}, int32, error) { //1、获取办学类型 list := SqlKit.QueryByIds([]string{schoolId}, "t_base_organization") if list == nil || len(list) == 0 { return nil, 0, errors.New("无法找到此学校id。") } xxbxlxm := list[0]["xxbxlxm"].(string) //2、此学校的附设班有哪些 fsbList, err := BaseOrganizationDao.GetFsb(schoolId) if err != nil { return nil, -1, err } var xxbxlxmArray = make([]string, len(fsbList)+1) for i := range fsbList { xxbxlxmArray[i] = fsbList[i] } xxbxlxmArray[len(fsbList)] = xxbxlxm //3、根据办学类型,查找所有的学段 var myBuilder = builder.Dialect(builder.MYSQL).Select("distinct t1.stage_id,t2.stage_name"). From("t_dm_stage_xxbxlxm as t1"). InnerJoin("t_dm_stage as t2", "t1.stage_id=t2.stage_id"). Where(builder.In("t1.xxbxlxm", xxbxlxmArray)). And(builder.Eq{"t1.b_use": 1}). And(builder.Eq{"t2.b_use": 1}). OrderBy("t2.sort_id") sql, err := myBuilder.ToBoundSQL() if err != nil { return nil, 0, err } return SqlKit.Query(sql) } /** 功能:获取指定学校下有哪些学部的map 作者:黄海 时间:2020-06-19 */ func GetStageMap(schoolId string) map[string]string { list, _, _ := GetStage(schoolId) _map := make(map[string]string) for i := range list { _map[list[i]["stage_name"].(string)] = list[i]["stage_id"].(string) } return _map } //根据学校ID和学部(学段)ID获取入学年份 func GetRxnf(schoolId string, stageId int32) ([]map[string]interface{}, int32, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("distinct rxnf"). From("t_base_class"). Where(builder.Eq{"bureau_id": schoolId}). And(builder.Eq{"stage_id": stageId}). And(builder.Eq{"b_use": 1}). OrderBy("rxnf") sql, err := myBuilder.ToBoundSQL() if err != nil { return nil, 0, err } return SqlKit.Query(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.Query(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 } //调置班级状态为毕业,或者,取消毕业 func BacthSetClassGraduateStatus(in *BaseClassProto.BacthSetClassGraduateStageArg) error { //遍历每个班 for i := range in.Ids { //1:恢复为正常班级 -3:毕业 //(1)批量设置班级中学生的状态为毕业状态 var flag int if in.Status == 2 { flag = 1 } else { flag = 2 } sql := `update t_base_student set b_use=? where class_id=? and b_use=?` _, err := db.SQL(sql, in.Status, in.Ids[i], flag).Execute() if err != nil { return err } //(2)批量设置班级中学生的登录状态为不可用状态 sql = `update t_sys_loginperson set b_use=? where person_id in (select person_id from t_base_student where class_id=?) and b_use=?` _, err = db.SQL(sql, in.Status, in.Ids[i], flag).Execute() if err != nil { return err } //关于缓存的思考:因为我们使用的是Mysql的查询,命中后才使用缓存,所以,即使b_use不符,也不响应查询,同时,缓存中的b_use本身也没有人用。 } return nil }