package BaseOrganizationDao import ( "dsBaseRpc/Const/ErrorConst" "dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationProto" "dsBaseRpc/RpcService/SysLoginperson/SysLoginpersonDao" "dsBaseRpc/Utils/CommonUtil" "dsBaseRpc/Utils/DbUtil" "dsBaseRpc/Utils/LogUtil" "dsBaseRpc/Utils/SqlKit" "dsBaseRpc/models" "errors" "github.com/xormplus/builder" "strings" ) //操作数据库的变量 var db = DbUtil.Engine //记录操作日志 func ActionLog(ms []models.TBaseOrganization, actionCode string, actionPersonId string, actionIp string) error { msLog := make([]models.TBaseOrganizationLog, 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.TBaseOrganization, error) { ms := make([]models.TBaseOrganization, 0) err := db.In("org_id", ids).Find(&ms) if err != nil { return nil, err } return ms, nil } /** 功能:获取指定单位下最大的排序号 作者:黄海 时间:2020-06-10 */ func MaxOrgSortId(ParentId string) (int32, error) { sql := "select ifnull(max(sort_id),0)+1 as maxsortid from t_base_organization where parent_id=? and b_use=1" list, err := db.SQL(sql, ParentId).Query().List() if err != nil { return 0, err } return int32(list[0]["maxsortid"].(int64)), nil } //增加 func AddBaseOrganization(model models.TBaseOrganization) (int64, error) { return db.Insert(model) } //修改 func UpdateBaseOrganization(model models.TBaseOrganization, ForceUpdateFields []string) (int64, error) { //1、清除Redis缓存 var ids = []string{model.OrgId} var selector = SqlKit.GetBean("t_base_organization") SqlKit.DeleteCacheByIds(ids, selector) //2、计算本次操作,有哪些字段需要更新 NeedUpdateFields := CommonUtil.GetNeedUpdateFields(model) //3、合并强制更新的字段 ForceUpdateFields = append(ForceUpdateFields, NeedUpdateFields...) //4、去重 ForceUpdateFields = CommonUtil.RemoveDuplicatesAndEmpty(ForceUpdateFields) //更改排序号 //(1)权限排序号的范围是parent_id var myBuilder = builder.Dialect(builder.MYSQL).Select("org_id").From("t_base_organization") //(2)查询获取到parent_id var m1 models.TBaseOrganization db.ID(model.OrgId).Get(&m1) //组装sql //orgType 1,2,7 是教育局,学校,教辅单位 //其它是部门,条件不一样 var sql string if m1.OrgType == 1 || m1.OrgType == 2 || m1.OrgType == 7 { sql, _ = myBuilder.Where(builder.Eq{"area_code": m1.AreaCode}).And(builder.Gte{"sort_id": model.SortId}).And(builder.Neq{"org_id": model.OrgId}).And(builder.Eq{"org_type": m1.OrgType}).OrderBy("sort_id").ToBoundSQL() } else { sql, _ = myBuilder.Where(builder.Eq{"parent_id": m1.ParentId}).And(builder.Gte{"sort_id": model.SortId}).And(builder.Neq{"org_id": model.OrgId}).OrderBy("sort_id").ToBoundSQL() } list, _ := db.SQL(sql).Query().List() //事务声明 session := db.NewSession() defer session.Close() session.Begin() //事务的内容 for i := range list { u := new(models.TBaseOrganization) u.SortId = model.SortId + int32(i+1) id := list[i]["org_id"].(string) _, err := session.ID(id).Update(u) if err != nil { session.Rollback() return 0, err } //删除缓存 var ids = []string{id} var selector = SqlKit.GetBean("t_base_organization") SqlKit.DeleteCacheByIds(ids, selector) } //事务提交 err := session.Commit() if err != nil { return 0, err } //5、更新操作,强制更新这些列 affected, err := db.ID(model.OrgId).Cols(ForceUpdateFields...).Update(model) return affected, err } //获取组织机构列表 func PageBaseOrganization(in *BaseOrganizationProto.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.*,t3.original_pwd,t3.pwd,t3.login_name"). From("t_base_organization as t1"). InnerJoin("t_base_role_person as t2", "t1.bureau_id=t2.rule_id"). InnerJoin("t_sys_loginperson as t3", "t2.person_id=t3.person_id") //是市,还是区? areaCode := in.AreaCode //1是教育局,需要要城市及所辖县区的教育局 if in.OrgType == 1 { myBuilder.Where(builder.Eq{"t1.city_code": areaCode}) } else { myBuilder.Where(builder.Eq{"t1.area_code": areaCode}) } //是全部,还是要启用,禁用的? if in.BUse != 0 { myBuilder.Where(builder.Eq{"t1.b_use": in.BUse}) } //是哪个单位类型的 if in.OrgType > 0 { myBuilder.Where(builder.Eq{"t1.org_type": in.OrgType}) } //学校办学类型 -1为查询全部 if in.Xxbxlxm != "-1" && len(in.Xxbxlxm) > 0 { myBuilder.Where(builder.Eq{"t1.xxbxlxm": in.Xxbxlxm}) } //只查主校+普通校 if in.IsMainSchool { myBuilder.Where(builder.In("t1.main_school_type", []int{1, 2})) //如果要排除某个学校 if in.BureauId != "" { myBuilder.Where(builder.Neq{"t1.org_id": in.BureauId}) } } myBuilder.Where(builder.Like{"t1.org_name", in.OrgName}).OrderBy("t1.sort_id asc,t1.id_int asc") //关键字查询 sql, _ := myBuilder.Limit(limit, offset).ToBoundSQL() //通过SQL获取带缓存的数据 list, count, err := SqlKit.Query(sql) //修改密码的显示项目 SysLoginpersonDao.FillPwd(&list) return list, count, err } //功能:给定一个单位的区域码,获得隶属教育局 func GetMasterJiaoYuJu(areaCode string) models.TBaseOrganization { var model models.TBaseOrganization db.Where("org_type=1 and area_code=?", areaCode).Get(&model) return model } //功能:给定一个市或县区的区域码,返回它对应的省、市、县区行政区划码 func GetGovAreaInfo(areaCode string) (provinceCode string, cityCode string, districtCode string) { if strings.HasSuffix(areaCode, "00") { //市 provinceCode = areaCode[0:2] + "0000" cityCode = areaCode districtCode = "-1" } else { //区 provinceCode = areaCode[0:2] + "0000" cityCode = areaCode[0:4] + "00" districtCode = areaCode } return provinceCode, cityCode, districtCode } //功能:指定的org_code是否存在 func IsExistOrgCode(orgCode string, bureauId string, orgType int32, withOutOrgId string) (bool, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("org_id").From("t_base_organization") myBuilder = myBuilder.Where(builder.Eq{"org_code": orgCode}).And(builder.Eq{"b_use": 1}) //如果需要在指定单位下检查,部门级 if orgType != 1 && orgType != 2 && orgType != 7 && orgType != 8 { myBuilder = myBuilder.Where(builder.Eq{"bureau_id": bureauId}) } //排除哪一个 if len(withOutOrgId) > 0 { myBuilder = myBuilder.And(builder.Neq{"org_id": withOutOrgId}) } sql, _ := myBuilder.ToBoundSQL() count, err := db.SQL(sql).Query().Count() if err != nil { //记录到错误日志 LogUtil.Error(ErrorConst.SqlQueryError, "执行IsExistOrgCode时发生严重错误:"+err.Error()) return false, err } if count > 0 { success := true return success, nil } else { return false, nil } } //功能:指定的org_name是否存在 func IsExistOrgName(orgName string, bureauId string, orgType int32, withOutOrgId string) (bool, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("org_id").From("t_base_organization") myBuilder = myBuilder.Where(builder.Eq{"org_name": orgName}).And(builder.Eq{"b_use": 1}) if len(withOutOrgId) > 0 { myBuilder = myBuilder.Where(builder.Neq{"org_id": withOutOrgId}) } //不是1,2,7,8,应该就是部门级~ 部门级需要在指定单位下进行查询 if orgType != 1 && orgType != 2 && orgType != 7 && orgType != 8 { myBuilder = myBuilder.Where(builder.Eq{"bureau_id": bureauId}) } sql, _ := myBuilder.ToBoundSQL() count, err := db.SQL(sql).Query().Count() if err != nil { //记录到错误日志 LogUtil.Error(ErrorConst.SqlQueryError, "执行IsExistOrgName时发生严重错误:"+err.Error()) return false, err } if count > 0 { success := true return success, nil } else { return false, nil } } //功能:根据主校ID,修改主校的main_schooltype标识 func UpdateMainSchoolTypeById(mainSchoolId string, mainSchoolType int32) (int64, error) { model := new(models.TBaseOrganization) model.MainSchoolType = mainSchoolType return db.ID(mainSchoolId).Update(model) } //功能:获取一个主校的分校个数 func GetChildSchoolCount(mainSchoolId string) (int64, error) { //如果是默认值,就没有查询的必要了 if mainSchoolId == "00000000-0000-0000-0000-000000000000" { return 0, nil } model := new(models.TBaseOrganization) count, err := db.Where("main_school_id=? and b_use=1", mainSchoolId).Count(model) return count, err } /** 功能:获取指定单位的行政区划信息+主校信息 作者:黄海 时间:2020-06-03 */ func GetBureauAdministrativeDivision(BureauId string) (string, string, string, string, string, error) { list := SqlKit.QueryByIds([]string{BureauId}, "t_base_organization") if len(list) > 0 { return list[0]["area_code"].(string), list[0]["province_code"].(string), list[0]["city_code"].(string), list[0]["district_code"].(string), list[0]["main_school_id"].(string), nil } else { return "", "", "", "", "", errors.New("没有找到对应的单位信息!") } } /** 功能:一次查询多条 作者:黄海 时间:2020-06-03 */ func GetMultipleBaseOrganization(Ids []string) ([]map[string]interface{}, int32, error) { list := SqlKit.QueryByIds(Ids, "t_base_organization") return list, int32(len(list)), nil } //通过单位ID,获取单位及单位下所有的部门信息,组装成结构体返回,用于构建树 func GetBureauOrgTree(BureauId string) ([]map[string]interface{}, int32, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("org_id").From("t_base_organization") myBuilder.Where(builder.Eq{"b_use": 1}).And(builder.Eq{"bureau_id": BureauId}).OrderBy("parent_id,sort_id") //通过SQL获取带缓存的数据 sql, _ := myBuilder.ToBoundSQL() list, count, err := SqlKit.Query(sql) return list, count, err } //根据一个或多个部门ID获取部门领导 func GetOrgManager(Ids []string) ([]map[string]interface{}, int32, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("t1.org_id,t1.person_id,t2.xm"). From("t_base_organization_manager as t1"). InnerJoin("t_base_teacher as t2", "t1.person_id=t2.person_id"). Where(builder.Eq{"t1.b_use": 1}). And(builder.In("t1.org_id", Ids)) //通过SQL获取数据 sql, _ := myBuilder.ToBoundSQL() list, count, err := SqlKit.Query(sql) return list, count, err } /** 功能:启用/禁用教育局 作者:黄海 时间:2020-06-08 */ func SetEduStatus(ids []string, bUse int) error { //1、清除Redis缓存 var selector = SqlKit.GetBean("t_base_organization") SqlKit.DeleteCacheByIds(ids, selector) //2、组织机构表 var myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": bUse}).From("t_base_organization").Where(builder.In("org_id", ids)) sql, err := myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //单元ID对应的areaCode myBuilder = builder.Dialect(builder.MYSQL).Select("area_code").From("t_base_organization").Where(builder.In("org_id", ids)) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } areaCodes := make([]string, 0) list, err := db.SQL(sql).Query().List() for i := range list { areaCodes = append(areaCodes, list[i]["area_code"].(string)) } //3A、人员角色表(教育局) myBuilder = builder.Dialect(builder.MYSQL).Select("person_id").From("t_base_role_person").Where(builder.In("rule_id", ids)) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } list, err = db.SQL(sql).Query().List() if err != nil { return err } //转为字符串数组 personIds := make([]string, 0) for i := range list { personIds = append(personIds, list[i]["person_id"].(string)) } //3B、人员角色表(行政区划) myBuilder = builder.Dialect(builder.MYSQL).Select("person_id").From("t_base_role_person").Where(builder.In("rule_id", areaCodes)) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } list, err = db.SQL(sql).Query().List() if err != nil { return err } //转为字符串数组 for i := range list { personIds = append(personIds, list[i]["person_id"].(string)) } //将人员角色表中的相关人员数据b_use修改为-1 myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": bUse}).From("t_base_role_person").Where(builder.In("person_id", personIds)) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //4、登录表 myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": bUse}).From("t_sys_loginperson").Where(builder.In("person_id", personIds)) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //5、人员表 myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": bUse}).From("t_base_teacher").Where(builder.In("person_id", personIds)) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //删除人员的缓存 selector = SqlKit.GetBean("t_base_teacher") SqlKit.DeleteCacheByIds(personIds, selector) return nil } /** 功能:获取一个指定部门下的所有子部门有哪些 作者:黄海 时间:2020-06-12 */ func GetChildOrg(orgId string) ([]map[string]interface{}, int32, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("org_id").From("t_base_organization"). Where(builder.In("parent_id", orgId)).And(builder.Eq{"b_use": 1}).OrderBy("sort_id") sql, err := myBuilder.ToBoundSQL() if err != nil { return nil, 0, err } return SqlKit.Query(sql) } /** 功能:禁用单位管理员的周边信息 作者:黄海 时间:2020-06-15 */ func DisableBureauManager(ids []string) error { //1、查找出这些单位下对应的管理员是哪些? myBuilder := builder.Dialect(builder.MYSQL).Select("person_id").From("t_base_role_person"). Where(builder.Eq{"identity_id": 1}.And(builder.In("rule_id", ids))) sql, err := myBuilder.ToBoundSQL() if err != nil { return err } list, err := db.SQL(sql).Query().List() if err != nil { return err } var personIds = make([]string, 0) //每个管理员都要进行处理 for i := range list { //2、设置t_base_teacher中此人员为-1状态 myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": -1}).From("t_base_teacher"). Where(builder.Eq{"identity_id": 1}).And(builder.Eq{"person_id": list[i]["person_id"].(string)}) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //3、设置t_sys_loginperson中此人员为-1状态 myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": -1}).From("t_sys_loginperson"). Where(builder.Eq{"identity_id": 1}).And(builder.Eq{"person_id": list[i]["person_id"].(string)}) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //4、设置t_base_role_person中此人员为-1状态 myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": -1}).From("t_base_role_person"). Where(builder.Eq{"identity_id": 1}).And(builder.Eq{"person_id": list[i]["person_id"].(string)}) sql, err = myBuilder.ToBoundSQL() if err != nil { return err } _, err = db.Exec(sql) if err != nil { return err } //人员数组 personIds = append(personIds, list[i]["person_id"].(string)) } //删除人员的缓存 selector := SqlKit.GetBean("t_base_teacher") SqlKit.DeleteCacheByIds(personIds, selector) return nil } /** 功能:判断一个组织机构是不是部门 作者:黄海 时间:2020-07-17 */ func IsBuMen(orgId string) bool { //判断是单位还是部门 list := SqlKit.QueryByIds([]string{orgId}, "t_base_organization") if list[0]["org_type"].(float64) == 3 { return true } return false } /** 功能:根据单位名称的关键字和管理员的人员ID查询单位列表 作者:黄海 时间:2020-07-17 */ func ListOrgInfoByOrgKeyWord(personId string, orgKeyWord string) ([]map[string]interface{}, error) { //(1)根据personId获取它管辖的范围 sql := `select rule_id from t_base_role_person where person_id=? and role_id in ('5CC3293C-3AA5-45B7-B54B-CA8CC549FB81','BF61C95F-3ADD-4F37-9FCD-97E69E1BF6E3','A66C757C-F797-454D-99DE-2A3F5415BC22')` list, err := db.SQL(sql, personId).Query().List() if err != nil { return nil, err } if list == nil || len(list) == 0 { return nil, errors.New("人员没有找到相应的管辖范围!") } //范围 ruleId := list[0]["rule_id"].(string) //(2)构建SQL进行查询 var myBuilder = builder.Dialect(builder.MYSQL).Select("*").From("t_base_organization") // 如果是超级管理员,那么没有这个条件限制 if ruleId != "100000" { //如果是市管理员 if ruleId[len(ruleId)-2:] == "00" { myBuilder.Where(builder.Eq{"city_code": ruleId}) } else { //如果是县区管理员 myBuilder.Where(builder.Eq{"district_code": ruleId}) } } myBuilder.Where(builder.Like{"org_name", orgKeyWord}) myBuilder.Where(builder.In("org_type", 1, 2, 7)).Limit(10, 0) sql, _ = myBuilder.ToBoundSQL() list, err = db.SQL(sql).Query().List() if err != nil { return nil, err } return list, nil } /** 功能:根据市的行政区划码获取教育局列表 作者:黄海 时间:2020-07-17 */ func ListEduByCityCode(cityCode string) ([]map[string]interface{}, error) { sql := `select area_code,org_name from t_base_organization where org_type=1 and b_use=1 and area_code in (select area_code from t_gov_area where master_code=? order by area_code) order by sort_id` list, err := db.SQL(sql, cityCode).Query().List() return list, err } /** 功能:将学校的附设班进行修改 作者:黄海 时间:2020-07-17 */ func UpdateFsb(bureauId string, fsbCode []string) error { //1、旧数据全面修改为-2 myBuilder := builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": -2}).From("t_base_school_fsb"). Where(builder.Eq{"bureau_id": bureauId}).And(builder.Eq{"b_use": 1}) sql, err := myBuilder.ToBoundSQL() if err != nil { return err } db.SQL(sql).Execute() //2、增加新数据 for i := range fsbCode { model := new(models.TBaseSchoolFsb) model.Id = CommonUtil.GetUUID() model.BureauId = bureauId model.Fsxxbxlxm = fsbCode[i] model.BUse = 1 db.Insert(model) } return nil } /** 功能:获取附设班信息 作者:黄海 时间:2020-08-21 */ func GetFsb(bureauId string) ([]string, error) { sql := `select * from t_base_school_fsb where b_use=1 and bureau_id=?` list, err := db.SQL(sql, bureauId).Query().List() var res = make([]string, 0) for i := range list { res = append(res, list[i]["fsxxbxlxm"].(string)) } return res, err } /** 功能:根据单位代码,获取单位信息 作者:黄海 时间:2020-08-21 */ func GetBureauInfoByCode(bureauCode string) ([]map[string]interface{}, error) { sql := `select * from t_base_organization where b_use=1 and org_code=?` list, err := db.SQL(sql, bureauCode).Query().List() return list, err }