tbf/OrderManagement/OrderManagementDlg.cs

472 lines
19 KiB
C#
Raw Normal View History

///
/// Copyright (c) 2021-2023 Sensus Slovensko a.s.
///
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using log4net;
using NHibernate;
using Common;
using SharedDatabase.Entities;
using OrderManagement.Resources;
using Common.Forms;
using SharedDatabase;
namespace OrderManagement
{
public partial class OrderManagementDlg : Form
{
private static readonly ILog log = LogManager.GetLogger(typeof(OrderManagementDlg));
public const long MaxPredefinedOrderNr = 1000;
ISessionFactory sessionFactory;
IList<OrderInfo> listOfOrders;
IList<Process> listOfWorkflows;
MySortOrder sortOrder = MySortOrder.Ascending;
int sortColumn = -1; /// 0-based index of column to be used for sorting
public OrderManagementDlg()
{
try
{
string culture = Program.LocalSettings.Language.Replace('_', '-');
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(culture);
}
catch (Exception)
{
MessageBox.Show("Selected language is not supported.\nUsing English.",
"Warning", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
System.Threading.Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("en");
}
InitializeComponent();
Text = string.Format("{0} v.{1}", Program.ProgramName, Program.Version); ;
}
public OrderManagementDlg(ISessionFactory sessionFactory, IList<OrderInfo> listOfOrders, IList<Process> listOfWorkflows)
: this()
{
this.sessionFactory = sessionFactory;
this.listOfOrders = listOfOrders;
this.listOfWorkflows = listOfWorkflows;
}
private void OrderManagementDlg_Load(object sender, EventArgs e)
{
Localize();
InitializeColumns(listViewEx1);
if (Program.LocalSettings.IsShowPredefinedOrders)
{
foreach (var oi in listOfOrders) AddRow(listViewEx1, oi);
}
else
{
int orderNr;
foreach (var oi in listOfOrders)
{
if (int.TryParse(oi.POName, out orderNr) && orderNr > MaxPredefinedOrderNr)
{
AddRow(listViewEx1, oi);
}
}
}
}
void Localize()
{
Text = string.Format("{0} ver.{1}", Strings.Order_Management, Program.Version);
settingsToolStripMenuItem.Text = Strings.Settings;
closeButton.Text = Strings.Close;
addButton.Text = Strings.Add;
editButton.Text = Strings.Edit;
copyButton.Text = Strings.Copy;
deleteButton.Text = Strings.Delete;
printButton.Text = Strings.Print;
}
enum Clmn
{
Order,
State,
Pieces,
CurrentPcs,
Workflow,
Procedure,
Variant,
VacoDescr,
MadeInText,
Year,
ModuleParam,
LaserMarking,
Packing,
SNPrefix,
SNFirst,
SNDigitsCount,
SNSuffix,
RAPrefix,
RAFirst,
RASuffix,
Remark,
Count
}
void InitializeColumns(ListView lv)
{
lv.Columns.Add(new ColumnHeader { Text = Strings.Order, Width = 70 });
lv.Columns.Add(new ColumnHeader { Text = Strings.State, Width = 60 });
lv.Columns.Add(new ColumnHeader { Text = "Target", Width = 50 });
lv.Columns.Add(new ColumnHeader { Text = "Produced", Width = 60 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Workflow, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Test_procedure, Width = 200 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Variant_code, Width = 150 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Variant_description, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Made_in_text, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Year_of_calibration, Width = 50 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Module_parameter, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Laser_marking, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Packing, Width = 100 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.prefix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.first, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.digits_count, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.SN + " " + Strings.suffix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.prefix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.first, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.RA + " " + Strings.suffix, Width = 80 });
lv.Columns.Add(new ColumnHeader { Text = Strings.Remark, Width = 200 });
}
void AddRow(ListView lv, OrderInfo o)
{
ListViewItem lvi = new ListViewItem(o.POName);
lvi.SubItems.Add(((OrderState)o.POState).ToString());
lvi.SubItems.Add(o.PiecesCount.ToString());
lvi.SubItems.Add(o.CurrentPcsCount.ToString());
lvi.SubItems.Add(o.Workflow);
lvi.SubItems.Add(o.TestProcedure);
lvi.SubItems.Add(o.VariantCode);
lvi.SubItems.Add(o.VacoDescription);
lvi.SubItems.Add(o.MadeInText);
lvi.SubItems.Add(o.Year.ToString());
lvi.SubItems.Add(o.ModuleParam);
lvi.SubItems.Add(o.LaserMarking);
lvi.SubItems.Add(o.Packing);
lvi.SubItems.Add(o.SNPrefix);
lvi.SubItems.Add(o.SNFirst.ToString(string.Format("D{0}", o.SNDigitsCount)));
lvi.SubItems.Add(o.SNDigitsCount.ToString());
lvi.SubItems.Add(o.SNSuffix);
lvi.SubItems.Add(o.RAPrefix);
lvi.SubItems.Add(o.RAFirst.ToString(SharedDatabase.Const.RAFormat));
lvi.SubItems.Add(o.RASuffix);
lvi.SubItems.Add(o.Remark);
lvi.Tag = o;
lv.Items.Add(lvi);
}
void UpdateRow(ListViewItem lvi, OrderInfo o)
{
int i = 0;
lvi.SubItems[i++].Text = o.POName;
lvi.SubItems[i++].Text = ((OrderState)o.POState).ToString();
lvi.SubItems[i++].Text = o.PiecesCount.ToString();
lvi.SubItems[i++].Text = o.CurrentPcsCount.ToString();
lvi.SubItems[i++].Text = o.Workflow;
lvi.SubItems[i++].Text = o.TestProcedure;
lvi.SubItems[i++].Text = o.VariantCode;
lvi.SubItems[i++].Text = o.VacoDescription;
lvi.SubItems[i++].Text = o.MadeInText;
lvi.SubItems[i++].Text = o.Year.ToString();
lvi.SubItems[i++].Text = o.ModuleParam;
lvi.SubItems[i++].Text = o.LaserMarking;
lvi.SubItems[i++].Text = o.Packing;
lvi.SubItems[i++].Text = o.SNPrefix;
lvi.SubItems[i++].Text = o.SNFirst.ToString(string.Format("D{0}", o.SNDigitsCount));
lvi.SubItems[i++].Text = o.SNDigitsCount.ToString();
lvi.SubItems[i++].Text = o.SNSuffix;
lvi.SubItems[i++].Text = o.RAPrefix;
lvi.SubItems[i++].Text = o.RAFirst.ToString(SharedDatabase.Const.RAFormat);
lvi.SubItems[i++].Text = o.RASuffix;
lvi.SubItems[i++].Text = o.Remark;
}
private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
{
try
{
Common.CurrentUser.RemoteUsersDB = new Common.DBSettings(Common.DBType.MySql, Program.LocalSettings.UsersDBConnString);
DialogResult dr = new SharedDatabase.Forms.LoginDlg().ShowDialog();
if (dr != DialogResult.OK) return;
dr = new SettingsDlg(Program.LocalSettings).ShowDialog();
if (dr == DialogResult.OK)
{
Program.LocalSettings.Save();
MessageBox.Show(Strings.Program_restart_is_required);
Close();
}
}
catch (Exception exc)
{
log.ErrorFormat("Failed to connect to the database of users: {0}", exc.Message);
}
}
private void closeButton_Click(object sender, EventArgs e)
{
DialogResult = DialogResult.OK;
Close();
}
private void addButton_Click(object sender, EventArgs e)
{
///
/// Determine the next production order name
///
string candidatePOName = string.Empty;
int candidatePONr;
foreach (var o in listOfOrders)
{
if (string.Compare(candidatePOName, o.POName, StringComparison.InvariantCulture) < 0) candidatePOName = o.POName;
}
if (int.TryParse(candidatePOName, out candidatePONr))
{
candidatePONr++;
candidatePOName = candidatePONr.ToString(string.Format("D{0}", candidatePOName.Length));
}
///
/// Create and edit the order
///
var order = new OrderInfo(candidatePOName);
if (new EditOrderDlg(sessionFactory, order, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders).ShowDialog()
== DialogResult.OK)
{
listOfOrders.Add(order);
AddRow(listViewEx1, order);
}
}
private void listViewEx1_DoubleClick(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.New)
{
editButton_Click(sender, e);
}
else
{
try
{
new OrderStateDlg(order, sessionFactory).ShowDialog();
}
catch (Exception exc)
{
log.ErrorFormat("Failed to read order {0} when creating OrderStateDlg: {1)", order.POName, exc.Message);
}
}
}
private void editButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.New)
{
if (new EditOrderDlg(sessionFactory, order, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders, true).ShowDialog()
== DialogResult.OK)
{
UpdateRow(listViewEx1.SelectedItems[0], order);
}
}
else
{
MessageBox.Show(Strings.You_can_only_edit_New_porduction_orders);
}
}
private void finishButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.Active && order.CurrentPcsCount >= order.PiecesCount)
{
ISession session = null;
try
{
session = sessionFactory.OpenSession();
var selectedOrders = session.QueryOver<OrderInfo>()
.Where(x => x.Id == order.Id)
.List();
if (selectedOrders.Count == 1)
{
selectedOrders[0].POState = (sbyte)OrderState.Finished;
session.SaveOrUpdate(selectedOrders[0]);
session.Flush();
order.POState = (sbyte)OrderState.Finished;
UpdateRow(listViewEx1.SelectedItems[0], order);
}
}
catch (Exception ex)
{
MessageBox.Show("Changing production order state failed: {0}", ex.Message);
}
finally
{
if (session != null && session.IsOpen) session.Close();
}
}
else
{
MessageBox.Show(Strings.You_can_only_finish_completed_production_orders);
}
}
private void copyButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo oriOrder = listViewEx1.SelectedItems[0].Tag as OrderInfo;
///
/// Determine the next production order name
///
string candidatePOName = string.Empty;
int candidatePONr;
foreach (var o in listOfOrders)
{
if (string.Compare(candidatePOName, o.POName, StringComparison.InvariantCulture) < 0) candidatePOName = o.POName;
}
if (int.TryParse(candidatePOName, out candidatePONr))
{
candidatePONr++;
candidatePOName = candidatePONr.ToString(string.Format("D{0}", candidatePOName.Length));
}
///
/// Create and edit the order
///
OrderInfo copiedOrder = oriOrder.Clone() as OrderInfo;
copiedOrder.POName = candidatePOName;
copiedOrder.POState = (sbyte)OrderState.New;
copiedOrder.SNFirst = oriOrder.SNFirst + oriOrder.PiecesCount; /// TODO
copiedOrder.RAFirst = oriOrder.RAFirst + oriOrder.PiecesCount; /// TODO
copiedOrder.BaseNr1 = 0;
copiedOrder.BaseNr2 = 0;
copiedOrder.BaseNr3 = 0;
copiedOrder.BaseNr4 = 0;
copiedOrder.BaseNr5 = 0;
copiedOrder.CurrentPcsCount = 0;
copiedOrder.CurrentSN = 0;
copiedOrder.CurrentRA = 0;
copiedOrder.CurrentNr1 = 0;
copiedOrder.CurrentNr2 = 0;
copiedOrder.CurrentNr3 = 0;
copiedOrder.CurrentNr4 = 0;
copiedOrder.CurrentNr5 = 0;
copiedOrder.Remark = string.Format("Copy of order {0}", oriOrder.POName);
if (new EditOrderDlg(sessionFactory, copiedOrder, listOfOrders, Program.LocalSettings.IsShowPredefinedOrders).ShowDialog()
== DialogResult.OK)
{
listOfOrders.Add(copiedOrder);
AddRow(listViewEx1, copiedOrder);
}
}
private void deleteButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
if (order.POState == (sbyte)OrderState.New)
{
if (MessageBox.Show(Strings.Are_you_sure, Strings.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) == DialogResult.Yes)
{
try
{
ISession session = sessionFactory.OpenSession();
var list = session.QueryOver<OrderInfo>().Where(x => x.Id == order.Id).List();
if (list.Count == 1)
{
if (list[0].POState == (sbyte)OrderState.New)
{
session.Delete(list[0]);
session.Flush();
listOfOrders.Remove(order);
listViewEx1.Items.Remove(listViewEx1.SelectedItems[0]);
}
else
{
MessageBox.Show(Strings.You_can_only_delete_New_porduction_orders);
}
}
else
{
listOfOrders.Remove(order);
listViewEx1.Items.Remove(listViewEx1.SelectedItems[0]);
MessageBox.Show(Strings.Order_was_already_deleted);
}
session.Close();
}
catch (Exception exc)
{
MessageBox.Show(string.Format("Deleting an order failed\r\n{0}", exc.Message));
}
}
}
else
{
MessageBox.Show(Strings.You_can_only_delete_New_porduction_orders);
}
}
private void listViewEx1_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == sortColumn)
{
/// Clicked on the same column header => increment to the next applicable MySortOrder
sortOrder = (sortOrder == MySortOrder.Ascending) ? MySortOrder.Descending : MySortOrder.Ascending;
}
else
{
/// Clicked on another column header => set sortOrder to MySortOrder.Ascending
sortColumn = e.Column;
sortOrder = MySortOrder.Ascending;
}
if (sortColumn == (int)Clmn.Pieces || sortColumn == (int)Clmn.SNFirst ||
sortColumn == (int)Clmn.SNDigitsCount || sortColumn == (int)Clmn.RAFirst)
{
listViewEx1.ListViewItemSorter = new LviIntColumnComparer(sortColumn, sortOrder);
}
else
{
listViewEx1.ListViewItemSorter = new LviTextColumnComparer(sortColumn, sortOrder);
}
listViewEx1.SetSortIcon(sortColumn, sortOrder);
listViewEx1.Sort();
}
private void printButton_Click(object sender, EventArgs e)
{
if (listViewEx1.SelectedItems.Count != 1 || !(listViewEx1.SelectedItems[0].Tag is OrderInfo)) return;
OrderInfo order = listViewEx1.SelectedItems[0].Tag as OrderInfo;
new OrderPrintDocument(order).Print();
}
}
}