using Dapper; using Learun.Application.TwoDevelopment.EducationalAdministration; using Learun.DataBase.Repository; using Learun.Util; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; namespace Learun.Application.TwoDevelopment.LogisticsManagement { /// /// 版 本 Learun-ADMS-Ultimate V7.0.0 数字化智慧校园 /// Copyright (c) 2013-2018 北京泉江科技有限公司 /// 创 建:超级管理员 /// 日 期:2019-04-26 15:02 /// 描 述:学生宿舍管理 /// public class AccommodationService : RepositoryFactory { #region 获取数据 /// /// 获取页面显示列表数据 /// /// 查询参数 /// public IEnumerable GetPageList(Pagination pagination, string queryJson) { try { var strSql = new StringBuilder(); strSql.Append("SELECT "); strSql.Append(@" t.ID, t.Name, t.Address, t.Campus, t.Dept, t.BuildType, t.Major, t.Class, t.Sex, t.Functionary, t.Phone, t.Price, t.Leader, t.StudentID, t.PlanStudentID, t.ParentID, t.Remark, t.Starred, t.HasToilet, stb.StuName "); strSql.Append(" FROM Acc_DormitoryBuild t LEFT JOIN dbo.StuInfoBasic stb ON t.StudentID=stb.StuId"); strSql.Append(" WHERE 1=1 "); var queryParam = queryJson.ToJObject(); // 虚拟参数 var dp = new DynamicParameters(new { }); if (!queryParam["ParentID"].IsEmpty()) { dp.Add("ParentID", queryParam["ParentID"].ToString(), DbType.String); strSql.Append(" AND t.ParentID =@ParentID "); } if (!queryParam["Name"].IsEmpty()) { dp.Add("Name", "%" + queryParam["Name"].ToString() + "%", DbType.String); strSql.Append(" AND t.Name Like @Name "); } if (!queryParam["Campus"].IsEmpty()) { dp.Add("Campus", "%" + queryParam["Campus"].ToString() + "%", DbType.String); strSql.Append(" AND t.Campus Like @Campus "); } if (!queryParam["Dept"].IsEmpty()) { dp.Add("Dept", "%" + queryParam["Dept"].ToString() + "%", DbType.String); strSql.Append(" AND t.Dept Like @Dept "); } if (!queryParam["Class"].IsEmpty()) { dp.Add("Class", "%" + queryParam["Class"].ToString() + "%", DbType.String); strSql.Append(" AND t.Class Like @Class "); } if (!queryParam["Major"].IsEmpty()) { dp.Add("Major", "%" + queryParam["Major"].ToString() + "%", DbType.String); strSql.Append(" AND t.Major Like @Major "); } if (!queryParam["Sex"].IsEmpty()) { dp.Add("Sex", queryParam["Sex"].ToString(), DbType.String); strSql.Append(" AND t.Sex = @Sex "); } if (!queryParam["Functionary"].IsEmpty()) { dp.Add("Functionary", "%" + queryParam["Functionary"].ToString() + "%", DbType.String); strSql.Append(" AND t.Functionary Like @Functionary "); } if (!queryParam["Leader"].IsEmpty()) { dp.Add("Leader", "%" + queryParam["Leader"].ToString() + "%", DbType.String); strSql.Append(" AND t.Leader Like @Leader "); } return this.BaseRepository("CollegeMIS").FindList(strSql.ToString(), dp, pagination).OrderBy(a => a.Name).ThenBy(a => a.Name).ToList(); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } public IEnumerable GetAllList() { try { return this.BaseRepository("CollegeMIS").FindList(); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } internal string GetBuildType(string parentID) { try { var entity = this.BaseRepository("CollegeMIS").FindEntity(a => a.ParentID == parentID); if (null != entity) { return entity.BuildType; } else { return ""; } } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowBusinessException(ex); } } } internal object GetRoomList(string parentID) { try { var data = this.BaseRepository("CollegeMIS").FindList(); var floor = data.FirstOrDefault(a => a.ID == parentID); var unit = data.FirstOrDefault(a => a.ID == floor.ParentID); var dormitory = data.FirstOrDefault(a => a.ID == unit.ParentID); var rooms = data.Where(a => a.ParentID == parentID) .OrderBy(a => a.Name); List list = new List(); foreach (var room in rooms) { var hasStudentsNum = 0; var bedsNum = 0; var beds = data.Where(a => a.ParentID == room.ID).ToList(); bedsNum = beds.Count; foreach (var bed in beds) { if (!string.IsNullOrEmpty(bed.StudentID)) { hasStudentsNum++; } } floorsInfo floorinfo = new floorsInfo(); floorinfo.dormitory = room; floorinfo.BedNum = bedsNum.ToString(); floorinfo.HasStudentNum = hasStudentsNum.ToString(); floorinfo.NoStudentNum = (bedsNum - hasStudentsNum).ToString(); list.Add(floorinfo); } return new { dormitoryName = dormitory.Name, dormitoryID = dormitory.ID, unitName = unit.Name, unitID = unit.ID, floorName = floor.Name, floorID = floor.ID, rows = list }; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowBusinessException(ex); } } } internal object GetFloorList(string parentID) { try { var data = this.BaseRepository("CollegeMIS").FindList(); var unit = data.FirstOrDefault(a => a.ID == parentID); var dormitory = data.FirstOrDefault(a => a.ID == unit.ParentID); var floors = data.Where(a => a.ParentID == parentID).OrderBy(a => a.Name).ToList(); List list = new List(); foreach (var floor in floors) { var rooms = data.Where(a => a.ParentID == floor.ID).ToList(); var bedsNum = 0; var hasStudentsNum = 0; foreach (var room in rooms) { var beds = data.Where(a => a.ParentID == room.ID).ToList(); foreach (var bed in beds) { bedsNum++; if (!string.IsNullOrEmpty(bed.StudentID)) { hasStudentsNum++; } } } floorsInfo floorinfo = new floorsInfo(); floorinfo.dormitory = floor; floorinfo.RoomNum = rooms.Count.ToString(); floorinfo.BedNum = bedsNum.ToString(); floorinfo.HasStudentNum = hasStudentsNum.ToString(); floorinfo.NoStudentNum = (bedsNum - hasStudentsNum).ToString(); list.Add(floorinfo); } return new { dormitoryName = dormitory.Name, dormitoryID = dormitory.ID, unitName = unit.Name, unitID = unit.ID, rows = list }; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowBusinessException(ex); } } } internal object GetUnitList(string ParentID) { try { var data = this.BaseRepository("CollegeMIS").FindList(); var dormitory = data.FirstOrDefault(a => a.ID == ParentID); var Units = data.Where(a => a.ParentID == ParentID).ToList().OrderBy(a => a.Name).ToList(); List list = new List(); foreach (var unit in Units) { var floors = data.Where(a => a.ParentID == unit.ID).ToList(); var roomsNum = 0; var bedsNum = 0; var hasStudentsNum = 0; foreach (var floor in floors) { var rooms = data.Where(a => a.ParentID == floor.ID).ToList(); roomsNum = roomsNum + rooms.Count; foreach (var room in rooms) { var beds = data.Where(a => a.ParentID == room.ID).ToList(); foreach (var bed in beds) { bedsNum++; if (!string.IsNullOrEmpty(bed.StudentID)) { hasStudentsNum++; } } } } floorsInfo floorinfo = new floorsInfo(); floorinfo.dormitory = unit; floorinfo.floorNum = floors.Count.ToString(); floorinfo.BedNum = bedsNum.ToString(); floorinfo.HasStudentNum = hasStudentsNum.ToString(); floorinfo.NoStudentNum = (bedsNum - hasStudentsNum).ToString(); floorinfo.RoomNum = roomsNum.ToString(); list.Add(floorinfo); } return new { rows = list, DormitoryName = dormitory.Name, DormitoryID = dormitory.ID }; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowBusinessException(ex); } } } public object GetDormitoryList() { try { var data = this.BaseRepository("CollegeMIS").FindList(); var dormitorys = data.Where(a => a.BuildType == "1").ToList().OrderBy(a => a.Name).ToList(); List list = new List(); foreach (var dormitory in dormitorys) { var units = data.Where(a => a.ParentID == dormitory.ID).ToList(); var roomsNum = 0; var bedsNum = 0; var hasStudentsNum = 0; foreach (var unit in units) { var floors = data.Where(a => a.ParentID == unit.ID).ToList(); foreach (var floor in floors) { var rooms = data.Where(a => a.ParentID == floor.ID).ToList(); roomsNum = roomsNum + rooms.Count; foreach (var room in rooms) { var beds = data.Where(a => a.ParentID == room.ID).ToList(); foreach (var bed in beds) { bedsNum++; if (!string.IsNullOrEmpty(bed.StudentID)) { hasStudentsNum++; } } } } } floorsInfo floorinfo = new floorsInfo(); floorinfo.dormitory = dormitory; floorinfo.UnitNum = units.Count.ToString(); if (units.Count > 0) { floorinfo.floorNum = data.Count(a => a.ParentID == units.FirstOrDefault().ID).ToString(); } else { floorinfo.floorNum = "0"; } floorinfo.BedNum = bedsNum.ToString(); floorinfo.HasStudentNum = hasStudentsNum.ToString(); floorinfo.NoStudentNum = (bedsNum - hasStudentsNum).ToString(); floorinfo.RoomNum = roomsNum.ToString(); list.Add(floorinfo); } return list; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } internal object GetBedList(string parentID) { try { var data = this.BaseRepository("CollegeMIS").FindList(); var room = data.FirstOrDefault(a => a.ID == parentID); var floor = data.FirstOrDefault(a => a.ID == room.ParentID); var unit = data.FirstOrDefault(a => a.ID == floor.ParentID); var dormitory = data.FirstOrDefault(a => a.ID == unit.ParentID); var beds = data.Where(a => a.ParentID == parentID).OrderBy(a => a.Name).ToList(); List list = new List(); foreach (var bed in beds) { floorsInfo floorInfo = new floorsInfo(); floorInfo.dormitory = bed; if (!string.IsNullOrEmpty(bed.StudentID)) { floorInfo.stuInfo = this.BaseRepository("CollegeMIS").FindEntity(a => a.StuId == bed.StudentID); } list.Add(floorInfo); } return new { rows = list, roomID = room.ID, roomName = room.Name, floorID = floor.ID, floorName = floor.Name, unitID = unit.ID, unitName = unit.Name, dormitoryID = dormitory.ID, dormitoryName = dormitory.Name }; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } private class floorsInfo { public Acc_DormitoryBuildEntity dormitory { get; set; } public StuInfoBasicEntity stuInfo { get; set; } /// /// 单元数量 /// public string UnitNum { get; set; } /// /// 楼层数量 /// public string floorNum { get; set; } /// /// 房间数量 /// public string RoomNum { get; set; } /// /// 床位数量 /// public string BedNum { get; set; } /// /// 入住人数 /// public string HasStudentNum { get; set; } /// /// 空床数量 /// public string NoStudentNum { get; set; } } /// /// 获取Acc_DormitoryBuild表实体数据 /// 主键 /// /// public Acc_DormitoryBuildEntity GetAcc_DormitoryBuildEntity(string keyValue) { try { return this.BaseRepository("CollegeMIS").FindEntity(keyValue); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 获取Acc_DormitoryBuild表实体数据 /// 主键 /// /// public Acc_DormitoryBuildEntity GetAcc_DormitoryBuildEntityByName(string name) { try { return this.BaseRepository("CollegeMIS").FindEntity(x => x.Name == name); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 获取树形数据 /// /// public List GetSqlTreeNew() { try { var aa = this.BaseRepository("CollegeMIS").FindList().OrderBy(a => a.Name).ToList(); var bb = this.BaseRepository("CollegeMIS").FindList(); foreach (var item in aa) { if (!string.IsNullOrEmpty(item.PlanStudentID)) { var bbq = bb.FirstOrDefault(a => a.StuId == item.PlanStudentID); if (bbq != null) { item.Name = $"{item.Name}({bbq.StuName})"; } } } return aa; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 获取树形数据 /// /// public List GetSqlTree() { try { return this.BaseRepository("CollegeMIS").FindList(a => a.BuildType != "5").OrderBy(a => a.sort).ThenBy(a => a.Name).ToList(); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 根据父id获取数据 /// /// 父id /// public DataTable GetTreeByParentId(string parentID) { try { return this.BaseRepository("CollegeMIS").FindTable($"SELECT * FROM dbo.Acc_DormitoryBuild WHERE ParentID = '{parentID}'"); } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 根据父id获取数据 /// /// 父id /// public string GetDormitoryInfoByPlanStuNo(string stuNo) { try { var result = ""; if (!string.IsNullOrEmpty(stuNo)) { var dormitorys = this.BaseRepository("CollegeMIS").FindList(); var bed = dormitorys.FirstOrDefault(a => a.PlanStudentID == stuNo); if (bed != null) { var room = dormitorys.FirstOrDefault(a => a.ID == bed.ParentID); var floor = dormitorys.FirstOrDefault(a => a.ID == room.ParentID); var unit = dormitorys.FirstOrDefault(a => a.ID == floor.ParentID); var dor = dormitorys.FirstOrDefault(a => a.ID == unit.ParentID); result = $"{dor.Name} {unit.Name} {floor.Name} {room.Name} {bed.Name}"; } } return result; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } public string GetDormitoryInfoByStuNo(string stuNo) { try { var result = ""; if (!string.IsNullOrEmpty(stuNo)) { var dormitorys = this.BaseRepository("CollegeMIS").FindList(); var userInfo = this.BaseRepository("CollegeMIS") .FindEntity(a => a.StuNo == stuNo); var bed = dormitorys.FirstOrDefault(a => a.StudentID == userInfo.StuId); if (bed != null) { var room = dormitorys.FirstOrDefault(a => a.ID == bed.ParentID); var floor = dormitorys.FirstOrDefault(a => a.ID == room.ParentID); var unit = dormitorys.FirstOrDefault(a => a.ID == floor.ParentID); var dor = dormitorys.FirstOrDefault(a => a.ID == unit.ParentID); result = $"{dor.Name} {unit.Name} {floor.Name} {room.Name} {bed.Name}"; } } return result; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } public bool MatchDormitoryInfo(string stuNo, string dormitory, string unit, string floor, string room, string bed, List data) { try { var stuInfo = this.BaseRepository("CollegeMIS").FindEntity(a => a.StuNo == stuNo); var dormitoryInfo = data.FirstOrDefault(a => a.BuildType == "1" && a.Name == dormitory); if (dormitoryInfo != null) { var unitInfo = data.FirstOrDefault(a => a.BuildType == "2" && a.ParentID == dormitoryInfo.ID && a.Name == unit); if (unitInfo != null) { var floorInfo = data.FirstOrDefault(a => a.BuildType == "3" && a.ParentID == unitInfo.ID && a.Name == floor); if (floorInfo != null) { var roomInfo = data.FirstOrDefault(a => a.BuildType == "4" && a.ParentID == floorInfo.ID && a.Name == room); if (roomInfo != null) { var bedInfo = data.FirstOrDefault(a => a.BuildType == "5" && a.ParentID == roomInfo.ID && a.Name == bed); if (bedInfo != null && stuInfo != null) { var oldbedInfo = data.Where(a => a.StudentID == stuInfo.StuId); foreach (var item in oldbedInfo) { item.StudentID = ""; this.BaseRepository("CollegeMIS").Update(item); } bedInfo.StudentID = stuInfo.StuId; bedInfo.StuName = stuInfo.StuName; this.BaseRepository("CollegeMIS").Update(bedInfo); return true; } } } } } return false; } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } #endregion 获取数据 #region 提交数据 /// /// 删除实体数据 /// 主键 /// /// public void DeleteEntity(string keyValue) { var db = this.BaseRepository("CollegeMIS").BeginTrans(); try { //单个删除 //this.BaseRepository("CollegeMIS").Delete(t => t.ID == keyValue); //多个删除 var keyvalueArr = keyValue.Split(','); foreach (var item in keyvalueArr) { db.Delete(t => t.ID == item); DeleteAll(item); } db.Commit(); } catch (Exception ex) { db.Rollback(); if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } public void DeleteAll(string parentid) { var list = this.BaseRepository("CollegeMIS").FindList(a => a.ParentID == parentid).ToList(); if (list.Count > 0) { foreach (var item in list) { if (item != null) { this.BaseRepository("CollegeMIS").Delete(item); DeleteAll(item.ID); } } } } /// /// 批量添加单元、楼层、房间、床位 /// /// /// /// /// /// public void DormitoryAdd(string keyValue, int elementNum, int floorNum, int roomNum, int bedNum) { try { //获取本楼允许入住的性别 var dormitory = this.BaseRepository("CollegeMIS").FindEntity(a => a.ID == keyValue); var currentUser = LoginUserInfo.Get(); if (elementNum > 0) { List list = new List(); //添加单元 for (int i = 1; i <= elementNum; i++) { var elementEntity = new Acc_DormitoryBuildEntity { ParentID = keyValue, Name = i.ToString() + "单元", BuildType = "2",//单元类型 Sex = dormitory.Sex, Address = dormitory.Address, Campus = dormitory.Campus, CreateBy = currentUser.realName, CreateTime = DateTime.Now, Dept = dormitory.Dept, Class = dormitory.Class, Functionary = dormitory.Functionary, Major = dormitory.Major, Phone = dormitory.Phone, Price = dormitory.Price, UpdateBy = currentUser.realName, UpdateTime = DateTime.Now }; elementEntity.Create(); list.Add(elementEntity); //添加楼层 if (floorNum > 0) { for (int j = 1; j <= floorNum; j++) { var floorEntity = new Acc_DormitoryBuildEntity { ParentID = elementEntity.ID, Name = j.ToString() + "层", BuildType = "3",//楼层类型, Sex = dormitory.Sex, Address = dormitory.Address, Campus = dormitory.Campus, CreateBy = currentUser.realName, CreateTime = DateTime.Now, Dept = dormitory.Dept, Class = dormitory.Class, Functionary = dormitory.Functionary, Major = dormitory.Major, Phone = dormitory.Phone, Price = dormitory.Price, UpdateBy = currentUser.realName, UpdateTime = DateTime.Now }; floorEntity.Create(); list.Add(floorEntity); //添加房间 if (roomNum > 0) { for (int n = 1; n <= roomNum; n++) { var roomEntity = new Acc_DormitoryBuildEntity { ParentID = floorEntity.ID, Name = j.ToString() + (n < 10 ? "0" + n.ToString() : n.ToString()) + "室", BuildType = "4",//房间类型 Sex = dormitory.Sex, Address = dormitory.Address, Campus = dormitory.Campus, CreateBy = currentUser.realName, CreateTime = DateTime.Now, Dept = dormitory.Dept, Class = dormitory.Class, Functionary = dormitory.Functionary, Major = dormitory.Major, Phone = dormitory.Phone, Price = dormitory.Price, UpdateBy = currentUser.realName, UpdateTime = DateTime.Now, Starred = "3", Leader = "暂无" }; roomEntity.Create(); list.Add(roomEntity); //床位添加 if (bedNum > 0) { for (int m = 1; m <= bedNum; m++) { var bedEntity = new Acc_DormitoryBuildEntity { ParentID = roomEntity.ID, Name = m.ToString() + "床", BuildType = "5", Sex = dormitory.Sex, Address = dormitory.Address, Campus = dormitory.Campus, CreateBy = currentUser.realName, CreateTime = DateTime.Now, Dept = dormitory.Dept, Class = dormitory.Class, Functionary = dormitory.Functionary, Major = dormitory.Major, Phone = dormitory.Phone, Price = dormitory.Price, UpdateBy = currentUser.realName, UpdateTime = DateTime.Now, }; bedEntity.Create(); list.Add(bedEntity); } } } } } } } if (list.Count > 0) { this.BaseRepository("CollegeMIS").Insert(list); } } } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } /// /// 自动分配宿舍 /// /// 少数民族不能分一块 /// 同一个地方的不能分一块 /// public void Automatic_allocation_accommodation(bool noNation, bool noPlace, string Sex) { try { var boolSex = Convert.ToBoolean(Sex == "1"); //获取所有的宿舍单位 var allBuilds = this.BaseRepository("CollegeMIS").FindList().Where(a => a.Sex == Sex).ToList(); //获取所有已经分配了床位的学生id var hasBedStudentIDs = allBuilds .Where(a => a.BuildType == "5") .Where(a => a.StudentID != null && a.StudentID != "").Select(a => a.StudentID).ToList(); //获取还没有床位的学生 var students = this.BaseRepository("CollegeMIS").FindList() .Where(a => a.GenderNo == boolSex) .Where(a => !hasBedStudentIDs.Contains(a.StuId)) .ToList(); //根据性别获取所有空闲的床位 var allBeds = this.BaseRepository("CollegeMIS").FindList() .Where(a => a.Sex == Sex) .Where(a => a.StudentID == null || a.StudentID == "") .ToList(); if (allBeds.Count() > students.Count()) { #region 普通分配 var beds = new List(); var studentNo = 0; var builds = allBuilds.Where(a => a.BuildType == "1").OrderBy(a => a.Name).ToList(); foreach (var build in builds) { if (studentNo < students.Count()) { var elements = allBuilds.Where(a => a.ParentID == build.ID).OrderBy(a => a.Name).ToList(); foreach (var element in elements) { if (studentNo < students.Count()) { var layers = allBuilds.Where(a => a.ParentID == element.ID).OrderBy(a => a.Name).ToList(); foreach (var layer in layers) { if (studentNo < students.Count()) { var rooms = allBuilds.Where(a => a.ParentID == layer.ID).OrderBy(a => a.Name).ToList(); foreach (var room in rooms) { if (studentNo < students.Count()) { var bedss = allBuilds.Where(a => a.ParentID == room.ID) .Where(a => a.StudentID == null || a.StudentID == "") .OrderBy(a => a.Name).ToList(); foreach (var bed in bedss) { if (studentNo < students.Count()) { bed.StudentID = students[studentNo].StuId; studentNo++; beds.Add(bed); } } } } } } } } } } //打乱 Random ram = new Random(); int currentIndex; string tempValue; for (int i = 0; i < beds.Count(); i++) { currentIndex = ram.Next(0, beds.Count() - i); tempValue = beds[currentIndex].StudentID; beds[currentIndex].StudentID = beds[beds.Count() - 1 - i].StudentID; beds[beds.Count() - 1 - i].StudentID = tempValue; } #endregion 普通分配 #region 同一少数民族的不能在一起 if (noNation) { //var nationals = students.GroupBy(a => a.NationalityNo); //List studentids = new List(); //foreach (var item in nationals) //{ // var studentid=studentid. // studentids.Add() //} var roomsIDs = beds.Where(a => !string.IsNullOrEmpty(a.StudentID)).GroupBy(a => a.ParentID).Select(a => a.Key).ToList(); foreach (var room in roomsIDs) { //获取本宿舍相同民族超过2个学生的民族 var sameNationals = beds.Join(students, b => b.StudentID, s => s.StuId, (b, s) => new { b, s }) .Where(a => a.b.ParentID == room) .Where(a => a.s.NationalityNo != "01") .GroupBy(a => a.s.NationalityNo) .Where(a => a.Count() > 1).ToList(); if (sameNationals.Count > 0) { //获取本宿舍的所有学生所属民族 var theRoomNationals = beds .Join(students, b => b.StudentID, s => s.StuId, (b, s) => new { b, s }) .Where(a => a.b.ParentID == room) .Where(a => a.s.NationalityNo != "01" && a.s.NationalityNo != "07") .Select(a => a.s.NationalityNo).ToList(); //获取别的宿舍不含此民族的学生的宿舍 var bedNum = beds.Count(a => a.ParentID == room); var otherRooms = beds.Join(students, a => a.StudentID, b => b.StuId, (a, b) => new { a, b }) .Where(a => !theRoomNationals.Contains(a.b.NationalityNo)) .Select(a => new { a.a.ID, a.a.ParentID }) .GroupBy(a => a.ParentID) .Where(a => a.Count() == bedNum) .ToList(); var changeTime = 0;//调换次数 if (otherRooms.Count > 0 && otherRooms.Count > changeTime) { Acc_DormitoryBuildEntity theBed; Acc_DormitoryBuildEntity otherBed; string tempStudentID; //遍历学生超过俩个的民族 foreach (var national in sameNationals) { //获取此宿舍此民族的学生的床位 var theSameNationalBeds = beds .Join(students, b => b.StudentID, s => s.StuId, (b, s) => new { b, s }) .Where(a => a.b.ParentID == room) .Where(a => a.s.NationalityNo == national.Key) .Select(a => a.b.ID).ToList(); //如果是俩个只要换一个就可以 依此类推 for (int j = 0; j < theSameNationalBeds.Count() - 1; j++) { if (otherRooms.Count > j) { //获取将要调换的床位 theBed = beds.FirstOrDefault(a => a.ID == theSameNationalBeds[j]); otherBed = beds.FirstOrDefault(a => a.ParentID == otherRooms[changeTime].Key); tempStudentID = otherBed.StudentID; otherBed.StudentID = theBed.StudentID; theBed.StudentID = tempStudentID; changeTime++; } else { break; } } } } } } } #endregion 同一少数民族的不能在一起 #region 同一地方的不能在一起 if (noPlace) { var roomsIDs = beds.Where(a => !string.IsNullOrEmpty(a.StudentID)).GroupBy(a => a.ParentID).Select(a => a.Key).ToList(); foreach (var room in roomsIDs) { //获取本宿舍相同地方超过2个学生的地方 var sameCitys = beds.Join(students, b => b.StudentID, s => s.StuId, (b, s) => new { b, s }) .Where(a => a.b.ParentID == room) .GroupBy(a => a.s.F_CityId) .Where(a => a.Count() > 1).ToList(); if (sameCitys.Count > 0) { //获取本宿舍的所有学生所属地方 var theRoomCitys = beds .Join(students, b => b.StudentID, s => s.StuId, (b, s) => new { b, s }) .Where(a => a.b.ParentID == room) .Select(a => a.s.F_CityId).ToList(); //获取别的宿舍不含此地方的学生的宿舍 var bedNum = beds.Count(a => a.ParentID == room); var otherRooms = beds.Join(students, a => a.StudentID, b => b.StuId, (a, b) => new { a, b }) .Where(a => !theRoomCitys.Contains(a.b.F_CityId)) .Select(a => new { a.a.ID, a.a.ParentID }) .GroupBy(a => a.ParentID) .Where(a => a.Count() == bedNum) .ToList(); var changeTime = 0;//调换次数 if (otherRooms.Count > 0 && otherRooms.Count > changeTime) { Acc_DormitoryBuildEntity theBed; Acc_DormitoryBuildEntity otherBed; string tempStudentID; //遍历学生超过俩个的地方 foreach (var city in sameCitys) { //获取此宿舍此地方的学生的床位 var theSameCityBeds = beds .Join(students, b => b.StudentID, s => s.StuId, (b, s) => new { b, s }) .Where(a => a.b.ParentID == room) .Where(a => a.s.F_CityId == city.Key) .Select(a => a.b.ID).ToList(); //如果是俩个只要换一个就可以 依此类推 for (int j = 0; j < theSameCityBeds.Count() - 1; j++) { if (otherRooms.Count > j) { //获取将要调换的床位 theBed = beds.FirstOrDefault(a => a.ID == theSameCityBeds[j]); otherBed = beds.FirstOrDefault(a => a.ParentID == otherRooms[changeTime].Key); tempStudentID = otherBed.StudentID; otherBed.StudentID = theBed.StudentID; theBed.StudentID = tempStudentID; changeTime++; } else { break; } } } } } } } #endregion 同一地方的不能在一起 this.BaseRepository("CollegeMIS").Update(beds); } } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } throw; } } /// /// 保存实体数据(新增、修改) /// 主键 /// /// public void SaveEntity(string keyValue, Acc_DormitoryBuildEntity entity) { var db = this.BaseRepository("CollegeMIS").BeginTrans(); try { var currentUser = LoginUserInfo.Get(); if (!string.IsNullOrEmpty(keyValue)) { entity.Modify(keyValue); entity.UpdateBy = currentUser.realName; entity.UpdateTime = DateTime.Now; db.Update(entity); //更新下级 var childList = db.FindList(x => x.ParentID == entity.ID); foreach (var childItem in childList) { childItem.Campus = entity.Campus; childItem.Dept = entity.Dept; childItem.Major = entity.Major; childItem.Class = entity.Class; childItem.Sex = entity.Sex; childItem.Functionary = entity.Functionary; childItem.Address = entity.Address; childItem.Phone = entity.Phone; childItem.Price = entity.Price; SaveEntity(childItem.ID, childItem); } db.Commit(); } else { if (entity.BuildType == "1") { if (string.IsNullOrEmpty(entity.ParentID)) { var rootNode = this.BaseRepository("CollegeMIS").FindList().FirstOrDefault(a => a.ParentID == null); if (rootNode == null) { var rootEntity = new Acc_DormitoryBuildEntity { Name = "数字化智慧校园" }; rootEntity.Create(); rootEntity.CreateBy = currentUser.realName; rootEntity.CreateTime = DateTime.Now; rootEntity.UpdateBy = currentUser.realName; rootEntity.UpdateTime = DateTime.Now; entity.ParentID = rootEntity.ID; this.BaseRepository("CollegeMIS").Insert(rootEntity); } else { entity.ParentID = rootNode.ID; } } } entity.Create(); entity.CreateBy = currentUser.realName; entity.CreateTime = DateTime.Now; entity.UpdateBy = currentUser.realName; entity.UpdateTime = DateTime.Now; this.BaseRepository("CollegeMIS").Insert(entity); } } catch (Exception ex) { if (ex is ExceptionEx) { throw; } else { throw ExceptionEx.ThrowServiceException(ex); } } } #endregion 提交数据 } }