package BaseClassService import ( "context" "dsBaseRpc/Const" "dsBaseRpc/Const/ErrorConst" "dsBaseRpc/RpcService/BaseClass/BaseClassDao" "dsBaseRpc/RpcService/BaseClass/BaseClassProto" "dsBaseRpc/RpcService/BaseOrganization/BaseOrganizationDao" "dsBaseRpc/RpcService/BaseStudent/BaseStudentDao" "dsBaseRpc/RpcService/BaseStudent/BaseStudentProto" "dsBaseRpc/Utils/CommonUtil" "dsBaseRpc/Utils/LogUtil" "dsBaseRpc/Utils/SqlKit" "dsBaseRpc/models" "fmt" "strings" ) type Rpc struct{} //服务对象 //选择单条 func (s *Rpc) GetBaseClass(ctx context.Context, in *BaseClassProto.ModelArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply //通用获取单条 list := SqlKit.QueryByIds([]string{in.ClassId}, "t_base_class") //将结果序列化 reply.Success = true reply.Count = 1 reply.Message = Const.SuccessDataBaseAction reply.List = CommonUtil.SerializeToString(list) return &reply, nil } //增加 func (s *Rpc) AddBaseClass(ctx context.Context, in *BaseClassProto.ModelArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply //检查单位号是不是存在 list := SqlKit.QueryByIds([]string{in.BureauId}, "t_base_organization") if list == nil || len(list) == 0 { reply.Success = false reply.Message = "输入的学校编号不存在,无法创建班级!" return &reply, nil } //这里需要注意的是,如果list是从redis中返回的,那么数据类型是float64,而从mysql返回的是int64 if int32(list[0]["org_type"].(float64)) != 2 { reply.Success = false reply.Message = "输入的编号存在,但不是学校类型,无法创建班级!" return &reply, nil } //开始班号,结束班号 if in.StartBh > in.EndBh { reply.Success = false reply.Message = "开始班号不能大于结束班号!" return &reply, nil } if in.StartBh > 99 || in.EndBh > 99 { reply.Success = false reply.Message = "输入班号不能大于99!" return &reply, nil } valid, err := BaseClassDao.CheckClassNumValid(in.BureauId, in.StageId, in.Rxnf, in.StartBh, in.EndBh) if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlUpdateError, "执行CheckClassNumValid时发生严重错误:"+err.Error()) return &reply, nil } //班号存在逻辑上的问题 if !valid { reply.Success = false reply.Message = "输入的班号与现有的班号冲突,无法创建!" return &reply, nil } //省市县+主校 _, provinceCode, cityCode, districtCode, mainSchoolId, err := BaseOrganizationDao.GetBureauAdministrativeDivision(in.BureauId) if err != nil { reply.Success = false reply.Message = err.Error() return &reply, nil } //声明实体数组 modelArray := make([]models.TBaseClass, 0) //循环添加班级 for i := in.StartBh; i <= in.EndBh; i++ { model := new(models.TBaseClass) model.ClassId = CommonUtil.GetUUID() //班号 model.Bh = i //入学年份 model.Rxnf = in.Rxnf //ClassCode是我来规定的,规则是入学年份+1位学段码+两位班号,前补零 model.ClassCode = CommonUtil.ConvertInt32ToString(in.Rxnf) + CommonUtil.ConvertInt32ToString(in.StageId) + fmt.Sprintf("%02d", i) //ClassName --->入学年份+班号 model.ClassName = CommonUtil.ConvertInt32ToString(in.Rxnf) + "级" + CommonUtil.ConvertInt32ToString(i) + "班" //ClassAlias --->入学年份+班号 if in.ClassAlias == "" { model.ClassAlias = model.ClassName } else { model.ClassAlias = in.ClassAlias } //入学季节 model.Rxjj = 9 //暂时使用秋季表示的月份 //学制 model.SchoolingLength = in.SchoolingLength //学段 model.StageId = in.StageId //这个不能给,这个是其它接口再补的 //model.TeacherId = in.TeacherId //这个用于职业学校扩展,暂不提供 //model.OrgId = in.OrgId //单位ID model.BureauId = in.BureauId //主校ID model.MainSchoolId = mainSchoolId //是否启用 model.BUse = 1 //扩展省,市,县区码 model.ProvinceCode = provinceCode model.CityCode = cityCode model.DistrictCode = districtCode //添加到实体数组 modelArray = append(modelArray, *model) } //批量增加 _, err = BaseClassDao.AddBaseClass(modelArray) if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlUpdateError, "执行AddBaseClass时发生严重错误:"+err.Error()) } else { reply.Success = true reply.Message = Const.SuccessDataBaseAction } //记录日志 err = BaseClassDao.ActionLog(modelArray, Const.ActionInsert, in.ActionPersonId, in.ActionIpAddress) if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlUpdateError, "执行ActionLog时发生严重错误:"+err.Error()) } return &reply, err } //删除 func (s *Rpc) DeleteBaseClass(ctx context.Context, in *BaseClassProto.DeleteIdsArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply //判断班级下是不是存在可用的学生? for i := range in.Ids { var inStudent BaseStudentProto.QueryArg inStudent.Page = 1 inStudent.Limit = 1 inStudent.Xm = "" inStudent.ClassId = in.Ids[i] _, count, err := BaseStudentDao.PageBaseStudent(&inStudent) if err != nil { LogUtil.Error(ErrorConst.SqlUpdateError, "执行PageBaseStudent时发生严重错误:"+err.Error()) reply.Success = false reply.Message = Const.DataBaseActionError return &reply, err } if count > 0 { reply.Success = false reply.Message = "班级下存在可用的学生,无法删除!" return &reply, err } } //调用通用删除命令进行删除 err := SqlKit.DeleteIds("t_base_class", in.Ids) //错误处理 if err != nil { LogUtil.Error(ErrorConst.SqlUpdateError, "执行DeleteBaseClass时发生严重错误:"+err.Error()) reply.Success = false reply.Message = Const.DataBaseActionError return &reply, err } //记录日志 ms, err := BaseClassDao.GetByIds(in.Ids) if err != nil { LogUtil.Error(ErrorConst.SqlUpdateError, "执行FindModelsByIds时发生严重错误:"+err.Error()) reply.Success = false reply.Message = Const.DataBaseActionError return &reply, err } err = BaseClassDao.ActionLog(ms, Const.ActionDelete, in.ActionPersonId, in.ActionIpAddress) if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlUpdateError, "执行ActionLog时发生严重错误:"+err.Error()) } reply.Success = true reply.Message = Const.SuccessDataBaseAction return &reply, err } //修改 func (s *Rpc) UpdateBaseClass(ctx context.Context, in *BaseClassProto.ModelArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply //修改 model := new(models.TBaseClass) model.ClassId = in.ClassId model.ClassAlias = in.ClassAlias model.TeacherId = in.TeacherId _, err := BaseClassDao.UpdateBaseClass(*model, in.ForceUpdateFields) //错误处理 if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlUpdateError, "执行UpdateBaseClass时发生严重错误:"+err.Error()) return &reply, err } //记录日志 ms, err := BaseClassDao.GetByIds([]string{in.ClassId}) if err != nil { LogUtil.Error(ErrorConst.SqlUpdateError, "执行FindModelsByIds时发生严重错误:"+err.Error()) reply.Success = false reply.Message = Const.DataBaseActionError return &reply, err } err = BaseClassDao.ActionLog(ms, Const.ActionUpdate, in.ActionPersonId, in.ActionIpAddress) if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlUpdateError, "执行ActionLog时发生严重错误:"+err.Error()) } reply.Success = true reply.Message = Const.SuccessDataBaseAction return &reply, nil } //分页查询 func (s *Rpc) PageBaseClass(ctx context.Context, in *BaseClassProto.QueryArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply list, count, err := BaseClassDao.PageBaseClass(in) //错误处理 if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlQueryError, "执行PageBaseClass时发生严重错误:"+err.Error()) return &reply, err } reply.Count = count reply.Success = true reply.Message = Const.SuccessDataBaseAction reply.List = CommonUtil.SerializeToString(list) return &reply, nil } //根据学校ID获取学部(学段)信息 func (s *Rpc) GetStage(ctx context.Context, in *BaseClassProto.ModelArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply list, count, err := BaseClassDao.GetStage(in.BureauId) //错误处理 if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlQueryError, "执行GetStage时发生严重错误:"+err.Error()) return &reply, err } reply.Count = count reply.Success = true reply.Message = Const.SuccessDataBaseAction reply.List = CommonUtil.SerializeToString(list) return &reply, nil } //根据学校ID和学部(学段)ID获取入学年份 func (s *Rpc) GetRxnf(ctx context.Context, in *BaseClassProto.ModelArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() //rpc响应 var reply BaseClassProto.Reply list, count, err := BaseClassDao.GetRxnf(in.BureauId, in.StageId) //错误处理 if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlQueryError, "执行GetRxnf时发生严重错误:"+err.Error()) return &reply, err } var rxnfArray = make([]int64, 0) for i := range list { rxnfArray = append(rxnfArray, list[i]["rxnf"].(int64)) } reply.Count = count reply.Success = true reply.Message = Const.SuccessDataBaseAction reply.List = strings.Replace(fmt.Sprint(rxnfArray), " ", ",", -1) return &reply, nil } //调置班级状态为毕业,或者,取消毕业 func (s *Rpc) BacthSetClassGraduateStatus(ctx context.Context, in *BaseClassProto.BacthSetClassGraduateStageArg) (*BaseClassProto.Reply, error) { //异常处理 defer func() { if err := recover(); err != nil { fmt.Printf("%s\n", err) } }() var reply BaseClassProto.Reply var err error if len(in.Ids) == 0 { reply.Success = false reply.Message = "输入的班级最少是一个,目前是零个!" return &reply, err } //调用Dao层进行处理 err = BaseClassDao.BacthSetClassGraduateStatus(in) //错误处理 if err != nil { reply.Success = false reply.Message = Const.DataBaseActionError LogUtil.Error(ErrorConst.SqlQueryError, "执行BacthSetClassGraduateStatus时发生严重错误:"+err.Error()) return &reply, err } reply.Count = int32(len(in.Ids)) reply.Success = true reply.Message = Const.SuccessDataBaseAction return &reply, nil }