package BaseStudentDao import ( "dsBaseRpc/Const" "dsBaseRpc/RpcService/BaseClass/BaseClassDao" "dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationDao" "dsBaseRpc/RpcService/BaseParent/BaseParentDao" "dsBaseRpc/RpcService/BaseStudent/BaseStudentProto" "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" "errors" "fmt" "github.com/xormplus/builder" "github.com/xuri/excelize/v2" "regexp" "strconv" "strings" "time" ) var db = DbUtil.Engine //记录操作日志 func ActionLog(ms []models.TBaseStudent, actionCode string, actionPersonId string, actionIp string) { msLog := make([]models.TBaseStudentLog, 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.TBaseStudent, error) { ms := make([]models.TBaseStudent, 0) err := db.In("person_id", ids).Find(&ms) if err != nil { return nil, err } return ms, nil } //增加 func AddBaseStudent(model models.TBaseStudent) (int64, error) { return db.Insert(model) } //修改 func UpdateBaseStudent(model models.TBaseStudent, ForceUpdateFields []string) (int64, error) { //1、清除Redis缓存 var ids = []string{model.PersonId} var selector = SqlKit.GetBean("t_base_student") 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) //更改排序号 //(1)权限排序号的范围是parent_id var myBuilder = builder.Dialect(builder.MYSQL).Select("person_id").From("t_base_student") _, _ = myBuilder.ToBoundSQL() //(2)查询获取到parent_id var m1 models.TBaseStudent _, _ = db.ID(model.PersonId).Get(&m1) //5、更新操作,强制更新这些列 affected, err := db.ID(model.PersonId).Cols(ForceUpdateFields...).Update(model) return affected, err } //分页查询 func PageBaseStudent(in *BaseStudentProto.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.*,t2.login_name,t2.b_use as login_b_use,t2.pwd,t2.original_pwd").From("t_base_student as t1"). InnerJoin("t_sys_loginperson as t2", "t1.person_id=t2.person_id") myBuilder.Where(builder.Eq{"t1.class_id": in.ClassId}).And(builder.Eq{"t1.b_use": 1}).And(builder.Like{"t1.xm", in.Xm}) //分页 myBuilder.Limit(limit, offset) //获取拼接完成的SQL语句 sql, err := myBuilder.OrderBy("t1.id_int asc").ToBoundSQL() if err != nil { return nil, 0, err } list, count, err := SqlKit.Query(sql) //对于教师是不是修改过账号进行判断 SysLoginpersonService.FillPwdIsChange(&list) //返回结果 return list, count, err } //批量学生调整班级 func ReviseTeacherOrg(Ids []string, ClassId string) error { //声明事务 session := db.NewSession() defer func() { err := session.Close() if err != nil { fmt.Println(err.Error()) } }() _ = session.Begin() for i := range Ids { var person models.TBaseStudent person.ClassId = ClassId _, err := db.ID(Ids[i]).Cols("class_id").Update(person) if err != nil { _ = session.Rollback() return err } } //提交事务 err := session.Commit() return err } //导出学生账号信息到EXCEL func ExportStudentAccountInfoExcel(in *BaseStudentProto.ModelArg) ([]map[string]interface{}, int32, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select( `t1.*,t4.stage_name,t3.class_name, (select login_name from t_sys_loginperson where person_id=t5.person_id) as parent_login_name, (select original_pwd from t_sys_loginperson where person_id=t5.person_id) as parent_original_pwd`). From("t_sys_loginperson as t1"). InnerJoin("t_base_student as t2", "t1.person_id=t2.person_id"). InnerJoin("t_base_class as t3", "t2.class_id=t3.class_id"). InnerJoin("t_dm_stage as t4", "t3.stage_id=t4.stage_id"). InnerJoin("t_base_parent as t5", "t2.person_id=t5.student_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{"t2.bureau_id": in.BureauId}) //如果指定了班级 if len(in.ClassId) > 0 { classIds := make([]string, 0) classIds = append(classIds, in.ClassId) myBuilder.And(builder.In("t3.class_id", classIds)) } myBuilder.OrderBy("t3.stage_id").OrderBy("t3.id_int").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 ExportStudentInfoExcel(targetPath string, bureauId string, ExportExcelStatus int32, ClassIds []string) { //1、配置文件 jsonTemplate := "student.json" f, _, _, SheetName := ExcelUtil.TemplateAddDict("student.xlsx", jsonTemplate) //2、添加批注 _ = f.AddComment(SheetName, "B201", `{"author":"示例: ","text":"填写年份全称,如:2019 或 2020。"}`) _ = f.AddComment(SheetName, "C201", `{"author":"示例: ","text":"填写本年级内班级的编号,如:1或2,代表本年级内的1班或2班。"}`) _ = f.AddComment(SheetName, "F201", `{"author":"示例: ","text":"1980-01-01"}`) //整数类型 var stylePathPrefix = "./Config/ExcelStyle/" tableStyleIntPath := stylePathPrefix + "tableStyleInt.json" if !FileUtil.PathExists(tableStyleIntPath) { tableStyleIntPath = "." + tableStyleIntPath } tableStyleIntStyle, _ := f.NewStyle(FileUtil.ReadFileContent(tableStyleIntPath)) //3、入学年份+班号的有效性 for k := 2 + ExcelUtil.HiddenRows; k <= 5000+ExcelUtil.HiddenRows; k++ { //设置单元格格式 cName := "B" + CommonUtil.ConvertIntToString(k) f.SetCellStyle(SheetName, cName, cName, tableStyleIntStyle) //入学年份 dvRange := excelize.NewDataValidation(true) dvRange.Sqref = "B" + CommonUtil.ConvertIntToString(k) + ":B" + CommonUtil.ConvertIntToString(k) _ = dvRange.SetRange(2014, 2030, excelize.DataValidationTypeWhole, excelize.DataValidationOperatorBetween) dvRange.SetError(excelize.DataValidationErrorStyleStop, "入学年份校验错误", "系统只支持2014-2030年度的班级!") _ = f.AddDataValidation(SheetName, dvRange) //设置单元格格式 cName = "C" + CommonUtil.ConvertIntToString(k) f.SetCellStyle(SheetName, cName, cName, tableStyleIntStyle) //班号 dvRange = excelize.NewDataValidation(true) dvRange.Sqref = "C" + CommonUtil.ConvertIntToString(k) + ":C" + CommonUtil.ConvertIntToString(k) _ = dvRange.SetRange(1, 99, excelize.DataValidationTypeWhole, excelize.DataValidationOperatorBetween) dvRange.SetError(excelize.DataValidationErrorStyleStop, "班号录入错误", "系统只支持1-99的班号!") _ = f.AddDataValidation(SheetName, dvRange) } //4、添加是否的下拉框K--->P for i := 11; i <= 16; i++ { //要设置下拉框的列 cName, _ := excelize.ColumnNumberToName(i) dvRange := excelize.NewDataValidation(true) dvRange.Sqref = cName + CommonUtil.ConvertIntToString(2+ExcelUtil.HiddenRows) + ":" + cName + CommonUtil.ConvertIntToString(ExcelUtil.RowsCount+ExcelUtil.HiddenRows) _ = dvRange.SetDropList([]string{"是", "否"}) _ = f.AddDataValidation(SheetName, dvRange) } //5、当前学校应该有哪些学段 stageList, _, _ := BaseClassDao.GetStage(bureauId) stageArray := CommonUtil.ConvertSqlListToArray(stageList, "stage_name") //学段没有那么多,不必使用名称管理器,采用数组即可 if len(stageList) > 0 { for k := 2 + ExcelUtil.HiddenRows; k <= 5000+ExcelUtil.HiddenRows; k++ { dvRange := excelize.NewDataValidation(true) dvRange.Sqref = "A" + CommonUtil.ConvertIntToString(k) + ":A" + CommonUtil.ConvertIntToString(k) _ = dvRange.SetDropList(stageArray) _ = f.AddDataValidation(SheetName, dvRange) } } if ExportExcelStatus > 0 { //将现有数据填充到下载的模板中 var myBuilder = builder.Dialect(builder.MYSQL).Select(`t1.person_id,t2.stage_id,t2.rxnf,t2.bh,t1.xm,t1.xbm,t1.csrq, (case t1.sfzjh when '-1' then '' else t1.sfzjh end ) as sfzjh, t1.mzm,t1.zzmmm,t1.sfzjlxm,t1.dszybz,t1.sqznbz,t1.jcwgrysqznbz, t1.gebz,t1.lsetbz,t1.cjbz`). From("t_base_student as t1").InnerJoin("t_base_class as t2", "t1.class_id=t2.class_id"). InnerJoin("t_dm_stage as t3", " t2.stage_id=t3.stage_id").Where(builder.Eq{"t1.b_use": 1}). And(builder.Eq{"t2.b_use": 1}).And(builder.Eq{"t1.bureau_id": bureauId}) //如果指定要哪个班级的导出 if len(ClassIds) > 0 { myBuilder.And(builder.In("t2.class_id", ClassIds)) } myBuilder.OrderBy("t2.stage_id,t2.rxnf,t2.bh,t1.id_int asc") sql, _ := myBuilder.ToBoundSQL() list, err := db.SQL(sql).Query().List() if err != nil { LogUtil.Error(Const.DataBaseActionError, "查询现有学生数据时出错!") return } for i := range list { record := list[i] //扩展性别 if record["xbm"].(string) == "1" { record["xbm"] = "男" } else { record["xbm"] = "女" } //扩展学段 record["stage_name"] = SysDictKit.MapStageIdToName[record["stage_id"].(string)] //扩展民族 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["dszybz"] = SysDictKit.MapTrueOrFalseValueToName[CommonUtil.ConvertInt64ToString(record["dszybz"].(int64))] //随迁子女 record["sqznbz"] = SysDictKit.MapTrueOrFalseValueToName[CommonUtil.ConvertInt64ToString(record["sqznbz"].(int64))] //务工子女 record["jcwgrysqznbz"] = SysDictKit.MapTrueOrFalseValueToName[CommonUtil.ConvertInt64ToString(record["jcwgrysqznbz"].(int64))] //孤儿 record["gebz"] = SysDictKit.MapTrueOrFalseValueToName[CommonUtil.ConvertInt64ToString(record["gebz"].(int64))] //留守儿童 record["lsetbz"] = SysDictKit.MapTrueOrFalseValueToName[CommonUtil.ConvertInt64ToString(record["lsetbz"].(int64))] //残疾儿童 record["cjbz"] = SysDictKit.MapTrueOrFalseValueToName[CommonUtil.ConvertInt64ToString(record["cjbz"].(int64))] } //填充 var colNames = []string{"stage_name", "rxnf", "bh", "xm", "xbm", "csrq", "mzm", "zzmmm", "sfzjlxm", "sfzjh", "dszybz", "sqznbz", "jcwgrysqznbz", "gebz", "lsetbz", "cjbz"} 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 := "Q" cName = cName + strconv.Itoa(i+2+ExcelUtil.HiddenRows) _ = f.SetCellValue(SheetName, cName, list[i]["person_id"]) } } // 6、根据指定路径保存文件 if err := f.SaveAs(targetPath); err != nil { println(err.Error()) } } //导入本校学生信息 func ImportStudentInfoExcel(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 := "student.json" var s1 = ExcelUtil.ReadJson(jsonTemplate, ExcelUtil.ImportFlag) //此单位下的哪些班级,按学部+入学年份+班号--->对应的class_id MapClass, _ := getClassMap(bureauId) //此学校下有哪些学部 MapStage := BaseClassDao.GetStageMap(bureauId) //1、对模板的合法性进行检查 templateSuccess = ExcelUtil.IsValidTemplate(excelPath, s1) if !templateSuccess { return false, "01", nil //01:不是系统提供的模板,无法完成导入! } //2、对excel的合法性进行检查 excelSuccess = checkExcel(excelPath, s1, MapClass, MapStage) //两个有一个不成功,则提示 if !excelSuccess { return false, "02", nil //02:在excel检测中,发现问题,请检查后重新上传! } //将excel文件读取到mysql的临时数据表中 err := readToTable(excelPath, s1, MapClass, bureauId, batchId, MapStage) if err != nil { return false, Const.DataBaseActionError, err } //3、对数据库中的人员身份证号进行检查 mysqlSuccess = checkTempTable(excelPath, s1, batchId, bureauId) //两个有一个不成功,则提示 if !mysqlSuccess { return false, "02", nil //02:在excel检测中,发现问题,请检查后重新上传! } //4、获取所有单位的一些属性,用于一会维护人员信息时使用 var bureauModel models.TBaseOrganization _, _ = db.Where("org_id=?", bureauId).Get(&bureauModel) //6、新增 insertCount, _, _ = insertStudent(batchId, bureauModel, actionPersonId, actionIp) //7、修改 updateCount, _, _ = updateStudentImport(batchId, bureauModel, actionPersonId, actionIp) return true, "插入" + CommonUtil.ConvertIntToString(insertCount) + "条记录,更新" + CommonUtil.ConvertIntToString(updateCount) + "条记录!", nil } /**********************************以下为辅助函数*************************************************************************/ /** 功能:指定学校下有哪些班级 作者:黄海 时间:2020-06-19 */ func getClassMap(bureauId string) (map[string]string, error) { //1、此单位下的哪些部门名称 sql := `select t1.class_id,t1.stage_id,t2.stage_name,t1.rxnf,t1.bh from t_base_class as t1 inner join t_dm_stage as t2 on t1.stage_id=t2.stage_id where t1.bureau_id=? and t1.b_use=1` listClass, err := db.SQL(sql, bureauId).Query().List() if err != nil { return nil, err } //转为map,一会方便用于填充班级号 var MapClass = make(map[string]string) for i := range listClass { MapClass[listClass[i]["stage_name"].(string)+"_"+CommonUtil.ConvertInt64ToString(listClass[i]["rxnf"].(int64))+"_"+CommonUtil.ConvertInt64ToString(listClass[i]["bh"].(int64))] = listClass[i]["class_id"].(string) } return MapClass, nil } /** 功能:检查excel,1是检查是不是系统提供的模板,2是检查是不是存在EXCEL级别的错误 作者:黄海 时间:2020-06-18 */ func checkExcel(excelPath string, s1 ExcelUtil.TemplateStruct, MapClass map[string]string, MapStage 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) //遍历所有数据 rows, _ := f.GetRows(s1.Title) //当前年份 CurrentYear := time.Now().Year() RedStyle, _ := f.GetCellStyle(s1.Title, Const.RedCell) WhiteStyle, _ := f.GetCellStyle(s1.Title, Const.WhiteCell) for i, row := range rows { //放过表头 if i < ExcelUtil.HiddenRows+1 { continue } //如果连续三个格为空,则不记入预导入行 if row[0] == "" && row[1] == "" && row[2] == "" { continue } //真实显示的字段,不要把名称管理器的内容遍历出来 for j := 0; j < len(s1.Cols); j++ { //必填写项目+值域检查 var pass = true //(0)学部 if j == 0 { //符合学部的Map if _, ok := MapStage[row[j]]; !ok { pass = false } } //(1)入学年份 if j == 1 { if row[j] == "" { pass = false } else { //入学年份是不是数字 pattern := "\\d+" //反斜杠要转义 result, _ := regexp.MatchString(pattern, row[j]) if result { //是不是与现在的所在年份在下6,上1范围内 if CommonUtil.ConvertStringToInt(row[j]) < (CurrentYear-6) || CommonUtil.ConvertStringToInt(row[j]) > CurrentYear+1 { pass = false } } } } //(2)班号 if j == 2 { if row[j] == "" { pass = false } else { pattern := "\\d+" //反斜杠要转义 result, _ := regexp.MatchString(pattern, row[j]) if result { if CommonUtil.ConvertStringToInt(row[j]) <= 0 || CommonUtil.ConvertStringToInt(row[j]) > 99 { pass = false } else { if _, ok := MapClass[row[j-2]+"_"+row[j-1]+"_"+row[j]]; !ok { pass = false } } } else { pass = false } } } //(3) 姓名 if j == 3 { if row[j] == "" { pass = false } } //(4)性别 if j == 4 { if row[j] != "男" && row[j] != "女" { pass = false } } //(5)出生日期 if j == 5 { //是不是合法出生日期 if !DateUtil.CheckDateStr(row[j]) { pass = false } //是合法日期 //尝试转一下整数 s := row[j] _, err := strconv.Atoi(s) if err == nil { //如果可以转为整数,那么可能是距离1900-01-01的天数 row[j] = DateUtil.ConvertToFormatDay(row[j]) //转为合法日期格式 } } //(6)民族 if j == 6 { if _, ok := SysDictKit.MapDictKindChineseToCode["mzm_"+row[j]]; !ok { pass = false } } //(7)政治面貌 if j == 7 { if _, ok := SysDictKit.MapDictKindChineseToCode["zzmmm_"+row[j]]; !ok { pass = false } } //(8)身份证件类型 if j == 8 { if _, ok := SysDictKit.MapDictKindChineseToCode["sfzjlxm_"+row[j]]; !ok { pass = false } if row[j] == "" { pass = true } } //(9)身份证号 if j == 9 { 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) } } //(10)独生子女 if j == 10 { row[j] = strings.Replace(row[j], " ", "", -1) if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(11)随迁子女 if j == 11 { row[j] = strings.Replace(row[j], " ", "", -1) if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(12)务工子女 if j == 12 { row[j] = strings.Replace(row[j], " ", "", -1) if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(13)孤儿 if j == 13 { row[j] = strings.Replace(row[j], " ", "", -1) if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(14)留守儿童 if j == 14 { row[j] = strings.Replace(row[j], " ", "", -1) if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(15)残疾儿童 if j == 15 { row[j] = strings.Replace(row[j], " ", "", -1) if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //标红 cName, _ := excelize.ColumnNumberToName(j + 1) cell := cName + CommonUtil.ConvertIntToString(i+1) nowStyle, _ := f.GetCellStyle(s1.Title, cell) if !pass { //红色 if nowStyle != RedStyle { _ = f.SetCellStyle(s1.Title, cell, cell, RedStyle) } firstSuccess = false } else { if nowStyle != WhiteStyle { _ = f.SetCellStyle(s1.Title, cell, cell, WhiteStyle) } } } } //判断身份证号是不是在本EXCEL中存在重复,如果存在,需要进行标识 for _, rowArray := range _idCardMap { //重复 if len(rowArray) > 1 { for i := range rowArray { cell := "J" + 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 } /** 功能:将excel的内容读入到数据库的临时表中 作者:黄海 时间:2020-06-18 */ func readToTable(excelPath string, s1 ExcelUtil.TemplateStruct, MapClass map[string]string, bureauId string, batchId string, MapStage map[string]string) error { var ms = make([]models.TBaseStudentImportExcel, 0) f, _ := excelize.OpenFile(excelPath) rows, _ := f.GetRows(s1.Title) for i, row := range rows { //放过第一行 if i < ExcelUtil.HiddenRows+1 { continue } //如果连续三个格为空,则不记入预导入行 if row[0] == "" && row[1] == "" && row[2] == "" { continue } //导入到临时表中 var m models.TBaseStudentImportExcel //主键 m.Id = CommonUtil.GetUUID() //学部 m.StageId = MapStage[row[0]] //入学年份 m.Rxnf = int32(CommonUtil.ConvertStringToInt(row[1])) //班号 m.Bh = int32(CommonUtil.ConvertStringToInt(row[2])) //单位ID m.BureauId = bureauId //如果班级已存在,那么保存上班级ID,否则存入默认值 if _, ok := MapClass[row[0]+"_"+row[1]+"_"+row[2]]; ok { m.ClassId = MapClass[row[0]+"_"+row[1]+"_"+row[2]] } else { m.ClassId = Const.ZeroGuid } //姓名 m.Xm = row[3] //性别 if row[4] == "男" { m.Xbm = "1" } else { m.Xbm = "2" } //出生日期 m.Csrq = DateUtil.ConvertDate(row[5]) //民族 m.Mzm = SysDictKit.MapDictKindChineseToCode["mzm_"+row[6]] //政治面貌 m.Zzmmm = SysDictKit.MapDictKindChineseToCode["zzmmm_"+row[7]] //身份证件类型 m.Sfzjlxm = SysDictKit.MapDictKindChineseToCode["sfzjlxm_"+row[8]] //身份证件号 m.Sfzjh = CommonUtil.CompressStr(row[9]) //独生子女 m.Dszybz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[10]])) //随迁子女 m.Sqznbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[11]])) //务工子女 m.Jcwgrysqznbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[12]])) //孤儿 m.Gebz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[13]])) //留守儿童 m.Lsetbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[14]])) //残疾儿童 m.Cjbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[15]])) //批次号 m.BatchId = batchId //人员ID if len(row) == 17 { m.PersonId = row[16] } else { m.PersonId = "" } //第几行的数据 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_student_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 := "F" + 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_student_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 := "J" + 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 } /** 功能:插入学生 */ func insertStudent(batchId string, bureauModel models.TBaseOrganization, actionPersonId string, actionIp string) (int, string, error) { //新增学生 studentImportExcelArray := make([]models.TBaseStudentImportExcel, 0) studentArray := make([]models.TBaseStudent, 0) _ = db.Where("batch_id=? and length(person_id)=0", batchId).Find(&studentImportExcelArray) for i := range studentImportExcelArray { r1 := studentImportExcelArray[i] var model models.TBaseStudent //所在班级 model.ClassId = r1.ClassId //人员编号 model.PersonId = CommonUtil.GetUUID() //单位 model.BureauId = bureauModel.BureauId //导入即可用 model.BUse = 1 //身份证号 model.Sfzjh = r1.Sfzjh //身份证件类型 model.Sfzjlxm = r1.Sfzjlxm //所属省份 model.ProvinceCode = bureauModel.ProvinceCode //所属城市 model.CityCode = bureauModel.CityCode //县区 model.DistrictCode = bureauModel.DistrictCode //主校 model.MainSchoolId = bureauModel.MainSchoolId //出生日期与性别 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.Mzm = r1.Mzm //姓名 model.Xm = r1.Xm //曾用名 model.Cym = model.Xm //姓名拼音 model.Xmpy = PinYinUtil.PinYin(model.Xm) //政治面貌 model.Zzmmm = r1.Zzmmm //状态 model.StateId = 1 //独生子女 model.Dszybz = r1.Dszybz //随迁子女 model.Sqznbz = r1.Sqznbz //务工子女 model.Jcwgrysqznbz = r1.Jcwgrysqznbz //孤儿 model.Gebz = r1.Gebz //留守儿童 model.Lsetbz = r1.Lsetbz //残疾儿童 model.Cjbz = r1.Cjbz //添加到数组中 studentArray = append(studentArray, model) } //批量插入 if len(studentArray) > 0 { _, err := db.Insert(&studentArray) if err != nil { return 0, Const.DataBaseActionError, err } //生成日志 ActionLog(studentArray, Const.ActionInsert, actionPersonId, actionIp) //产生登录名 accountArray := SysLoginpersonService.GenerateLoginAccount(3, int64(len(studentImportExcelArray))) var loginpersonModels = make([]models.TSysLoginperson, 0) for i := range studentArray { //调用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 = 3 model.PersonId = studentArray[i].PersonId model.PersonName = studentArray[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 } } /*生成家长及账号*/ for i := range studentArray { model := studentArray[i] //为学生创建对应的家长 modelParent := new(models.TBaseParent) modelParent.PersonId = CommonUtil.GetUUID() modelParent.Xm = model.Xm + "家长" modelParent.Lxdh = "-1" modelParent.StudentId = model.PersonId modelParent.ClassId = model.ClassId modelParent.BureauId = model.BureauId modelParent.ProvinceCode = model.ProvinceCode modelParent.CityCode = model.CityCode modelParent.DistrictCode = model.DistrictCode modelParent.MainSchoolId = model.MainSchoolId modelParent.BUse = 1 _, err = BaseParentDao.AddBaseParent(*modelParent) if err != nil { return 0, Const.DataBaseActionError, err } //为家长创建账号 _, err = SysLoginpersonService.AddLoginperson(4, modelParent.PersonId, modelParent.Xm) if err != nil { return 0, Const.DataBaseActionError, err } } return len(studentArray), "保存成功", nil } return 0, "没有记录需要进行保存", nil } /** 功能:更新导入的学生 */ func updateStudentImport(batchId string, bureauModel models.TBaseOrganization, actionPersonId string, actionIp string) (int, string, error) { //准备身份证号与人员id的映射map sql := `select t1.person_id,t1.sfzjh from t_base_student as t1 inner join t_base_student_import_excel as t2 on t1.sfzjh=t2.sfzjh where t2.batch_id=?` list, _ := db.SQL(sql, batchId).Query().List() var MapSfzjh = make(map[string]string) for i := range list { MapSfzjh[list[i]["sfzjh"].(string)] = list[i]["person_id"].(string) } //开始 studentImportExcelArray := make([]models.TBaseStudentImportExcel, 0) studentArray := make([]models.TBaseStudent, 0) _ = db.Where("batch_id=? and length(person_id)=36", batchId).Find(&studentImportExcelArray) //准备更新的数据 for i := range studentImportExcelArray { r1 := studentImportExcelArray[i] var model models.TBaseStudent //人员编号 model.PersonId = MapSfzjh[r1.Sfzjh] //通过身份证件号反向获取到人员的id //班级ID model.ClassId = r1.ClassId //单位 model.BureauId = bureauModel.BureauId //导入即可用 model.BUse = 1 //身份证号 model.Sfzjh = r1.Sfzjh //身份证件类型 model.Sfzjlxm = r1.Sfzjlxm //所属省份 model.ProvinceCode = bureauModel.ProvinceCode //所属城市 model.CityCode = bureauModel.CityCode //县区 model.DistrictCode = bureauModel.DistrictCode //主校 model.MainSchoolId = bureauModel.MainSchoolId //出生日期与性别 if model.Sfzjlxm == "1" { //根据身份证号,提取男女,出生日期 _, birthday, xbm := IdCardUtil.GetIdCardNoInfo(r1.Sfzjh) model.Csrq = DateUtil.ConvertDate(birthday) model.Xbm = xbm } else { //如果不是身份证号,那就用个默认值吧 model.Csrq = DateUtil.ConvertDate("1977-10-11") model.Xbm = "1" } //排序号 //model.SortId = 1 //排序号就不修改了,防止人为修改对了,这样导入再修改回去 //姓名 model.Xm = r1.Xm //曾用名 model.Cym = model.Xm //姓名拼音 model.Xmpy = PinYinUtil.PinYin(model.Xm) //民族 model.Mzm = r1.Mzm //政治面貌 model.Zzmmm = r1.Zzmmm //状态 model.StateId = 1 //独生子女 model.Dszybz = r1.Dszybz //随迁子女 model.Sqznbz = r1.Sqznbz //务工子女 model.Jcwgrysqznbz = r1.Jcwgrysqznbz //孤儿 model.Gebz = r1.Gebz //留守儿童 model.Lsetbz = r1.Lsetbz //残疾儿童 model.Cjbz = r1.Cjbz //添加到数组中 studentArray = append(studentArray, model) } //批量更新 if len(studentArray) > 0 { //声明事务 session := db.NewSession() defer func() { err := session.Close() if err != nil { fmt.Println(err.Error()) } }() _ = session.Begin() for k := range studentArray { _, err := session.Where("person_id=?", studentArray[k].PersonId).Update(studentArray[k]) if err != nil { _ = session.Rollback() return 0, Const.DataBaseActionError, err } } //事务提交 err := session.Commit() if err != nil { return 0, Const.DataBaseActionError, err } //生成日志 var studentIds = make([]string, 0) for i := range studentArray { studentIds = append(studentIds, studentArray[i].PersonId) } ms, err := GetByIds(studentIds) ActionLog(ms, Const.ActionUpdate, actionPersonId, actionIp) //删除缓存 for i := range studentArray { key := SqlKit.GetBean("t_base_student").RedisPrefix + studentArray[i].PersonId RedisUtil.DEL(key) } return len(studentArray), "保存成功", nil } return 0, "没有记录需要保存", nil } //通过学生的IDS获取到对应家长的IDS func GetParentIds(studentIds []string) ([]string, error) { var myBuilder = builder.Dialect(builder.MYSQL).Select("person_id").From("t_base_parent") myBuilder.Where(builder.In("student_id", studentIds)).And(builder.Eq{"b_use": 1}) sql, err := myBuilder.ToBoundSQL() if err != nil { return nil, err } list, err := db.SQL(sql).Query().List() if err != nil { return nil, err } var parentIds = make([]string, 0) for i := range list { parentIds = append(parentIds, list[i]["person_id"].(string)) } return parentIds, nil } //学生的调转 func StudentTransfer(personId string, classId string) (bool, string, error) { //1、获取班级信息 list := SqlKit.QueryByIds([]string{classId}, "t_base_class") if list == nil || len(list) == 0 { return false, "没有找到指定的班级信息", errors.New("没有找到指定的班级信息") } //单位ID bureauId := list[0]["bureau_id"].(string) _, provinceCode, cityCode, districtCode, mainSchoolId, _ := BaseOrganizationDao.GetBureauAdministrativeDivision(bureauId) //2、修改学生信息 sql := `update t_base_student set bureau_id=?,class_id=?,province_code=?,city_code=?,district_code=?,main_school_id=? where person_id=? and b_use=1` _, err := db.SQL(sql, bureauId, classId, provinceCode, cityCode, districtCode, mainSchoolId, personId).Execute() fmt.Println(err) //3、修改家长信息 sql = `update t_base_parent set bureau_id=?,class_id=?,province_code=?,city_code=?,district_code=?,main_school_id=? where student_id=? and b_use=1` _, _ = db.SQL(sql, bureauId, classId, provinceCode, cityCode, districtCode, mainSchoolId, personId).Execute() return true, "保存成功", nil }