using Learun.Util; using System.Data; using Learun.Application.TwoDevelopment.PersonnelManagement; using System.Web.Mvc; using System.Collections.Generic; using Learun.Application.TwoDevelopment.EducationalAdministration; using System; using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; using System.IO; using Learun.Application.Base.SystemModule; using Learun.Application.TwoDevelopment.Pk; namespace Learun.Application.Web.Areas.PersonnelManagement.Controllers { /// /// 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园 /// Copyright (c) 2013-2018 北京泉江科技有限公司 /// 创 建:超级管理员 /// 日 期:2019-03-25 11:16 /// 描 述:课程表 /// public class TimeTableController : MvcControllerBase { private ArrangeLessonTermIBLL arrangeLessonTermIBLL = new ArrangeLessonTermBLL(); private StuAttendanceIBLL stuAttendanceIBLL = new StuAttendanceBLL(); private ArrangeLessonTermOfElectiveIBLL arrangeLessonTermOfElectiveIBLL = new ArrangeLessonTermOfElectiveBLL(); private StuAttendanceLeaveIBLL stuAttendanceLeaveIBLL = new StuAttendanceLeaveBLL(); private StuSelectLessonListOfElectiveIBLL stuSelectLessonList = new StuSelectLessonListOfElectiveBLL(); private StuInfoBasicIBLL stuInfoBasicIBLL = new StuInfoBasicBLL(); private LessonInfoIBLL lessonInfoIBLL = new LessonInfoBLL(); private Edu_ChangeTeacherLessonIBLL edu_ChangeTeacherLessonIBLL = new Edu_ChangeTeacherLessonBLL(); private AnnexesFileIBLL annexesFileIBLL = new AnnexesFileBLL(); private Pm_LessonscheduleverIBLL pm_LessonscheduleverIBLL=new Pm_LessonscheduleverBLL(); private Pm_PkDataIBLL pm_PkDataIBLL = new Pm_PkDataBLL(); #region 视图功能 /// /// 主页面 /// /// [HttpGet] public ActionResult Index() { return View(); } /// /// 考勤 /// /// [HttpGet] public ActionResult Attendance() { return View(); } [HttpGet] public ActionResult AttendanceDetail() { return View(); } [HttpGet] public ActionResult AttendanceStatistic() { return View(); } [HttpGet] public ActionResult AttendanceList() { return View(); } [HttpGet] public ActionResult Leave() { return View(); } /// /// 导入页面 /// /// [HttpGet] public ActionResult ImportForm() { return View(); } /// /// 排课导入页面 /// /// [HttpGet] public ActionResult PkImportForm() { return View(); } /// /// 课程表【教务】 /// /// [HttpGet] public ActionResult IndexInEducation() { return View(); } /// /// 班级课程表【教务】 /// /// [HttpGet] public ActionResult ClassIndexInEducation() { return View(); } /// /// 课程表【教学调度】 /// /// [HttpGet] public ActionResult IndexInEducationSelect() { return View(); } /// /// 课程表【教学调度】--调课 /// /// [HttpGet] public ActionResult IndexInEducationSelect_() { return View(); } /// /// 课程表--修改教师所带的课程【教务】 /// /// [HttpGet] public ActionResult IndexInEducationModify() { return View(); } /// /// 表单--修改教师所带的课程【教务】 /// /// [HttpGet] public ActionResult ModifyLessonForm() { return View(); } /// /// 表单--修改教师所带的课程【教务】 /// /// [HttpGet] public ActionResult SchoolLesson() { return View(); } /// /// 表单--修改教师所带的课程【教务】 /// /// [HttpGet] public ActionResult PrintSchedule() { return View(); } public class WeekDate { public int week { get; set; } public string startdate { get; set; } public string enddate { get; set; } public string textweek { get; set; } } [HttpGet] [AjaxOnly] public ActionResult GetWeeksData() { var weekdatelist = new List(); var yearsemester = Common.GetSemesterAndYear(); var arrangelessonlist = arrangeLessonTermIBLL.GetListForTimeTable("{\"AcademicYearNo\":\"" + yearsemester.AcademicYearShort + "\",\"Semester\":\"" + yearsemester.Semester + "\"}").OrderBy(m => m.LessonDate); if (arrangelessonlist.Any()) { var firstday = arrangelessonlist.First(); var lastday = arrangelessonlist.Last(); var monday = firstday.LessonDate.Value.AddDays(-Convert.ToInt32(firstday.LessonDate.Value.DayOfWeek) + 1); var sunday = lastday.LessonDate.Value.AddDays(7 - Convert.ToInt32(lastday.LessonDate.Value.DayOfWeek)); //总周数 var weekCount = Math.Ceiling(Convert.ToDouble((sunday - monday).Days+1) / 7); for (var i = 0; i < weekCount; i++) { var wentity = new WeekDate(); wentity.week = i + 1; wentity.startdate = monday.AddDays(i * 7).ToString("yyyy-MM-dd"); wentity.enddate = monday.AddDays(i * 7+6).ToString("yyyy-MM-dd"); wentity.textweek = "第" + wentity.week + "周 (" + wentity.startdate + "~" + wentity.enddate + ")"; weekdatelist.Add(wentity); } return Success(weekdatelist); } else return Success(new { }); } /// /// 获取当前日期是第几周 /// /// [HttpGet] [AjaxOnly] public ActionResult GetCurrentWeek() { var yearsemester = Common.GetSemesterAndYear(); var arrangelessonlist = arrangeLessonTermIBLL.GetListForTimeTable("{\"AcademicYearNo\":\"" + yearsemester.AcademicYearShort + "\",\"Semester\":\"" + yearsemester.Semester + "\"}").OrderBy(m => m.LessonDate); if (arrangelessonlist.Any()) { var firstday = arrangelessonlist.First(); var lastday = arrangelessonlist.Last(); var monday = firstday.LessonDate.Value.AddDays(-(Convert.ToInt32(firstday.LessonDate.Value.DayOfWeek) == 0 ? 7 : Convert.ToInt32(firstday.LessonDate.Value.DayOfWeek)) + 1); var sunday = lastday.LessonDate.Value.AddDays(7 - (Convert.ToInt32(lastday.LessonDate.Value.DayOfWeek) == 0 ? 7 : Convert.ToInt32(lastday.LessonDate.Value.DayOfWeek))); var currentweek = Util.Time.GetWeekOfDay(monday, sunday); return Success(currentweek); } return Success(1); } /// /// 获取表单数据 /// /// [HttpGet] [AjaxOnly] public ActionResult GetFormData() { var userInfo = LoginUserInfo.Get(); var stuInfo = stuInfoBasicIBLL.GetStuInfoBasicEntityByStuNo(userInfo.account); StuAttendanceLeaveEntity entity = new StuAttendanceLeaveEntity(); entity.ClassNo = stuInfo.ClassNo; entity.DeptNo = stuInfo.DeptNo; entity.Grade = stuInfo.Grade; entity.MajorNo = stuInfo.MajorNo; entity.StuNo = userInfo.account; entity.StuName = userInfo.realName; var jsonData = new { StuAttendanceLeave = entity, }; return Success(jsonData); } /// /// 获取相关课程考勤的学生信息 /// /// [HttpGet] [AjaxOnly] public ActionResult AttendanceStudents(string pagination, string queryJson, string lessonSortNo) { Pagination paginationobj = pagination.ToObject(); var data = new List(); if (lessonSortNo == "1")//必修课 { data = arrangeLessonTermIBLL.AttendanceStudents(paginationobj, queryJson).ToList(); } else if (lessonSortNo == "2")//选修课 { data = arrangeLessonTermOfElectiveIBLL.AttendanceStudents(paginationobj, queryJson).ToList(); } var jsonData = new { rows = data, total = paginationobj.total, page = paginationobj.page, records = paginationobj.records }; return Success(jsonData); } /// /// 提交课程考勤 /// /// [HttpPost] [AjaxOnly] public async Task AttendanceApply(string kqType, string lessonTime, string lessonDate, string classRoomNo, string dataJson, decimal? attenScore, string attenCondition) { var data = await stuAttendanceIBLL.AttendanceApply(kqType, lessonTime, lessonDate, classRoomNo, dataJson, attenScore, attenCondition); return Success(data); } /// /// 排课同步 /// /// [HttpPost] [AjaxOnly] public ActionResult PkSyncForm() { var bb=pm_LessonscheduleverIBLL.GetData(); if(bb!=null) { var bbid = bb.id; var r=pm_PkDataIBLL.SyncPkData(bbid); return Success(r); } return Fail("同步失败(未找到版本)"); } /// /// 教师/学生课程表 /// /// [HttpGet] [AjaxOnly] public ActionResult GetData(string startTime, string endTime) { var userInfo = LoginUserInfo.Get(); //var startDate = startTime ?? Common.CalculateFirstDateOfWeek(DateTime.Today).ToString("yyyy-MM-dd"); //var endDate = endTime ?? Common.CalculateLastDateOfWeek(DateTime.Today).ToString("yyyy-MM-dd"); //开始时间 var startdate = string.IsNullOrEmpty(startTime) ? DateTime.Today : Convert.ToDateTime(startTime); var startDate = Common.CalculateFirstDateOfWeek(startdate).ToString("yyyy-MM-dd"); var endDate = Common.CalculateLastDateOfWeek(startdate).ToString("yyyy-MM-dd"); var semesterAndYear = Common.GetSemesterAndYear(startDate); var strAcademicYear = semesterAndYear.AcademicYearLong; var strSemester = semesterAndYear.Semester; var timeTableList = new List(); //课程表 var data = arrangeLessonTermIBLL.GetTimeTable(userInfo.account, userInfo.Description, startDate, endDate); timeTableList.AddRange(data); //选修课课程表 var dataOfElective = arrangeLessonTermOfElectiveIBLL.GetTimeTable(userInfo.account, userInfo.Description, startDate, endDate); timeTableList.AddRange(dataOfElective); //var timeTables = data.ToList(); var timeTables = timeTableList.ToList(); var noDataResult = new { schoolName = "课程表", semester = $"{strAcademicYear}学年度 第{strSemester}学期", weekList = "", teacherName = userInfo.realName }; if (!timeTables.Any()) { return JsonResult(noDataResult); } var leaveList = stuAttendanceLeaveIBLL.GetList(); var formatData = from d in timeTables let tt = d.LessonTime.Substring(1) group d by tt into g orderby g.Key select new { time = g.Key, list = from e in timeTables let ee = e.LessonTime.Substring(1) where ee == g.Key select new { day = e.LessonTime.ToCharArray()[0], curriculum = string.IsNullOrEmpty(e.EnName) ? (e.LessonSortNo == "2" ? e.LessonName + "[选修]" : e.LessonName) : (e.LessonSortNo == "2" ? e.EnName + "[选修]" : e.EnName), lessonName = e.LessonName, teacher = e.EmpName, classRoom = e?.ClassroomName?.Trim(), academicyear = semesterAndYear.AcademicYearShort, semester = strSemester, lessonNo = e?.LessonNo, teachClassNo = e?.TeachClassNo, empno = e?.EmpNo, lessonTime = e.LessonTime, lessonDate = e.LessonDate.ToString("yyyy-MM-dd"), classRoomNo = e?.ClassRoomNo?.Trim(), lessonSortNo = e.LessonSortNo, e.OLPEId, className = string.IsNullOrEmpty(e.ClassName) ? "" : e.ClassName, leaveType = leaveList.Any(c => c.LessonNo == e.LessonNo && c.StuNo == userInfo.account && c.LessonDate == e.LessonDate && c.LessonTime == e.LessonTime) ? 1 : 0, checkType = leaveList.FirstOrDefault(c => c.LessonNo == e.LessonNo && c.StuNo == userInfo.account && c.LessonDate == e.LessonDate && c.LessonTime == e.LessonTime)?.IsCheck, } } ; // var leaveList = stuAttendanceLeaveIBLL.GetList(); //var formatData = timeTables.OrderBy(a => a.LessonTime.Substring(1)) // .Select(a => new // { // time = a.LessonTime.Substring(1), // list = timeTables.Where(b => b.LessonTime.Substring(1) == a.LessonTime.Substring(1)) // .Select(b => new // { // day = b.LessonTime.ToCharArray()[0], // curriculum = string.IsNullOrEmpty(b.EnName) ? (b.LessonSortNo == "2" ? b.LessonName + "[选修]" : b.LessonName) : (b.LessonSortNo == "2" ? b.EnName + "[选修]" : b.EnName), // lessonName = b.LessonName, // teacher = b.EmpName, // classRoom = b.ClassroomName.Trim(), // academicyear = semesterAndYear.AcademicYearShort, // semester = strSemester, // lessonNo = b?.LessonNo, // teachClassNo = b?.TeachClassNo, // empno = b?.EmpNo, // lessonTime = b.LessonTime, // lessonDate = b.LessonDate.ToString("yyyy-MM-dd"), // classRoomNo = b?.ClassRoomNo.Trim(), // lessonSortNo = b.LessonSortNo, // b.OLPEId, // className = string.IsNullOrEmpty(b.ClassName) ? "" : b.ClassName, // leaveType = leaveList.Any(c => c.LessonNo == b.LessonNo && c.StuNo == userInfo.account && c.LessonDate == b.LessonDate && c.LessonTime == b.LessonTime) ? 1 : 0, // checkType = leaveList.FirstOrDefault(c => c.LessonNo == b.LessonNo && c.StuNo == userInfo.account && c.LessonDate == b.LessonDate && c.LessonTime == b.LessonTime)?.IsCheck, // }) // }); //foreach (var item in formatData.list) //{ // if(leaveList.Any(a=>a.LessonNo==item.)) //} var result = new { schoolName = "课程表", semester = $"{strAcademicYear}学年度 第{strSemester}学期", teacherName = userInfo.realName, weekList = formatData }; return JsonResult(result); } /// /// 课程表【教务】 /// /// [HttpGet] [AjaxOnly] public ActionResult GetDataInEducation(string startTime, string endTime, string classNo, string empNo, string schoolId, string classroomNo) { var userInfo = LoginUserInfo.Get(); //开始时间 var startdate = string.IsNullOrEmpty(startTime) ? DateTime.Today : Convert.ToDateTime(startTime); var startDate = Common.CalculateFirstDateOfWeek(startdate).ToString("yyyy-MM-dd"); var endDate = Common.CalculateLastDateOfWeek(startdate).ToString("yyyy-MM-dd"); var semesterAndYear = Common.GetSemesterAndYear(startDate); var strAcademicYear = semesterAndYear.AcademicYearLong; var strSemester = semesterAndYear.Semester; var timeTableList = new List(); //课程表 var data = arrangeLessonTermIBLL.GetTimeTableInEducation(startDate, endDate, classNo, empNo, schoolId, classroomNo); timeTableList.AddRange(data); //选修课课程表 //20220718因 更改教务课表显示格式为班级作为列头,选修课无班级所以不能显示在课表内 //var dataOfElective = arrangeLessonTermOfElectiveIBLL.GetTimeTableInEducation(startDate, endDate, classNo, empNo, schoolId); //timeTableList.AddRange(dataOfElective); var timeTables = timeTableList.ToList(); var noDataResult = new { schoolName = "课程表", semester = $"{strAcademicYear}学年度 第{strSemester}学期", weekList = "" }; if (!timeTables.Any()) { return JsonResult(noDataResult); } //最大节次 int maxlessontime = timeTables.Max(m => Convert.ToInt32(m.LessonTime.Substring(1))); //班级列表 var classinfolist = timeTables.Select(m => new { m.TeachClassNo, m.ClassName }).OrderBy(m => m.TeachClassNo).GroupBy(m => new { m.TeachClassNo, m.ClassName }); var formatData = from d in timeTables let tt = d.LessonTime.Substring(1) group d by tt into g orderby g.Key select new { time = g.Key, list = from e in timeTables let ee = e.LessonTime.Substring(1) where ee == g.Key select new { day = e.LessonTime.ToCharArray()[0], curriculum = e.LessonSortNo == "2" ? e.LessonName + "[选修]" : e.LessonName, teacher = e?.EmpName, classRoom = string.IsNullOrEmpty(e.ClassroomName) ? "" : e.ClassroomName.Trim(), academicyear = semesterAndYear.AcademicYearShort, semester = strSemester, lessonNo = e?.LessonNo, teachClassNo = e?.TeachClassNo, empno = e?.EmpNo, lessonTime = e.LessonTime, lessonDate = e.LessonDate.ToString("yyyy-MM-dd"), classRoomNo = string.IsNullOrEmpty(e.ClassRoomNo) ? "" : e.ClassRoomNo.Trim(), lessonSortNo = e.LessonSortNo, e?.OLPEId, className = string.IsNullOrEmpty(e.ClassName) ? "" : e.ClassName } } ; var result = new { schoolName = "课程表", semester = $"{strAcademicYear}学年度 第{strSemester}学期", maxlessontime, classinfolist, weekList = formatData }; return JsonResult(result); } /// /// 课程表【教务】 /// /// [HttpGet] [AjaxOnly] public ActionResult GetDataInEducationSelect(string startTime, string endTime, string classNo, string empNo, string schoolId) { var userInfo = LoginUserInfo.Get(); //开始时间 var startdate = string.IsNullOrEmpty(startTime) ? DateTime.Today : Convert.ToDateTime(startTime); var startDate = Common.CalculateFirstDateOfWeek(startdate).ToString("yyyy-MM-dd"); var endDate = Common.CalculateLastDateOfWeek(startdate).ToString("yyyy-MM-dd"); var semesterAndYear = Common.GetSemesterAndYear(startDate); var strAcademicYear = semesterAndYear.AcademicYearLong; var strSemester = semesterAndYear.Semester; var timeTableList = new List(); //课程表 var data = arrangeLessonTermIBLL.GetTimeTableInEducation(startDate, endDate, classNo, empNo, schoolId, ""); timeTableList.AddRange(data); //选修课课程表 //var dataOfElective = arrangeLessonTermOfElectiveIBLL.GetTimeTableInEducation(startDate, endDate, classNo, empNo, schoolId); //timeTableList.AddRange(dataOfElective); var timeTables = timeTableList.ToList(); var noDataResult = new { schoolName = "课程表", semester = $"{strAcademicYear}学年度 第{strSemester}学期", weekList = "" }; if (!timeTables.Any()) { return JsonResult(noDataResult); } var formatData = from d in timeTables let tt = d.LessonTime.Substring(1) group d by tt into g orderby g.Key select new { time = g.Key, list = from e in timeTables let ee = e.LessonTime.Substring(1) where ee == g.Key select new { AltId=e.AltId, day = e.LessonTime.ToCharArray()[0], lessonTime = e.LessonTime, lessonDate = e.LessonDate.ToString("yyyy-MM-dd"), schooldId = e?.F_SchoolId, academicyear = semesterAndYear.AcademicYearShort, semester = strSemester, deptNo = e?.DeptNo, deptname="", majorNo = e?.MajorNo, lessonNo = e?.LessonNo, curriculum = e.LessonSortNo == "2" ? e.LessonName + "[选修]" : e.LessonName, teachClassNo = e?.TeachClassNo, className = string.IsNullOrEmpty(e.ClassName) ? "" : e.ClassName, empno = e?.EmpNo, teacher = e?.EmpName, classRoomNo = string.IsNullOrEmpty(e.ClassRoomNo) ? "" : e.ClassRoomNo.Trim(), classRoom = string.IsNullOrEmpty(e.ClassroomName) ? "" : e.ClassroomName.Trim(), lessonSortNo = e.LessonSortNo } } ; var result = new { schoolName = "课程表", semester = $"{strAcademicYear}学年度 第{strSemester}学期", weekList = formatData }; return JsonResult(result); } /// /// 课程表【教务】--班级下拉框信息 /// /// [HttpGet] [AjaxOnly] public ActionResult GetClassData(string schoolId = "") { var data = arrangeLessonTermIBLL.GetClassData(schoolId); return Success(data); } /// /// 课程表【教务】--教师下拉框信息 /// /// [HttpGet] [AjaxOnly] public ActionResult GetTeacherData(string schoolId = "") { var data = arrangeLessonTermIBLL.GetTeacherData(schoolId); return Success(data); } /// /// 课程表【教务】--教室下拉框信息 /// /// [HttpGet] [AjaxOnly] public ActionResult GetClassroomData(string schoolId = "") { var data = arrangeLessonTermIBLL.GetClassroomData(schoolId); return Success(data); } /// /// 表单--修改教师所带的课程【教务】--课程下拉框信息 /// /// [HttpGet] [AjaxOnly] public ActionResult GetLessonData() { var lessonList = lessonInfoIBLL.GetAllLesson().OrderBy(x => x.LessonNo); var data = lessonList.Select(x => new { value = x.LessonId, text = x.LessonName + "(" + x.LessonNo + ")" }); return Success(data); } #endregion #region 保存数据 [HttpPost] [ValidateAntiForgeryToken] [AjaxOnly] public ActionResult SaveForm(string keyValue, string strEntity) { StuAttendanceLeaveEntity entity = strEntity.ToObject(); entity.TeachClassNo = entity.ClassNo; stuAttendanceLeaveIBLL.SaveEntity(keyValue, entity); return Success("保存成功!"); } /// /// 修改教师课程--保存 /// /// /// /// [HttpPost] [ValidateAntiForgeryToken] [AjaxOnly] public ActionResult SaveChangeTeacherLesson(string strEntity) { Edu_ChangeTeacherLessonEntity entity = strEntity.ToObject(); entity.CToTeacherId = entity.CFromTeacherId; entity.CToTeacherName = entity.CFromTeacherName; //获取目标课程 var lessonInfoEntity = lessonInfoIBLL.GetLessonInfoEntity(entity.CToLessonId); if (lessonInfoEntity == null) { return Fail("目标课程不存在!"); } entity.CToLessonId = lessonInfoEntity.LessonNo; entity.CToLessonName = lessonInfoEntity.LessonName; entity.CreateTime = DateTime.Now; if (entity.CFromLessonId == entity.CToLessonId) { return Fail("目标课程与原目标一致!"); } //修改排课、成绩录入相关表 edu_ChangeTeacherLessonIBLL.ModifyTableAboutTeacherLesson(entity); //新增Edu_ChangeTeacherLesson记录 edu_ChangeTeacherLessonIBLL.SaveEntity("", entity); return Success("保存成功!"); } /// /// 考勤统计 /// /// 分页参数 /// 查询参数 /// [HttpGet] [AjaxOnly] public ActionResult GetAttendanceStatisticPageList(string pagination, string queryJson) { Pagination paginationobj = pagination.ToObject(); var data = stuAttendanceIBLL.GetAttendanceStatisticPageList(paginationobj, queryJson); var jsonData = new { rows = data, total = paginationobj.total, page = paginationobj.page, records = paginationobj.records }; return Success(jsonData); } /// /// 全校学生课程考勤 /// /// 分页参数 /// 查询参数 /// [HttpGet] [AjaxOnly] public ActionResult GetAttendancePageList(string pagination, string queryJson) { Pagination paginationobj = pagination.ToObject(); var data = stuAttendanceIBLL.GetAttendancePageList(paginationobj, queryJson); var jsonData = new { rows = data, total = paginationobj.total, page = paginationobj.page, records = paginationobj.records }; return Success(jsonData); } #endregion /// /// 导入数据 /// /// public ActionResult DownTemplate() { FileStreamResult result = null; try { var path = Server.MapPath("~/Content/excel/"); var pathoffull = path + "ArrangeLessonTermImport.xls"; FileStream fsread = fsread = new FileStream(pathoffull, FileMode.OpenOrCreate, FileAccess.ReadWrite); result = File(fsread, "application/ms-excel", "课程表导入模版.xls"); return result; } catch (Exception ex) { return null; } } public ActionResult DownTemplatePk() { FileStreamResult result = null; try { var path = Server.MapPath("~/Content/excel/"); var pathoffull = path + "ArrangeLessonTermImportPk.xls"; FileStream fsread = fsread = new FileStream(pathoffull, FileMode.OpenOrCreate, FileAccess.ReadWrite); result = File(fsread, "application/ms-excel", "排课系统课程表导入模版.xls"); return result; } catch (Exception ex) { return null; } } /// /// /// /// /// /// /// [HttpPost] [ValidateAntiForgeryToken] public ActionResult ArrangeLessonTermImport(string fileId, int chunks, string ext) { UserInfo userInfo = LoginUserInfo.Get(); string path = annexesFileIBLL.SaveAnnexes(fileId, fileId + "." + ext, chunks, userInfo); if (!string.IsNullOrEmpty(path)) { DataTable dt = ExcelHelper.ExcelImport(path); var res = arrangeLessonTermIBLL.ArrangeLessonTermImportPk(dt, fileId); var data = new { Success = res.Split('|')[0], Fail = res.Split('|')[1] }; return JsonResult(data); } else { return Fail("导入数据失败!"); } } } }