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.

615 lines
19 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 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 || 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})
}
//不是1278应该就是部门级~ 部门级需要在指定单位下进行查询
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.Eq{"b_use": 1})
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
}