using ComponentFactory.Krypton.Toolkit; using NXWMS.Client.Model.AppModels.Condition.Balance; using NXWMS.Client.Model.AppModels.Result.Balance; using NXWMS.Client.Model.AppModels.Result.Common; using NXWMS.Client.Model.AppModels.Result.OutStock; using NXWMS.Client.Model.CoreModels; using NXWMS.Commons; using NXWMS.Services; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; using System.Web.UI.WebControls; using System.Windows.Forms; namespace NXWMS.Forms.OutStock.frmOutstockChild { /// /// 添加发货单窗体类 /// public partial class frmChildAddWmsOutInvoice : KryptonForm { /// /// 窗体构造函数 /// public frmChildAddWmsOutInvoice() { InitializeComponent(); InitmaterielBalanceDataControl(); } #region 全局变量 /// /// 库存物料数据的浮动DataGridView数据表 /// private KryptonDataGridView kdgv_materielBalanceData = new KryptonDataGridView(); #endregion #region 初始化数据 private void frmChildAddWmsOutInvoice_Load(object sender, EventArgs e) { InitComboBoxItemData(); kdtp_InvoiceEndTime.Checked = false; } /// /// 初始化下拉列表数据 /// private void InitComboBoxItemData() { /* ToDo:后续把下拉列表转为 后台获取数据,目前是写死的。 */ List results = new List(); #region 单据类型 results = BasDictionaryUtil.basDictionaryResultLst.FindAll(x => x.DICTIONARY_CODE == "InvoiceTypeDesc"); if (results.Count > 0) { kcmb_InvoiceType.Items.Clear(); foreach (var item in results) { kcmb_InvoiceType.Items.Add(new ListItem { Value = item.DICTIONARY_ITEM_CODE, Text = item.DICTIONARY_ITEM_NAME, }); } kcmb_InvoiceType.SelectedIndex = 0; } else { KryptonMessageBox.Show("未找到发货单类型的字典项数据!"); } #endregion } private DataTable CreateTable(WmsStkBalanceDtlSearchMd SearchMd) { DataTable dt = new DataTable(); DataColumn dc = new DataColumn("序号"); dt.Columns.Add(dc); dc = new DataColumn("物料编码"); dt.Columns.Add(dc); dc = new DataColumn("物料名称"); dt.Columns.Add(dc); dc = new DataColumn("物料规格"); dt.Columns.Add(dc); dc = new DataColumn("物料条码"); dt.Columns.Add(dc); dc = new DataColumn("批次号"); dt.Columns.Add(dc); dc = new DataColumn("库存数量"); dt.Columns.Add(dc); dc = new DataColumn("单位"); dt.Columns.Add(dc); dc = new DataColumn("包装"); dt.Columns.Add(dc); var result = WmsInvoiceService.wmsOutInvoiceService.GetBalanceForInvoice(new WmsStkBalanceDtlSearchMd { MaterielMsg = ktb_MaterielMsg.Text, BatchNoMsg = ktb_BatchNoMsg.Text }); if (result.Status == OperateStatus.Success) { if (result.Data.Count > 0) { int index = 0; foreach (WmsStkBalanceDtlResult item in result.Data) { index++; DataRow dr = dt.NewRow(); dr["序号"] = index; dr["物料编码"] = item.MATERIEL_CODE; dr["物料名称"] = item.MATERIEL_NAME; dr["物料规格"] = item.MATERIEL_SPEC; dr["物料条码"] = item.MATERIEL_BARCODE; dr["批次号"] = item.BATCH_NO; dr["库存数量"] = item.QTY; dr["单位"] = item.UNIT_CODE; dr["包装"] = item.PACKAGE_CODE; dt.Rows.Add(dr); } } } return dt; } /// /// 初始化库存物料数据的浮动DataGridView数据表 /// private void InitmaterielBalanceDataControl() { this.Controls.Add(kdgv_materielBalanceData); kdgv_materielBalanceData.Visible = false; kdgv_materielBalanceData.AllowUserToAddRows = false; kdgv_materielBalanceData.AllowUserToDeleteRows = false; kdgv_materielBalanceData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; kdgv_materielBalanceData.MultiSelect = false; kdgv_materielBalanceData.SelectionMode = DataGridViewSelectionMode.FullRowSelect; kdgv_materielBalanceData.ScrollBars = System.Windows.Forms.ScrollBars.None; kdgv_materielBalanceData.BorderStyle = System.Windows.Forms.BorderStyle.None; kdgv_materielBalanceData.BackgroundColor = this.BackColor; kdgv_materielBalanceData.BringToFront(); kdgv_materielBalanceData.ReadOnly = true; kdgv_materielBalanceData.CellDoubleClick += kdgv_materielBalanceData_CellDoubleClick; } private void kdgv_materielBalanceData_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { int rowIndex = e.RowIndex; if (rowIndex >= 0) { string idX = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["序号"].Value.ToString(); string materielCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料编码"].Value.ToString(); string materielName = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料名称"].Value.ToString(); string materielBarCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料条码"].Value.ToString(); string materielSpec = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料规格"].Value.ToString(); string batchNo = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["批次号"].Value.ToString(); string balanceQty = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["库存数量"].Value.ToString(); string unitCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["单位"].Value.ToString(); string packageCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["包装"].Value.ToString(); if (kdgv_InvoiceDtlData.Rows.Count > 0) { foreach (DataGridViewRow item in kdgv_InvoiceDtlData.Rows) { string tmpBatchNo = item.Cells[5].Value == null ? "" : item.Cells[5].Value.ToString(); string tmpMateriel = item.Cells[1].Value == null ? "" : item.Cells[1].Value.ToString(); if (batchNo == tmpBatchNo && materielCode == tmpMateriel && !item.IsNewRow) { KryptonMessageBox.Show($"物料条码:【{tmpMateriel}】,批次号:【{tmpBatchNo}】 已经被添加到发货单明细,不允许重复添加。"); return; } } } int index = kdgv_InvoiceDtlData.Rows.Add(); kdgv_InvoiceDtlData.Rows[index].Cells[0].Value = index + 1; kdgv_InvoiceDtlData.Rows[index].Cells[1].Value = materielCode; kdgv_InvoiceDtlData.Rows[index].Cells[2].Value = materielName; kdgv_InvoiceDtlData.Rows[index].Cells[3].Value = materielBarCode; kdgv_InvoiceDtlData.Rows[index].Cells[4].Value = materielSpec; kdgv_InvoiceDtlData.Rows[index].Cells[5].Value = batchNo; kdgv_InvoiceDtlData.Rows[index].Cells[6].Value = balanceQty; kdgv_InvoiceDtlData.Rows[index].Cells[8].Value = unitCode; kdgv_InvoiceDtlData.Rows[index].Cells[9].Value = packageCode; this.kdgv_materielBalanceData.Visible = false; this.kdgv_materielBalanceData.DataSource = null; this.ktb_BatchNoMsg.Text = ""; this.ktb_MaterielMsg.Text = ""; } } private void Delay(int milliseconds) { var timer = new System.Timers.Timer(milliseconds) { AutoReset = false }; timer.Elapsed += delegate { Invoke(new Action(()=> { DataGridViewCellEventArgs evta = new DataGridViewCellEventArgs(1, 0); kdgv_materielBalanceData_CellDoubleClick(this.kdgv_materielBalanceData, evta); timer.Dispose(); })); }; timer.Start(); } /// /// 物料信息输入内容变化事件 /// /// /// private void ktb_MaterielMsg_TextChanged(object sender, EventArgs e) { if (!string.IsNullOrEmpty(this.ktb_MaterielMsg.Text)) { Point pot = this.ktb_MaterielMsg.Location; pot.X = pot.X + 2; pot.Y = pot.Y + this.ktb_MaterielMsg.Height * 2 + 2; DataTable dt = CreateTable(new WmsStkBalanceDtlSearchMd { MaterielMsg = this.ktb_MaterielMsg.Text //BatchNoMsg = this.ktb_BatchNoMsg.Text }); if (dt.Rows.Count == 1 && this.ktb_MaterielMsg.Text == dt.Rows[0]["物料编码"].ToString()) { this.kdgv_materielBalanceData.Location = pot; this.kdgv_materielBalanceData.DataSource = dt; int cWidth = 0; for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++) { cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width; } this.kdgv_materielBalanceData.Width = cWidth + 40; this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight; this.kdgv_materielBalanceData.Visible = true; this.kdgv_materielBalanceData.Invalidate(); this.kdgv_materielBalanceData.CurrentCell = this.kdgv_materielBalanceData.Rows[0].Cells[0]; Delay(300); } else { this.kdgv_materielBalanceData.Location = pot; this.kdgv_materielBalanceData.DataSource = dt; int cWidth = 0; for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++) { cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width; } this.kdgv_materielBalanceData.Width = cWidth + 40; this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight; this.kdgv_materielBalanceData.Visible = true; this.kdgv_materielBalanceData.Invalidate(); } } else { this.kdgv_materielBalanceData.Visible = false; this.kdgv_materielBalanceData.DataSource = null; } } /// /// 批次号输入内容变化事件 /// /// /// private void ktb_BatchNoMsg_TextChanged(object sender, EventArgs e) { if (!string.IsNullOrEmpty(this.ktb_BatchNoMsg.Text)) { Point pot = this.ktb_BatchNoMsg.Location; pot.X = pot.X + 2; pot.Y = pot.Y + this.ktb_BatchNoMsg.Height * 2 + 2; DataTable dt = CreateTable(new WmsStkBalanceDtlSearchMd { //MaterielMsg = this.ktb_MaterielMsg.Text, BatchNoMsg = this.ktb_BatchNoMsg.Text }); if (dt.Rows.Count == 1 && this.ktb_BatchNoMsg.Text == dt.Rows[0]["物料编码"].ToString()) { this.kdgv_materielBalanceData.Location = pot; this.kdgv_materielBalanceData.DataSource = dt; int cWidth = 0; for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++) { cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width; } this.kdgv_materielBalanceData.Width = cWidth + 40; this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight; this.kdgv_materielBalanceData.Visible = true; this.kdgv_materielBalanceData.Invalidate(); this.kdgv_materielBalanceData.CurrentCell = this.kdgv_materielBalanceData.Rows[0].Cells[0]; Delay(300); } else { this.kdgv_materielBalanceData.Location = pot; this.kdgv_materielBalanceData.DataSource = dt; int cWidth = 0; for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++) { cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width; } this.kdgv_materielBalanceData.Width = cWidth + 40; this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight; this.kdgv_materielBalanceData.Visible = true; this.kdgv_materielBalanceData.Invalidate(); } } else { this.kdgv_materielBalanceData.Visible = false; this.kdgv_materielBalanceData.DataSource = null; } } #endregion #region 按钮事件 private void btnConfirm_Click(object sender, EventArgs e) { WmsOutInvoiceResult wmsOutInvoiceResult = new WmsOutInvoiceResult(); wmsOutInvoiceResult.INVOICE_PRIORITY = Convert.ToInt32(knud_InvoicePriority.Value); wmsOutInvoiceResult.INVOICE_TYPE = ((ListItem)kcmb_InvoiceType.SelectedItem).Value; if (kdtp_InvoiceEndTime.Checked) { wmsOutInvoiceResult.INVOICE_END_TIME = kdtp_InvoiceEndTime.Value; } else { wmsOutInvoiceResult.INVOICE_END_TIME = new DateTime(); } wmsOutInvoiceResult.DESCRIBE = ktb_Describe.Text.Trim(); wmsOutInvoiceResult.CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId; wmsOutInvoiceResult.UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId; List mdInvoiceDtlList = new List(); if (kdgv_InvoiceDtlData.Rows.Count > 0 && !kdgv_InvoiceDtlData.Rows[0].IsNewRow) { foreach (DataGridViewRow dvr in kdgv_InvoiceDtlData.Rows) { if (!dvr.IsNewRow) { #region 校验每一行数据的完整性 string RowCheckMsg = string.Empty; if (!CheckDataGridViewRowFormat(dvr, ref RowCheckMsg)) { KryptonMessageBox.Show(RowCheckMsg); return; } #endregion string materielCode = dvr.Cells[1].Value.ToString(); string materielName = dvr.Cells[2].Value.ToString(); string materielBarcode = dvr.Cells[3].Value == null ? null : dvr.Cells[3].Value.ToString(); string materielSpec = dvr.Cells[4].Value == null ? null : dvr.Cells[4].Value.ToString(); string batchNo = dvr.Cells[5].Value == null ? null : dvr.Cells[5].Value.ToString(); decimal invoiceQty = Convert.ToDecimal(dvr.Cells[7].Value.ToString()); string unitCode = dvr.Cells[8].Value == null ? null : dvr.Cells[8].Value.ToString(); string packageCode = dvr.Cells[9].Value == null ? null : dvr.Cells[9].Value.ToString(); mdInvoiceDtlList.Add(new WmsOutInvoiceDtlResult { MATERIEL_CODE = materielCode, MATERIEL_NAME = materielName, MATERIEL_BARCODE = materielBarcode, MATERIEL_SPEC = materielSpec, BATCH_NO = batchNo, INVOICE_DEMAND_QTY = invoiceQty, UNIT_CODE = unitCode, PACKAGE_CODE = packageCode, CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId, UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId, DESCRIBE = null }); } } wmsOutInvoiceResult.WmsOutInvoiceDtlList = mdInvoiceDtlList; var result = WmsInvoiceService.wmsOutInvoiceService.AddWmsOutInvoiceData(wmsOutInvoiceResult); if (result.Status == OperateStatus.Success) { KryptonMessageBox.Show(result.Message); frmWmsOutInvoice.RefreshFrmHost(); this.Close(); } else { KryptonMessageBox.Show(result.Message); } } else { KryptonMessageBox.Show("请添加发货单明细数据!"); } } /// /// 校验DataGridView输入行数据的正确性 /// /// DataGridView输入行 /// 校验结果信息 /// private bool CheckDataGridViewRowFormat(DataGridViewRow dvr, ref string OutMssg) { if (dvr.Cells[7].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入发货数量!"; return false; } else { if (!Regex.IsMatch(dvr.Cells[7].Value.ToString(), @"([1-9]\d*(\.\d*[1-9])?)")) { OutMssg = $"第【{dvr.Index + 1}】行输入的发货数量不是合法的数字类型,请检查!"; return false; } } OutMssg = "校验成功!"; return true; } private void btnCancel_Click(object sender, EventArgs e) { this.Close(); } #endregion #region DataGridView相关事件 private void kdgv_ReceiptDtlData_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e) { //int index = e.RowIndex; //kdgv_materielBalanceData.Rows[index].Cells[0].Value = index + 1; } #endregion #region 鼠标右键单击事件 private void 删除选中行ToolStripMenuItem_Click(object sender, EventArgs e) { if (!kdgv_InvoiceDtlData.CurrentRow.IsNewRow) { kdgv_InvoiceDtlData.Rows.Remove(kdgv_InvoiceDtlData.CurrentCell.OwningRow); foreach (DataGridViewRow item in kdgv_InvoiceDtlData.Rows) { if (!item.IsNewRow) { int index = item.Index; kdgv_InvoiceDtlData.Rows[index].Cells[0].Value = index + 1; } } } } private void 全部删除ToolStripMenuItem_Click(object sender, EventArgs e) { kdgv_InvoiceDtlData.Rows.Clear(); } #endregion } }