using DevExpress.XtraEditors; using DevExpress.XtraPrinting; using GCAS.Code; using GCAS.Dto; using GCAS.Localization; using GCAS.Model; using System; using System.Collections; using System.Collections.Generic; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace GCAS { public partial class ReportForm : XtraForm { private List L; private RecordRepository recordRepository; private DeviceRepository deviceRepository; public OperatorModel currentUser; private EntranceRepository entranceRepository; private TeamRepository teamRepository; private ActionsRepository actionsRepository; private DateTime startTime; private DateTime endTime; private List devices; private List teams; private TeamModel teamNext; private List entrances; private string range; private string type; public ReportForm() { InitializeComponent(); L = LocalizationHelper.GetSource(Thread.CurrentThread.CurrentUICulture); range = "day"; type = L.GetString("team"); } private async void ReportForm_LoadAsync(object sender, EventArgs e) { recordRepository = new RecordRepository(); deviceRepository = new DeviceRepository(); devices = deviceRepository.GetList(); actionsRepository = new ActionsRepository(); entranceRepository = new EntranceRepository(); entrances = entranceRepository.GetList(); teamRepository = new TeamRepository(); teams = teamRepository.GetList(); teamNext = teams.Where(c => c.NextDay == 1).FirstOrDefault(); cb_range.SelectedIndex = 0; cb_types.SelectedIndex = 0; await BindGridAsync(); } private async Task BindGridAsync() { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("Time", typeof(string))); dt.Columns.Add(new DataColumn("TotalCount", typeof(int))); dt.Columns.Add(new DataColumn("TotalWeight", typeof(double))); gridView1.LoadingPanelVisible = true; if (teamNext != null && cb_range.SelectedIndex >= 1) { endTime = Convert.ToDateTime(endTime.AddDays(1).ToShortDateString() + " " + teamNext.EndTime); } var query = await recordRepository.GetList(null, 0, 0, 0, startTime, endTime); if (teamNext != null && cb_range.SelectedIndex >= 1) { foreach (var item in query) { if (item.Team == teamNext.Id) { var tempTime = Convert.ToDateTime(item.Time.ToShortDateString() + " " + teamNext.EndTime); if (item.Time < tempTime) { item.Time = item.Time.AddDays(-1); } } } } ArrayList tempList = new ArrayList(); switch (cb_range.SelectedIndex) { case 0: switch (cb_types.SelectedIndex) { case 0: var tGroup = query.GroupBy(c => c.Time.Hour); dt.Columns.AddRange(teams.Select(c => new DataColumn("team" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(g.Key.ToString().PadLeft(2, '0') + ":00:00-" + g.Key.ToString().PadLeft(2, '0') + ":59:59"); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in teams) { tempList.Add(Math.Round(g.Where(c => c.Team == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 1: tGroup = query.GroupBy(c => c.Time.Hour); dt.Columns.AddRange(devices.Select(c => new DataColumn("device" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(g.Key.ToString().PadLeft(2, '0') + ":00:00-" + g.Key.ToString().PadLeft(2, '0') + ":59:59"); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in devices) { tempList.Add(Math.Round(g.Where(c => c.Device == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 2: tGroup = query.GroupBy(c => c.Time.Hour); dt.Columns.AddRange(entrances.Select(c => new DataColumn("entrance" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(g.Key.ToString().PadLeft(2, '0') + ":00:00-" + g.Key.ToString().PadLeft(2, '0') + ":59:59"); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in entrances) { tempList.Add(Math.Round(g.Where(c => c.Entrance == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; } break; case 1: switch (cb_types.SelectedIndex) { case 0: var tGroup = query.GroupBy(c => c.Time.DayOfWeek); dt.Columns.AddRange(teams.Select(c => new DataColumn("team" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetWeek(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in teams) { tempList.Add(Math.Round(g.Where(c => c.Team == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 1: tGroup = query.GroupBy(c => c.Time.DayOfWeek); dt.Columns.AddRange(devices.Select(c => new DataColumn("device" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetWeek(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in devices) { tempList.Add(Math.Round(g.Where(c => c.Device == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 2: tGroup = query.GroupBy(c => c.Time.DayOfWeek); dt.Columns.AddRange(entrances.Select(c => new DataColumn("entrance" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetWeek(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in entrances) { tempList.Add(Math.Round(g.Where(c => c.Entrance == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; } break; case 2: switch (cb_types.SelectedIndex) { case 0: var tGroup = query.GroupBy(c => c.Time.Month + "-" + c.Time.Day); dt.Columns.AddRange(teams.Select(c => new DataColumn("team" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetDay(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in teams) { tempList.Add(Math.Round(g.Where(c => c.Team == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 1: tGroup = query.GroupBy(c => c.Time.Month + "-" + c.Time.Day); dt.Columns.AddRange(devices.Select(c => new DataColumn("device" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetDay(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in devices) { tempList.Add(Math.Round(g.Where(c => c.Device == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 2: tGroup = query.GroupBy(c => c.Time.Month + "-" + c.Time.Day); dt.Columns.AddRange(entrances.Select(c => new DataColumn("entrance" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetDay(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in entrances) { tempList.Add(Math.Round(g.Where(c => c.Entrance == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; } break; case 3: switch (cb_types.SelectedIndex) { case 0: var tGroup = query.GroupBy(c => c.Time.Month); dt.Columns.AddRange(teams.Select(c => new DataColumn("team" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetMonth(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in teams) { tempList.Add(Math.Round(g.Where(c => c.Team == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 1: tGroup = query.GroupBy(c => c.Time.Month); dt.Columns.AddRange(devices.Select(c => new DataColumn("device" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetMonth(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in devices) { tempList.Add(Math.Round(g.Where(c => c.Device == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; case 2: tGroup = query.GroupBy(c => c.Time.Month); dt.Columns.AddRange(entrances.Select(c => new DataColumn("entrance" + c.Id, typeof(double))).ToArray()); foreach (var g in tGroup) { tempList.Clear(); tempList.Add(Tools.GetMonth(g.Key)); tempList.Add(g.Count()); tempList.Add(Math.Round(g.Sum(e => e.NetWeight), 2)); foreach (var item in entrances) { tempList.Add(Math.Round(g.Where(c => c.Entrance == item.Id).Sum(c => c.NetWeight), 2)); } dt.LoadDataRow(tempList.ToArray(), true); } break; } break; } gridControl1.DataSource = dt; gridView1.FocusedRowHandle = -1; gridView1.LoadingPanelVisible = false; } private void gridControl1_Load(object sender, EventArgs e) { if (File.Exists(Application.StartupPath + @"\" + Text + ".xml")) { gridView1.RestoreLayoutFromXml(Application.StartupPath + @"\" + Text + ".xml"); //加载布局 } } private void gridView1_Layout(object sender, EventArgs e) { gridView1.SaveLayoutToXml(Application.StartupPath + @"\" + Text + ".xml");//保存布局 } private void rg_type_SelectedIndexChanged(object sender, EventArgs e) { switch ((sender as ComboBoxEdit).SelectedIndex) { case 0: range = "day"; btn_pre.Text = L.GetString("prevDay"); btn_next.Text = L.GetString("nextDay"); btn_cur.Text = L.GetString("today"); startTime = DateTime.Today; endTime = startTime.AddDays(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " 24:00"; break; case 1: range = "week"; btn_pre.Text = L.GetString("prevWeek"); btn_next.Text = L.GetString("nextWeek"); btn_cur.Text = L.GetString("thisWeek"); startTime = Tools.GetTimeStartByType("Week", DateTime.Now).Value.Date; endTime = startTime.AddDays(7).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 2: range = "month"; btn_pre.Text = L.GetString("prevMonth"); btn_next.Text = L.GetString("nextMonth"); btn_cur.Text = L.GetString("thisMonth"); startTime = Tools.GetTimeStartByType("Month", DateTime.Now).Value.Date; endTime = startTime.AddMonths(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 3: range = "year"; btn_pre.Text = L.GetString("prevYear"); btn_next.Text = L.GetString("nextYear"); btn_cur.Text = L.GetString("thisYear"); startTime = Tools.GetTimeStartByType("Year", DateTime.Now).Value.Date; endTime = startTime.AddYears(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; } } private void btn_range_Click(object sender, EventArgs e) { SimpleButton btn = sender as SimpleButton; switch (btn.Name) { case "btn_pre": switch (cb_range.SelectedIndex) { case 0: startTime = startTime.AddDays(-1); endTime = startTime.AddDays(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " 24:00"; break; case 1: startTime = startTime.AddDays(-7); endTime = startTime.AddDays(7).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 2: startTime = startTime.AddMonths(-1); endTime = startTime.AddMonths(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 3: startTime = startTime.AddYears(-1); endTime = startTime.AddYears(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; } break; case "btn_next": switch (cb_range.SelectedIndex) { case 0: startTime = startTime.AddDays(1); endTime = startTime.AddDays(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " 24:00"; break; case 1: startTime = startTime.AddDays(7); endTime = startTime.AddDays(8).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 2: startTime = startTime.AddMonths(1); endTime = startTime.AddMonths(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 3: startTime = startTime.AddYears(1); endTime = startTime.AddYears(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; } break; case "btn_cur": switch (cb_range.SelectedIndex) { case 0: startTime = DateTime.Today; endTime = startTime.AddDays(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " 24:00"; break; case 1: startTime = Tools.GetTimeStartByType("Week", DateTime.Now).Value.Date; endTime = startTime.AddDays(7).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 2: startTime = Tools.GetTimeStartByType("Month", DateTime.Now).Value.Date; endTime = startTime.AddMonths(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; case 3: startTime = Tools.GetTimeStartByType("Year", DateTime.Now).Value.Date; endTime = startTime.AddYears(1).AddSeconds(-1); lbl_range.Text = startTime.ToString("yyyy-MM-dd") + " 0:00 " + L.GetString("to") + " " + endTime.ToString("yyyy-MM-dd") + " 24:00"; break; } break; } } private async void btn_search_ClickAsync(object sender, EventArgs e) { await BindGridAsync(); } private void cb_types_SelectedIndexChanged(object sender, EventArgs e) { int index = 0; gridView1.Columns.Clear(); gridView1.Columns.Add(new DevExpress.XtraGrid.Columns.GridColumn { Name = "col_time", FieldName = "Time", Caption = "时间", Width = 200, VisibleIndex = index, SortOrder = DevExpress.Data.ColumnSortOrder.Ascending }); index++; switch (cb_types.SelectedIndex) { case 0: type = L.GetString("team"); foreach (var item in teams) { gridView1.Columns.Add(new DevExpress.XtraGrid.Columns.GridColumn { Name = "col_team" + item.Id, Caption = item.Name, FieldName = "team" + item.Id, Width = 200, VisibleIndex = index }); index++; } break; case 1: type = L.GetString("device"); foreach (var item in devices) { gridView1.Columns.Add(new DevExpress.XtraGrid.Columns.GridColumn { Name = "col_device" + item.Id, Caption = item.Name, FieldName = "device" + item.Id, Width = 200, VisibleIndex = index }); index++; } break; case 2: type = L.GetString("entrance"); foreach (var item in entrances) { gridView1.Columns.Add(new DevExpress.XtraGrid.Columns.GridColumn { Name = "col_entrance" + item.Id, Caption = item.Name, FieldName = "entrance" + item.Id, Width = 200, VisibleIndex = index }); index++; } break; } gridView1.Columns.Add(new DevExpress.XtraGrid.Columns.GridColumn { Name = "col_totalCount", FieldName = "TotalCount", Caption = "斗数小计", Width = 200, VisibleIndex = index }); index++; gridView1.Columns.Add(new DevExpress.XtraGrid.Columns.GridColumn { Name = "col_totalWeight", FieldName = "TotalWeight", Caption = "重量小计", Width = 200, VisibleIndex = index }); index++; } private void btn_export_Click(object sender, EventArgs e) { SaveFileDialog fileDialog = new SaveFileDialog { Title = "Export Excel", Filter = "Excel 97-2003(*.xls)|*.xls|Excel(*.xlsx)|*.xlsx" }; switch (range) { case "day": fileDialog.FileName = L.GetString("dailyReport"); break; case "week": fileDialog.FileName = L.GetString("weeklyReport"); break; case "month": fileDialog.FileName = L.GetString("monthlyReport"); break; case "year": fileDialog.FileName = L.GetString("annualReport"); break; default: break; } if (fileDialog.ShowDialog() == DialogResult.OK) { try { gridControl1.ExportToXls(fileDialog.FileName); XtraMessageBox.Show(L.GetString("ExportSucceeded"), L.GetString("notification"), MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception ex) { XtraMessageBox.Show(L.GetString("WeighingFailed") + " Info:" + ex.Message, L.GetString("notification"), MessageBoxButtons.OK, MessageBoxIcon.Error); } } } private void btnPrint_Click(object sender, EventArgs e) { gridView1.SelectRow(-1); PrintableComponentLink link = new PrintableComponentLink(new PrintingSystem()) { Component = gridControl1, Landscape = true, PaperKind = System.Drawing.Printing.PaperKind.A4, }; link.CreateMarginalHeaderArea += new CreateAreaEventHandler(Link_CreateMarginalHeaderArea); link.CreateDocument(); link.ShowPreview(); } private void Link_CreateMarginalHeaderArea(object sender, CreateAreaEventArgs e) { string title = ""; switch (range) { case "day": title = L.GetString("dailyReport"); break; case "week": title = L.GetString("weeklyReport"); break; case "month": title = L.GetString("monthlyReport"); break; case "year": title = L.GetString("annualReport"); break; } PageInfoBrick brickTitle = e.Graph.DrawPageInfo(PageInfo.None, title, Color.Black, new RectangleF(0, 0, 100, 30), BorderSide.None); brickTitle.LineAlignment = BrickAlignment.Center; brickTitle.Alignment = BrickAlignment.Center; brickTitle.AutoWidth = true; brickTitle.Font = new Font("Tahoma", 16f, FontStyle.Bold); PageInfoBrick brickSubtitle = e.Graph.DrawPageInfo(PageInfo.None, L.GetString("dateRange") + lbl_range.Text, Color.Black, new RectangleF(0, 10, 100, 20), BorderSide.None); brickSubtitle.LineAlignment = BrickAlignment.Far; brickSubtitle.Alignment = BrickAlignment.Far; brickSubtitle.AutoWidth = true; brickSubtitle.Font = new Font("Tahoma", 9f, FontStyle.Regular); PageInfoBrick brickType = e.Graph.DrawPageInfo(PageInfo.None, L.GetString("statisticType") + type, Color.Black, new RectangleF(0, 0, 100, 20), BorderSide.None); brickType.LineAlignment = BrickAlignment.Near; brickType.Alignment = BrickAlignment.Near; brickType.AutoWidth = true; brickType.Font = new Font("Tahoma", 9f, FontStyle.Regular); } public static DataTable ToDataTable(List> collection) { var dt = new DataTable(); if (collection.Count() > 0) { dt.Columns.AddRange(collection.First().Select(p => new DataColumn(p.Key, typeof(object))).ToArray()); for (int i = 0; i < collection.Count(); i++) { ArrayList tempList = new ArrayList(); foreach (var item in collection[i]) { tempList.Add(item.Value); } dt.LoadDataRow(tempList.ToArray(), true); } } return dt; } } }