AIMS/AIMS.UI/OperationFront/frmPersonSchedulKeep.cs
2023-08-13 21:05:09 +08:00

1069 lines
46 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AIMSExtension;
using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace AIMS.OperationFront.UI
{
public partial class frmPersonSchedulKeep : Form
{
private bool isDataLoaded = false;
private System.Data.DataTable dtDoctorNurses = null;
private System.Data.DataTable dtSchedulingType = null;
private System.Data.DataTable dtOverLackHours = null;
private System.Data.DataTable dtMainTable = null;
private System.Data.DataTable dtSchedulingNew = null;
private Dictionary<int, string> dicSchedulingTypeIdName = new Dictionary<int, string>();
private Dictionary<string, int> dicSchedulingTypeNameId = new Dictionary<string, int>();
private GPDbHelper dbHelper = new GPDbHelper();
public frmPersonSchedulKeep()
{
InitializeComponent();
}
/// <summary>
/// 由班次Id获取班次名称
/// </summary>
/// <param name="id">班次Id</param>
/// <returns></returns>
private string getSchedulingTypeName(int id)
{
if (dicSchedulingTypeIdName.ContainsKey(id))
{
return dicSchedulingTypeIdName[id];
}
return "";
}
/// <summary>
/// 由班次名称获取班次Id
/// </summary>
/// <param name="name">班次名称</param>
/// <returns></returns>
private int getSchedulingTypeId(string name)
{
if (dicSchedulingTypeNameId.ContainsKey(name))
{
return dicSchedulingTypeNameId[name];
}
return 0;
}
/// <summary>
/// 字符串数组加空项
/// </summary>
/// <param name="items">字符串数组</param>
/// <returns></returns>
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 FrmDeptAttendance_Load(object sender, EventArgs e)
{
//dbHelper = new GPDbHelper();
//this.dataGridView1.RowPostPaint += GPControls.DataGridView_RowPostPaint;
GetMainDataTable();
this.WindowState = FormWindowState.Maximized;
this.dataGridView1.EditMode = System.Windows.Forms.DataGridViewEditMode.EditOnEnter;
}
/// <summary>
/// 结构时间(小时 分钟)
/// </summary>
struct MyHourMinute
{
public int hour;
public int minute;
}
/// <summary>
/// 上下班时间
/// </summary>
struct MySxbTime
{
public DateTime sbTime;
public DateTime xbTime;
}
/// <summary>
/// 由时间字符串解析出结构时间
/// </summary>
/// <param name="time">时间字符串</param>
/// <returns></returns>
private MyHourMinute GetMyHourMinute(string time)
{
MyHourMinute hm;
hm.hour = -1; /*不正确的时间表示*/
hm.minute = 0;
if (string.IsNullOrEmpty(time)) return hm;
int[] arr = GPFunctions.StringToIntArray(time, ':');
if (arr.Length == 2)
{
hm.minute = arr[1];
}
hm.hour = arr[0];
return hm;
}
/// <summary>
/// 由上下班时间字符串解析出上下班时间
/// </summary>
/// <param name="beginTime">上班时间字符</param>
/// <param name="endTime">下班时间字符</param>
/// <returns></returns>
private MySxbTime GetMySxbTime(string beginTime, string endTime)
{
/*获取上下班时间, 如果下班时间早于上班时间,则无效*/
MySxbTime sxbTime;
DateTime dateTime = this.dateTimePicker1.Value.Date;
if (string.IsNullOrEmpty(beginTime) || string.IsNullOrEmpty(endTime))
{
sxbTime.sbTime = dateTime;
sxbTime.xbTime = dateTime.AddDays(-1);
return sxbTime;
}
MyHourMinute 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;
}
/// <summary>
/// 读取主显示表数据
/// </summary>
private void GetMainDataTable()
{
if (dtMainTable != null)
{
if (GPFunData.GetDataTableChangedCount(dtMainTable) > 0)
{
if (MessageBox.Show("数据有修改,没有保存,是否要保存?", "提示信息", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
SaveData();
}
}
}
isDataLoaded = false;
DateTime dateTime = this.dateTimePicker1.Value.Date;
int year = dateTime.Year;
int month = dateTime.Month;
int day = dateTime.Day;
string sql;
/*读取手术麻醉科的医生WorkersType=2护士信息 WorkersType=*/
if (chxInvalidWorker.Checked)
{
if (radioDoctor.Checked)
{
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,2 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' order by w.[PersonOrder] ";
}
else
{
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,1 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' order by w.[PersonOrder] ";
}
}
else
{
if (radioDoctor.Checked)
{
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,2 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='麻醉医生' and w.IsValid=1 order by w.[PersonOrder] ";
}
else
{
sql = "select w.Id, w.[Name], w.[HelpCode] HCode,w.No WorkNo,1 WorkersType, w.[PersonOrder] Orderby from Person as w where w.PersonType='手术室护士' and w.IsValid=1 order by w.[PersonOrder] ";
}
}
dtDoctorNurses = dbHelper.GetDataTable(sql);
sql = "select Id, [Name], BeginTime, EndTime from SchedulingType";
dtSchedulingType = dbHelper.GetDataTable(sql);
dicSchedulingTypeIdName.Clear();
dicSchedulingTypeNameId.Clear();
foreach (DataRow dr in dtSchedulingType.Rows)
{
int id = (int)dr["Id"];
string name = dr["Name"].ToString();
dicSchedulingTypeIdName[id] = name;
dicSchedulingTypeNameId[name] = id;
}
DataGridView dgv = this.dataGridView1;
dgv.AutoGenerateColumns = false;
sql = string.Format("SELECT Id, WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2 from ScheduleOverLackHours where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime));
dtOverLackHours = dbHelper.GetDataTable(sql);
sql = string.Format("select Id, WorkerId, SchedulingDate, SchedulingType from SchedulingNew where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime));
dtSchedulingNew = dbHelper.GetDataTable(sql);
DataView dvWorkers = dtDoctorNurses.DefaultView;
DataView dvOverLackHours = dtOverLackHours.DefaultView;
DataView dvSchedulingNew = dtSchedulingNew.DefaultView;
DataView dvSchedulingType = dtSchedulingType.DefaultView;
System.Data.DataTable dataTable = dtOverLackHours.Clone();
dataTable.Columns.Add("SchedulingTypeName", typeof(string));
dataTable.Columns.Add("WorkNo", typeof(string));
dataTable.Columns.Add("HCode", typeof(string));
dataTable.Columns.Add("Name", typeof(string));
dataTable.Columns.Add("RoleName", typeof(string));
dataTable.Columns.Add("BeginTime2", typeof(DateTime));
dataTable.Columns.Add("EndTime2", typeof(DateTime));
bool isNurse = radioNurse.Checked;
if (!isNurse)
{
dvWorkers.RowFilter = "WorkersType=2";
}
else
{
dvWorkers.RowFilter = "WorkersType=1";
}
dvWorkers.Sort = "OrderBy";
int n = dvWorkers.Count;
for (int i = 0; i < n; i++)
{
DataRow dr = dataTable.NewRow();
DataRowView dvr = dvWorkers[i];
/*WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2*/
int workerId = (int)dvr["id"];
int workersType = (int)dvr["WorkersType"];
int SchedulingTypeId = 0;
string beginTime, endTime;
MySxbTime sxbTime;
dr["WorkerId"] = (int)dvr["Id"];
dr["WorkersType"] = workersType;
dr["WorkNo"] = dvr["WorkNo"].ToString();
dr["Name"] = dvr["Name"].ToString();
dr["HCode"] = dvr["HCode"].ToString();
dr["RoleName"] = (workersType == 2 ? "医生" : "护士");
dr["SchedulingDate"] = dateTime;
dvOverLackHours.RowFilter = string.Format("WorkerId={0}", workerId);
if (dvOverLackHours.Count > 0)
{
SchedulingTypeId = GPFunctions.CInt(dvOverLackHours[0]["SchedulingTypeId"]);
dr["SchedulingTypeId"] = SchedulingTypeId;
if (SchedulingTypeId > 0)
{
dr["SchedulingTypeName"] = getSchedulingTypeName(SchedulingTypeId);
beginTime = dvOverLackHours[0]["BeginTime"].ToString();
endTime = dvOverLackHours[0]["EndTime"].ToString();
dr["BeginTime"] = beginTime;
dr["EndTime"] = endTime;
sxbTime = GetMySxbTime(beginTime, endTime);
if (sxbTime.sbTime.CompareTo(sxbTime.xbTime) < 0)
{
dr["BeginTime2"] = sxbTime.sbTime;
dr["EndTime2"] = sxbTime.xbTime;
}
}
dr["OverHours"] = dvOverLackHours[0]["OverHours"];
dr["LackHours"] = dvOverLackHours[0]["LackHours"];
dr["OverTime1"] = dvOverLackHours[0]["OverTime1"];
dr["OverTime2"] = dvOverLackHours[0]["OverTime2"];
dr["LackTime1"] = dvOverLackHours[0]["LackTime1"];
dr["LackTime2"] = dvOverLackHours[0]["LackTime2"];
}
else
{
dvSchedulingNew.RowFilter = string.Format("WorkerId={0}", workerId);
if (dvSchedulingNew.Count > 0)
{
SchedulingTypeId = (int)dvSchedulingNew[0]["SchedulingType"];
dr["SchedulingTypeId"] = SchedulingTypeId;
dr["SchedulingTypeName"] = getSchedulingTypeName(SchedulingTypeId);
dvSchedulingType.RowFilter = string.Format("Id={0}", SchedulingTypeId);
if (dvSchedulingType.Count > 0)
{
beginTime = dvSchedulingType[0]["beginTime"].ToString();
endTime = dvSchedulingType[0]["endTime"].ToString();
dr["BeginTime"] = beginTime;
dr["EndTime"] = endTime;
sxbTime = GetMySxbTime(beginTime, endTime);
dr["BeginTime2"] = sxbTime.sbTime;
dr["EndTime2"] = sxbTime.xbTime;
dr["OverTime1"] = sxbTime.xbTime;
dr["OverTime2"] = sxbTime.xbTime;
dr["LackTime1"] = sxbTime.xbTime;
dr["LackTime2"] = sxbTime.xbTime;
}
}
}
dataTable.Rows.Add(dr);
}
dataTable.AcceptChanges();
this.dataGridView1.DataSource = dataTable;
dtMainTable = dataTable;
DisplayTotalInfo(new string[] { "OverHours", "LackHours" }, new string[] { "加班小时数", "缺勤小时数" });
isDataLoaded = true;
}
private void btnExit_Click(object sender, EventArgs e)
{
this.Close();
}
private void button1_Click(object sender, EventArgs e)
{
ExportToExcel(string.Format("{0}考勤缺勤表.xls", this.dateTimePicker1.Value.ToString("yyyy-MM-dd")), this.dataGridView1);
}
private void textFind_TextChanged(object sender, EventArgs e)
{
string text = textFind.Text.Trim();
dtMainTable.DefaultView.RowFilter = string.Format("WorkNo like '%{0}%' or Name like '%{0}%' or HCode like '%{0}%' ", text);
}
private void radioDoctor_CheckedChanged(object sender, EventArgs e)
{
GetMainDataTable();
}
private void radioNurse_CheckedChanged(object sender, EventArgs e)
{
GetMainDataTable();
}
private void dateTimePicker1_ValueChanged(object sender, EventArgs e)
{
GetMainDataTable();
}
private void chxInvalidWorker_CheckedChanged(object sender, EventArgs e)
{
GetMainDataTable();
}
private void btnFresh_Click(object sender, EventArgs e)
{
GetMainDataTable();
}
/// <summary>
/// 显示汇总数据
/// </summary>
/// <param name="fieldname">汇总字段列表</param>
/// <param name="displayname">汇总字段显示标题</param>
private void DisplayTotalInfo(string[] fieldname, string[] displayname)
{
int n = fieldname.Length;
decimal[] num = new decimal[n];
DataRowCollection rows = dtMainTable.Rows;
for (int i = 0, m = rows.Count; i < m; i++)
{
for (int j = 0; j < n; j++)
{
num[j] += GPFunctions.CDecimal(rows[i][fieldname[j]]);
}
}
StringBuilder sb = new StringBuilder();
for (int k = 0; k < n; k++)
{
sb.Append(string.Format("{0}: {1} ", displayname[k], num[k]));
}
labelTotal.Text = sb.ToString();
}
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
/*表格值修改时*/
if (!isDataLoaded) return;
DataGridView dgv = this.dataGridView1;
int rowIndex = e.RowIndex;
int colIndex = e.ColumnIndex;
string columnName = dgv.Columns[colIndex].Name;
if (string.IsNullOrEmpty(columnName)) return;
dgv.CellValueChanged -= dataGridView1_CellValueChanged;
double dblValue;
decimal overHours, lackHours;
DateTime t1, t2;
bool ischanged = false;
DataGridViewRow dvr = dgv.Rows[rowIndex];
DateTime dateTime = this.dateTimePicker1.Value.Date;
MySxbTime sxbTime;
TimeSpan ts;
switch (columnName)
{
case "SchedulingTypeName":
/*班次调为不可编辑 2020-01-10*/
//intValue = getSchedulingTypeId(dvr.Cells[colIndex].Value.ToString());
//DataView dv = dtSchedulingType.DefaultView;
//dv.RowFilter = string.Format("id={0}", intValue);
//if (dv.Count > 0)
//{
// beginTime = dv[0]["BeginTime"].ToString();
// endTime = dv[0]["EndTime"].ToString();
// dvr.Cells["SchedulingTypeId"].Value = intValue;
// dvr.Cells["BeginTime"].Value = beginTime;
// dvr.Cells["endTime"].Value = endTime;
// hm = GetMyHourMinute(beginTime);
// t1 = dateTime.AddHours(hm.hour).AddMinutes(hm.minute);
// dvr.Cells["OverTime1"].Value = t1;
// dvr.Cells["OverTime2"].Value = t1;
// hm = GetMyHourMinute(endTime);
// t2 = dateTime.AddHours(hm.hour).AddMinutes(hm.minute);
// dvr.Cells["LackTime1"].Value = t2;
// dvr.Cells["LackTime2"].Value = t2;
//}
//dgv.EndEdit();
break;
case "OverHours":
/*输入加班时数加班时数应当正数如果是负数或者0, 就自动调整为空值。
如果存在加班起点就直接计算加班终点如果不存在加班起点说明无班次就以18点做为加班起点计算加班终点。*/
overHours = GPFunctions.CDecimal(dvr.Cells[colIndex].Value);
if (overHours <= 0)
{
if (overHours < 0) MessageBox.Show(string.Format("加班时数({0}),请输入非负数。", overHours), "提示信息");
dvr.Cells["OverHours"].Value = DBNull.Value;
dvr.Cells["OverTime2"].Value = dvr.Cells["OverTime1"].Value;
}
else
{
if (dvr.Cells["OverTime1"].Value == DBNull.Value)
{
t1 = dateTime.AddHours(18);
dvr.Cells["OverTime1"].Value = t1;
}
else
{
t1 = GPFunctions.CDate(dvr.Cells["OverTime1"].Value);
}
dvr.Cells["OverTime2"].Value = t1.AddMinutes((double)overHours * 60);
}
ischanged = true;
dgv.EndEdit();
break;
case "LackHours":
/*输入缺勤时数如果存在缺勤终点就直接计算缺勤起点如果不存在缺勤终点说明无班次就以18点做为终点计算缺勤起点*/
lackHours = GPFunctions.CDecimal(dvr.Cells[colIndex].Value);
if (lackHours <= 0)
{
if (lackHours < 0) MessageBox.Show(string.Format("缺勤时数({0}),请输入非负数。", lackHours), "提示信息");
dvr.Cells["LackHours"].Value = DBNull.Value;
dvr.Cells["OverTime1"].Value = dvr.Cells["OverTime2"].Value;
}
else
{
if (dvr.Cells["LackTime2"].Value == DBNull.Value)
{
t2 = dateTime.AddHours(18);
dvr.Cells["LackTime2"].Value = t2;
}
else
{
t2 = GPFunctions.CDate(dvr.Cells["LackTime2"].Value);
}
dblValue = 0 - GPFunctions.CDbl(lackHours) * 60;
dvr.Cells["LackTime1"].Value = t2.AddMinutes(dblValue);
}
ischanged = true;
dgv.EndEdit();
break;
case "Overtime1":
/*输入加班起点时间,如果存在加班小时数,就计算终点时间。
如果不存在加班小时数,存在加班终点,且加班终点大于起点,就计算加班小时数,加班终点不大于起点, 将加班终点时设为加班起点,加班时数为空。*/
t1 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
t1 = dateTime.AddHours(t1.Hour).AddMinutes(t1.Minute);
dvr.Cells["OverTime1"].Value = t1;
overHours = GPFunctions.CDecimal(dvr.Cells["OverHours"].Value);
if (overHours.CompareTo(0) > 0)
{
t2 = t1.AddMinutes((double)overHours * 60);
dvr.Cells["OverTime2"].Value = t2;
}
else
{
if (dvr.Cells["OverTime2"].Value == DBNull.Value)
{
dvr.Cells["OverTime2"].Value = t1;
dvr.Cells["OverHours"].Value = DBNull.Value;
}
else
{
t2 = GPFunctions.CDate(dvr.Cells["OverTime2"].Value);
if (t2.CompareTo(t1) > 0)
{
ts = t2 - t1;
overHours = GPFunctions.CDecimal(ts.TotalHours);
dvr.Cells["OverHours"].Value = overHours;
}
else
{
dvr.Cells["OverTime2"].Value = t1;
dvr.Cells["OverHours"].Value = DBNull.Value;
}
}
}
ischanged = true;
dgv.EndEdit();
break;
case "Overtime2":
/*输入加班终点时间,如果存在加班起点,就计算加班小时数。
如果不存在加班起点(也一定不存在加班小时数),将加班起点时设为加班终点,加班时数为空。*/
t2 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
t2 = dateTime.AddHours(t2.Hour).AddMinutes(t2.Minute);
sxbTime.sbTime = GPFunctions.CDate(dvr.Cells["BeginTime2"].Value);
if (t2.CompareTo(sxbTime.sbTime) < 0)
{
t2 = t2.AddDays(1);
}
dvr.Cells["OverTime2"].Value = t2;
if (dvr.Cells["OverTime1"].Value == DBNull.Value)
{
dvr.Cells["OverTime1"].Value = t2;
dvr.Cells["OverHours"].Value = DBNull.Value;
}
else
{
t1 = GPFunctions.CDate(dvr.Cells["OverTime1"].Value);
if (t2.CompareTo(t1) <= 0)
{
dvr.Cells["OverTime2"].Value = t1;
dvr.Cells["OverHours"].Value = DBNull.Value;
}
else
{
ts = t2 - t1;
overHours = GPFunctions.CDecimal(ts.TotalHours);
dvr.Cells["OverHours"].Value = overHours;
}
}
ischanged = true;
dgv.EndEdit();
break;
case "LackTime1":
/*输入缺勤起点时间,如果存在缺勤终点,就计算缺勤小时数。如果不存在缺勤终点(缺勤小时数也一定不存在),将缺勤终点设为缺勤起点,缺勤小时数为空。*/
t1 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
t1 = dateTime.AddHours(t1.Hour).AddMinutes(t1.Minute);
dvr.Cells["LackTime1"].Value = t1;
if (dvr.Cells["LackTime2"].Value == DBNull.Value)
{
dvr.Cells["LackTime2"].Value = t1;
dvr.Cells["LackHours"].Value = DBNull.Value;
}
else
{
t2 = GPFunctions.CDate(dvr.Cells["LackTime2"].Value);
if (t2.CompareTo(t1) <= 0)
{
dvr.Cells["LackTime2"].Value = t1;
dvr.Cells["LackHours"].Value = DBNull.Value;
}
else
{
ts = t2 - t1;
lackHours = GPFunctions.CDecimal(ts.TotalHours);
dvr.Cells["LackHours"].Value = lackHours;
}
}
ischanged = true;
dgv.EndEdit();
break;
case "LackTime2":
/*输入缺勤终点时间,如果存在缺勤小时数,就计算缺勤起点。 如果不存在缺勤小时数,存在缺勤起点,就计算缺勤小时数。如果不存在缺勤起点(缺勤小时数也一定不存在),将缺勤起点设为缺勤终点,缺勤小时数为空。*/
t2 = GPFunctions.CDate(dvr.Cells[colIndex].Value);
t2 = dateTime.AddHours(t2.Hour).AddMinutes(t2.Minute);
sxbTime.sbTime = GPFunctions.CDate(dvr.Cells["BeginTime2"].Value);
if (t2.CompareTo(sxbTime.sbTime) < 0) t2 = t2.AddDays(1);
dvr.Cells["LackTime2"].Value = t2;
lackHours = GPFunctions.CDecimal(dvr.Cells["LackHours"].Value);
if (lackHours.CompareTo(0) > 0)
{
t1 = t2.AddMinutes((double)lackHours * (-1) * 60);
dvr.Cells["LackTime1"].Value = t1;
}
else
{
if (dvr.Cells["LackTime1"].Value == DBNull.Value)
{
dvr.Cells["LackHours"].Value = DBNull.Value;
dvr.Cells["LackTime1"].Value = t2;
}
else
{
t1 = GPFunctions.CDate(dvr.Cells["LackTime1"].Value);
if (t2.CompareTo(t1) <= 0)
{
dvr.Cells["LackTime1"].Value = t2;
dvr.Cells["LackHours"].Value = DBNull.Value;
}
else
{
ts = t2 - t1;
lackHours = GPFunctions.CDecimal(ts.TotalHours);
dvr.Cells["LackHours"].Value = lackHours;
}
}
}
ischanged = true;
dgv.EndEdit();
break;
default:
break;
}
if (ischanged)
{
DisplayTotalInfo(new string[] { "OverHours", "LackHours" }, new string[] { "加班小时数", "缺勤小时数" });
}
dgv.CellValueChanged += dataGridView1_CellValueChanged;
}
/// <summary>
/// 保存数据
/// </summary>
private void SaveData()
{
System.Data.DataTable dataTable = dtMainTable.Clone();
int n = dtMainTable.Rows.Count;
string[] columns = new string[] { "WorkerId", "SchedulingDate", "WorkersType", "SchedulingTypeId", "BeginTime", "EndTime", "OverHours", "LackHours", "OverTime1", "OverTime2", "LackTime1", "LackTime2" };
for (int i = 0; i < n; i++)
{
DataRow dr, dr2;
dr = dtMainTable.Rows[i];
int overHours = GPFunctions.CInt(dr["OverHours"]);
int lackHours = GPFunctions.CInt(dr["LackHours"]);
if (overHours > 0 || lackHours > 0)
{
dr2 = dataTable.NewRow();
GPFunData.CopyDataRow(dr, dr2, columns);
dataTable.Rows.Add(dr2);
}
}
n = dataTable.Rows.Count;
if (n == 0) return;
DateTime dateTime = Convert.ToDateTime(dataTable.Rows[0]["SchedulingDate"]);
try
{
dbHelper.BeginTransaction();
n = dbHelper.Execute(string.Format("delete ScheduleOverLackHours where SchedulingDate='{0}'", GPFunctions.DateStr(dateTime)));
n = dbHelper.DataTableSave(dataTable, "SELECT Id, WorkerId, SchedulingDate, WorkersType, SchedulingTypeId, BeginTime, EndTime, OverHours, LackHours, OverTime1, OverTime2, LackTime1, LackTime2 from ScheduleOverLackHours");
dbHelper.Commit();
dtMainTable.AcceptChanges();
MessageBox.Show("保存成功。", "提示信息");
}
catch (Exception ex)
{
dbHelper.RollBack();
MessageBox.Show("保存失败:" + ex.Message, "提示信息");
}
}
/// <summary>
/// 检查数据的合理性
/// </summary>
/// <returns></returns>
private bool CheckData()
{
bool isOverChecked = chxOverTime.Checked;
bool isLackChecked = chxLackTime.Checked;
if ((!isOverChecked) && (!isLackChecked)) return true;
DataGridView dgv = this.dataGridView1;
int rowCount = dgv.Rows.Count;
bool isok = true;
for (int i = 0; i < rowCount; i++)
{
int overHours, lackHours;
MySxbTime sxbTime;
DateTime overTime1, overTime2, lackTime1, lackTime2;
DataGridViewCellCollection cells = dgv.Rows[i].Cells;
sxbTime.sbTime = GPFunctions.CDate(cells["BeginTime2"].Value);
sxbTime.xbTime = GPFunctions.CDate(cells["EndTime2"].Value);
if (sxbTime.sbTime.CompareTo(sxbTime.xbTime) == 0)
{
continue;
}
/*检查加班时间*/
if (isOverChecked)
{
overHours = GPFunctions.CInt(cells["OverHours"].Value);
if (overHours > 0)
{
overTime1 = GPFunctions.CDate(cells["OverTime1"].Value);
overTime2 = GPFunctions.CDate(cells["OverTime2"].Value);
if (overTime1.CompareTo(sxbTime.sbTime) >= 0 && overTime1.CompareTo(sxbTime.xbTime) < 0)
{
MessageBox.Show("加班起点不能在上下班时间内。", "提示信息");
dgv.CurrentCell = dgv.Rows[i].Cells["OverTime1"];
isok = false;
break;
}
if (overTime2.CompareTo(sxbTime.sbTime) > 0 && overTime2.CompareTo(sxbTime.xbTime) <= 0)
{
dgv.CurrentCell = dgv.Rows[i].Cells["OverTime1"];
MessageBox.Show("加班终点不能在上下班时间内。", "提示信息");
isok = false;
break;
}
}
}
/*检查加班时间*/
if (isLackChecked)
{
lackHours = GPFunctions.CInt(cells["LackHours"].Value);
if (lackHours > 0)
{
lackTime1 = GPFunctions.CDate(cells["LackTime1"].Value);
lackTime2 = GPFunctions.CDate(cells["LackTime2"].Value);
if (lackTime1.CompareTo(sxbTime.sbTime) <= 0 || lackTime1.CompareTo(sxbTime.xbTime) > 0)
{
dgv.CurrentCell = dgv.Rows[i].Cells["LackTime1"];
MessageBox.Show("缺勤起点不能在上下班时间外。", "提示信息");
isok = false;
break;
}
if (lackTime2.CompareTo(sxbTime.sbTime) < 0 || lackTime2.CompareTo(sxbTime.xbTime) > 0)
{
dgv.CurrentCell = dgv.Rows[i].Cells["LackTime2"];
MessageBox.Show("缺勤终点不能在上下班时间外。", "提示信息");
isok = false;
break;
}
}
}
}
return isok;
}
private void btnSave_Click(object sender, EventArgs e)
{
/*保存数据*/
if (!CheckData())
{
return;
}
SaveData();
}
private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
{
}
private void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
DataGridView dgv = this.dataGridView1;
int rowIndex = e.RowIndex;
int colIndex = e.ColumnIndex;
string columnName = dgv.Columns[colIndex].Name;
if (string.IsNullOrEmpty(columnName)) return;
DateTime t, dateTime;
dateTime = this.dateTimePicker1.Value.Date;
switch (columnName)
{
case "Overtime1":
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
if (t.CompareTo(dateTime) < 0)
{
t = dateTime;
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
}
break;
case "Overtime2":
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
if (t.CompareTo(dateTime) < 0)
{
t = dateTime;
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
}
break;
case "LackTime1":
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
if (t.CompareTo(dateTime) < 0)
{
t = dateTime;
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
}
break;
case "LackTime2":
t = GPFunctions.CDate(dgv.Rows[rowIndex].Cells[colIndex].Value);
if (t.CompareTo(dateTime) < 0)
{
t = dateTime;
dgv.Rows[rowIndex].Cells[colIndex].Value = t;
}
break;
default:
break;
}
}
private void btnPrint_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", System.Windows.Forms.Application.StartupPath);
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);
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;
System.Windows.Forms.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();
}
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="fileName">文件路径</param>
/// <param name="myDGV">控件DataGridView</param>
public static void ExportToExcel(string fileName, DataGridView gridView, int[] excludeColcumns = null)
{
int rowsCount = gridView.Rows.Count;
if (rowsCount == 0)
{
MessageBox.Show("没有数据", "提示信息");
return;
}
string saveFileName = "";
SaveFileDialog saveDialog = new SaveFileDialog();
saveDialog.DefaultExt = "xls";
saveDialog.Filter = "Excel文件|*.xls";
saveDialog.FileName = fileName;
saveDialog.ShowDialog();
saveFileName = saveDialog.FileName;
if (saveFileName.IndexOf(":") < 0) return; //被点了取消
if (saveFileName == "") return;
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
if (xlApp == null)
{
MessageBox.Show("无法创建Excel对象可能您的机子未安装Excel");
return;
}
Workbooks workbooks = xlApp.Workbooks;
Workbook workbook = workbooks.Add(XlWBATemplate.xlWBATWorksheet);
//取得sheet1
Worksheet worksheet = (Worksheet)workbook.ActiveSheet;
//写入标题
int colLen = gridView.ColumnCount;
List<MyIntInt> list = new List<MyIntInt>();
for (int i = 0; i < colLen; i++)
{
bool isok = gridView.Columns[i].Visible;
MyIntInt o;
if (isok)
{
if (excludeColcumns != null)
{
if (Array.IndexOf(excludeColcumns, i) >= 0)
{
isok = false;
}
}
}
if (isok)
{
o = new MyIntInt();
o.Key = i;
o.Val = gridView.Columns[i].Width;
list.Add(o);
}
}
int col = 0;
foreach (MyIntInt o in list)
{
col++;
worksheet.Cells[1, col] = gridView.Columns[o.Key].HeaderText;
Microsoft.Office.Interop.Excel.Range range = worksheet.Range[worksheet.Cells[1, col], worksheet.Cells[1, col]];
range.ColumnWidth = o.Val > 200 ? 200 : o.Val;
}
//写入数值
for (int r = 0, n = rowsCount; r < n; r++)
{
col = 0;
foreach (MyIntInt o in list)
{
col++;
worksheet.Cells[r + 2, col] = gridView.Rows[r].Cells[o.Key].Value;
}
System.Windows.Forms.Application.DoEvents();
}
worksheet.Columns.EntireColumn.AutoFit();//列宽自适应
try
{
workbook.Saved = true;
workbook.SaveCopyAs(saveFileName);
}
catch (Exception ex)
{
MessageBox.Show("导出文件时出错,文件可能正被打开!\n" + ex.Message, "提示信息");
}
xlApp.Quit();
GC.Collect();//强行销毁
MessageBox.Show("文件: " + saveFileName + " 保存成功", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
public class MyIntInt
{
public int Key { get; set; }
public int Val { get; set; }
}
}