using SchedulingSystemClient.EntityClass; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; namespace SchedulingSystemClient { public class Scheduling { static SurgerySchedulingEntities myModel = new SurgerySchedulingEntities(); #region 排班方法 /// /// 修改排班状态 /// public static void UpdateZT() { //1、查出最后修改时间 int zhxgsj = Convert.ToInt32((from tbqtcs in myModel.Bus_SJCSB select new { tbqtcs }).Single().tbqtcs.ZHXGSJ.Replace("天内", "")); //2、获取锁定时间 DateTime sdsj = DateTime.Now.AddDays(zhxgsj).Date.AddSeconds(-1); //3、查出状态不是已完成和已取消并且开始时间小于锁定时间的手术排班 var listpbb = (from tbpbb in myModel.Bus_SSPBB where tbpbb.PBZT != 3 && tbpbb.PBZT != 4 && tbpbb.SSKSSJ < sdsj select new { tbpbb }).ToList(); try { for (int i = 0; i < listpbb.Count; i++) { Bus_SSPBB pbb = new Bus_SSPBB(); pbb = listpbb[i].tbpbb; //4、获取手术完成时间 DateTime sswcsj = Convert.ToDateTime(pbb.SSKSSJ).AddHours(Convert.ToDouble(pbb.SSZSC)); //5、如果手术完成时间小于当前时间修改状态为已完成 if (sswcsj < DateTime.Now) { pbb.PBZT = 4; myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; myModel.SaveChanges(); myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; } //6、如果手术完成时间大于当前时间修改状态为已锁定 else { if (listpbb[i].tbpbb.PBZT != 5) { pbb.PBZT = 2; myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; myModel.SaveChanges(); myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; } } } //myModel.SaveChanges(); //myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } static double amsc = 0; static double pmsc = 0; static string mtkssj = string.Empty; static string mtpbjssj = string.Empty; static string sssxxsj = string.Empty; /// /// 智能排班(修改开始时间) /// public static void SmartScheduling() { //查询其他参数表 var qtcs = (from tbqtcs in myModel.Bus_SJCSB select new { tbqtcs }).Single(); //获取每天排班时间长 int mtsssc = Convert.ToInt32(qtcs.tbqtcs.MTPBSC.Replace("小时", "")); //获取锁定时间 DateTime sdsj = DateTime.Now.AddDays(Convert.ToDouble(qtcs.tbqtcs.ZHXGSJ.Replace("天内", ""))).Date.AddSeconds(-1); var qjdb = (from tbqjd in myModel.SYS_SSQKLXB select new { tbqjd }).ToList(); //获取每天排班开始时间 mtkssj = qtcs.tbqtcs.PBKSSJ; //获取每天排班时长 double mtpbsc = Convert.ToDouble(qtcs.tbqtcs.MTPBSC.Replace("小时", "")); //获取手术室休息时间 sssxxsj = qtcs.tbqtcs.STRXXSJ; //获取手术室休息时长 double sssxxsc = Convert.ToDouble(qtcs.tbqtcs.XXSC); string pmkssj = string.Empty; bool sfxx = sssxxsj == "不休息"; //判断手术室是否有休息时间 if (!sfxx) { //8、如果手术室需要休息获取休息前后两端时间的时长 DateTime kspbjs = Convert.ToDateTime(DateTime.Now.Date.ToString("yyyy-MM-dd") + " " + mtkssj); DateTime ksxxsj = Convert.ToDateTime(DateTime.Now.Date.ToString("yyyy-MM-dd") + " " + sssxxsj); DateTime xwkssj = ksxxsj.AddHours(sssxxsc); pmkssj = xwkssj.ToString("HH:mm:ss"); TimeSpan ts = ksxxsj - kspbjs; amsc = ts.TotalHours; pmsc = mtpbsc - amsc; } //每天排班结束时间 mtpbjssj = Convert.ToDateTime(DateTime.Now.Date.ToString("yyyy-MM-dd") + " " + mtkssj).AddHours(mtpbsc + sssxxsc).ToString("HH:mm:ss"); DateTime dt = DateTime.Now.Date; //1、查询出开始时间为空(未进行排班)和开始时间大于锁定时间的手术排班 List listpbjl = (from tbpbb in myModel.Bus_SSPBB where tbpbb.SSKSSJ == null || tbpbb.SSKSSJ > sdsj select new Cus_SJKPBB { //ID = tbpbb.ID, //HZXM = tbpbb.HZXM, //KSID = tbpbb.KSID, //KSSJ = tbpbb.KSSJ, //PBZT = tbpbb.PBZT, //QZ = tbpbb.QZ, //SQR = tbpbb.SQR, //SQSJ = tbpbb.SQSJ, //KSRQ = tbpbb.KSRQ, //SSLX = tbpbb.SSLX, //SSMC = tbpbb.SSMC, //SSQJD = tbpbb.SSQJD, //SSSC = tbpbb.SSSC, //SSSID = tbpbb.SSSID, //SSSQJSC = tbpbb.SSSQJSC, //SSZSC = tbpbb.SSZSC, //XGR = tbpbb.XGR, //XGSJ = tbpbb.XGSJ, //YSID = tbpbb.YSID, //ZLKH = tbpbb.ZLKH, //ZYH = tbpbb.ZYH }).ToList(); //2、将排班按照手术室分组获取手术室列表 var listsss = listpbjl.GroupBy(a => a.SSSID).ToList(); try { //3、使用for循环为每个手术室进行排班 for (int j = 0; j < listsss.Count; j++) { int sssid = Convert.ToInt32(listsss[j].Key); //4、获取每个手术室的排班并按权重进行排序 List listssspb = listpbjl.Where(a => a.PBZT == 1 && a.SSSID == sssid).ToList(); //5、获取排班开始时间 DateTime pbkssj = Convert.ToDateTime(DateTime.Now.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); double pbsc = mtpbsc; double am = amsc; double pm = pmsc; List ypb = new List(); List listpb = new List(); //手术室需要休息 if (!sfxx) { //执行排班方法 DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); } } //myModel.SaveChanges(); //MessageBox.Show("排班成功"); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } public static void DiGuiPaiBan(DateTime pbkssj, string sssxxsj, List listpb, List listssspb, double am, double pm, List ypb, string pmkssj,int sssid) { //DateTime rq = pbkssj.Date; ////实例化排班列表 //listpb = new List(); //Bus_SSPBB pbb = new Bus_SSPBB(); //DateTime xxsj = Convert.ToDateTime(pbkssj.Date.ToString("yyyy-MM-dd") + " " + sssxxsj); ////1、判断开始时间是否大于休息时间 //if (pbkssj < xxsj) //{ // if (pbkssj.ToString("HH:mm:ss") == mtkssj) // { // var sdpbb = (from tbsdpbb in myModel.Bus_SDPBB // join tbpbb in myModel.Bus_SSPBB on tbsdpbb.SSID equals tbpbb.ID // where tbsdpbb.SSSJ>=pbkssj && tbsdpbb.SSJSSJ <= xxsj && tbpbb.SSSID == sssid // select new { tbsdpbb }).OrderBy(a => a.tbsdpbb.SSSJ).ToList(); // if (sdpbb.Count > 0) // { // for (int i = 0; i < sdpbb.Count; i++) // { // DateTime ikssj = Convert.ToDateTime( sdpbb[i].tbsdpbb.SSSJ); // DateTime ijssj = Convert.ToDateTime(sdpbb[i].tbsdpbb.SSJSSJ); // decimal isszsc = Convert.ToDecimal(sdpbb[i].tbsdpbb.SSZSC); // if (i == 0) // { // TimeSpan amhoursSpan = new TimeSpan(ikssj.Ticks - pbkssj.Ticks); // am = amhoursSpan.TotalHours; // } // else // { // TimeSpan amhoursSpan = new TimeSpan(sdpbb[i + 1].tbsdpbb.SSSJ.Ticks - sdpbb[i].tbsdpbb.SSJSSJ.Ticks); // am = amhoursSpan.TotalHours; // } // //排班时间为上午 // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(am)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // am = am - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // } // if (i == sdpbb.Count - 1) // { // TimeSpan amhoursSpan = new TimeSpan(xxsj.Ticks - ijssj.Ticks); // am = amhoursSpan.TotalHours; // //排班时间为上午 // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(am)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbkssj = ijssj; // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // am = am - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // //判断已排班数量是否等于该手术室排班数量 // if (ypb.Count != listssspb.Count) // { // //判断排班时间是否小于六天后 // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj,sssid); // } // } // } // else // { // pbkssj = ijssj; // if (ypb.Count != listssspb.Count) // { // //判断排班时间是否小于六天后 // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // } // } // } // } // else // { // //排班时间为上午 // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(am)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // am = am - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // //判断已排班数量是否等于该手术室排班数量 // if (ypb.Count != listssspb.Count) // { // //判断排班时间是否小于六天后 // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // } // else // { // //判断下午时长是否等于每天下午时长 // if (pm == pmsc) // { // //排班时间改为休息之后的时间 // pbkssj = Convert.ToDateTime(pbkssj.Date.ToString("yyyy-MM-dd") + " " + pmkssj); // } // //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //下午剩余时间-手术总时长 // pm = pm - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // //判断排班时间是否大于六天后 // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // //重新执行排班方法 // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // else // { // //判断下午剩余时长是否等于每天下午时长 // if (pm != pmsc) // { // //排班时间改为第二天的排班开始时间 // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } // } // } // else // { // //排班时间为上午 // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(am)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // am = am - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // //判断已排班数量是否等于该手术室排班数量 // if (ypb.Count != listssspb.Count) // { // //判断排班时间是否小于六天后 // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // } // else // { // //判断下午时长是否等于每天下午时长 // if (pm == pmsc) // { // DateTime xwkssj = Convert.ToDateTime(pbkssj.Date.ToString("yyyy-MM-dd") + " " + pmkssj); // //排班时间改为休息之后的时间 // pbkssj = xwkssj; // var sdpbb = (from tbsdpbb in myModel.Bus_SDPBB // join tbpbb in myModel.Bus_SSPBB on tbsdpbb.SSID equals tbpbb.ID // where tbsdpbb.SSSJ >= pbkssj && tbsdpbb.SSJSSJ <= xxsj && tbpbb.SSSID == sssid // select new { tbsdpbb }).OrderBy(a => a.tbsdpbb.SSSJ).ToList(); // //var sdpbb = (from tbsdpbb in myModel.Bus_SDPBB // // join tbpbb in myModel.Bus_SSPBB on tbsdpbb.SSID equals tbpbb.ID // // where tbsdpbb.SSRQ == rq && tbsdpbb.SSJSSJ <= xxsj && tbpbb.SSSID == sssid // // select new { tbsdpbb }).OrderBy(a => a.tbsdpbb.SSSJ).ToList(); // if (sdpbb.Count > 0) // { // for (int i = 0; i < sdpbb.Count; i++) // { // DateTime ikssj = sdpbb[i].tbsdpbb.SSSJ; // DateTime ijssj = sdpbb[i].tbsdpbb.SSJSSJ; // decimal isszsc = sdpbb[i].tbsdpbb.SSZSC; // if (i == 0) // { // TimeSpan amhoursSpan = new TimeSpan(ikssj.Ticks - pbkssj.Ticks); // pm = amhoursSpan.Hours; // } // else // { // TimeSpan amhoursSpan = new TimeSpan(sdpbb[i + 1].tbsdpbb.SSSJ.Ticks - sdpbb[i].tbsdpbb.SSJSSJ.Ticks); // pm = amhoursSpan.Hours; // } // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // pm = pm - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // } // if (i == sdpbb.Count - 1) // { // DateTime pbjssj = Convert.ToDateTime(pbkssj.ToString("yyyy-MM-dd") + " " + mtpbjssj); // TimeSpan amhoursSpan = new TimeSpan(pbjssj.Ticks - ijssj.Ticks); // pm = amhoursSpan.Hours; // //排班时间为上午 // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbkssj = ijssj; // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // am = am - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // } // else // { // //判断下午剩余时长是否等于每天下午时长 // if (pm != pmsc) // { // //排班时间改为第二天的排班开始时间 // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } // } // } // else // { // //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // pm = pm - (double)pbb.SSZSC; // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // else // { // if (pm != pmsc) // { // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } // } // else // { // //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //下午剩余时间-手术总时长 // pm = pm - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // //判断排班时间是否大于六天后 // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // //重新执行排班方法 // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // else // { // //判断下午剩余时长是否等于每天下午时长 // if (pm != pmsc) // { // //排班时间改为第二天的排班开始时间 // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } // } // } //} //else //{ // //判断下午剩余时长是否等于每天下午时长 // if (pm == pmsc) // { // DateTime xwkssj = Convert.ToDateTime(pbkssj.Date.ToString("yyyy-MM-dd") + " " + pmkssj); // DateTime xwjssj = Convert.ToDateTime(pbkssj.Date.ToString("yyyy-MM-dd") + " " + mtpbjssj); // //排班时间改为休息之后的时间 // pbkssj = xwkssj; // var sdpbb = (from tbsdpbb in myModel.Bus_SDPBB // join tbpbb in myModel.Bus_SSPBB on tbsdpbb.SSID equals tbpbb.ID // where tbsdpbb.SSSJ >= xwkssj && tbsdpbb.SSJSSJ <= xwjssj && tbpbb.SSSID == sssid // select new { tbsdpbb }).OrderBy(a => a.tbsdpbb.SSSJ).ToList(); // //var sdpbb = (from tbsdpbb in myModel.Bus_SDPBB // // join tbpbb in myModel.Bus_SSPBB on tbsdpbb.SSID equals tbpbb.ID // // where tbsdpbb.SSRQ == rq && tbsdpbb.SSJSSJ <= xxsj && tbpbb.SSSID == sssid // // select new { tbsdpbb }).OrderBy(a => a.tbsdpbb.SSSJ).ToList(); // if (sdpbb.Count > 0) // { // for (int i = 0; i < sdpbb.Count; i++) // { // DateTime ikssj = sdpbb[i].tbsdpbb.SSSJ; // DateTime ijssj = sdpbb[i].tbsdpbb.SSJSSJ; // decimal isszsc = sdpbb[i].tbsdpbb.SSZSC; // if (i == 0) // { // TimeSpan amhoursSpan = new TimeSpan(ikssj.Ticks - pbkssj.Ticks); // pm = amhoursSpan.Hours; // } // else // { // TimeSpan amhoursSpan = new TimeSpan(sdpbb[i + 1].tbsdpbb.SSSJ.Ticks - sdpbb[i].tbsdpbb.SSJSSJ.Ticks); // pm = amhoursSpan.Hours; // } // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // pm = pm - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // } // if (i == sdpbb.Count - 1) // { // DateTime pbjssj = Convert.ToDateTime(pbkssj.ToString("yyyy-MM-dd") + " " + mtpbjssj); // TimeSpan amhoursSpan = new TimeSpan(pbjssj.Ticks - ijssj.Ticks); // pm = amhoursSpan.Hours; // //排班时间为上午 // //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果有列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = ijssj; // pbb.KSRQ = pbkssj.Date; // //修改手术开始时间 // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // //排班时间+手术总时长 // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // //上午剩余时间-手术总时长 // am = am - (double)pbb.SSZSC; // //已排班列表添加当前手术 // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // } // else // { // //判断下午剩余时长是否等于每天下午时长 // if (pm != pmsc) // { // //排班时间改为第二天的排班开始时间 // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } // } // } // else // { // //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // pm = pm - (double)pbb.SSZSC; // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // else // { // if (pm != pmsc) // { // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } // } // else // { // //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 // listpb = listssspb.Except(ypb).Where(a => a.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.QZ).ToList(); // //如果列表有数据直接排班 // if (listpb.Count > 0) // { // pbb.HZXM = listpb[0].HZXM; // pbb.ID = listpb[0].ID; // pbb.KSID = listpb[0].KSID; // //pbb.KSRQ = listpb[0].KSRQ; // pbb.PBZT = listpb[0].PBZT; // pbb.QZ = listpb[0].QZ; // pbb.SQR = listpb[0].SQR; // pbb.SQSJ = listpb[0].SQSJ; // pbb.SSLX = listpb[0].SSLX; // pbb.SSMC = listpb[0].SSMC; // pbb.SSQJD = listpb[0].SSQJD; // pbb.SSSC = listpb[0].SSSC; // pbb.SSSID = listpb[0].SSSID; // pbb.SSSQJSC = listpb[0].SSSQJSC; // pbb.SSZSC = listpb[0].SSZSC; // pbb.XGR = listpb[0].XGR; // pbb.XGSJ = listpb[0].XGSJ; // pbb.YSID = listpb[0].YSID; // pbb.ZLKH = listpb[0].ZLKH; // pbb.ZYH = listpb[0].ZYH; // pbb.KSSJ = pbkssj; // pbb.KSRQ = pbkssj.Date; // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; // myModel.SaveChanges(); // myModel.Entry(pbb).State = System.Data.Entity.EntityState.Detached; // pbkssj = pbkssj.AddHours((double)pbb.SSZSC); // pm = pm - (double)pbb.SSZSC; // ypb.Add(listssspb.Where(a => a.ID == pbb.ID).Single()); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // else // { // if (pm != pmsc) // { // pbkssj = Convert.ToDateTime(pbkssj.AddDays(1).Date.ToString("yyyy-MM-dd") + " " + mtkssj); // if (pbkssj <= DateTime.Now.AddDays(6).Date.AddSeconds(-1)) // { // am = amsc; // pm = pmsc; // DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj, sssid); // } // } // //如果上午下午都没有数据证明该手术室没有手术不需要排班 // //或者有的手术总时长比上午时长和下午时长都大不能自动排班 // //继续对其他手术室进行排班 // } // } //} } #endregion } }