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.
677 lines
34 KiB
677 lines
34 KiB
using SchedulingSystem.EntityClass; |
|
using SchedulingSystemClient.EntityClass; |
|
using System; |
|
using System.Collections.Generic; |
|
using System.Linq; |
|
using System.Windows; |
|
using System.Windows.Controls; |
|
using System.Windows.Media; |
|
|
|
|
|
namespace SchedulingSystemClient |
|
{ |
|
/// <summary> |
|
/// SYWindow.xaml 的交互逻辑 |
|
/// </summary> |
|
public partial class SYWindow : Window |
|
{ |
|
SchedulingSystemEntities myModel = new SchedulingSystemEntities(); |
|
public SYWindow() |
|
{ |
|
InitializeComponent(); |
|
} |
|
private void Window_Loaded(object sender, RoutedEventArgs e) |
|
{ |
|
List<ComboBoxBinding> listsss = new List<ComboBoxBinding>(); |
|
listsss = (from tbsss in myModel.SYS_SSSB |
|
select new ComboBoxBinding |
|
{ |
|
ID = tbsss.ID, |
|
Name = tbsss.SSSMC, |
|
}).ToList(); |
|
sss.ItemsSource = listsss; |
|
sss.SelectedValuePath = "ID"; |
|
sss.DisplayMemberPath = "Name"; |
|
sss.SelectedValue = 1; |
|
for (int i = 0; i < 7; i++) |
|
{ |
|
DateTime date = DateTime.Now; |
|
Label label = SJ.FindName("label" + i) as Label; |
|
label.Content = date.AddDays(i).Date.ToString("yyyy年MM月dd日"); |
|
} |
|
|
|
UpdateZT(); |
|
SmartScheduling(); |
|
PaiBan(); |
|
labela.Content = "排班开始时间" + mtkssj; |
|
labelb.Content = "排班结束时间" + mtpbjssj; |
|
labelc.Content = "上午时长" + amsc; |
|
labeld.Content = "下午时长" + pmsc; |
|
} |
|
/// <summary> |
|
/// 排班UI生成 |
|
/// </summary> |
|
private void PaiBan() |
|
{ |
|
int sssid = Convert.ToInt32(sss.SelectedValue); |
|
DateTime kssj = DateTime.Now.AddDays(-1).Date; |
|
DateTime jssj = DateTime.Now.AddDays(7).Date; |
|
List<Cus_PBB> listday = new List<Cus_PBB>(); |
|
List<Cus_PBB> listpbb = (from tbpbb in myModel.Bus_PBB |
|
join tbsssb in myModel.SYS_SSSB on tbpbb.SSSID equals tbsssb.ID |
|
join tbksb in myModel.SYS_KSB on tbpbb.KSID equals tbksb.ID |
|
join tbysb in myModel.SYS_YSB on tbpbb.YSID equals tbysb.ID |
|
where tbpbb.SSSID == sssid && tbpbb.KSSJ > kssj && tbpbb.KSSJ < jssj |
|
select new Cus_PBB |
|
{ |
|
ID = tbpbb.ID, |
|
SSSID = tbsssb.ID, |
|
SSSMC = tbsssb.SSSMC, |
|
YSID = tbysb.ID, |
|
YSMC = tbysb.YSXM, |
|
KSID = tbksb.ID, |
|
KSMC = tbksb.KSMC, |
|
KSSJ = tbpbb.KSSJ, |
|
SSSC = tbpbb.SSSC, |
|
PBZT = tbpbb.PBZT, |
|
KSRQ = tbpbb.KSRQ, |
|
SSMC = tbpbb.SSMC, |
|
HZXM = tbpbb.HZXM, |
|
SSZSC = tbpbb.SSZSC, |
|
ZYH = tbpbb.ZYH, |
|
QZ = tbpbb.QZ |
|
}).ToList(); |
|
for (int i = 0; i < 7; i++) |
|
{ |
|
DateTime date = DateTime.Now.AddDays(i).Date; |
|
listday = listpbb.Where(a =>Convert.ToDateTime(a.KSSJ).Date == date).OrderBy(b => b.KSSJ).ToList(); |
|
|
|
DockPanel dock = SJ.FindName("date" + i) as DockPanel; |
|
dock.Children.Clear(); |
|
for (int j = 0; j < listday.Count; j++) |
|
{ |
|
Grid grid = new Grid(); |
|
grid.SetValue(DockPanel.DockProperty, Dock.Top); |
|
grid.Margin = new Thickness(10, 10, 10, 0); |
|
grid.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#badbf5")); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
grid.RowDefinitions.Add(new RowDefinition { }); |
|
Label lb0 = new Label(); |
|
Label lb1 = new Label(); |
|
Label lb2 = new Label(); |
|
Label lb3 = new Label(); |
|
Label lb4 = new Label(); |
|
Label lb5 = new Label(); |
|
Label lb6 = new Label(); |
|
lb0.SetValue(Grid.RowProperty, 0); |
|
lb1.SetValue(Grid.RowProperty, 1); |
|
lb2.SetValue(Grid.RowProperty, 2); |
|
lb3.SetValue(Grid.RowProperty, 3); |
|
lb4.SetValue(Grid.RowProperty, 4); |
|
lb5.SetValue(Grid.RowProperty, 5); |
|
lb6.SetValue(Grid.RowProperty, 6); |
|
lb0.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb0.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb1.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb1.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb2.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb2.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb3.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb3.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb4.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb4.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb5.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb5.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb6.HorizontalContentAlignment = HorizontalAlignment.Center; |
|
lb6.VerticalContentAlignment = VerticalAlignment.Center; |
|
lb0.FontSize = 16; |
|
lb1.FontSize = 16; |
|
lb2.FontSize = 16; |
|
lb3.FontSize = 16; |
|
lb4.FontSize = 16; |
|
lb5.FontSize = 16; |
|
lb6.FontSize = 16; |
|
lb0.Content = listday[j].SSMC; |
|
lb1.Content = "开始时间:" + listday[j].KSSJ.ToString().Substring(listday[j].KSSJ.ToString().LastIndexOf(" ")); |
|
lb2.Content = "手术总时长:" + listday[j].SSZSC + "小时"; |
|
lb3.Content = "医生:" + listday[j].YSMC; |
|
lb4.Content = "病人:" + listday[j].HZXM; |
|
lb5.Content = "住院号:" + listday[j].ZYH; |
|
lb6.Content = "权重:" + listday[j].QZ; |
|
lb1.Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#ff0000")); |
|
grid.Children.Add(lb0); |
|
grid.Children.Add(lb1); |
|
grid.Children.Add(lb2); |
|
grid.Children.Add(lb3); |
|
grid.Children.Add(lb4); |
|
grid.Children.Add(lb5); |
|
grid.Children.Add(lb6); |
|
dock.Children.Add(grid); |
|
} |
|
} |
|
} |
|
private void shuaxin_Click(object sender, RoutedEventArgs e) |
|
{ |
|
PaiBan(); |
|
} |
|
/// <summary> |
|
/// 修改排班状态 |
|
/// </summary> |
|
private void UpdateZT() |
|
{ |
|
//1、查出最后修改时间 |
|
int zhxgsj = Convert.ToInt32((from tbqtcs in myModel.Bus_QTCSB |
|
select new |
|
{ |
|
tbqtcs |
|
}).Single().tbqtcs.ZHXGSJ.Replace("天内", "")); |
|
//2、获取锁定时间 |
|
DateTime sdsj = DateTime.Now.AddDays(zhxgsj-1).Date.AddDays(-1); |
|
|
|
//3、查出状态不是已完成和已取消并且开始时间小于锁定时间的手术排班 |
|
var listpbb = (from tbpbb in myModel.Bus_PBB |
|
where tbpbb.PBZT != 3 && tbpbb.PBZT != 4 && tbpbb.KSSJ < sdsj |
|
select new |
|
{ |
|
tbpbb |
|
}).ToList(); |
|
try |
|
{ |
|
for (int i = 0; i < listpbb.Count; i++) |
|
{ |
|
Bus_PBB pbb = new Bus_PBB(); |
|
pbb = listpbb[i].tbpbb; |
|
//4、获取手术完成时间 |
|
DateTime sswcsj = Convert.ToDateTime(pbb.KSSJ).AddHours(Convert.ToDouble(pbb.SSZSC)); |
|
//5、如果手术完成时间小于当前时间修改状态为已完成 |
|
if (sswcsj< DateTime.Now) |
|
{ |
|
pbb.PBZT = 4; |
|
myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; |
|
} |
|
//6、如果手术完成时间大于当前时间修改状态为已锁定 |
|
else |
|
{ |
|
pbb.PBZT = 2; |
|
myModel.Entry(pbb).State = System.Data.Entity.EntityState.Modified; |
|
} |
|
} |
|
myModel.SaveChanges(); |
|
} |
|
catch (Exception ex) |
|
{ |
|
MessageBox.Show( ex.ToString()); |
|
} |
|
} |
|
double amsc = 0; |
|
double pmsc = 0; |
|
string mtkssj = string.Empty; |
|
string mtpbjssj = string.Empty; |
|
string sssxxsj = string.Empty; |
|
/// <summary> |
|
/// 智能排班(修改开始时间) |
|
/// </summary> |
|
private void SmartScheduling() |
|
{ |
|
//查询其他参数表 |
|
var qtcs = (from tbqtcs in myModel.Bus_QTCSB |
|
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_SSQJDB 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<Cus_SJKPBB> listpbjl = (from tbpbb in myModel.Bus_PBB |
|
where tbpbb.KSSJ == null || tbpbb.KSSJ > 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<Cus_SJKPBB> 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<Cus_SJKPBB> ypb = new List<Cus_SJKPBB>(); |
|
List<Cus_SJKPBB> listpb = new List<Cus_SJKPBB>(); |
|
//手术室需要休息 |
|
if (!sfxx) |
|
{ |
|
//执行排班方法 |
|
DiGuiPaiBan(pbkssj, sssxxsj, listpb, listssspb, am, pm, ypb, pmkssj); |
|
} |
|
} |
|
//myModel.SaveChanges(); |
|
//MessageBox.Show("排班成功"); |
|
} |
|
catch (Exception ex) |
|
{ |
|
|
|
MessageBox.Show(ex.ToString()); |
|
} |
|
} |
|
|
|
#region 备份SmartScheduling方法 |
|
//private void SmartScheduling() |
|
//{ |
|
// //1、查询其他参数表 |
|
// var qtcs = (from tbqtcs in myModel.Bus_QTCSB |
|
// select new |
|
// { |
|
// tbqtcs |
|
// }).Single(); |
|
|
|
// //2、获取每天排班时间长 |
|
// int mtsssc = Convert.ToInt32(qtcs.tbqtcs.MTPBSC.Replace("小时", "")); |
|
// //3、获取锁定时间 |
|
// DateTime sdsj = DateTime.Now.AddDays(Convert.ToDouble(qtcs.tbqtcs.ZHXGSJ.Replace("天内", ""))).Date.AddSeconds(-1); |
|
// var qjdb = (from tbqjd in myModel.SYS_SSQJDB select new { tbqjd }).ToList(); |
|
// //4、获取每天排班开始时间 |
|
// string mtkssj = qtcs.tbqtcs.PBKSSJ; |
|
// //4、获取每天排班时长 |
|
// double mtpbsc = Convert.ToDouble(qtcs.tbqtcs.MTPBSC.Replace("小时", "")); |
|
// //5、获取手术室休息时间 |
|
// string sssxxsj = qtcs.tbqtcs.STRXXSJ; |
|
// //6、获取手术室休息时长 |
|
// double sssxxsc = Convert.ToDouble(qtcs.tbqtcs.XXSC); |
|
// double amsc = 0; |
|
// double pmsc = 0; |
|
// string pmkssj = string.Empty; |
|
// bool sfxx = sssxxsj == "不休息"; |
|
// //判断手术室是否有休息时间 |
|
// if (!sfxx) |
|
// { |
|
// //如果手术室需要休息获取休息前后两端时间的时长 |
|
// DateTime kspbjs = Convert.ToDateTime(DateTime.Now.Date + "" + mtkssj); |
|
// DateTime ksxxsj = Convert.ToDateTime(DateTime.Now.Date + "" + sssxxsj); |
|
// DateTime xwkssj = ksxxsj.AddHours(sssxxsc); |
|
// pmkssj = xwkssj.ToString("HH:mm:ss"); |
|
// TimeSpan ts = ksxxsj - kspbjs; |
|
// amsc = ts.TotalHours; |
|
// pmsc = mtpbsc - amsc; |
|
// } |
|
// //每天排班结束时间 |
|
// string mtpbjssj = Convert.ToDateTime(DateTime.Now.Date + mtkssj).AddHours(mtpbsc + sssxxsc).ToString("HH:mm:ss"); |
|
|
|
// DateTime dt = DateTime.Now.Date; |
|
// //7、查询出开始时间为空(未进行排班)和开始时间大于锁定时间的手术排班 |
|
|
|
// var listpbjl = (from tbpbb in myModel.Bus_PBB |
|
// where tbpbb.KSSJ == null || tbpbb.KSSJ > sdsj |
|
// select new |
|
// { |
|
// tbpbb |
|
// }).ToList(); |
|
|
|
// //8、将排班按照手术室分组获取手术室列表 |
|
// var listsss = listpbjl.GroupBy(a => a.tbpbb.SSSID).ToList(); |
|
|
|
// try |
|
// { |
|
// //9、使用for循环为每个手术室进行排班 |
|
// for (int j = 0; j < listsss.Count; j++) |
|
// { |
|
// int sssid = Convert.ToInt32(listsss[j].Key); |
|
// //10、获取每个手术室的排班并按权重进行排序 |
|
// //var listssspb = listpbjl.Where(a => a.tbpbb.PBZT == 1 && a.tbpbb.SSSID == sssid).OrderByDescending(a => a.tbpbb.QZ).ToList(); |
|
// var listssspb = listpbjl.Where(a => a.tbpbb.PBZT == 1 && a.tbpbb.SSSID == sssid).ToList(); |
|
// //11、获取排班开始时间 |
|
// DateTime pbkssj = Convert.ToDateTime(DateTime.Now.AddDays(1).Date + "" + mtkssj); |
|
// double pbsc = mtpbsc; |
|
// double am = amsc; |
|
// double pm = pmsc; |
|
|
|
// //12、循环当前手术室的排班修改开始时间 |
|
// for (int i = 0; i < listssspb.Count(); i++) |
|
// { |
|
// var ypb = listssspb; |
|
// ypb.Clear(); |
|
// Bus_PBB pbb = new Bus_PBB(); |
|
// var listpb = listssspb; |
|
// listpb.Clear(); |
|
// //手术室需要休息 |
|
// if (!sfxx) |
|
// { |
|
// //判断开始时间是否大于休息时间 |
|
// if (pbkssj < Convert.ToDateTime(pbkssj.Date + " " + sssxxsj)) |
|
// { |
|
// //查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 |
|
// listpb = listssspb.Except(ypb).Where(a => a.tbpbb.SSZSC <= Convert.ToDecimal(am)).OrderByDescending(a => a.tbpbb.QZ).ToList(); |
|
// //如果有列表有数据直接排班 |
|
// if (listpb.Count > 0) |
|
// { |
|
// pbb = listpb[0].tbpbb; |
|
// pbb.KSSJ = pbkssj; |
|
// pbkssj = pbkssj.AddHours((double)pbb.SSZSC); |
|
// am = am - (double)pbb.SSZSC; |
|
// ypb.Add(listssspb.Where(a => a.tbpbb.ID == pbb.ID).Single()); |
|
|
|
// } |
|
// else |
|
// { |
|
// //排班时间改为休息之后的时间 |
|
// pbkssj = Convert.ToDateTime(pbkssj.Date + " " + pmkssj); |
|
// //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 |
|
// listpb = listssspb.Where(a => a.tbpbb.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.tbpbb.QZ).ToList(); |
|
// //如果列表有数据直接排班 |
|
// if (listpb.Count > 0) |
|
// { |
|
// pbb = listpb[0].tbpbb; |
|
// pbb.KSSJ = pbkssj; |
|
// pbkssj = pbkssj.AddHours((double)pbb.SSZSC); |
|
// pm = pm - (double)pbb.SSZSC; |
|
// ypb.Add(listssspb.Where(a => a.tbpbb.ID == pbb.ID).Single()); |
|
// } |
|
// //如果上午下午都没有数据证明该手术室没有手术不需要排班 |
|
// //或者有的手术总时长比上午时长和下午时长都大不能自动排班 |
|
// //继续对其他手术室进行排班 |
|
// } |
|
// } |
|
// else |
|
// { |
|
// //排班时间改为休息之后的时间 |
|
// pbkssj = Convert.ToDateTime(pbkssj.Date + " " + pmkssj); |
|
// //查询出未排班并且手术总时长小于或等于下午时长的手术按权重排序 |
|
// listpb = listssspb.Where(a => a.tbpbb.SSZSC <= Convert.ToDecimal(pm)).OrderByDescending(a => a.tbpbb.QZ).ToList(); |
|
// //如果列表有数据直接排班 |
|
// if (listpb.Count > 0) |
|
// { |
|
// pbb = listpb[0].tbpbb; |
|
// pbb.KSSJ = pbkssj; |
|
// pbkssj = pbkssj.AddHours((double)pbb.SSZSC); |
|
// pm = pm - (double)pbb.SSZSC; |
|
// ypb.Add(listssspb.Where(a => a.tbpbb.ID == pbb.ID).Single()); |
|
// } |
|
// //如果上午下午都没有数据证明该手术室没有手术不需要排班 |
|
// //或者有的手术总时长比上午时长和下午时长都大不能自动排班 |
|
// //继续对其他手术室进行排班 |
|
// } |
|
// } |
|
// } |
|
// } |
|
// // myModel.SaveChanges(); |
|
// //MessageBox.Show("排班成功"); |
|
// } |
|
// catch (Exception ex) |
|
// { |
|
|
|
// MessageBox.Show(ex.ToString()); |
|
// } |
|
//} |
|
#endregion |
|
|
|
private void DiGuiPaiBan(DateTime pbkssj, string sssxxsj, List<Cus_SJKPBB> listpb, List<Cus_SJKPBB> listssspb, double am, double pm, List<Cus_SJKPBB> ypb, string pmkssj) |
|
{ |
|
//实例化排班列表 |
|
listpb = new List<Cus_SJKPBB>(); |
|
Bus_PBB pbb = new Bus_PBB(); |
|
//1、判断开始时间是否大于休息时间 |
|
if (pbkssj < Convert.ToDateTime(pbkssj.Date.ToString("yyyy-MM-dd") + " " + sssxxsj)) |
|
{ |
|
//排班时间为上午 |
|
//查询出未排班并且手术总时长小于或等于上午时长的手术按权重排序 |
|
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; |
|
//修改手术开始时间 |
|
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); |
|
} |
|
} |
|
} |
|
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; |
|
//修改手术开始时间 |
|
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); |
|
} |
|
} |
|
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); |
|
} |
|
} |
|
|
|
//如果上午下午都没有数据证明该手术室没有手术不需要排班 |
|
//或者有的手术总时长比上午时长和下午时长都大不能自动排班 |
|
//继续对其他手术室进行排班 |
|
} |
|
|
|
} |
|
} |
|
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; |
|
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); |
|
} |
|
} |
|
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); |
|
} |
|
} |
|
//如果上午下午都没有数据证明该手术室没有手术不需要排班 |
|
//或者有的手术总时长比上午时长和下午时长都大不能自动排班 |
|
//继续对其他手术室进行排班 |
|
} |
|
} |
|
} |
|
|
|
private void btn_sx_Click(object sender, RoutedEventArgs e) |
|
{ |
|
PaiBan(); |
|
} |
|
|
|
private void btn_gb_Click(object sender, RoutedEventArgs e) |
|
{ |
|
this.Close(); |
|
} |
|
|
|
private void btn_xz_Click(object sender, RoutedEventArgs e) |
|
{ |
|
PBSQWindow window = new PBSQWindow("admin"); |
|
window.Show(); |
|
} |
|
} |
|
}
|
|
|