package BaseStudentDao import ( "dsBaseRpc/Const" "dsBaseRpc/RpcService/BaseClass/BaseClassDao" "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" "github.com/360EntSecGroup-Skylar/excelize/v2" "github.com/xormplus/builder" "regexp" "strconv" "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 msLog[i].ActionTime = time.Now() } //批量保存 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 session.Close() 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"). 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") 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") 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班。"}`) //3、入学年份+班号的有效性 for k := 2 + ExcelUtil.HiddenRows; k <= 5000+ExcelUtil.HiddenRows; k++ { //入学年份 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) //班号 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、添加是否的下拉框L--->N for i := 9; i <= 14; 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(`t2.stage_id,t2.rxnf,t2.bh,t1.xm, (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.rxnf,t2.bh") 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] //扩展学段 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", "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]]) } } } // 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, "文件没有找到", nil } //模板是不是系统提供的 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, "不是系统提供的模板,无法完成导入!", nil } //2、对excel的合法性进行检查 excelSuccess = checkExcel(excelPath, s1, MapClass, MapStage) //将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 !excelSuccess || !mysqlSuccess { return false, "在excel检测中,发现问题,请检查后重新上传!", nil } //4、获取所有单位的一些属性,用于一会维护人员信息时使用 var bureauModel models.TBaseOrganization db.Where("org_id=?", bureauId).Get(&bureauModel) //5、更新标识修改,数据库里有的为修改,没有是新增 insertOrUpdateFlagSetting(batchId) //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() 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 } } } } } //(3) 姓名 if j == 3 { if 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 } } //(7)身份证号 if j == 7 { if row[j-1] == "居民身份证" && !CommonUtil.IsIdCard(row[j]) { pass = false } if row[j] == "" { pass = false } _idCardMap[row[j]] = append(_idCardMap[row[j]], i+1) } //(8)独生子女 if j == 8 { if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(9)随迁子女 if j == 9 { if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(10)务工子女 if j == 10 { if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(11)孤儿 if j == 11 { if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(12)留守儿童 if j == 12 { if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //(13)残疾儿童 if j == 13 { if _, ok := SysDictKit.MapTrueOrFalseNameToValue[row[j]]; !ok { pass = false } } //标红 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 } } // 根据指定路径保存文件(不管是不是通过,都保存一次) 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] //民族 m.Mzm = SysDictKit.MapDictKindChineseToCode["mzm_"+row[4]] //政治面貌 m.Zzmmm = SysDictKit.MapDictKindChineseToCode["zzmmm_"+row[5]] //身份证件类型 m.Sfzjlxm = SysDictKit.MapDictKindChineseToCode["sfzjlxm_"+row[6]] //身份证件号 m.Sfzjh = row[7] //独生子女 m.Dszybz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[8]])) //随迁子女 m.Sqznbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[9]])) //务工子女 m.Jcwgrysqznbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[10]])) //孤儿 m.Gebz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[11]])) //留守儿童 m.Lsetbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[12]])) //残疾儿童 m.Cjbz = int32(CommonUtil.ConvertStringToInt(SysDictKit.MapTrueOrFalseNameToValue[row[13]])) //批次号 m.BatchId = batchId //第几行的数据 m.RowNumber = int32(i + 1) //新增还是修改,默认是新增 m.InsertOrUpdate = 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 where t2.batch_id=? and t1.bureau_id<>?` 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<>?` 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 := "F" + 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 insertOrUpdateFlagSetting(batchId string) { //1、更新标识修改,数据库里有的为修改,没有是新增 sql := `update t_base_student_import_excel as t1 join t_base_student as t2 on t1.sfzjh=t2.sfzjh set t1.insert_or_update=2 where t2.b_use=1 and t1.batch_id=?` db.SQL(sql, batchId).Execute() } /** 功能:插入学生 */ 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 insert_or_update=1", 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" { //根据身份证号,提取男女,出生日期 _, birthday, xbm := IdCardUtil.GetIdCardNoInfo(r1.Sfzjh) model.Csrq = DateUtil.ConvertDateTime(birthday+" 00:00:00") model.Xbm = xbm } else { //如果不是身份证号,那就用个默认值吧 model.Csrq = DateUtil.ConvertDateTime("1977-10-11 00:00:00") model.Xbm = "1" } //民族 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, 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 } } 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 insert_or_update=2", 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.ConvertDateTime(birthday+" 00:00:00") model.Xbm = xbm } else { //如果不是身份证号,那就用个默认值吧 model.Csrq = DateUtil.ConvertDateTime("1977-10-11 00:00:00") 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 session.Close() 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 }