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.

1358 lines
43 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 BaseTeacherDao
import (
"dsBaseRpc/Const"
"dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationDao"
"dsBaseRpc/RpcService/BaseTeacher/BaseTeacherProto"
"dsBaseRpc/RpcService/SysDict/SysDictKit"
"dsBaseRpc/RpcService/SysLoginperson/SysLoginpersonDao"
"dsBaseRpc/RpcService/SysLoginperson/SysLoginpersonService"
"dsBaseRpc/Utils/CommonUtil"
"dsBaseRpc/Utils/DateUtil"
"dsBaseRpc/Utils/DbUtil"
"dsBaseRpc/Utils/ExcelUtil"
"dsBaseRpc/Utils/FileUtil"
"dsBaseRpc/Utils/IdCardUtil"
"dsBaseRpc/Utils/LogUtil"
"dsBaseRpc/Utils/PinYinUtil"
"dsBaseRpc/Utils/RedisUtil"
"dsBaseRpc/Utils/SqlKit"
"dsBaseRpc/models"
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/pkg/errors"
"github.com/xormplus/builder"
"github.com/xormplus/xorm"
"strconv"
)
var db = DbUtil.Engine
//记录操作日志
func ActionLog(ms []models.TBaseTeacher, actionCode string, actionPersonId string, actionIp string) {
msLog := make([]models.TBaseTeacherLog, 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
}
//批量保存
_, _ = db.Insert(msLog)
}
//通过主键集合查找对应的实体bean集合
func GetByIds(ids []string) ([]models.TBaseTeacher, error) {
ms := make([]models.TBaseTeacher, 0)
err := db.In("person_id", ids).Find(&ms)
if err != nil {
return nil, err
}
return ms, nil
}
/**
功能:获取指定部门下的排序号最大值
作者:黄海
时间2020-06-03
*/
func GetMaxSortId(OrgId string) int64 {
//取最大值
sql := "select ifnull(max(sort_id),0) as maxSortId from t_base_teacher_org where org_id=? and b_use=1"
listSort, _ := db.SQL(sql, OrgId).Query().List()
SortId := listSort[0]["maxSortId"].(int64)
return SortId
}
//增加
func AddBaseTeacher(session *xorm.Session, model models.TBaseTeacher) (int64, error) {
//插入基本表
count, err := session.Insert(model)
return count, err
}
//修改
func UpdateBaseTeacher(model models.TBaseTeacher, ForceUpdateFields []string) (int64, error) {
//1、清除Redis缓存
var ids = []string{model.PersonId}
var selector = SqlKit.GetBean("t_base_teacher")
SqlKit.DeleteCacheByIds(ids, selector)
//更改登录表中的教师姓名
_, _ = SysLoginpersonDao.UpdatePersonName(model.PersonId, model.Xm)
//2、计算本次操作有哪些字段需要更新
NeedUpdateFields := CommonUtil.GetNeedUpdateFields(model)
//3、合并强制更新的字段
ForceUpdateFields = append(ForceUpdateFields, NeedUpdateFields...)
//4、去重
ForceUpdateFields = CommonUtil.RemoveDuplicatesAndEmpty(ForceUpdateFields)
//5、更新操作,强制更新这些列
affected, err := db.ID(model.PersonId).Cols(ForceUpdateFields...).Update(model)
return affected, err
}
//分页查询
func PageBaseTeacher(in *BaseTeacherProto.QueryArg) ([]map[string]interface{}, int32, error) {
//所在单位ID
list := SqlKit.QueryByIds([]string{in.OrgId}, "t_base_organization")
if list == nil {
return nil, 0, errors.New("没有找到此单位代码!")
}
bureauId := list[0]["bureau_id"].(string)
//接收传入参数
var limit = int(in.Limit)
var offset = int((in.Page - 1) * in.Limit)
// 注意使用limit时要使用方言
// 注意两个表关联时的on用法
var myBuilder = builder.Dialect(builder.MYSQL).Select(`t1.person_id,t1.identity_id,group_concat(t3.org_name) as org_name,t1.id_int,t1.xm,t1.xmpy,t1.cym,t1.xbm,t1.csrq,t1.mzm,t1.zzmmm,t1.sfzjlxm,t1.sfzjh,t1.xlm,t1.xwm,t1.zcm,t1.bzlbm,t1.cjny,t1.stage_id,t1.subject_id,t1.gwzym,t1.lxdh,t1.dzxx,t1.b_use,t1.state_id,t1.last_updated_time,t1.create_time,t2.bureau_id,t2.org_id`).
From("t_base_teacher as t1").
LeftJoin("t_base_teacher_org as t2", "t1.person_id=t2.person_id and t2.b_use=1 and t2.bureau_id='"+bureauId+"'").
InnerJoin("t_base_organization as t3", "t2.org_id=t3.org_id").
OrderBy("t2.sort_id")
if in.OrgId == bureauId {
//如果是单位ID
myBuilder.And(builder.Eq{"t2.bureau_id": in.OrgId})
} else {
//如果是部门ID
myBuilder.And(builder.Eq{"t2.org_id": in.OrgId})
}
//姓名模糊搜索
myBuilder.And(builder.Like{"t1.xm", in.Xm})
//只要b_use=1
myBuilder.And(builder.Eq{"t1.b_use": 1})
//只要identity_id=2
myBuilder.And(builder.Eq{"t1.identity_id": 2})
//分组
myBuilder.GroupBy("t1.person_id")
//分页
myBuilder.Limit(limit, offset)
//获取拼接完成的SQL语句
sql, err := myBuilder.ToBoundSQL()
if err != nil {
return nil, 0, err
}
list, count, err := SqlKit.Query(sql)
//扩展登录信息
_ = FillLoginInfo(&list)
//对于教师是不是修改过账号进行判断
SysLoginpersonService.FillPwdIsChange(&list)
//扩展是不是在多个单位+部门下
FillIsMultiOrg(&list)
//填充主单位,主部门信息
FillMainBureauOrgInfo(&list)
//返回结果
return list, count, err
}
/**
功能:填充一个人员在几个部门下
作者:黄海
时间2020-08-05
*/
func FillIsMultiOrg(list2 *[]map[string]interface{}) {
list := *list2
var personIds = make([]string, 0)
for i := range list {
personIds = append(personIds, (list[i])["person_id"].(string))
}
var myBuilder = builder.Dialect(builder.MYSQL).Select("person_id,count(*) as c").
From("t_base_teacher_org").Where(builder.In("person_id", personIds)).And(builder.Eq{"b_use": 1}).
GroupBy("person_id")
sql, _ := myBuilder.ToBoundSQL()
_list, _ := db.SQL(sql).Query().List()
//生成map
var _map = make(map[string]int64, 0)
for i := range _list {
_map[_list[i]["person_id"].(string)] = _list[i]["c"].(int64)
}
for i := range list {
list[i]["org_count"] = _map[list[i]["person_id"].(string)]
}
}
/**
功能:填充一个人员的主单位,主部门
作者:黄海
时间2020-08-05
*/
func FillMainBureauOrgInfo(list2 *[]map[string]interface{}) {
list := *list2
var personIds = make([]string, 0)
for i := range list {
personIds = append(personIds, (list[i])["person_id"].(string))
}
var myBuilder = builder.Dialect(builder.MYSQL).Select("person_id,bureau_id,org_id,province_code,city_code,district_code,main_school_id").
From("t_base_teacher_org").
Where(builder.In("person_id", personIds)).And(builder.Eq{"b_use": 1}).
And(builder.Eq{"is_main": 1})
sql, _ := myBuilder.ToBoundSQL()
_listExtendInfo, _ := db.SQL(sql).Query().List()
for i := range list {
for j := range _listExtendInfo {
if _listExtendInfo[j]["person_id"] == list[i]["person_id"] {
list[i]["x_bureau_id"] = _listExtendInfo[j]["bureau_id"]
list[i]["x_org_id"] = _listExtendInfo[j]["org_id"]
list[i]["x_province_code"] = _listExtendInfo[j]["province_code"]
list[i]["x_city_code"] = _listExtendInfo[j]["city_code"]
list[i]["x_district_code"] = _listExtendInfo[j]["district_code"]
list[i]["x_main_school_id"] = _listExtendInfo[j]["main_school_id"]
break
}
}
}
}
/**
功能:扩展登录信息
作者:黄海
时间2020-6-15
*/
func FillLoginInfo(list *[]map[string]interface{}) error {
list2 := *list
//哪些person_ids
ids := CommonUtil.ConvertSqlListToArray(list2, "person_id")
//在登录表中查找
var myBuilder = builder.Dialect(builder.MYSQL).Select("person_id,login_name,pwd,original_pwd,b_use").
From("t_sys_loginperson").Where(builder.Eq{"identity_id": 2}).And(builder.In("person_id", ids))
sql, err := myBuilder.ToBoundSQL()
if err != nil {
return err
}
list3, err := db.SQL(sql).Query().List()
if err != nil {
return err
}
//准备字典数据
_map := make(map[string]map[string]interface{})
for i := range list3 {
_map[list3[i]["person_id"].(string)] = list3[i]
}
//对原始数据进行扩展
for i := range list2 {
record := list2[i]
_, ok := _map[record["person_id"].(string)]["login_name"]
if ok {
record["login_name"] = _map[record["person_id"].(string)]["login_name"].(string)
record["pwd"] = _map[record["person_id"].(string)]["pwd"].(string)
record["original_pwd"] = _map[record["person_id"].(string)]["original_pwd"].(string)
record["login_b_use"] = _map[record["person_id"].(string)]["b_use"].(int64)
} else {
record["login_name"] = "未找到"
record["pwd"] = "未找到"
record["original_pwd"] = "未找到"
var i int64 = 0
record["login_b_use"] = i
}
}
return nil
}
/**
功能:获取指定部门的人员最大排序号
*/
func getOrgMaxSortId(OrgId string) int32 {
//1、目前这个部门最大的SortId
sql := "select ifnull(max(sort_id),0) as maxSortId from t_base_teacher_org where b_use=1 and org_id=?"
listSortId, _ := db.SQL(sql, OrgId).Query().List()
maxSortId := int32(listSortId[0]["maxSortId"].(int64))
return maxSortId
}
//批量教师修改部门
func ReviseTeacherOrg(Ids []string, OrgId string) error {
//获取指定部门的人员最大排序号
maxSortId := getOrgMaxSortId(OrgId)
//2、删除旧的部门关系
_ = DeleteTeacherOrgInfo(Ids, OrgId)
//3、插入人员部门关系
_, _, _, _ = AddTeacherOrgInfo(Ids, OrgId, 1, maxSortId)
return nil
}
//导出本单位教职工账号信息到EXCEL
func ExportTeacherAccountInfoExcel(in *BaseTeacherProto.ModelArg) ([]map[string]interface{}, int32, error) {
var myBuilder = builder.Dialect(builder.MYSQL).Select("t1.*,t3.org_name").
From("t_sys_loginperson as t1").
InnerJoin("t_base_teacher as t2", "t1.person_id=t2.person_id").
InnerJoin("t_base_teacher_org as t4", "t2.person_id=t4.person_id").
InnerJoin("t_base_organization as t3", "t4.org_id=t3.org_id")
myBuilder.Where(builder.Eq{"t1.b_use": 1}).
And(builder.Eq{"t2.b_use": 1}).
And(builder.Eq{"t3.b_use": 1}).
And(builder.Eq{"t4.b_use": 1}).
And(builder.Eq{"t4.is_main": 1}).
And(builder.Eq{"t3.bureau_id": in.BureauId}).And(builder.Eq{"t1.identity_id": 2})
myBuilder.OrderBy("t2.sort_id").OrderBy("t2.id_int")
sql, err := myBuilder.ToBoundSQL()
if err != nil {
return nil, 0, err
}
list, count, err := SqlKit.Query(sql)
return list, count, err
}
/**
功能生成导入教师的EXCEL模板
作者:黄海
时间2020-06-05
*/
func ExportTeacherInfoExcel(targetPath string, bureauId string, ExportExcelStatus int32) {
//1、配置文件
jsonTemplate := "teacher.json"
f, s1, dictCols, SheetName := ExcelUtil.TemplateAddDict("teacher.xlsx", jsonTemplate)
//添加注释
_ = f.AddComment(SheetName, "D201", `{"author":"示例: ","text":"1980-01-01"}`)
//数据准备
list, _ := db.SQL(s1.Level2Sql[0][0]).Query().List()
//初始列
var startDictCName string
//终止列
var stopDictCName string
for i := range list {
dictCName, _ := excelize.ColumnNumberToName(dictCols)
if i == 0 {
startDictCName = dictCName
}
if i == len(list)-1 {
stopDictCName = dictCName
}
dictCols++
stageName := list[i]["dict_value"].(string)
_ = f.SetCellValue(SheetName, dictCName+CommonUtil.ConvertIntToString(1), stageName)
//在学段下面第二行开始写入各个学段对应的学科
list2, _ := db.SQL(s1.Level2Sql[0][1], stageName).Query().List()
for k := range list2 {
subjectName := list2[k]["dict_value"].(string)
_ = f.SetCellValue(SheetName, dictCName+CommonUtil.ConvertIntToString(k+2), subjectName)
}
//批量建立名称管理器
_ = f.SetDefinedName(&excelize.DefinedName{
Name: stageName,
RefersTo: SheetName + "!$" + dictCName + "$2:$" + dictCName + "$" + CommonUtil.ConvertIntToString(len(list2)+1),
Comment: stageName,
Scope: SheetName,
})
//隐藏字典列
_ = f.SetColVisible(SheetName, dictCName, false)
}
//学段限定
dvRange := excelize.NewDataValidation(true)
dvRange.Sqref = "M" + CommonUtil.ConvertIntToString(ExcelUtil.HiddenRows+2) + ":M" + CommonUtil.ConvertIntToString(ExcelUtil.RowsCount+ExcelUtil.HiddenRows)
_ = dvRange.SetSqrefDropList("$"+startDictCName+"$1:$"+stopDictCName+"$1", true)
_ = f.AddDataValidation(SheetName, dvRange)
//学科级联绑定
dvRange = excelize.NewDataValidation(true)
dvRange.Sqref = "N" + CommonUtil.ConvertIntToString(2+ExcelUtil.HiddenRows) + ":N" + CommonUtil.ConvertIntToString(ExcelUtil.RowsCount+ExcelUtil.HiddenRows)
_ = dvRange.SetSqrefDropList("INDIRECT($M"+CommonUtil.ConvertIntToString(ExcelUtil.HiddenRows+2)+")", true)
_ = f.AddDataValidation(SheetName, dvRange)
//部门
sql := "select org_name as dict_value from t_base_organization where bureau_id=? and b_use=1 order by org_type,sort_id"
list, _ = db.SQL(sql, bureauId).Query().List()
if len(list) > 0 {
//字典列从cols+1开始
dictCName, _ := excelize.ColumnNumberToName(dictCols)
for j := range list {
_ = f.SetCellValue(SheetName, dictCName+CommonUtil.ConvertIntToString(j+1), list[j]["dict_value"])
//隐藏字典列
_ = f.SetColVisible(SheetName, dictCName, false)
//要设置下拉框的列
dvRange := excelize.NewDataValidation(true)
dvRange.Sqref = "A" + CommonUtil.ConvertIntToString(2+ExcelUtil.HiddenRows) + ":A" + CommonUtil.ConvertIntToString(ExcelUtil.RowsCount+ExcelUtil.HiddenRows)
c := "$" + dictCName + "$1:" + dictCName + "$" + CommonUtil.ConvertIntToString(ExcelUtil.RowsCount)
_ = dvRange.SetSqrefDropList(c, true)
_ = f.AddDataValidation(SheetName, dvRange)
}
}
if ExportExcelStatus > 0 {
//将现有数据填充到下载的模板中
sql := `select t1.person_id,t2.org_name,t1.xm,t1.xbm,t1.csrq,
t1.mzm,t1.zzmmm,t1.sfzjlxm, (case t1.sfzjh when '-1' then '' else t1.sfzjh end ) as sfzjh,
t1.xlm,t1.xwm,t1.zcm,t1.bzlbm,t1.stage_id,t1.subject_id,t1.gwzym,t1.lxdh,t1.dzxx
from t_base_teacher as t1 inner join t_base_teacher_org as t3 on t1.person_id=t3.person_id
inner join t_base_organization as t2 on t3.org_id=t2.org_id
where t3.bureau_id=? and t1.identity_id=2 and t1.b_use=1 and t3.b_use=1 and t3.is_main=1 order by t3.sort_id,t1.id_int`
list, _ := db.SQL(sql, bureauId).Query().List()
for i := range list {
record := list[i]
//扩展性别
if record["xbm"].(string) == "1" {
record["xbm"] = "男"
} else {
record["xbm"] = "女"
}
//扩展民族
record["mzm"] = SysDictKit.MapDictKindCodeToChinese["mzm"+"_"+record["mzm"].(string)]
//扩展政治面貌
record["zzmmm"] = SysDictKit.MapDictKindCodeToChinese["zzmmm"+"_"+record["zzmmm"].(string)]
//扩展身份证件类型
record["sfzjlxm"] = SysDictKit.MapDictKindCodeToChinese["sfzjlxm"+"_"+record["sfzjlxm"].(string)]
//扩展学历
record["xlm"] = SysDictKit.MapDictKindCodeToChinese["xlm"+"_"+record["xlm"].(string)]
//扩展学位
record["xwm"] = SysDictKit.MapDictKindCodeToChinese["xwm"+"_"+record["xwm"].(string)]
//扩展职称
record["zcm"] = SysDictKit.MapDictKindCodeToChinese["zcm"+"_"+record["zcm"].(string)]
//扩展编制类别
record["bzlbm"] = SysDictKit.MapDictKindCodeToChinese["bzlbm"+"_"+record["bzlbm"].(string)]
//扩展学段
record["stage_name"] = SysDictKit.MapStageIdToName[record["stage_id"].(string)]
//扩展学科
record["subject_name"] = SysDictKit.MapSubjectIdToName[record["subject_id"].(string)]
//岗位
record["gwzym"] = SysDictKit.MapDictKindCodeToChinese["gwzym"+"_"+record["gwzym"].(string)]
//联系电话
record["lxdh"] = record["lxdh"].(string)
//邮箱
record["dzxx"] = record["dzxx"].(string)
}
//填充
var colNames = []string{"org_name", "xm", "xbm", "csrq", "mzm", "zzmmm", "sfzjlxm", "sfzjh", "xlm", "xwm", "zcm", "bzlbm", "stage_name", "subject_name", "lxdh"}
for i := range list {
for j := range colNames {
cName, _ := excelize.ColumnNumberToName(j + 1)
cName = cName + strconv.Itoa(i+2+ExcelUtil.HiddenRows)
_ = f.SetCellValue(SheetName, cName, list[i][colNames[j]])
}
//单独填充上person_id,为了能在没有身份号的唯一标识的情况下,确定是新增还是修改
cName := "P"
cName = cName + strconv.Itoa(i+2+ExcelUtil.HiddenRows)
_ = f.SetCellValue(SheetName, cName, list[i]["person_id"])
}
}
// 根据指定路径保存文件
if err := f.SaveAs(targetPath); err != nil {
println(err.Error())
}
}
//导入本校教师信息
func ImportTeacherInfoExcel(excelPath string, bureauId string, actionPersonId string, actionIp string) (bool, string, error) {
//判断文件是不是存在
if !FileUtil.PathExists(excelPath) {
return false, "03", nil //03:文件没有找到
}
//模板是不是系统提供的
var templateSuccess = true
//excel级别检查
var excelSuccess = true
//临时表级别检查
var mysqlSuccess = true
//新增记录个数
var insertCount = 0
//修改记录个数
var updateCount = 0
//批次号
var batchId = CommonUtil.GetUUID()
//配置文件,用于校验读入的表格是不是系统规定好的格式
jsonTemplate := "teacher.json"
var s1 = ExcelUtil.ReadJson(jsonTemplate, ExcelUtil.ImportFlag)
//此单位下的哪些部门名称
MapOrgName, _ := getOrgNameMap(bureauId)
//1、对模板的合法性进行检查
templateSuccess = ExcelUtil.IsValidTemplate(excelPath, s1)
if !templateSuccess {
return false, "01", nil //01:不是系统提供的模板,无法完成导入!
}
//2、对excel的合法性进行检查
excelSuccess = checkExcel(excelPath, s1, MapOrgName)
//将excel文件读取到mysql的临时数据表中
_ = readToTable(excelPath, s1, MapOrgName, bureauId, batchId)
//3、对数据库中的人员身份证号进行检查
mysqlSuccess = checkTempTable(excelPath, s1, batchId, bureauId)
//两个有一个不成功,则提示
if !excelSuccess || !mysqlSuccess {
return false, "02", nil //02:在excel检测中发现问题请检查后重新上传
}
//4、获取所有单位的一些属性用于一会维护人员信息时使用
var bureauModel models.TBaseOrganization
_, _ = db.Where("org_id=?", bureauId).Get(&bureauModel)
//5、新增
insertCount, _, _ = insertTeacher(batchId, actionPersonId, actionIp)
//6、修改
updateCount, _, _ = updateTeacherImport(batchId, actionPersonId, actionIp)
return true, "插入" + CommonUtil.ConvertIntToString(insertCount) + "条记录,更新" + CommonUtil.ConvertIntToString(updateCount) + "条记录!", nil
}
/**********************************以下为辅助函数*************************************************************************/
/**
功能将excel的内容读入到数据库的临时表中
作者:黄海
时间2020-06-18
*/
func readToTable(excelPath string, s1 ExcelUtil.TemplateStruct, MapOrgName map[string]string, bureauId string, batchId string) error {
var ms = make([]models.TBaseTeacherImportExcel, 0)
f, _ := excelize.OpenFile(excelPath)
rows, _ := f.GetRows(s1.Title)
for i, row := range rows {
//放过第一行
if i < ExcelUtil.HiddenRows+1 {
continue
}
//如果连续三个格为空,则不记入预导入行
if len(row) == 0 {
break
}
if row[0] == "" && row[1] == "" && row[2] == "" {
break
}
//导入到临时表中
var m models.TBaseTeacherImportExcel
//主键
m.Id = CommonUtil.GetUUID()
//部门
m.OrgName = row[0]
//姓名
m.Xm = row[1]
//性别
if row[2] == "男" {
m.Xbm = "1"
} else {
m.Xbm = "2"
}
//出生日期
m.Csrq = DateUtil.ConvertDate(row[3])
//民族
m.Mzm = SysDictKit.MapDictKindChineseToCode["mzm_"+row[4]]
//政治面貌
m.Zzmmm = SysDictKit.MapDictKindChineseToCode["zzmmm_"+row[5]]
//身份证件类型
m.Sfzjlxm = SysDictKit.MapDictKindChineseToCode["sfzjlxm_"+row[6]]
//身份证件号
m.Sfzjh = CommonUtil.CompressStr(row[7])
//学历
m.Xlm = SysDictKit.MapDictKindChineseToCode["xlm_"+row[8]]
//学位
m.Xwm = SysDictKit.MapDictKindChineseToCode["xwm_"+row[9]]
//职称
m.Zcm = SysDictKit.MapDictKindChineseToCode["zcm_"+row[10]]
//编制
m.Bzlbm = SysDictKit.MapDictKindChineseToCode["bzlbm_"+row[11]]
//学段
m.StageId = SysDictKit.MapStageNameToId[row[12]]
//学科
m.SubjectId = SysDictKit.MapSubjectNameToId[row[13]]
//部门名称
m.OrgName = row[0]
//部门ID
if len(m.OrgName) == 0 {
m.OrgId = bureauId //默认是放到单位根目录下的
} else {
m.OrgId = MapOrgName[m.OrgName]
}
//联系电话
m.Lxdh = row[14]
//人员ID
if len(row) == 16 {
m.PersonId = row[15]
} else {
m.PersonId = ""
}
//批次号
m.BatchId = batchId
//第几行的数据
m.RowNumber = int32(i + 1)
//添加到数组中
ms = append(ms, m)
}
_, err := db.Insert(ms)
return err
}
/**
功能:在临时表中检查身份证号的合法性,本次上传的身份证号,不能存在于系统中的其它单位
作者:黄海
时间2020-06-18
*/
func checkTempTable(excelPath string, s1 ExcelUtil.TemplateStruct, batchId string, bureauId string) bool {
//打开excel文件
f, _ := excelize.OpenFile(excelPath)
var success = true
/****************************************************************************/
//是否存在本次导入的身份证号与其它单位的已有身份证号相同,这样的不让导入,用蓝色标识出来
sql := `select t1.sfzjh,t2.row_number from t_base_teacher as t1
inner join t_base_teacher_import_excel as t2
on t1.sfzjh=t2.sfzjh
inner join t_base_teacher_org as t3
on t1.person_id=t3.person_id and t3.b_use=1 and t3.is_main=1
where t2.batch_id=? and t3.bureau_id<>? and t1.sfzjh<>''`
listIdCardTeacher, err := db.SQL(sql, batchId, bureauId).Query().List()
if err != nil {
LogUtil.Error(Const.DataBaseActionError, "在查询教师的身份证号重复时发生严重错误!")
return false
}
//存在教师身份证号检查重复
for i := range listIdCardTeacher {
rowNumber := listIdCardTeacher[i]["row_number"].(int64)
cell := "H" + CommonUtil.ConvertInt64ToString(rowNumber)
style, _ := f.GetCellStyle(s1.Title, Const.YellowCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
//设计二级检查失败
success = false
}
/****************************************************************************/
//检查学生的身份证号重复
sql = `select t1.sfzjh,t2.row_number from t_base_student as t1 inner join t_base_teacher_import_excel as t2
on t1.sfzjh=t2.sfzjh where t2.batch_id=? and t1.bureau_id<>? and t1.sfzjh<>''`
listIdCardStudent, err := db.SQL(sql, batchId, bureauId).Query().List()
if err != nil {
LogUtil.Error(Const.DataBaseActionError, "在查询学生的身份证号重复时发生严重错误!")
return false
}
//存在学生身份证号检查重复
for i := range listIdCardStudent {
rowNumber := listIdCardStudent[i]["row_number"].(int64)
cell := "H" + CommonUtil.ConvertInt64ToString(rowNumber)
style, _ := f.GetCellStyle(s1.Title, Const.YellowCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
//设计二级检查失败
success = false
}
/****************************************************************************/
//查出与数据库中重复的非空手机号
sql = `select t1.sfzjh,t1.lxdh from t_base_teacher as t1 inner join t_base_teacher_import_excel as t2
on t1.lxdh=t2.lxdh where t2.batch_id=? and t2.lxdh<>''`
listJoinMobileNumber, _ := db.SQL(sql, batchId).Query().List()
//转成map方便快速查询
var _map = make(map[string]string)
for i := range listJoinMobileNumber {
_map[listJoinMobileNumber[i]["lxdh"].(string)] = listJoinMobileNumber[i]["sfzjh"].(string)
}
//读取本次导入的所有手机号不为空的数据
sql = `select sfzjh,lxdh,row_number from t_base_teacher_import_excel where batch_id=? and lxdh<>''`
listThisBatchNotEmptyMobileNumber, _ := db.SQL(sql, batchId).Query().List()
//遍历每一行数据,看看与系统现有数据的是不是存在冲突
for i := range listThisBatchNotEmptyMobileNumber {
if _, ok := _map[listThisBatchNotEmptyMobileNumber[i]["lxdh"].(string)]; ok {
//身份证号一致
if listThisBatchNotEmptyMobileNumber[i]["sfzjh"].(string) != _map[listThisBatchNotEmptyMobileNumber[i]["lxdh"].(string)] {
//不一致
rowNumber := listThisBatchNotEmptyMobileNumber[i]["row_number"].(int64)
cell := "O" + CommonUtil.ConvertInt64ToString(rowNumber)
style, _ := f.GetCellStyle(s1.Title, Const.YellowCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
//设计二级检查失败
success = false
}
}
}
// 根据指定路径保存文件(不管是不是通过,都保存一次)
if err := f.SaveAs(excelPath); err != nil {
println(err.Error())
}
return success
}
/**
功能检查excel,1是检查是不是系统提供的模板2是检查是不是存在EXCEL级别的错误
作者:黄海
时间2020-06-18
*/
func checkExcel(excelPath string, s1 ExcelUtil.TemplateStruct, MapOrgName map[string]string) bool {
//打开指定的文件
f, err := excelize.OpenFile(excelPath)
if err != nil {
LogUtil.Error(Const.IoActionError, "文件丢失:"+excelPath)
return false
}
// excel级别检查的结果
var firstSuccess = true
//身份证的map
var _idCardMap = make(map[string][]int)
//手机号的map
var _mobileMap = make(map[string][]int)
//遍历所有数据
rows, _ := f.GetRows(s1.Title)
for i, row := range rows {
//放过表头
if i < ExcelUtil.HiddenRows+1 {
continue
}
//如果连续三个格为空,则不记入预导入行
if len(row) == 0 {
break
}
if row[0] == "" && row[1] == "" && row[2] == "" {
break
}
//真实显示的字段,不要把名称管理器的内容遍历出来
for j := 0; j < len(s1.Cols); j++ {
//(1)必填写项目+值域检查
var pass = true
//(0)部门
if j == 0 {
//是不是在单位已存在的部门列表中,不允许手动输入
if _, ok := MapOrgName[row[j]]; !ok {
//如果未输入,也是可以的,理解为放到根目录下
if row[j] != "" {
pass = false
}
}
}
//(1)姓名
if j == 1 {
if row[j] == "" {
pass = false
}
}
//(2)性别
if j == 2 {
if row[j] != "男" && row[j] != "女" {
pass = false
}
}
//(3)出生日期
if j == 3 {
//是不是合法出生日期
if !DateUtil.CheckDateStr(row[j]) {
pass = false
}
}
//(4)民族
if j == 4 {
if _, ok := SysDictKit.MapDictKindChineseToCode["mzm_"+row[j]]; !ok {
pass = false
}
}
//(5)政治面貌
if j == 5 {
if _, ok := SysDictKit.MapDictKindChineseToCode["zzmmm_"+row[j]]; !ok {
pass = false
}
}
//(6)身份证件类型
if j == 6 {
if _, ok := SysDictKit.MapDictKindChineseToCode["sfzjlxm_"+row[j]]; !ok {
pass = false
}
if row[j] == "" {
pass = true
}
}
//(7)身份证号
if j == 7 {
if row[j-1] == "居民身份证" && row[j] != "" && !CommonUtil.IsIdCard(CommonUtil.CompressStr(row[j])) {
pass = false
}
if len(row[j]) > 0 {
_idCardMap[CommonUtil.CompressStr(row[j])] = append(_idCardMap[CommonUtil.CompressStr(row[j])], i+1)
}
}
//(8)学历
if j == 8 {
if _, ok := SysDictKit.MapDictKindChineseToCode["xlm_"+row[j]]; !ok {
pass = false
}
}
//(9)学位
if j == 9 {
if _, ok := SysDictKit.MapDictKindChineseToCode["xwm_"+row[j]]; !ok {
pass = false
}
}
//(10)职称
if j == 10 {
if _, ok := SysDictKit.MapDictKindChineseToCode["zcm_"+row[j]]; !ok {
pass = false
}
}
//(11)编制
if j == 11 {
if _, ok := SysDictKit.MapDictKindChineseToCode["bzlbm_"+row[j]]; !ok {
pass = false
}
}
//(12)任课学段
if j == 12 {
if _, ok := SysDictKit.MapStageNameToId[row[j]]; !ok {
pass = false
}
}
//(13)任课学科
if j == 13 {
if _, ok := SysDictKit.MapStageSubjectNameExist[row[j-1]+"_"+row[j]]; !ok {
pass = false
}
}
//(14)联系电话
if j == 14 {
if row[j] != "" {
_mobileMap[row[j]] = append(_mobileMap[row[j]], i+1)
}
}
//标红
cName, _ := excelize.ColumnNumberToName(j + 1)
cell := cName + CommonUtil.ConvertIntToString(i+1)
if !pass {
//红色
style, _ := f.GetCellStyle(s1.Title, Const.RedCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
firstSuccess = false
} else {
style, _ := f.GetCellStyle(s1.Title, Const.WhiteCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
}
}
}
//判断身份证号是不是在本EXCEL中存在重复如果存在需要进行标识
for _, rowArray := range _idCardMap {
//重复
if len(rowArray) > 1 {
for i := range rowArray {
cell := "H" + CommonUtil.ConvertIntToString(rowArray[i])
//重复
style, _ := f.GetCellStyle(s1.Title, Const.BlueCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
}
firstSuccess = false
}
}
//判断联系电话是不是在本EXCEL中存在重复如果存在需要进行标识
for _, rowArray := range _mobileMap {
//重复
if len(rowArray) > 1 {
for i := range rowArray {
cell := "O" + CommonUtil.ConvertIntToString(rowArray[i])
//重复
style, _ := f.GetCellStyle(s1.Title, Const.BlueCell)
_ = f.SetCellStyle(s1.Title, cell, cell, style)
}
firstSuccess = false
}
}
// 根据指定路径保存文件(不管是不是通过,都保存一次)
if err := f.SaveAs(excelPath); err != nil {
println(err.Error())
}
return firstSuccess
}
/**
功能:插入教师
*/
func insertTeacher(batchId string, actionPersonId string, actionIp string) (int, string, error) {
//2、新增人员
teacherImportExcelArray := make([]models.TBaseTeacherImportExcel, 0)
teacherArray := make([]models.TBaseTeacher, 0)
_ = db.Where("batch_id=? and length(person_id)=0", batchId).Find(&teacherImportExcelArray)
for i := range teacherImportExcelArray {
r1 := teacherImportExcelArray[i]
var model models.TBaseTeacher
//身份
model.IdentityId = 2
//人员编号
model.PersonId = CommonUtil.GetUUID()
//导入即可用
model.BUse = 1
//身份证号
model.Sfzjh = r1.Sfzjh
//身份证件类型
model.Sfzjlxm = r1.Sfzjlxm
//编制
model.Bzlbm = r1.Bzlbm
//从教年月
model.Cjny = DateUtil.ConvertDate("1900-01-01")
//根据身份证号,提取男女,出生日期
isValid, birthday, xbm := IdCardUtil.GetIdCardNoInfo(r1.Sfzjh)
if isValid {
model.Csrq = DateUtil.ConvertDate(birthday)
model.Xbm = xbm
} else {
model.Csrq = r1.Csrq
model.Xbm = r1.Xbm
}
//学段
model.StageId = r1.StageId
//学科
model.SubjectId = r1.SubjectId
//民族
model.Mzm = r1.Mzm
//学历
model.Xlm = r1.Xlm
//姓名
model.Xm = r1.Xm
//曾用名
model.Cym = model.Xm
//姓名拼音
model.Xmpy = PinYinUtil.PinYin(model.Xm)
//学位码
model.Xwm = r1.Xwm
//职称
model.Zcm = r1.Zcm
//政治面貌
model.Zzmmm = r1.Zzmmm
//岗位
model.Gwzym = r1.Gwzym
//联系电话
model.Lxdh = r1.Lxdh
//邮箱
model.Dzxx = r1.Dzxx
//状态
model.StateId = 1
//添加到数组中
teacherArray = append(teacherArray, model)
//保存人员所在的部门信息
_, _, _, _ = AddTeacherOrgInfo([]string{model.PersonId}, r1.OrgId, 1, 1)
}
//批量插入
if len(teacherArray) > 0 {
_, err := db.Insert(&teacherArray)
if err != nil {
return 0, Const.DataBaseActionError, err
}
//记录日志
ActionLog(teacherArray, Const.ActionInsert, actionPersonId, actionIp)
//产生登录名
accountArray := SysLoginpersonService.GenerateLoginAccount(2, int64(len(teacherImportExcelArray)))
var loginpersonModels = make([]models.TSysLoginperson, 0)
for i := range teacherArray {
//调用dao
model := new(models.TSysLoginperson)
model.Id = CommonUtil.GetUUID()
model.LoginName = accountArray[i].LoginName
model.Pwd = accountArray[i].Pwd
model.OriginalPwd = accountArray[i].OriginalPwd
model.IdentityId = 2
model.PersonId = teacherArray[i].PersonId
model.PersonName = teacherArray[i].Xm
model.BUse = 1
loginpersonModels = append(loginpersonModels, *model)
}
//批量插入
if len(loginpersonModels) > 0 {
_, err = db.Insert(&loginpersonModels)
if err != nil {
return 0, Const.DataBaseActionError, err
}
}
return len(teacherArray), "保存成功", nil
}
return 0, "没有记录需要进行保存", nil
}
/**
功能:更新导入的教师
*/
func updateTeacherImport(batchId string, actionPersonId string, actionIp string) (int, string, error) {
//开始
teacherImportExcelArray := make([]models.TBaseTeacherImportExcel, 0)
teacherArray := make([]models.TBaseTeacher, 0)
_ = db.Where("batch_id=? and length(person_id)=36", batchId).Find(&teacherImportExcelArray)
//准备更新的数据
for i := range teacherImportExcelArray {
r1 := teacherImportExcelArray[i]
var model models.TBaseTeacher
//身份
model.IdentityId = 2
//人员编号
model.PersonId = r1.PersonId
//导入即可用
model.BUse = 1
//身份证号
model.Sfzjh = r1.Sfzjh
//身份证件类型
model.Sfzjlxm = r1.Sfzjlxm
//编制
model.Bzlbm = r1.Bzlbm
//从教年月
model.Cjny = DateUtil.ConvertDate("1999-09-01")
//出生日期与性别
if model.Sfzjlxm == "1" {
//根据身份证号,提取男女,出生日期
isValid, birthday, xbm := IdCardUtil.GetIdCardNoInfo(r1.Sfzjh)
if isValid {
model.Csrq = DateUtil.ConvertDate(birthday)
model.Xbm = xbm
} else {
model.Csrq = r1.Csrq
model.Xbm = r1.Xbm
}
} else {
model.Csrq = r1.Csrq
model.Xbm = r1.Xbm
}
//排序号
//model.SortId = 1 //排序号就不修改了,防止人为修改对了,这样导入再修改回去
//学段
model.StageId = r1.StageId
//学科
model.SubjectId = r1.SubjectId
//学历
model.Xlm = r1.Xlm
//姓名
model.Xm = r1.Xm
//曾用名
model.Cym = model.Xm
//姓名拼音
model.Xmpy = PinYinUtil.PinYin(model.Xm)
//学位码
model.Xwm = r1.Xwm
//职称
model.Zcm = r1.Zcm
//民族
model.Mzm = r1.Mzm
//政治面貌
model.Zzmmm = r1.Zzmmm
//岗位
model.Gwzym = r1.Gwzym
//联系电话
model.Lxdh = r1.Lxdh
//邮箱
model.Dzxx = r1.Dzxx
//状态
model.StateId = 1
//添加到数组中
teacherArray = append(teacherArray, model)
//保存人员所在的部门信息
_, _, _, _ = AddTeacherOrgInfo([]string{model.PersonId}, r1.OrgId, 1, 1)
}
//批量更新
if len(teacherArray) > 0 {
//声明事务
session := db.NewSession()
defer func() {
err := session.Close()
if err != nil {
fmt.Println(err.Error())
}
}()
_ = session.Begin()
for k := range teacherArray {
_, err := session.Where("person_id=?", teacherArray[k].PersonId).
Cols("b_use", "sfzjh", "sfzjlxm", "bzlbm", "cjny",
"xbm", "csrq", "stage_id", "subject_id", "xlm", "xm", "cym",
"xmpy", "xwm", "zcm", "mzm", "zzmmm", "gwzym",
"lxdh", "dzxx", "state_id").Update(teacherArray[k])
if err != nil {
_ = session.Rollback()
return 0, Const.DataBaseActionError, err
}
}
//事务提交
err := session.Commit()
if err != nil {
return 0, Const.DataBaseActionError, err
}
//删除缓存
var teacherIds = make([]string, 0)
for i := range teacherArray {
key := SqlKit.GetBean("t_base_teacher").RedisPrefix + teacherArray[i].PersonId
RedisUtil.DEL(key)
teacherIds = append(teacherIds, teacherArray[i].PersonId)
}
//记录日志
ms, _ := GetByIds(teacherIds)
ActionLog(ms, Const.ActionUpdate, actionPersonId, actionIp)
return len(teacherArray), "保存成功", nil
}
return 0, "没有记录需要保存", nil
}
/**
功能:获取指定单位下部门的名称集合MAP
作者:黄海
时间2020-06-18
*/
func getOrgNameMap(bureauId string) (map[string]string, error) {
//1、此单位下的哪些部门名称
sql := `select org_name,org_id from t_base_organization where bureau_id=? and b_use=1`
listOrgName, err := db.SQL(sql, bureauId).Query().List()
if err != nil {
return nil, err
}
//转为map一会方便用于填充部门号
var MapOrgName = make(map[string]string)
for i := range listOrgName {
MapOrgName[listOrgName[i]["org_name"].(string)] = listOrgName[i]["org_id"].(string)
}
return MapOrgName, nil
}
/**
功能:将人员追加到某个部门下,支持批量操作
作者:黄海
时间2020-08-05
*/
func AddTeacherOrgInfo(personIds []string, orgId string, isMain int32, fromSortId int32) (bool, string, string, error) {
//(1)获取单位ID
list := SqlKit.QueryByIds([]string{orgId}, "t_base_organization")
if len(list) == 0 {
return false, "", "没有找到指定的部门编号!", nil
}
bureauId := list[0]["bureau_id"].(string)
//(2)获取单位对应的省码市码县区码主校ID
_, ProvinceCode, CityCode, DistrictCode, mainSchoolId, err := BaseOrganizationDao.GetBureauAdministrativeDivision(bureauId)
if err != nil {
return false, "", "在查找单位的行政区划关系时出错!", nil
}
//(3)删除旧的
_ = DeleteTeacherOrgInfo(personIds, orgId)
//(4)如果isMain==1还需要清除原来这些人员的主部门准备插入新的
if isMain == 1 {
disableMainOrg(personIds)
}
//(5)插入新的
for i := range personIds {
var model models.TBaseTeacherOrg
model.Id = CommonUtil.GetUUID()
model.PersonId = personIds[i]
model.BureauId = bureauId
model.OrgId = orgId
model.BUse = 1
model.ProvinceCode = ProvinceCode
model.CityCode = CityCode
model.DistrictCode = DistrictCode
model.MainSchoolId = mainSchoolId
model.SortId = fromSortId
model.IsMain = isMain
_, err := db.Insert(model)
if err != nil {
return false, "", "插入人员部门关系表时失败!", err
}
fromSortId++
}
return true, bureauId, "保存成功!", nil
}
/**
功能:将人员从某个部门下删除,支持批量操作
作者:黄海
时间2020-08-05
*/
func DeleteTeacherOrgInfo(personIds []string, orgId string) error {
//主部门是不能删除的,主部门只能随着人员删除而删除
//批量删除教师在此部门的信息
var myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": -2}).
From("t_base_teacher_org").Where(builder.Eq{"b_use": 1, "org_id": orgId}.And(builder.In("person_id", personIds)))
sql, _ := myBuilder.ToBoundSQL()
_, err := db.SQL(sql).Execute()
return err
}
/**
功能:将人员从全部部门下删除,支持批量操作
作者:黄海
时间2020-08-05
*/
func DeleteTeacherOrgInfoAll(personIds []string) error {
//主部门是不能删除的,主部门只能随着人员删除而删除
//批量删除教师在此部门的信息
var myBuilder = builder.Dialect(builder.MYSQL).Update(builder.Eq{"b_use": -2}).
From("t_base_teacher_org").Where(builder.Eq{"b_use": 1}.And(builder.In("person_id", personIds)))
sql, _ := myBuilder.ToBoundSQL()
_, err := db.SQL(sql).Execute()
return err
}
/**
功能:修改指定人员在指定部门下的排序号
作者:黄海
时间2020-08-05
*/
func UpdateSortId(personId string, sortId int32) {
sql := `update t_base_teacher_org set sort_id=? where person_id=?`
_, _ = db.SQL(sql, sortId, personId).Execute()
}
/**
功能:将指定人员的主部门信息禁用
作者:黄海
时间2020-08-05
*/
func disableMainOrg(personIds []string) {
for i := range personIds {
sql := `update t_base_teacher_org set b_use=-2 where person_id=? and is_main=1`
_, _ = db.SQL(sql, personIds[i]).Execute()
}
}
/**
功能:获取指定人员的部门名称
作者:黄海
时间2020-08-12
*/
func GetPersonOrgName(personId string) (string, error) {
sql := `select group_concat(org_name) as org_name from t_base_organization where org_id in (
select org_id from t_base_teacher_org where person_id=? and b_use=1 order by is_main desc);`
list, err := db.SQL(sql, personId).Query().List()
if err != nil {
return "操作异常", err
}
if len(list) == 0 {
return "没有找到此人员", nil
}
if list[0]["org_name"] == nil {
return "未找到部门信息", nil
} else {
return list[0]["org_name"].(string), nil
}
}
/**
功能:将指定的人员,保存到指定的单位下,存储多个职务
作者:黄海
时间2020-08-20
*/
func AddTeacherPosition(personIds []string, bureauId string, PositionIds []string) (bool, string, error) {
//两重循环进行保存
for i := range personIds {
for j := range PositionIds {
model := new(models.TBaseTeacherPosition)
model.Id = CommonUtil.GetUUID()
model.PersonId = personIds[i]
model.BureauId = bureauId
model.PositionId = PositionIds[j]
model.BUse = 1
//插入基本表
_, err := db.Insert(model)
if err != nil {
return false, "保存人员职务信息出错!", err
}
}
}
return true, "保存成功!", nil
}
/**
功能:删除人员在指定单位下的职务
作者:黄海
时间2020-08-20
*/
func DeleteTeacherPosition(personIds []string, bureauId string) (bool, error) {
for i := range personIds {
sql := `update t_base_teacher_position set b_use=-2 where person_id=? and bureau_id=?`
_, err := db.SQL(sql, personIds[i], bureauId).Execute()
if err != nil {
return false, err
}
}
return true, nil
}
/**
功能:删除人员在指定单位下的职务(所有的职务)
作者:黄海
时间2020-08-20
*/
func DeleteTeacherAllPosition(personIds []string) (bool, error) {
for i := range personIds {
sql := `update t_base_teacher_position set b_use=-2 where person_id=?`
_, err := db.SQL(sql, personIds[i]).Execute()
if err != nil {
return false, err
}
}
return true, nil
}
/**
功能:获取指定人员在指定单位下有哪些职务
作者:黄海
时间2020-08-20
*/
func GetPositionInfoByPersonIdAndBureauId(personId string, bureauId string) ([]string, error) {
sql := `select position_id from t_base_teacher_position where person_id=? and bureau_id=? and b_use=1`
list, err := db.SQL(sql, personId, bureauId).Query().List()
if err != nil {
return nil, err
}
res := make([]string, len(list))
for i := range list {
res[i] = list[i]["position_id"].(string)
}
return res, nil
}
//设置教师多单位
func SettingTeacherMultipleBureau(in *BaseTeacherProto.SettingMultipleBureauArg) (bool, string, error) {
var fromSortId = int32(GetMaxSortId(in.OrgId)) + 1
_, _, message, err := AddTeacherOrgInfo([]string{in.PersonId}, in.OrgId, 0, fromSortId)
if err != nil {
return false, message, err
}
return true, "调置成功!", nil
}
//根据教职工ID获取该教职工所在多单位列表
func PageTeacherMultipleBureau(in *BaseTeacherProto.PageMultipleBureauArg) ([]map[string]interface{}, int32, error) {
var myBuilder = builder.Dialect(builder.MYSQL).Select("t1.id,t1.person_id,t4.xm,t1.org_id,t2.org_name,t1.bureau_id,t3.org_name as bureau_name,t1.is_main").
From("t_base_teacher_org as t1").
InnerJoin("t_base_organization as t2", "t1.org_id=t2.org_id").
InnerJoin("t_base_organization as t3", "t1.bureau_id=t3.org_id").
InnerJoin("t_base_teacher as t4", "t1.person_id=t4.person_id").
Where(builder.Eq{"t1.person_id": in.PersonId}).And(builder.Eq{"t1.b_use": 1})
sql, err := myBuilder.ToBoundSQL()
if err != nil {
return nil, 0, err
}
list, err := db.SQL(sql).Query().List()
if err != nil {
return nil, 0, err
}
return list, int32(len(list)), nil
}
//获取指定人员所在单位的行政区划列表
func GetPersonAllBureauXZQH(personId string) ([]map[string]interface{}, int32, error) {
sql := `select bureau_id,province_code,city_code,district_code from t_base_teacher_org where person_id=?`
list, err := db.SQL(sql, personId).Query().List()
return list, int32(len(list)), err
}
//设置主单位
func SettingMainOrg(in *BaseTeacherProto.SettingMainOrgArg) (bool, string, error) {
//将旧的设置为删除状态
sql := `update t_base_teacher_org set is_main=0 where person_id=? and b_use=1`
_, _ = db.SQL(sql, in.PersonId).Execute()
//将新的ID设置为主单位状态
sql = `update t_base_teacher_org set is_main=1,b_use=1 where id=?`
_, _ = db.SQL(sql, in.Id).Execute()
return true, "设置成功!", nil
}
//教师的调转
func TeacherTransfer(personId string, orgId string) (bool, string, error) {
//1、因为只有唯一个单位+部门的人员才能进行调转,所以直接找到此关系,禁用即可
sql := `update t_base_teacher_org set b_use=-2 where person_id=? and b_use=1`
_, _ = db.SQL(sql, personId).Execute()
//2、插入新的关系
fromSortId := getOrgMaxSortId(orgId)
_, _, _, _ = AddTeacherOrgInfo([]string{personId}, orgId, 1, fromSortId)
return true, "保存成功", nil
}