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.

498 lines
15 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 BaseStudentService
import (
"context"
"dsBaseRpc/Const"
"dsBaseRpc/Const/ErrorConst"
"dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationDao"
"dsBaseRpc/RpcService/BaseParent/BaseParentDao"
"dsBaseRpc/RpcService/BaseStudent/BaseStudentDao"
"dsBaseRpc/RpcService/BaseStudent/BaseStudentProto"
"dsBaseRpc/RpcService/SysLoginperson/SysLoginpersonDao"
"dsBaseRpc/RpcService/SysLoginperson/SysLoginpersonService"
"dsBaseRpc/Utils/CommonUtil"
"dsBaseRpc/Utils/DateUtil"
"dsBaseRpc/Utils/ExcelUtil"
"dsBaseRpc/Utils/IdCardUtil"
"dsBaseRpc/Utils/LogUtil"
"dsBaseRpc/Utils/PinYinUtil"
"dsBaseRpc/Utils/SqlKit"
"dsBaseRpc/models"
"fmt"
"github.com/pkg/errors"
)
type Rpc struct{} //服务对象
//选择单条
func (s *Rpc) GetBaseStudent(ctx context.Context, in *BaseStudentProto.ModelArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
//通用获取单条
list := SqlKit.QueryByIds([]string{in.PersonId}, "t_base_student")
//将结果序列化
reply.Success = true
reply.Count = 1
reply.Message = Const.SuccessDataBaseAction
reply.List = CommonUtil.SerializeToString(list)
return &reply, nil
}
//增加
func (s *Rpc) AddBaseStudent(ctx context.Context, in *BaseStudentProto.ModelArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
//==========================================
//检查身份证的有效性
if len(in.Sfzjh) > 0 {
IdCardNo := []byte(in.Sfzjh)
if in.Sfzjlxm == "01" && !IdCardUtil.IsValidIdCardNo(&IdCardNo) {
reply.Success = false
reply.Message = "身份证号在不符合检查要求!"
return &reply, nil
}
//是不是重复
if !SysLoginpersonDao.IsValidIdCardNo(in.Sfzjh, "") {
reply.Success = false
reply.Message = "证件号在系统中已存在,无法创建!"
return &reply, nil
}
}
//==========================================
//调用dao
model := new(models.TBaseStudent)
//学生ID
model.PersonId = CommonUtil.GetUUID()
//学生姓名
model.Xm = in.Xm
//姓名拼音
model.Xmpy = PinYinUtil.PinYin(in.Xm)
//曾用名
model.Cym = in.Cym
//身份证件号
model.Sfzjh = in.Sfzjh
model.Sfzjlxm = in.Sfzjlxm
//如果是身份证
if model.Sfzjlxm == "1" {
//如果是身份证
by := []byte(in.Sfzjh)
if !IdCardUtil.IsValidIdCardNo(&by) {
reply.Success = false
reply.Message = "身份证号不合法!"
return &reply, nil
}
//根据身份证号,提取男女,出生日期
_, birthday, xbm := IdCardUtil.GetIdCardNoInfo(in.Sfzjh)
model.Csrq = DateUtil.ConvertDate(birthday)
model.Xbm = xbm
} else {
model.Csrq = DateUtil.ConvertDate(in.Csrq)
model.Xbm = in.Xbm
}
//民族 (有字典)
model.Mzm = in.Mzm
//政治面貌 (有字典)
model.Zzmmm = in.Zzmmm
//独生子女标志 0不是 1
model.Dszybz = in.Dszybz
//随迁子女标志 0不是 1
model.Sqznbz = in.Sqznbz
//进城务工人员随迁子女标志 0不是 1
model.Jcwgrysqznbz = in.Jcwgrysqznbz
//孤儿标志 0不是 1
model.Gebz = in.Gebz
//留守儿童标志 0不是 1
model.Lsetbz = in.Lsetbz
//残疾标志 0不是 1
model.Cjbz = in.Cjbz
//班级ID
model.ClassId = in.ClassId
//是否启用 0未启用 1启用
model.BUse = 1
//状态码
model.StateId = 1
list := SqlKit.QueryByIds([]string{in.ClassId}, "t_base_class")
if list == nil || len(list) == 0 {
reply.Success = false
reply.Message = "没有找到对应的班级!"
return &reply, errors.New("传入的班级ID有误")
}
//单位ID
BureauId := list[0]["bureau_id"].(string)
//省市县区
var err error
_, model.ProvinceCode, model.CityCode, model.DistrictCode, model.MainSchoolId, err = BaseOrganizationDao.GetBureauAdministrativeDivision(BureauId)
if err != nil {
reply.Success = false
reply.Message = err.Error()
return &reply, err
}
//学校ID
model.BureauId = BureauId
//添加学生
_, err = BaseStudentDao.AddBaseStudent(*model)
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlUpdateError, "执行AddBaseStudent时发生严重错误"+err.Error())
return &reply, err
}
//为学生创建账号
_, err = SysLoginpersonService.AddLoginperson(3, model.PersonId, model.Xm)
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlUpdateError, "执行AddLoginperson时发生严重错误"+err.Error())
return &reply, err
}
//为学生创建对应的家长
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 {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlUpdateError, "执行AddBaseParent时发生严重错误"+err.Error())
return &reply, err
}
//记录日志
BaseParentDao.ActionLog([]models.TBaseParent{*modelParent}, Const.ActionInsert, in.ActionPersonId, in.ActionIpAddress)
//为家长创建账号
_, err = SysLoginpersonService.AddLoginperson(4, modelParent.PersonId, modelParent.Xm)
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlUpdateError, "执行AddLoginperson时发生严重错误"+err.Error())
return &reply, err
}
//记录日志
BaseStudentDao.ActionLog([]models.TBaseStudent{*model}, Const.ActionInsert, in.ActionPersonId, in.ActionIpAddress)
reply.Success = true
reply.Message = Const.SuccessDataBaseAction
return &reply, err
}
//删除
func (s *Rpc) DeleteBaseStudent(ctx context.Context, in *BaseStudentProto.DeleteIdsArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
//调用通用删除命令进行删除
err := SqlKit.DeleteIds("t_base_student", in.Ids)
//错误处理
if err != nil {
LogUtil.Error(ErrorConst.SqlUpdateError, "执行DeleteBaseStudent时发生严重错误"+err.Error())
reply.Success = false
reply.Message = Const.DataBaseActionError
return &reply, err
}
//记录日志
ms, err := BaseStudentDao.GetByIds(in.Ids)
if err != nil {
LogUtil.Error(ErrorConst.SqlUpdateError, "执行FindModelsByIds时发生严重错误"+err.Error())
reply.Success = false
reply.Message = Const.DataBaseActionError
return &reply, err
}
BaseStudentDao.ActionLog(ms, Const.ActionDelete, in.ActionPersonId, in.ActionIpAddress)
//根据学生IDS--->家长IDS
parentIds, err := BaseStudentDao.GetParentIds(in.Ids)
if err != nil {
LogUtil.Error(ErrorConst.SqlUpdateError, "执行GetParentIds时发生严重错误"+err.Error())
reply.Success = false
reply.Message = Const.DataBaseActionError
return &reply, err
}
//删除对应的家长
_ = SqlKit.DeleteIds("t_base_parent", parentIds)
//记录家长表的数据变更
ms2, err := BaseParentDao.GetByIds(parentIds)
if err != nil {
LogUtil.Error(ErrorConst.SqlUpdateError, "执行FindModelsByIds时发生严重错误"+err.Error())
reply.Success = false
reply.Message = Const.DataBaseActionError
return &reply, err
}
BaseParentDao.ActionLog(ms2, Const.ActionDelete, in.ActionPersonId, in.ActionIpAddress)
reply.Success = true
reply.Message = Const.SuccessDataBaseAction
return &reply, err
}
//修改
func (s *Rpc) UpdateBaseStudent(ctx context.Context, in *BaseStudentProto.ModelArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
//==========================================
//检查身份证的有效性
if len(in.Sfzjh) > 0 {
IdCardNo := []byte(in.Sfzjh)
if in.Sfzjlxm == "1" && !IdCardUtil.IsValidIdCardNo(&IdCardNo) {
reply.Success = false
reply.Message = "身份证号在不符合检查要求!"
return &reply, nil
}
//是不是重复
if !SysLoginpersonDao.IsValidIdCardNo(in.Sfzjh, in.PersonId) {
reply.Success = false
reply.Message = "证件号在系统中已存在,无法创建!"
return &reply, nil
}
}
//==========================================
model := new(models.TBaseStudent)
//身份证件号
model.Sfzjh = in.Sfzjh
model.Sfzjlxm = in.Sfzjlxm
//如果是身份证
if model.Sfzjlxm == "1" {
//如果是身份证
by := []byte(in.Sfzjh)
if !IdCardUtil.IsValidIdCardNo(&by) {
reply.Success = false
reply.Message = "身份证号不合法!"
return &reply, nil
}
//根据身份证号,提取男女,出生日期
_, birthday, xbm := IdCardUtil.GetIdCardNoInfo(in.Sfzjh)
model.Csrq = DateUtil.ConvertDate(birthday)
model.Xbm = xbm
} else {
//如果不是身份证号,那就用个默认值吧
model.Csrq = DateUtil.ConvertDate(in.Csrq)
model.Xbm = in.Xbm
}
model.PersonId = in.PersonId
//学生姓名
model.Xm = in.Xm
//姓名拼音
model.Xmpy = PinYinUtil.PinYin(in.Xm)
//曾用名
model.Cym = in.Cym
//民族 (有字典)
model.Mzm = in.Mzm
//政治面貌 (有字典)
model.Zzmmm = in.Zzmmm
//独生子女标志 0不是 1
model.Dszybz = in.Dszybz
//随迁子女标志 0不是 1
model.Sqznbz = in.Sqznbz
//进城务工人员随迁子女标志 0不是 1
model.Jcwgrysqznbz = in.Jcwgrysqznbz
//孤儿标志 0不是 1
model.Gebz = in.Gebz
//留守儿童标志 0不是 1
model.Lsetbz = in.Lsetbz
//残疾标志 0不是 1
model.Cjbz = in.Cjbz
//查找此学生所在的班级
list := SqlKit.QueryByIds([]string{in.PersonId}, "t_base_student")
if list == nil || len(list) == 0 {
reply.Success = false
reply.Message = "没有找到对应的学生!"
return &reply, nil
}
//班级ID
model.ClassId = list[0]["class_id"].(string)
//所在单位ID
BureauId := list[0]["bureau_id"].(string)
//是否启用 0未启用 1启用
model.BUse = 1
//状态码
model.StateId = 1
//省市县区+主校ID
var err error
_, model.ProvinceCode, model.CityCode, model.DistrictCode, model.MainSchoolId, err = BaseOrganizationDao.GetBureauAdministrativeDivision(BureauId)
if err != nil {
reply.Success = false
reply.Message = err.Error()
return &reply, err
}
//学校ID
model.BureauId = list[0]["bureau_id"].(string)
_, err = BaseStudentDao.UpdateBaseStudent(*model, in.ForceUpdateFields)
//错误处理
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlUpdateError, "执行UpdateBaseStudent时发生严重错误"+err.Error())
return &reply, err
}
//记录日志
ms, err := BaseStudentDao.GetByIds([]string{in.PersonId})
if err != nil {
LogUtil.Error(ErrorConst.SqlUpdateError, "执行FindModelsByIds时发生严重错误"+err.Error())
reply.Success = false
reply.Message = Const.DataBaseActionError
return &reply, err
}
BaseStudentDao.ActionLog(ms, Const.ActionUpdate, in.ActionPersonId, in.ActionIpAddress)
reply.Success = true
reply.Message = Const.SuccessDataBaseAction
return &reply, nil
}
//分页查询
func (s *Rpc) PageBaseStudent(ctx context.Context, in *BaseStudentProto.QueryArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
list, count, err := BaseStudentDao.PageBaseStudent(in)
//错误处理
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlQueryError, "执行PageBaseStudent时发生严重错误"+err.Error())
return &reply, err
}
reply.Count = count
reply.Success = true
reply.Message = Const.SuccessDataBaseAction
reply.List = CommonUtil.SerializeToString(list)
return &reply, nil
}
//学生调整班级
func (s *Rpc) ReviseStudentClass(ctx context.Context, in *BaseStudentProto.ReviseArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
//调用dao
err := BaseStudentDao.ReviseTeacherOrg(in.Ids, in.ClassId)
//错误处理
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlQueryError, "执行ReviseTeacherOrg时发生严重错误"+err.Error())
return &reply, err
}
reply.Count = int32(len(in.Ids))
reply.Success = true
reply.Message = Const.SuccessDataBaseAction
return &reply, nil
}
//导出本校学生账号信息到EXCEL
func (s *Rpc) ExportStudentAccountInfoExcel(ctx context.Context, in *BaseStudentProto.ModelArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
list, _, err := BaseStudentDao.ExportStudentAccountInfoExcel(in)
//错误处理
if err != nil {
reply.Success = false
reply.Message = Const.DataBaseActionError
LogUtil.Error(ErrorConst.SqlQueryError, "执行ExportStudentAccountInfoExcel时发生严重错误"+err.Error())
return &reply, err
}
//1、配置文件
jsonTemplate := "student_account.json"
//2、导出
TargetPath := CommonUtil.GetExportExcelFilePath()
ExcelUtil.ExportExcel(jsonTemplate, list, TargetPath)
reply.ExcelPath = TargetPath
return &reply, nil
}
//导出本校学生信息到EXCEL
func (s *Rpc) ExportStudentInfoExcel(ctx context.Context, in *BaseStudentProto.ModelArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
TargetPath := CommonUtil.GetExportExcelFilePath()
//哪个单位
bureauId := in.BureauId
//是不是需要导出空的excel
ExportExcelStatus := in.ExportExcelStatus
//目前只处理一个班级或全校的情况
var classIds = make([]string, 0)
if len(in.ClassId) > 0 {
classIds = append(classIds, in.ClassId)
}
BaseStudentDao.ExportStudentInfoExcel(TargetPath, bureauId, ExportExcelStatus, classIds)
reply.ExcelPath = TargetPath
return &reply, nil
}
//导入本校学生信息
func (s *Rpc) ImportStudentInfoExcel(ctx context.Context, in *BaseStudentProto.ImportArg) (*BaseStudentProto.Reply, error) {
//异常处理
defer func() {
if err := recover(); err != nil {
fmt.Printf("%s\n", err)
}
}()
//rpc响应
var reply BaseStudentProto.Reply
//将业务逻辑封装到dao层
success, message, err := BaseStudentDao.ImportStudentInfoExcel(in.ExcelPath, in.BureauId, in.ActionPersonId, in.ActionIpAddress)
if err != nil {
reply.Success = false
reply.Message = message
return &reply, nil
}
reply.Success = success
reply.Message = message
return &reply, nil
}