using HelperDB; using AIMSExtension; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using DCSoftDotfuscate; namespace AIMS.OperationFront.UI { public partial class frmPersonSchedul : Form { public frmPersonSchedul() { InitializeComponent(); } private int operatorId = 1; private string conditionMonth = "0"; private string conditionRole = "Doctor"; //Doctor|Nurse private DataTable dtSchedulingType = null; private DataTable dtScheduleSetup = null; private DataTable dtDoctors = null; private DataTable dtNurses = null; private DataTable dtOperationRoom = null; private DataTable dtSchedulingNew = null; private DataTable dtSchedulingNurseToOperationRoom = null; private DataTable dtMainTable = null; private Dictionary dicDoctors = new Dictionary(); private Dictionary dicNurses = new Dictionary(); private Dictionary dicOperationRoomNameId = new Dictionary(); private Dictionary dicOperationRoomIdName = new Dictionary(); private Dictionary dicSchedulingTypeNameId = new Dictionary(); private Dictionary dicSchedulingTypeIdName = new Dictionary(); private string[] validSchedulingTypes = null; private string[] doctorRoles = new string[1] { "医生" }; private string[] nurseRoles = new string[3] { " ", "洗手", "巡回" }; private List listHeaderChinese; private List listHeaderWeek; private List listHeaderDays; private DataView dvSchedulingType = null; private GPDbHelper dbHelper = new GPDbHelper(); /// /// 数据添加空值 /// /// 字符串数组 /// private string[] ArrayAddEmptyValue(string[] items) { int n = items.Length; string[] items2 = new string[n + 1]; items2[0] = ""; Array.Copy(items, 0, items2, 1, n); return items2; } /// /// 刷新排班计划中的下拉列表数据 /// private void FreshDicSchedulingType() { bool isHasInvalid = chxHasInvaild.Checked; DataView dv = dtSchedulingType.DefaultView; if (!isHasInvalid) { dv.RowFilter = "IsValid=1"; } else { dv.RowFilter = ""; } Dictionary dicValidType = new Dictionary(); dicSchedulingTypeNameId.Clear(); dicSchedulingTypeIdName.Clear(); foreach (DataRow dr in dtSchedulingType.Rows) { try { int id = (int)dr["Id"]; string name = dr["Name"].ToString(); int isValid = int.Parse(dr["IsValid"].ToString()); dicSchedulingTypeNameId[name] = id; dicSchedulingTypeIdName[id] = name; if (isValid == 1) { dicValidType[name] = id; } } catch (Exception) { } } string[] items; DataGridView dgv; DataGridViewComboBoxColumn cbxColumn; items = ArrayAddEmptyValue(dicValidType.Keys.ToArray()); Array.Sort(items); validSchedulingTypes = items; dgv = this.dgvShiftPlan; for (int i = 1; i < 14; i++) { string columnName = string.Format("Day{0}", i); cbxColumn = (DataGridViewComboBoxColumn)dgv.Columns[columnName]; cbxColumn.Items.Clear(); cbxColumn.Items.AddRange(items); } dgv.Update(); dgv = this.dataGridView1; if (!chxModified.Checked) { items = ArrayAddEmptyValue(dicSchedulingTypeNameId.Keys.ToArray()); Array.Sort(items); } for (int i = 1; i <= 31; i++) { string columnName = string.Format("Date{0}", i); cbxColumn = (DataGridViewComboBoxColumn)dgv.Columns[columnName]; cbxColumn.Items.Clear(); cbxColumn.Items.AddRange(items); } dgv.Update(); } /// /// 由班次Id获取班次名称,为了兼容原来是名称的数据,所以判断是否是数字,如果不是数字,则直接返加 /// /// 班次Id /// private string getSchedulingTypeName(string id) { int _id = int.Parse(id); if (_id == 0) { return id; } if (dicSchedulingTypeIdName.ContainsKey(_id)) { return dicSchedulingTypeIdName[_id]; } return ""; } /// /// 由班次Id获取班次名称 /// /// 班次Id /// private string getSchedulingTypeName(int id) { if (dicSchedulingTypeIdName.ContainsKey(id)) { return dicSchedulingTypeIdName[id]; } return ""; } /// /// 根据班次名称读取班次Id /// /// /// private int getSchedulingTypeId(string name) { if (dicSchedulingTypeNameId.ContainsKey(name)) { return dicSchedulingTypeNameId[name]; } return 0; } /// /// 由手术室Id获取手术室名称 /// /// 手术室Id /// private string getOperationRoomName(int operationRoomId) { if (dicOperationRoomIdName.ContainsKey(operationRoomId)) { return dicOperationRoomIdName[operationRoomId]; } return ""; } /// /// 由手术室名称获取手术室Id /// /// 手术室名称 /// private int GetOperationRoomId(string operationRoomName) { if (dicOperationRoomNameId.ContainsKey(operationRoomName)) { return dicOperationRoomNameId[operationRoomName]; } return 0; } /// /// 读取班次数据* /// private void GetDataTableSchedulingType() { string sql = "select Id, [Name], BeginTime, EndTime, IsValid, OperatorId, OperatorTime from SchedulingType"; dtSchedulingType = dbHelper.GetDataTable(sql); } /// /// 结构时间(小时 分钟) /// struct MyHourMinute { public int hour; public int minute; } /// /// 上下班时间 /// struct MySxbTime { public DateTime sbTime; public DateTime xbTime; } /// /// 由时间字符串解析出结构时间 /// /// 时间字符串 /// private MyHourMinute GetMyHourMinute(string time) { MyHourMinute hm; hm.hour = -1; /*不正确的时间表示*/ hm.minute = 0; if (string.IsNullOrEmpty(time.Trim())) return hm; if (time.Contains(':')) time = time.Replace(':', ':'); string[] arr = time.Split(':'); if (arr.Length == 2) { hm.minute = int.Parse(arr[1]); } hm.hour = int.Parse(arr[0]); return hm; } /// /// 由上下班时间字符串解析出上下班时间 /// /// 上班时间字符 /// 下班时间字符 /// private MySxbTime GetMySxbTime(string beginTime, string endTime, DateTime dateTime) { /*获取上下班时间, 如果下班时间早于上班时间,则无效*/ MyHourMinute hm; MySxbTime sxbTime; if (string.IsNullOrEmpty(beginTime) || string.IsNullOrEmpty(endTime)) { sxbTime.sbTime = dateTime; sxbTime.xbTime = dateTime.AddDays(-1); return sxbTime; } hm = GetMyHourMinute(beginTime); sxbTime.sbTime = dateTime.AddHours(hm.hour).AddMinutes(hm.minute); hm = GetMyHourMinute(endTime); sxbTime.xbTime = dateTime.AddHours(hm.hour).AddMinutes(hm.minute); if (sxbTime.xbTime.CompareTo(sxbTime.sbTime) <= 0) { sxbTime.xbTime = sxbTime.xbTime.AddDays(1); } return sxbTime; } /// /// 读取班次上班时间, 为了刷新dvSchedulingType,循环调用前,请置dvSchedulingType=null /// /// 班次Id /// 工作日期 /// 上下班时间 private MySxbTime GetSchedulingTypeSxbsj(int schedulingTypeId, DateTime dateTime) { MySxbTime sxbTime; if (dvSchedulingType == null) { dvSchedulingType = new DataView(dtSchedulingType); } dvSchedulingType.RowFilter = "Id=" + schedulingTypeId.ToString(); if (dvSchedulingType.Count > 0) { string beginTime = dvSchedulingType[0]["BeginTime"].ToString(); string endTime = dvSchedulingType[0]["EndTime"].ToString(); sxbTime = GetMySxbTime(beginTime, endTime, dateTime); } else { sxbTime.sbTime = dateTime; sxbTime.xbTime = dateTime; } return sxbTime; } /// /// 读取手术麻醉科医生 护士 手术间信息 /// private void GetDataTableDoctorsNursesRoom() { /*读取手术麻醉科医生信息 WorkersType=2*/ string sql; //if (PublicMethod.hospitals.Name== "山西省心血管病医院") sql = "select w.Id, w.[Name], w.[HelpCode] HCode, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' and w.IsValid=1 order by w.[PersonOrder] "; dtDoctors = dbHelper.GetDataTable(sql); /*读取手术麻醉科护士信息 WorkersType=1*/ sql = "select w.Id, w.[Name], w.[HelpCode] HCode, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' and w.IsValid=1 order by w.[PersonOrder] "; dtNurses = dbHelper.GetDataTable(sql); /*读取手术间信息*/ sql = "select id, [Name] from OperationRoom where IsValid=1 order by [RoomOrder]"; dtOperationRoom = dbHelper.GetDataTable(sql); dicDoctors.Clear(); foreach (DataRow dr in dtDoctors.Rows) { dicDoctors.Add((int)dr["Id"], dr["Name"].ToString()); } dicNurses.Clear(); foreach (DataRow dr in dtNurses.Rows) { dicNurses.Add((int)dr["Id"], dr["Name"].ToString()); } dicOperationRoomNameId.Clear(); dicOperationRoomIdName.Clear(); foreach (DataRow dr in dtOperationRoom.Rows) { string name = dr["Name"].ToString(); int id = (int)dr["Id"]; if (!dicOperationRoomNameId.ContainsKey(name)) { dicOperationRoomNameId.Add(name, id); dicOperationRoomIdName.Add(id, name); } } } /// /// 从数据库中读取排班计划到页面中 /// private void GetDataTableShiftPlan() { /*从数据库中读取排班计划到页面中*/ string sql = "select id,ScheduleName, ScheduleTypeId, RoundDays, isValid, OperatorNo, OperatorTime from ScheduleSetup"; DataTable dataTable = dbHelper.GetDataTable(sql); dtScheduleSetup = dataTable; for (int i = 1; i < 14; i++) { dataTable.Columns.Add("Day" + i.ToString(), typeof(string)); } int n = dataTable.Rows.Count; //删除空行 for (int i = n - 1; i >= 0; i--) { DataRow dr = dataTable.Rows[i]; if (string.IsNullOrEmpty(dr["ScheduleTypeId"].ToString())) { dr.Delete(); } } n = dataTable.Rows.Count; for (int i = 0; i < n; i++) { DataRow dr = dataTable.Rows[i]; string strTypeId = dr["ScheduleTypeId"].ToString(); string[] ids = strTypeId.Split('|'); int m = ids.Length; for (int j = 1; j <= m; j++) { dr["Day" + j.ToString()] = getSchedulingTypeName(ids[j - 1]); } dr["RoundDays"] = m; } DataGridView dgv = this.dgvShiftPlan; dgv.AutoGenerateColumns = false; dgv.DataSource = dataTable.DefaultView; } /// /// 读取排班数据 /// private void GetDataTableSchedulingNew() { if (dtMainTable != null) { if (GetDataTableChangedCount(dtMainTable) > 0) { if (MessageBox.Show("数据没有保存,是否需要保存", "提示信息", MessageBoxButtons.YesNo) == DialogResult.Yes) { btnSave_Click(null, null); } } } string radioType; bool isNurse = radioNurse.Checked; if (isNurse) { radioType = "Nurse"; } else { radioType = "Doctor"; } string strMonth = dateTimePicker1.Value.ToString("yyyyMM"); if (conditionMonth != strMonth || conditionRole != radioType) { /*与上次获取条件不一致,则重新取数据*/ string sql = string.Format("select id, workerId, WorkersType, ScheduleMonth, ScheduleDay, SchedulingType, SchedulingDate, OperatorId, OperatorTime, sbsj, xbsj from SchedulingNew where ScheduleMonth={0}", strMonth); dtSchedulingNew = dbHelper.GetDataTable(sql); if (isNurse) { sql = string.Format("select Id, WorkerId, OperationRoomId, nurseType, beginTime, endTime, ScheduleMonth, Remark from SchedulingNurseToOperationRoom where ScheduleMonth={0}", strMonth); dtSchedulingNurseToOperationRoom = dbHelper.GetDataTable(sql); } this.dataGridView1.DataSource = GetMainDataTable(); /*记录获取条件*/ conditionMonth = strMonth; conditionRole = radioType; } } /// /// 生成DataTable dtMainTable /// /// private DataTable GetMainDataTable() { DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; int dayMax = (new DateTime(year, month, 1)).AddMonths(1).AddDays(-1).Day; List listHeaderChinese = new List(); List listHeaderWeek = new List(); List listHeaderDays = new List(); ChineseCalendar cCalendar; for (int i = 1; i <= dayMax; i++) { DateTime date = new DateTime(year, month, i); cCalendar = new ChineseCalendar(date); string chineseDay = cCalendar.ChineseTwentyFourDay != "" ? cCalendar.ChineseTwentyFourDay : cCalendar.ChineseDateString; if (chineseDay.StartsWith("十一月")) { chineseDay = chineseDay.Replace("十一月", "11月"); } listHeaderChinese.Add(chineseDay); listHeaderWeek.Add(cCalendar.WeekDayStr); listHeaderDays.Add(date.ToString("MM-dd")); } this.listHeaderChinese = listHeaderChinese; this.listHeaderWeek = listHeaderWeek; this.listHeaderDays = listHeaderDays; DataTable dataTable = new DataTable(); dataTable.Columns.Add("ColChecked", typeof(int)); dataTable.Columns.Add("WorkerId", typeof(int)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Columns.Add("HCode", typeof(string)); dataTable.Columns.Add("Role", typeof(string)); dataTable.Columns.Add("xh", typeof(int)); /*护士: 添加手术室,值班时间和备注*/ bool isNurse = radioNurse.Checked; if (isNurse) { dataTable.Columns.Add("OperationRoom", typeof(string)); dataTable.Columns.Add("BeginDate", typeof(DateTime)); dataTable.Columns.Add("EndDate", typeof(DateTime)); dataTable.Columns.Add("Remark", typeof(string)); } /*添加当天各天的字段*/ for (int i = 1; i <= dayMax; i++) { string fieldname = string.Format("Date{0}", i.ToString()); dataTable.Columns.Add(fieldname, typeof(string)); } /*设置列标题*/ string newLine = System.Environment.NewLine; DataGridView dgv = this.dataGridView1; DataGridViewComboBoxColumn column; dgv.Columns["Date29"].Visible = false; dgv.Columns["Date30"].Visible = false; dgv.Columns["Date31"].Visible = false; for (int i = 0; i < dayMax; i++) { string columnName = string.Format("Date{0}", (i + 1).ToString()); column = (DataGridViewComboBoxColumn)dgv.Columns[columnName]; string WeekDayStr = listHeaderWeek[i]; column.HeaderText = string.Format("{0}{1}{2}{3}{4}", listHeaderDays[i], newLine, WeekDayStr, newLine, listHeaderChinese[i]); if (i >= 28) column.Visible = true; if (WeekDayStr == "周六" || WeekDayStr == "周日") { column.HeaderCell.Style.ForeColor = Color.Red; } else { column.HeaderCell.Style.ForeColor = Color.Black; } } /*给手术室和角色添加数据源*/ column = (DataGridViewComboBoxColumn)dgv.Columns["Role"]; if (isNurse) { column.ReadOnly = false; column.Items.Clear(); column.Items.AddRange(nurseRoles); column = (DataGridViewComboBoxColumn)dgv.Columns["OperationRoom"]; column.Items.Clear(); column.Items.Add(""); column.Items.AddRange(dicOperationRoomNameId.Keys.ToArray()); column.ReadOnly = false; dgv.Columns["OperationRoom"].Visible = true; dgv.Columns["BeginDate"].Visible = true; dgv.Columns["EndDate"].Visible = true; dgv.Columns["Remark"].Visible = true; } else { column.ReadOnly = true; column.Items.Clear(); column.Items.AddRange(doctorRoles); dgv.Columns["OperationRoom"].Visible = false; dgv.Columns["BeginDate"].Visible = false; dgv.Columns["EndDate"].Visible = false; dgv.Columns["Remark"].Visible = false; } /*填充相数据*/ DataTable duTable; if (isNurse) { duTable = dtNurses; } else { duTable = dtDoctors; } Dictionary dicUsedWorkers = new Dictionary(); DataView dv1, dv2; dv1 = new DataView(dtSchedulingNew); if (isNurse) { dv2 = new DataView(dtSchedulingNurseToOperationRoom); } else { dv2 = new DataView(); } string strMonth = (year * 100 + month).ToString(); DateTime beginTime = new DateTime(year, month, 1); DateTime endTime = new DateTime(year, month, dayMax); int xh = 0; foreach (DataRow dr in duTable.Rows) { int workerId = (int)dr["Id"]; DataRow dr2 = dataTable.NewRow(); dr2["ColChecked"] = 0; dr2["WorkerId"] = (int)dr["Id"]; dr2["Name"] = dr["Name"].ToString(); dr2["HCode"] = dr["HCode"].ToString(); dr2["xh"] = ++xh; if (!isNurse) { dr2["Role"] = "医生"; } else { dv2.RowFilter = string.Format("ScheduleMonth={0} and WorkerId={1}", strMonth, workerId); if (dv2.Count > 0) { dr2["OperationRoom"] = getOperationRoomName((int)dv2[0]["OperationRoomId"]); dr2["Role"] = dv2[0]["nurseType"]; dr2["BeginDate"] = dv2[0]["BeginTime"]; dr2["EndDate"] = dv2[0]["EndTime"]; } else { //dr2["OperationRoom"] = "";// getOperationRoomName(int.Parse(dr["OperationRoomId"].ToString())); //dr2["Role"] = dr["NurseRole"].ToString(); //dr2["BeginDate"] = beginTime; //dr2["EndDate"] = endTime; } } dv1.RowFilter = string.Format("ScheduleMonth={0} and WorkerId={1}", strMonth, workerId); int n = dv1.Count; for (int i = 0; i < n; i++) { int day = (int)dv1[i]["ScheduleDay"]; if (day >= 1 && day <= dayMax) { dr2["Date" + day.ToString()] = getSchedulingTypeName((int)dv1[i]["SchedulingType"]); } } dataTable.Rows.Add(dr2); } dtMainTable = dataTable; dataTable.DefaultView.Sort = "xh"; dataTable.AcceptChanges(); return dataTable; } private void FrmScheduling2_Load(object sender, EventArgs e) { DataGridView dgv = this.dataGridView1; dgv.EditMode = DataGridViewEditMode.EditOnEnter; //冻结姓名列 dgv.Columns["ColName"].Frozen = true; dgv.AutoGenerateColumns = false; //dgv.RowPostPaint += GPControls.DataGridView_RowPostPaint; //dgvSchedulingType.RowPostPaint += GPControls.DataGridView_RowPostPaint; //dgvShiftPlan.RowPostPaint += GPControls.DataGridView_RowPostPaint; operatorId = AIMSExtension.PublicMethod.OperatorId; GetDataTableSchedulingType(); FreshDicSchedulingType(); dgv = this.dgvSchedulingType; dgv.EditMode = DataGridViewEditMode.EditOnEnter; dgv.AutoGenerateColumns = false; dgv.DataSource = dtSchedulingType; this.dgvShiftPlan.EditMode = DataGridViewEditMode.EditOnEnter; GetDataTableShiftPlan(); GetDataTableDoctorsNursesRoom(); this.WindowState = FormWindowState.Maximized; dateTimePicker1.Value = DateTime.Now.Date; radioDoctor.Focus(); if (PublicMethod.RoleId == 6 || PublicMethod.RoleId == 8 || PublicMethod.RoleId == 10) { radioNurse.Checked = true; radioNurse.Focus(); } } private void ChxSelectAllRows_CheckedChanged(object sender, EventArgs e) { DataGridView dgv = this.dataGridView1; int n = dgv.Rows.Count; int isChecked = ((System.Windows.Forms.CheckBox)sender).Checked ? 1 : 0; for (int i = 0; i < n; i++) { dgv.Rows[i].Cells["colChecked"].Value = isChecked; } dgv.EndEdit(); } private void radioNurse_CheckedChanged(object sender, EventArgs e) { if (radioNurse.Checked) { labelTitle.Text = "护士排班管理"; labelDoctorNurse.Text = "选择护士"; labelScheduling.Text = "护士排班计划"; GetDataTableSchedulingNew(); } } private void radioDoctor_CheckedChanged(object sender, EventArgs e) { if (radioDoctor.Checked) { labelTitle.Text = "麻醉医生排班管理"; labelDoctorNurse.Text = "选择麻醉医生"; labelScheduling.Text = "麻醉医生排班计划"; GetDataTableSchedulingNew(); } } private void btnSave_Click(object sender, EventArgs e) { /*保存排班数据*/ this.dataGridView1.EndEdit(); //SaveWorkersInfo(); if (!radioNurse.Checked) { SaveDoctorSchedulingNew(); } else { SaveNurseSchedulingNew(); } } /// /// 保存员工信息 /// private void SaveWorkersInfo() { /*OrderBy, OperationRoom, NurseRole */ DataGridView dgv = this.dataGridView1; bool isNurse = dgv.Columns["OperationRoom"].Visible; int n = dgv.Rows.Count; List list = new List(); for (int i = 0; i < n; i++) { DataGridViewRow dvr = dgv.Rows[i]; int id = int.Parse(dvr.Cells["WorkerId"].Value.ToString()); int OrderBy = int.Parse(dvr.Cells["ColXh"].Value.ToString()); int operationRoomId; string nurseRole; if (!isNurse) { list.Add(string.Format("SELECT {0} AS ID, {1} AS OrderBy", id, OrderBy)); } else { operationRoomId = GetOperationRoomId(dvr.Cells["OperationRoom"].Value.ToString()); nurseRole = dvr.Cells["Role"].Value.ToString(); list.Add(string.Format("SELECT {0} AS ID, {1} AS OrderBy, {2} AS OperationRoomId, '{3}' AS NurseRole", id, OrderBy, operationRoomId, nurseRole)); } } if (list.Count == 0) return; string sql; if (!isNurse) { sql = string.Format("Update Person SET OrderBy = a.OrderBy FROM ({0}) a WHERE Person.Id = a.Id", string.Join(" UNION ALL ", list.ToArray())); } else { sql = string.Format("Update Person SET OrderBy = a.OrderBy, OperationRoomId=a.OperationRoomId, NurseRole=a.NurseRole FROM ({0}) a WHERE Person.Id = a.Id", string.Join(" UNION ALL ", list.ToArray())); } n = dbHelper.Execute(sql); } /// /// 保存医生排班数据 /// private void SaveDoctorSchedulingNew() { /*select id, workerId, WorkersType, ScheduleMonth, ScheduleDay, SchedulingType, SchedulingDate, OperatorId, OperatorTime, sbsj, xbsj from SchedulingNew*/ DataTable dataTable = dtSchedulingNew.Clone(); DataView dvMain = new DataView(dtMainTable); DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; int dayMax = (new DateTime(year, month, 1)).AddMonths(1).AddDays(-1).Day; StringBuilder sb = new StringBuilder(); sb.Append("len(Date1) >0"); for (int i = 2; i <= dayMax; i++) { sb.Append(string.Format(" or len(Date{0})>0", i.ToString())); } dvMain.RowFilter = sb.ToString(); int scheduleMonth = year * 100 + month; dvSchedulingType = null; for (int i = 0, n = dvMain.Count; i < n; i++) { DataRowView drv = dvMain[i]; DataRow dr; for (int j = 1; j <= dayMax; j++) { int schedulingTypeId; DateTime zbrq; /* 值班日期 */ MySxbTime sxbsj; /* 上下班时间 */ string fieldName = string.Format("Date{0}", j.ToString()); string fieldValue = drv[fieldName].ToString(); if (!string.IsNullOrEmpty(fieldValue)) { schedulingTypeId = getSchedulingTypeId(fieldValue); if (schedulingTypeId > 0) { dr = dataTable.NewRow(); dr["WorkerId"] = (int)drv["WorkerId"]; dr["WorkersType"] = 2; dr["ScheduleMonth"] = scheduleMonth; dr["ScheduleDay"] = j; dr["SchedulingType"] = schedulingTypeId; zbrq = new DateTime(year, month, j); sxbsj = GetSchedulingTypeSxbsj(schedulingTypeId, zbrq); dr["SchedulingDate"] = zbrq; if (sxbsj.sbTime.CompareTo(sxbsj.xbTime) < 0) { dr["sbsj"] = sxbsj.sbTime; dr["xbsj"] = sxbsj.xbTime; } else { dr["sbsj"] = DBNull.Value; dr["xbsj"] = DBNull.Value; } dataTable.Rows.Add(dr); } } } } if (dataTable.Rows.Count == 0) { MessageBox.Show("没有需要保存的数据", "提示信息"); return; } SetOperatorId(dataTable, operatorId); try { foreach (DataGridViewRow item in dataGridView1.Rows) { dbHelper.BeginTransaction(); dbHelper.Execute(string.Format("update Person set PersonOrder={0} where Id={1}", item.Cells["ColXh"].Value, item.Cells["WorkerId"].Value)); dbHelper.Commit(); } dbHelper.BeginTransaction(); int workersType = int.Parse(dataTable.Rows[0]["workersType"].ToString()); dbHelper.Execute(string.Format("delete SchedulingNew where ScheduleMonth={0} and WorkersType={1}", scheduleMonth, workersType)); int n = dbHelper.DataTableSave(dataTable, "select id, workerId, WorkersType, ScheduleMonth, ScheduleDay, SchedulingType, SchedulingDate, OperatorId, OperatorTime, sbsj, xbsj from SchedulingNew"); dbHelper.Commit(); dtMainTable.AcceptChanges(); MessageBox.Show("保存成功。", "提示信息"); } catch (Exception ex) { dbHelper.RollBack(); MessageBox.Show("保存失败:" + ex.Message, "提示信息"); } } /// /// 保存护士排班数据 /// private void SaveNurseSchedulingNew() { /*select id, workerId, WorkersType, ScheduleMonth, ScheduleDay, SchedulingType, SchedulingDate, OperatorId, OperatorTime, sbsj, xbsj from SchedulingNew */ DataTable dataTable = dtSchedulingNew.Clone(); DataView dvMain = new DataView(dtMainTable); DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; DateTime monthFirstDay = new DateTime(year, month, 1); DateTime monthLastDay = monthFirstDay.AddMonths(1).AddDays(-1); int dayMax = monthLastDay.Day; StringBuilder sb = new StringBuilder(); sb.Append("len(Date1) >0"); for (int i = 2; i <= dayMax; i++) { sb.Append(string.Format(" or len(Date{0})>0", i.ToString())); } dvMain.RowFilter = sb.ToString(); int scheduleMonth = year * 100 + month; dvSchedulingType = null; /*转换排班数据*/ for (int i = 0, n = dvMain.Count; i < n; i++) { DataRowView drv = dvMain[i]; DataRow dr; for (int j = 1; j < dayMax; j++) { int schedulingTypeId; DateTime zbrq; /* 值班日期 */ MySxbTime sxbsj; /* 上下班时间 */ string fieldName = string.Format("Date{0}", j.ToString()); string fieldValue = drv[fieldName].ToString(); if (!string.IsNullOrEmpty(fieldValue)) { schedulingTypeId = getSchedulingTypeId(fieldValue); if (schedulingTypeId > 0) { dr = dataTable.NewRow(); dr["WorkerId"] = (int)drv["WorkerId"]; dr["WorkersType"] = 1; dr["ScheduleMonth"] = scheduleMonth; dr["ScheduleDay"] = j; dr["SchedulingType"] = schedulingTypeId; zbrq = new DateTime(year, month, j); sxbsj = GetSchedulingTypeSxbsj(schedulingTypeId, zbrq); dr["SchedulingDate"] = zbrq; if (sxbsj.sbTime.CompareTo(sxbsj.xbTime) < 0) { dr["sbsj"] = sxbsj.sbTime; dr["xbsj"] = sxbsj.xbTime; } else { dr["sbsj"] = DBNull.Value; dr["xbsj"] = DBNull.Value; } dataTable.Rows.Add(dr); } } } } if (dataTable.Rows.Count == 0) { MessageBox.Show("没有需要保存的数据", "提示信息"); return; } SetOperatorId(dataTable, operatorId); /*转换护士值班数据*/ /*SELECT Id, WorkerId, OperationRoomId, nurseType, beginTime, endTime, ScheduleMonth, Remark FROM SchedulingNurseToOperationRoom*/ DataTable dataTable2 = dtSchedulingNurseToOperationRoom.Clone(); for (int i = 0, n = dvMain.Count; i < n; i++) { DataRowView drv = dvMain[i]; DataRow dr; int OperationRoomId; DateTime beginTime, endTime; OperationRoomId = GetOperationRoomId(drv["OperationRoom"].ToString()); if (OperationRoomId > 0) { beginTime = Convert.ToDateTime(drv["BeginDate"]); endTime = Convert.ToDateTime(drv["EndDate"]); if (beginTime.Year < year) beginTime = monthFirstDay; if (endTime.Year < year) endTime = monthLastDay; dr = dataTable2.NewRow(); dr["WorkerId"] = (int)drv["WorkerId"]; dr["OperationRoomId"] = OperationRoomId; dr["ScheduleMonth"] = scheduleMonth; dr["nurseType"] = drv["Role"].ToString(); dr["beginTime"] = beginTime; dr["endTime"] = endTime; dr["Remark"] = drv["Remark"].ToString(); dataTable2.Rows.Add(dr); } } try { foreach (DataGridViewRow item in dataGridView1.Rows) { dbHelper.BeginTransaction(); dbHelper.Execute(string.Format("update Person set PersonOrder={0} where Id={1}", item.Cells["ColXh"].Value, item.Cells["WorkerId"].Value)); dbHelper.Commit(); } dbHelper.BeginTransaction(); dbHelper.Execute(string.Format("delete SchedulingNew where ScheduleMonth={0} and WorkersType=1", scheduleMonth)); dbHelper.Execute(string.Format("delete SchedulingNurseToOperationRoom where ScheduleMonth={0}", scheduleMonth)); int n = dbHelper.DataTableSave(dataTable, "select id, workerId, WorkersType, ScheduleMonth, ScheduleDay, SchedulingType, SchedulingDate, OperatorId, OperatorTime, sbsj, xbsj from SchedulingNew"); n = dbHelper.DataTableSave(dataTable2, "SELECT Id, WorkerId, OperationRoomId, nurseType, beginTime, endTime, ScheduleMonth, Remark FROM SchedulingNurseToOperationRoom"); dbHelper.Commit(); dtMainTable.AcceptChanges(); MessageBox.Show("保存成功。", "提示信息"); } catch (Exception ex) { dbHelper.RollBack(); MessageBox.Show("保存失败:" + ex.Message, "提示信息"); } } private void btnExit_Click(object sender, EventArgs e) { this.Close(); } /// /// 是否是时间格式, 格式为h或者h:m /// /// /// private bool isTimeString(string time) { time = time.Trim(); if (string.IsNullOrEmpty(time)) return true; time = time.Replace(":", ":"); //int hour, minute; //if (!GPFunctions.IsAllNumber(time.Replace(":", ""))) //{ // MessageBox.Show(string.Format("时间应当为数字,{0}不是正确的时间表示", time), "提示信息"); // return false; //} //int[] arr = StringToIntArray(time, ':'); //int n = arr.Length; //if (n > 2) //{ // MessageBox.Show("时间格式为:hh:mm, 如10:19", "提示信息"); // return false; //} //if (arr.Length == 1) //{ // hour = arr[0]; // if (hour < 0 || hour > 23) // { // return false; // } //} //else //{ // hour = arr[0]; // if (hour < 0 || hour > 23) // { // return false; // } // minute = arr[1]; // if (minute < 0 || minute > 59) // { // return false; // } //} return true; } private void dgvSchedulingType_CellEndEdit(object sender, DataGridViewCellEventArgs e) { int rowIndex = e.RowIndex; int columnIndex = e.ColumnIndex; DataGridView dgv = this.dgvSchedulingType; string columnName = dgv.Columns[columnIndex].Name; if (columnName == "BeginTime" || columnName == "EndTime") { string val = dgv.Rows[rowIndex].Cells[columnIndex].Value.ToString(); isTimeString(val); } } private void btnShiftFresh_Click(object sender, EventArgs e) { GetDataTableSchedulingType(); this.dgvSchedulingType.DataSource = dtSchedulingType; } private void btnShiftDelete_Click(object sender, EventArgs e) { /*班次删除*/ DataGridView dgv = this.dgvSchedulingType; DataGridViewSelectedRowCollection rows = dgv.SelectedRows; if (rows.Count == 0) return; for (int i = rows.Count - 1; i >= 0; i--) { DataGridViewRow row = rows[i]; int id = int.Parse(row.Cells["TypeId"].Value.ToString()); dgv.Rows.Remove(row); dgv.EndEdit(); } } private void btnShiftSave_Click(object sender, EventArgs e) { /*班次保存*/ if (!CheckSchedulingTypeData()) return; if (!SchedulingTypeExistsSameName()) return; DataTable dataTable = dtSchedulingType; SetOperatorId(dataTable, operatorId); int n; try { dbHelper.BeginTransaction(); n = dbHelper.DataTableSave(dataTable, "select Id, [Name], BeginTime, EndTime, IsValid, OperatorId, OperatorTime from SchedulingType"); dbHelper.Commit(); dataTable.AcceptChanges(); MessageBox.Show("保存成功。", "提示信息"); } catch (Exception ex) { dbHelper.RollBack(); MessageBox.Show("保存失败:" + ex.Message, "提示信息"); } GetDataTableSchedulingType(); FreshDicSchedulingType(); } /// /// 设置操作员Id /// /// /// private void SetOperatorId(DataTable dataTable, int operatorId) { /*设置修改的操作员信息*/ if (dataTable == null) return; DateTime dateTime = DateTime.Now; foreach (DataRow dr in dataTable.Rows) { if (dr.RowState != DataRowState.Unchanged && dr.RowState != DataRowState.Deleted) { dr["operatorId"] = operatorId; dr["OperatorTime"] = dateTime; } } } /// /// 设置操作员代码 /// /// DataTable /// 操作员Id private void SetOperatorNo(DataTable dataTable, string operatorNo) { /*设置修改的操作员信息*/ if (dataTable == null) return; DateTime dateTime = DateTime.Now; foreach (DataRow dr in dataTable.Rows) { if (dr.RowState != DataRowState.Unchanged && dr.RowState != DataRowState.Deleted) { dr["operatorNo"] = operatorNo; dr["OperatorTime"] = dateTime; } } } /// /// 检查班次数据信息的输入时间 是否正确 /// /// private bool CheckSchedulingTypeData() { string strVal; DataTable dataTable = dtSchedulingType; int n = dataTable.Rows.Count; DataGridView dgv = this.dgvSchedulingType; bool isok = true; for (int i = 0; i < n; i++) { DataRow dr = dataTable.Rows[i]; if (dr.RowState != DataRowState.Unchanged && dr.RowState != DataRowState.Deleted) { strVal = dr["BeginTime"].ToString().Trim(); if (!isTimeString(strVal)) { dgv.CurrentCell = dgv.Rows[i].Cells["BeginTime"]; isok = false; break; } else { if (string.IsNullOrEmpty(strVal)) { dr["BeginTime"] = DBNull.Value; } } strVal = dr["EndTime"].ToString().Trim(); if (!isTimeString(strVal)) { dgv.CurrentCell = dgv.Rows[i].Cells["EndTime"]; isok = false; break; } else { if (string.IsNullOrEmpty(strVal)) { dr["EndTime"] = DBNull.Value; } } } } return isok; } /// /// 判断班次中是否存在相同的名称 /// /// private bool SchedulingTypeExistsSameName() { int n = dgvSchedulingType.Rows.Count; bool isok = true; Dictionary dic = new Dictionary(); for (int i = n - 1; i >= 0; i--) { DataGridViewRow drr = dgvSchedulingType.Rows[i]; if (drr.Cells[1].Value == null) continue; string name = drr.Cells[1].Value.ToString(); if (!string.IsNullOrEmpty(name)) { if (!dic.ContainsKey(name)) { dic.Add(name, i + 1); } else { MessageBox.Show(string.Format("班次名称:{0}在{1}行和{2}出现重复。", name, dic[name], i + 1), "提示信息"); dgvSchedulingType.CurrentCell = dgvSchedulingType.Rows[i].Cells["ShiftName"]; isok = false; break; } } } return isok; } private void btnShiftPlanDelete_Click(object sender, EventArgs e) { DataGridView dgv = this.dgvShiftPlan; DataGridViewSelectedRowCollection rows = dgv.SelectedRows; if (rows.Count == 0) return; for (int i = rows.Count - 1; i >= 0; i--) { DataGridViewRow row = rows[i]; int id = int.Parse(row.Cells["Id"].Value.ToString()); dgv.Rows.Remove(row); dgv.EndEdit(); } } private void btnShiptPlanSave_Click(object sender, EventArgs e) { /*排班计划保存*/ DataTable dataTable = dtScheduleSetup; int n = dataTable.Rows.Count; //生成ScheduleTypeId字段值 List list = new List(); for (int i = 0; i < n; i++) { DataRow dr = dataTable.Rows[i]; if (dr.RowState != DataRowState.Deleted) { list.Clear(); for (int j = 1; j < 14; j++) { //var str = dgvShiftPlan.Rows[i].Cells["Day" + j.ToString()].Value; //if (str != null && str.ToString() != "") //{ // int id = getSchedulingTypeId(str.ToString()); // if (id > 0) // { // dr["Day" + j.ToString()] = id; // list.Add(id); // } //} int id = getSchedulingTypeId(dr["Day" + j.ToString()].ToString()); if (id > 0) { list.Add(id); } else { break; } } string strTypeId = ""; if (list.Count > 0) { strTypeId = string.Join("|", list); } dr["ScheduleTypeId"] = strTypeId; dr["RoundDays"] = list.Count; dr["IsValid"] = 1; } } //除去无数据空行 for (int i = n - 1; i >= 0; i--) { DataRow dr = dataTable.Rows[i]; if (dr.RowState != DataRowState.Deleted) { if (string.IsNullOrEmpty(dr["ScheduleTypeId"].ToString())) { dr.Delete(); } } } SetOperatorNo(dataTable, operatorId.ToString()); try { dbHelper.BeginTransaction(); n = dbHelper.DataTableSave(dataTable, "select id, ScheduleName, ScheduleTypeId, RoundDays, IsValid, OperatorNo, OperatorTime from ScheduleSetup"); dbHelper.Commit(); dataTable.AcceptChanges(); MessageBox.Show("保存成功。", "提示信息"); } catch (Exception ex) { dbHelper.RollBack(); MessageBox.Show("保存失败:" + ex.Message, "提示信息"); } } private void btnShiftPlanFresh_Click(object sender, EventArgs e) { /*刷新排班计划*/ GetDataTableShiftPlan(); } private void dateTimePicker1_ValueChanged(object sender, EventArgs e) { /*改变月份*/ GetDataTableSchedulingNew(); } private frmPersonSchedulOption formOption = new frmPersonSchedulOption(); private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { /*在主排班表格的日期格上点鼠标右键, 进行排班设置*/ if (e.Button == MouseButtons.Right) { DataGridView dgv = this.dataGridView1; string columnName = dgv.Columns[e.ColumnIndex].Name; if (columnName.StartsWith("Date")) { int rowIndex = e.RowIndex; DataGridViewSelectedRowCollection rows = this.dgvShiftPlan.SelectedRows; if (rows.Count == 0) { MessageBox.Show("请选中排班计划行", "提示信息"); return; } /*读取排班计划班次名称数组*/ List list = new List(); DataGridViewRow dr = rows[0]; int i = 1; while (i <= 13) { string shiftName = dr.Cells["Day" + i.ToString()].Value.ToString(); if (!string.IsNullOrEmpty(shiftName)) { list.Add(shiftName); i++; } else { break; } } if (list.Count == 0) { MessageBox.Show("请选中排班计划行班次数据不正确。", "提示信息"); return; } DateTime dateTime = this.dateTimePicker1.Value; formOption.month = dateTime.Month; int dayMax = (new DateTime(dateTime.Year, dateTime.Month, 1)).AddMonths(1).AddDays(-1).Day; formOption.dayMax = dayMax; formOption.shiftPlan = list.ToArray(); formOption.shiftPlanRow = dr.Index; formOption.selectedDay1 = Convert.ToInt32(columnName.Substring(4)); formOption.ShowDialog(); if (formOption.DialogResult == System.Windows.Forms.DialogResult.OK) { /*对选中行进行排班*/ int selectDay1 = formOption.selectedDay1; int selectDay2 = formOption.selectedDay2; bool clearOthers = formOption.clearOthers; int columnIndex = formOption.shiftPlanColumn; int shiftLen = list.Count; dr = dgv.CurrentRow; /*设置值*/ int cIndex; for (int x = 0, n = dgv.Rows.Count; x < n; x++) { dr = dgv.Rows[x]; if (int.Parse(dr.Cells["colChecked"].Value.ToString()) == 1) { /*设置值*/ cIndex = (columnIndex - 1) % shiftLen; for (int j = selectDay1; j <= selectDay2; j++) { int index = (cIndex++) % shiftLen; dr.Cells["Date" + j.ToString()].Value = list[index]; } /*是否清空其它项*/ if (clearOthers) { for (int j = 1; j < selectDay1; j++) { dr.Cells["Date" + j.ToString()].Value = ""; } for (int j = selectDay2 + 1; j <= dayMax; j++) { dr.Cells["Date" + j.ToString()].Value = ""; } } } dgv.EndEdit(); } } } } } private void btnDelete_Click(object sender, EventArgs e) { /*清除选中行和当前行的数据*/ DataGridView dgv = this.dataGridView1; DateTime dateTime = this.dateTimePicker1.Value; int dayMax = (new DateTime(dateTime.Year, dateTime.Month, 1)).AddMonths(1).AddDays(-1).Day; for (int x = 0, n = dgv.Rows.Count; x < n; x++) { DataGridViewRow dr = dgv.Rows[x]; if (int.Parse(dr.Cells["colChecked"].Value.ToString()) == 1) { for (int j = 1; j <= dayMax; j++) { dr.Cells["Date" + j.ToString()].Value = ""; } } dgv.EndEdit(); } } private void textFind_TextChanged(object sender, EventArgs e) { /*过滤姓名*/ string text = textFind.Text.Trim(); DataView dv = dtMainTable.DefaultView; dv.RowFilter = string.Format("Name like '%{0}%' or HCode like '%{0}%'", text); } private void chxOnlyShiftPlan_CheckedChanged(object sender, EventArgs e) { /*只显示有数据部分*/ if (!chxOnlyShiftPlan.Checked) { dtMainTable.DefaultView.RowFilter = ""; return; } DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; int dayMax = (new DateTime(year, month, 1)).AddMonths(1).AddDays(-1).Day; StringBuilder sb = new StringBuilder(); sb.Append("len(Date1) >0"); for (int i = 2; i <= dayMax; i++) { sb.Append(string.Format(" or len(Date{0})>0", i.ToString())); } dtMainTable.DefaultView.RowFilter = sb.ToString(); } private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) { /*全选和全非选之间进行切换*/ if (e.ColumnIndex == 0) { DataGridView dgv = this.dataGridView1; string colname = dgv.Columns[0].Name; int n = dgv.Rows.Count; if (n > 0) { bool isChecked = ((int)dgv.Rows[0].Cells[0].Value == 1); int v = (isChecked ? 0 : 1); for (int i = 0; i < n; i++) { dgv.Rows[i].Cells[0].Value = v; } dgv.EndEdit(); } } } private void btnExcel_Click(object sender, EventArgs e) { /*排班表导出Excel*/ //GPControls.ExportToExcel(this.labelScheduling.Text + "表", this.dataGridView1, new int[] { 0, 1 }); } private void btnAttendance_Click(object sender, EventArgs e) { frmPersonSchedulKeep form = new frmPersonSchedulKeep(); form.Show(); } private void btnPrint_Click(object sender, EventArgs e) { try { /*打印排班表*/ bool oldChecked = chxOnlyShiftPlan.Checked; chxOnlyShiftPlan.Checked = true; DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; DateTime monthFirstDay = new DateTime(year, month, 1); DateTime monthLastDay = (new DateTime(year, month, 1)).AddMonths(1).AddDays(-1); int dayMax = monthLastDay.Day; DataGridView dgv = this.dataGridView1; int rowsCount = dgv.Rows.Count; string filepath = string.Format("{0}\\Template\\排班按月.xlt", AppDomain.CurrentDomain.BaseDirectory); GoldPrinter.ExcelAccess excel = new GoldPrinter.ExcelAccess(); excel.IsVisibledExcel = false; excel.Open(filepath); Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.Workbooks.ActiveSheet; string strTitle; strTitle = PublicMethod.HospitalName; excel.SetCellText(1, "A", strTitle); /*标题*/ strTitle = (radioDoctor.Checked) ? "麻醉医生" : "护士"; excel.SetCellText(2, "A", string.Format("{0}年{1}月 {2}", year, month, strTitle)); Microsoft.Office.Interop.Excel.Range range; DataGridViewRow drv; /*填写16-31日的姓名标题,合并姓名单元格*/ range = xlSheet.Range[xlSheet.Cells[6 + rowsCount, 1], xlSheet.Cells[8 + rowsCount, 1]]; range.Merge(System.Reflection.Missing.Value); range.Font.Color = Color.Red; //红色 xlSheet.Cells[6 + rowsCount, 1] = "姓名"; xlSheet.Cells[6 + rowsCount, 2] = "阴历"; xlSheet.Cells[7 + rowsCount, 2] = "阳历"; xlSheet.Cells[8 + rowsCount, 2] = "星期"; /*设置标题栏红色*/ range = xlSheet.Range[xlSheet.Cells[3, 2], xlSheet.Cells[5, 20]]; range.Font.Color = Color.Red; //红色 range = xlSheet.Range[xlSheet.Cells[6 + rowsCount, 2], xlSheet.Cells[8 + rowsCount, 20]]; range.Font.Color = Color.Red; //红色 /*填写姓名*/ for (int j = 0; j < rowsCount; j++) { drv = dgv.Rows[j]; string name = drv.Cells["colName"].FormattedValue.ToString(); range = xlSheet.Range[xlSheet.Cells[j + 6, 1], xlSheet.Cells[j + 6, 2]]; range.Merge(System.Reflection.Missing.Value); xlSheet.Cells[j + 6, 1] = name; range = xlSheet.Range[xlSheet.Cells[j + 9 + rowsCount, 1], xlSheet.Cells[j + 9 + rowsCount, 2]]; range.Merge(System.Reflection.Missing.Value); xlSheet.Cells[j + 9 + rowsCount, 1] = name; } /*填写日期中的班次*/ for (int i = 1; i <= dayMax; i++) { int colIndex; if (i <= 16) { colIndex = i + 2; /*填充日期表头*/ xlSheet.Cells[3, colIndex] = listHeaderDays[i - 1]; xlSheet.Cells[4, colIndex] = listHeaderChinese[i - 1]; xlSheet.Cells[5, colIndex] = listHeaderWeek[i - 1]; for (int j = 0; j < rowsCount; j++) { xlSheet.Cells[j + 6, colIndex] = dgv.Rows[j].Cells["Date" + i.ToString()].FormattedValue.ToString(); } } else { colIndex = i - 14; xlSheet.Cells[6 + rowsCount, colIndex] = listHeaderDays[i - 1]; xlSheet.Cells[7 + rowsCount, colIndex] = listHeaderChinese[i - 1]; xlSheet.Cells[8 + rowsCount, colIndex] = listHeaderWeek[i - 1]; for (int j = 0; j < rowsCount; j++) { xlSheet.Cells[j + 9 + rowsCount, colIndex] = dgv.Rows[j].Cells["Date" + i.ToString()].FormattedValue; } } Application.DoEvents(); } ///*删除模板中多余的整行*/ string rowstr = string.Format("{0}:500", rowsCount * 2 + 9); range = (Microsoft.Office.Interop.Excel.Range)xlSheet.Rows[rowstr, Type.Missing]; range.Rows.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp); /*设置打印为1页宽*/ xlSheet.PageSetup.FitToPagesWide = 1; excel.PrintPreview(); excel.Close(); chxOnlyShiftPlan.Checked = oldChecked; } catch (Exception exp) { MessageBox.Show(exp.Message); PublicMethod.WriteLog(exp, ""); } } private void btnPrintAttendance_Click(object sender, EventArgs e) { /*打印出缺勤表*/ DateTime dateTime = this.dateTimePicker1.Value; int year = dateTime.Year; int month = dateTime.Month; DateTime monthFirstDay = new DateTime(year, month, 1); DateTime nextMonthFirstDay = monthFirstDay.AddMonths(1); int dayMax = nextMonthFirstDay.AddDays(-1).Day; string sql = string.Format("SELECT a.WorkerId, w.[Name], Day(a.SchedulingDate) as [Day], a.WorkersType, a.OverHours, a.LackHours FROM ScheduleOverLackHours a inner join Person w on a.WorkerId = w.id WHERE SchedulingDate >= '{0}' AND SchedulingDate<'{1}' order by WorkersType desc, w.PersonOrder, [Day]", GPFunctions.DateStr(monthFirstDay), GPFunctions.DateStr(nextMonthFirstDay)); System.Data.DataTable dataTable = dbHelper.GetDataTable(sql); GoldPrinter.ExcelAccess excel = new GoldPrinter.ExcelAccess(); excel.IsVisibledExcel = false; string filepath = string.Format("{0}\\Template\\职工出缺勤表.xlt", Application.StartupPath); excel.Open(filepath); Microsoft.Office.Interop.Excel.Worksheet xlSheet = (Microsoft.Office.Interop.Excel.Worksheet)excel.Workbooks.ActiveSheet; string strTitle = "职工出(缺)勤表"; excel.SetCellText(1, "A", strTitle); excel.SetCellText(2, "E", string.Format("{0} 年 {1} 月", year, month)); int rowsCount = dataTable.Rows.Count; decimal sumOverHours = 0, sumLackHours = 0; int prewWorkId = 0; int workerNumber = 0; int rowsNumber = 0; Microsoft.Office.Interop.Excel.Range range; switch (dayMax) { case 30: ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0; break; case 29: ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0; ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 32]).EntireColumn.ColumnWidth = 0; break; case 28: ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 33]).EntireColumn.ColumnWidth = 0; ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 32]).EntireColumn.ColumnWidth = 0; ((Microsoft.Office.Interop.Excel.Range)xlSheet.Cells[1, 31]).EntireColumn.ColumnWidth = 0; break; default: break; } for (int i = 0; i < rowsCount; i++) { decimal overHours, lackHours; DataRow dr = dataTable.Rows[i]; int workerId = Convert.ToInt32(dr["WorkerId"]); int day = Convert.ToInt32(dr["Day"]); overHours = GPFunctions.CDecimal(dr["OverHours"]); lackHours = GPFunctions.CDecimal(dr["LackHours"]); if (workerId == prewWorkId) { sumOverHours += overHours; sumLackHours += lackHours; } else { /*合并姓名单元格, 填入名称*/ workerNumber++; rowsNumber = 4 + (workerNumber - 1) * 2; range = xlSheet.Range[xlSheet.Cells[rowsNumber, 1], xlSheet.Cells[rowsNumber + 1, 1]]; range.Merge(System.Reflection.Missing.Value); xlSheet.Cells[rowsNumber, 1] = dr["Name"].ToString(); xlSheet.Cells[rowsNumber, 2] = "加班"; xlSheet.Cells[rowsNumber + 1, 2] = "缺勤"; range = xlSheet.Range[xlSheet.Cells[rowsNumber, "AI"], xlSheet.Cells[rowsNumber + 1, "AI"]]; range.Merge(System.Reflection.Missing.Value); /*设置缺勤行字体颜色*/ rowsNumber = rowsNumber + 1; range = xlSheet.Range[xlSheet.Cells[rowsNumber, 2], xlSheet.Cells[rowsNumber, 34]]; range.Font.Color = Color.Red; //红色 if (workerNumber > 1) { /*填写上一个职工行的合计数*/ rowsNumber = 4 + (workerNumber - 2) * 2; if (sumOverHours > 0) xlSheet.Cells[rowsNumber, "AH"] = sumOverHours; if (sumLackHours > 0) xlSheet.Cells[rowsNumber + 1, "AH"] = sumLackHours; /*合并累计单元格*/ xlSheet.Cells[rowsNumber, "AI"] = sumOverHours - sumLackHours; if (sumOverHours - sumLackHours < 0) { /*累计小于0,红色显示*/ range.Font.Color = Color.Red; //红色 } } sumOverHours = overHours; sumLackHours = lackHours; prewWorkId = workerId; } /*填入加班和缺勤缺勤小时数*/ rowsNumber = 4 + (workerNumber - 1) * 2; if (overHours > 0) xlSheet.Cells[rowsNumber, 2 + day] = overHours; if (lackHours > 0) xlSheet.Cells[rowsNumber + 1, 2 + day] = lackHours; Application.DoEvents(); } if (workerNumber > 0) { /*填写最后一个职工行的合计数*/ rowsNumber = 4 + (workerNumber - 1) * 2; if (sumOverHours > 0) xlSheet.Cells[rowsNumber, "AH"] = sumOverHours; if (sumLackHours > 0) xlSheet.Cells[rowsNumber + 1, "AH"] = sumLackHours; xlSheet.Cells[rowsNumber, "AI"] = sumOverHours - sumLackHours; if (sumOverHours - sumLackHours < 0) { /*累计小于0,红色显示*/ range = xlSheet.Range[xlSheet.Cells[rowsNumber, "AI"], xlSheet.Cells[rowsNumber, "AI"]]; range.Font.Color = Color.Red; //红色 } } excel.PrintPreview(); excel.Close(); } private void btnUp_Click(object sender, EventArgs e) { /*对选中行向上移动*/ DataTable dataTable = dtMainTable; if (dataTable == null) return; int rowsCount = dataTable.Rows.Count; int workId, xh, xh2; Dictionary dic = new Dictionary(); bool ischecked = false; for (int i = 0; i < rowsCount; i++) { DataRow dr = dataTable.Rows[i]; if (!ischecked) { ischecked = (int.Parse(dr["ColChecked"].ToString()) == 1); } workId = Convert.ToInt32(dr["WorkerId"]); xh = Convert.ToInt32(dr["xh"]); dic[workId] = xh; } if (!ischecked) return; DataGridView dgv = this.dataGridView1; int dgvCount = dgv.Rows.Count; int p = FindNextUncheckedCheckIndex(dgv, 0); if (p < 0) return; int p2 = 0; while (p >= 0) { p2 = FindNextUncheckedIndex(dgv, p + 1); if (p2 < p) { p2 = dgvCount; } workId = Convert.ToInt32(dgv.Rows[p].Cells["WorkerId"].Value); xh = Convert.ToInt32(dgv.Rows[p2 - 1].Cells["ColXh"].Value); dic[workId] = xh; for (int j = p + 1; j < p2; j++) { workId = Convert.ToInt32(dgv.Rows[j].Cells["WorkerId"].Value); xh = Convert.ToInt32(dgv.Rows[j - 1].Cells["ColXh"].Value); dic[workId] = xh; } if (p2 < p) break; p = FindNextUncheckedCheckIndex(dgv, p2); } for (int i = 0; i < rowsCount; i++) { DataRow dr = dataTable.Rows[i]; workId = Convert.ToInt32(dr["WorkerId"]); xh = Convert.ToInt32(dr["xh"]); xh2 = dic[workId]; if (xh != xh2) dr["xh"] = xh2; } } /// /// 找出下一个:本行没有选中而下一行是选中的行的index /// /// /// /// private int FindNextUncheckedCheckIndex(DataGridView dgv, int start) { int index = -1; if (start < 0) return -1; int n = dgv.Rows.Count - 1; if (start >= n) return -1; for (int i = start; i < n; i++) { if (int.Parse(dgv.Rows[i].Cells["ColChecked"].Value.ToString()) == 0 && int.Parse(dgv.Rows[i + 1].Cells["ColChecked"].Value.ToString()) == 1) { index = i; break; } } return index; } /// /// 找出下一个:没有选中的行的index /// /// /// /// private int FindNextUncheckedIndex(DataGridView dgv, int start) { int index = -1; if (start < 0) return -1; int n = dgv.Rows.Count - 1; for (int i = start; i < n; i++) { if (int.Parse(dgv.Rows[i].Cells["ColChecked"].Value.ToString()) == 0) { index = i; break; } } return index; } /// /// 对选中行向下移动 /// /// /// private void btnDown_Click(object sender, EventArgs e) { DataTable dataTable = dtMainTable; if (dataTable == null) return; int rowsCount = dataTable.Rows.Count; int workId, xh, xh2; Dictionary dic = new Dictionary(); bool ischecked = false; for (int i = 0; i < rowsCount; i++) { DataRow dr = dataTable.Rows[i]; if (!ischecked) { ischecked = (int.Parse(dr["ColChecked"].ToString()) == 1); } workId = Convert.ToInt32(dr["WorkerId"]); xh = Convert.ToInt32(dr["xh"]); dic[workId] = xh; } if (!ischecked) return; DataGridView dgv = this.dataGridView1; int dgvCount = dgv.Rows.Count; int p = FindNextCheckedIndex(dgv, 0); int p2 = 0; while (p >= 0) { if (p < 0) return; p2 = FindNextCheckedUnCheckIndex(dgv, p); if (p2 < p) { break; } workId = Convert.ToInt32(dgv.Rows[p2].Cells["WorkerId"].Value); xh = Convert.ToInt32(dgv.Rows[p].Cells["ColXh"].Value); dic[workId] = xh; for (int j = p; j < p2; j++) { workId = Convert.ToInt32(dgv.Rows[j].Cells["WorkerId"].Value); xh = Convert.ToInt32(dgv.Rows[j + 1].Cells["ColXh"].Value); dic[workId] = xh; } p = FindNextUncheckedCheckIndex(dgv, p2); } for (int i = 0; i < rowsCount; i++) { DataRow dr = dataTable.Rows[i]; workId = Convert.ToInt32(dr["WorkerId"]); xh = Convert.ToInt32(dr["xh"]); xh2 = dic[workId]; if (xh != xh2) dr["xh"] = xh2; } } /// /// 找出下一个:本行没有选中而上一行选中的行的index /// /// /// /// private int FindNextCheckedUnCheckIndex(DataGridView dgv, int start) { int index = -1; if (start < 0) return -1; int n = dgv.Rows.Count - 1; if (start >= n) return -1; for (int i = start; i < n; i++) { if (int.Parse(dgv.Rows[i].Cells["ColChecked"].Value.ToString()) == 1 && int.Parse(dgv.Rows[i + 1].Cells["ColChecked"].Value.ToString()) == 0) { index = i + 1; break; } } return index; } /// /// 找出下一个:选中的行的index /// /// /// /// private int FindNextCheckedIndex(DataGridView dgv, int start) { int index = -1; if (start < 0) return -1; int n = dgv.Rows.Count - 1; for (int i = start; i < n; i++) { if (int.Parse(dgv.Rows[i].Cells["ColChecked"].Value.ToString()) == 1) { index = i; break; } } return index; } private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) { /*修改排序值时事件*/ DataGridView dgv = this.dataGridView1; int colIndex = e.ColumnIndex; string columnName = dgv.Columns[colIndex].Name; if (columnName == "ColXh") { int rowIndex = e.RowIndex; int editVal = int.Parse(dgv.Rows[rowIndex].Cells[colIndex].Value.ToString()); int editWorkerId = Convert.ToInt32(dgv.Rows[rowIndex].Cells["WorkerId"].Value); DataTable dataTable = dtMainTable; int rowsCount = dataTable.Rows.Count; if (editVal < 1 || editVal > rowsCount) { if (editVal < 1) editVal = 1; else editVal = rowsCount; } Dictionary dic = new Dictionary(); int workerId, xh; for (int i = 0; i < rowsCount; i++) { DataRow dr = dataTable.Rows[i]; workerId = Convert.ToInt32(dr["WorkerId"]); xh = Convert.ToInt32(dr["xh"]); if (workerId == editWorkerId) { xh = editVal; } else { if (xh >= editVal) { xh = xh + 1; } } dic[workerId] = xh; } for (int i = 0; i < rowsCount; i++) { DataRow dr = dataTable.Rows[i]; workerId = Convert.ToInt32(dr["WorkerId"]); xh = Convert.ToInt32(dr["xh"]); int xh2 = dic[workerId]; if (xh != xh2) dr["xh"] = xh2; } dtMainTable.DefaultView.Sort = "xh"; } } private void btnFresh_Click(object sender, EventArgs e) { /*不保存调出原来的数据*/ GetDataTableSchedulingNew(); } private void chxHasInvaild_CheckedChanged(object sender, EventArgs e) { FreshDicSchedulingType(); } /// /// 错误信息屏蔽 /// /// /// private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e) { } private void dgvShiftPlan_DataError(object sender, DataGridViewDataErrorEventArgs e) { } private void dgvSchedulingType_DataError(object sender, DataGridViewDataErrorEventArgs e) { } private void btnClearChecked_Click(object sender, EventArgs e) { DataGridView dgv = this.dataGridView1; for (int i = 0, n = dgv.Rows.Count; i < n; i++) { DataGridViewRow dr = dgv.Rows[i]; if (int.Parse(dr.Cells["colChecked"].Value.ToString()) == 1) { /*设置值*/ dr.Cells["colChecked"].Value = 0; } } dgv.EndEdit(); } private void FrmScheduling2_FormClosing(object sender, FormClosingEventArgs e) { /*退出前,判断是否保存, 提示用户是否退出?*/ this.dataGridView1.EndEdit(); int n = GetDataTableChangedCount(dtMainTable); if (n > 0) { if (MessageBox.Show("数据修改后没有保存,是否继续退出?", "提示信息", MessageBoxButtons.YesNo) == DialogResult.No) { e.Cancel = true; } } } private void chxModified_CheckedChanged(object sender, EventArgs e) { DataGridView dgv = this.dataGridView1; string[] items; if (!chxModified.Checked) { items = ArrayAddEmptyValue(dicSchedulingTypeNameId.Keys.ToArray()); Array.Sort(items); } else { items = validSchedulingTypes; } for (int i = 1; i <= 31; i++) { string columnName = string.Format("Date{0}", i); DataGridViewComboBoxColumn cbxColumn = (DataGridViewComboBoxColumn)dgv.Columns[columnName]; cbxColumn.Items.Clear(); cbxColumn.Items.AddRange(items); } dgv.Update(); } public static int GetDataTableChangedCount(DataTable dataTable) { int num = 0; bool flag = dataTable == null; int result; if (flag) { result = 0; } else { foreach (DataRow dataRow in dataTable.Rows) { bool flag2 = dataRow.RowState != DataRowState.Unchanged; if (flag2) { num++; } } result = num; } return result; } private void dgvShiftPlan_CellClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == -1 || e.RowIndex == -1) return; int x = dgvShiftPlan.CurrentCell.ColumnIndex;//获取鼠标的点击列 if (x == 0)//点击第一列是单选。 { for (int i = 0; i < dgvShiftPlan.Rows.Count; i++) { DataGridViewCheckBoxCell checkcell = (DataGridViewCheckBoxCell)dgvShiftPlan.Rows[i].Cells[0]; checkcell.Value = false; } DataGridViewCheckBoxCell ifcheck = (DataGridViewCheckBoxCell)dgvShiftPlan.Rows[e.RowIndex].Cells[0]; ifcheck.Value = true; } } private void btnupMonth_Click(object sender, EventArgs e) { dateTimePicker1.Value = dateTimePicker1.Value.AddMonths(-1); } private void btnDownMonth_Click(object sender, EventArgs e) { dateTimePicker1.Value = dateTimePicker1.Value.AddMonths(1); } } }