using ComponentFactory.Krypton.Toolkit; using NXWMS.Client.Model.AppModels.Condition.Balance; using NXWMS.Client.Model.AppModels.Condition.Common; 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.Web.UI.WebControls; using System.Windows.Forms; namespace NXWMS.Forms.OutStock.frmOutstockChild { /// /// 编辑发货单窗体 /// public partial class frmChildEditWmsOutInvoice : KryptonForm { /// /// 窗体构造函数 /// public frmChildEditWmsOutInvoice() { InitializeComponent(); InitmaterielBalanceDataControl(); } #region 全局变量 /// /// 库存物料数据的浮动DataGridView数据表 /// private KryptonDataGridView kdgv_materielBalanceData = new KryptonDataGridView(); /// /// 发货单主键ID /// public string InvoiceId { get; set; } /// /// 数据库中的发货单所有数据(包括主、明细表)。 /// 未进行编辑过。 /// private WmsOutInvoiceResult InvoiceDataNotEdit = new WmsOutInvoiceResult(); #endregion #region 初始化数据 /// /// 窗体加载函数 /// /// /// private void frmChildEditWmsOutInvoice_Load(object sender, EventArgs e) { InitComboBoxItemData(); kdtp_InvoiceEndTime.Checked = false; LoadWmsOutInvoiceDtlData(); } /// /// 初始化下拉列表数据 /// 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 string LoadWmsOutInvoiceDtlData() { var result = WmsInvoiceService.wmsOutInvoiceService.GetWmsOutInvoiceDtlListForId(new WmsOutInvoiceResult { INVOICE_ID = Convert.ToInt32(this.InvoiceId) }); if (result.Status == OperateStatus.Success) { kcmb_InvoiceType.Text = result.Data.INVOICE_TYPE_NAME; kcmb_InvoiceType.Enabled = false; knud_InvoicePriority.Value = result.Data.INVOICE_PRIORITY; //knud_InvoicePriority.Enabled = false; ktb_Describe.Text = result.Data.DESCRIBE; if (result.Data.INVOICE_END_TIME != new DateTime()) { kdtp_InvoiceEndTime.Value = result.Data.INVOICE_END_TIME; } InvoiceDataNotEdit = result.Data; kdgv_InvoiceDtlData.Rows.Clear(); foreach (WmsOutInvoiceDtlResult item in result.Data.WmsOutInvoiceDtlList) { int index = kdgv_InvoiceDtlData.Rows.Add(); kdgv_InvoiceDtlData.Rows[index].Cells[0].Value = index + 1; kdgv_InvoiceDtlData.Rows[index].Cells[1].Value = item.MATERIEL_CODE; kdgv_InvoiceDtlData.Rows[index].Cells[2].Value = item.MATERIEL_NAME; kdgv_InvoiceDtlData.Rows[index].Cells[3].Value = item.MATERIEL_BARCODE; kdgv_InvoiceDtlData.Rows[index].Cells[4].Value = item.MATERIEL_SPEC; kdgv_InvoiceDtlData.Rows[index].Cells[5].Value = item.BATCH_NO; kdgv_InvoiceDtlData.Rows[index].Cells[6].Value = item.INVOICE_DEMAND_QTY; kdgv_InvoiceDtlData.Rows[index].Cells[7].Value = item.UNIT_CODE; kdgv_InvoiceDtlData.Rows[index].Cells[8].Value = item.PACKAGE_CODE; } return string.Empty; } else { return result.Message; } } #region 初始化浮动DataGridView控件和数据 /// /// 初始化库存物料数据的浮动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; WmsOutInvoiceDtlResult invoiceDtlMd = InvoiceDataNotEdit.WmsOutInvoiceDtlList.Find(x => x.MATERIEL_CODE == materielCode && x.BATCH_NO == batchNo); if (invoiceDtlMd != null) { kdgv_InvoiceDtlData.Rows[index].Cells[6].Value = balanceQty; } kdgv_InvoiceDtlData.Rows[index].Cells[7].Value = unitCode; kdgv_InvoiceDtlData.Rows[index].Cells[8].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; } } 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; } #endregion #endregion #region 按钮事件 private void btnConfirm_Click(object sender, EventArgs e) { WmsOutInvoiceResult mdInvoice = new WmsOutInvoiceResult(); mdInvoice.INVOICE_ID = InvoiceDataNotEdit.INVOICE_ID; mdInvoice.INVOICE_NO = InvoiceDataNotEdit.INVOICE_NO; mdInvoice.INVOICE_TYPE = ((ListItem)kcmb_InvoiceType.SelectedItem).Value; mdInvoice.INVOICE_TYPE_NAME = kcmb_InvoiceType.Text; if (kdtp_InvoiceEndTime.Checked) { mdInvoice.INVOICE_END_TIME = kdtp_InvoiceEndTime.Value; } else { mdInvoice.INVOICE_END_TIME = new DateTime(); } mdInvoice.INVOICE_STATUS = InvoiceDataNotEdit.INVOICE_STATUS; mdInvoice.INVOICE_PRIORITY = Convert.ToInt32(knud_InvoicePriority.Value); mdInvoice.DESCRIBE = ktb_Describe.Text.Trim(); mdInvoice.CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId; mdInvoice.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[6].Value.ToString()); string unitCode = dvr.Cells[7].Value == null ? null : dvr.Cells[7].Value.ToString(); string packageCode = dvr.Cells[8].Value == null ? null : dvr.Cells[8].Value.ToString(); WmsOutInvoiceDtlResult invoiceDtlMd = InvoiceDataNotEdit.WmsOutInvoiceDtlList.Find(x => x.MATERIEL_CODE == materielCode && x.BATCH_NO == batchNo); mdInvoiceDtlList.Add(new WmsOutInvoiceDtlResult { INVOICE_DTL_ID = invoiceDtlMd == null ? 0 : invoiceDtlMd.INVOICE_DTL_ID, MATERIEL_CODE = materielCode, MATERIEL_NAME = materielName, MATERIEL_BARCODE = materielBarcode, 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 }); } } #region 校验明细行 不能存在相同批次、物料条码的数据行 var strList = mdInvoiceDtlList.GroupBy(x => new { x.MATERIEL_CODE, x.BATCH_NO }).Select(x => new { Key = x.Count(), MATERIEL_CODE = x.Key.MATERIEL_CODE, BATCH_NO = x.Key.BATCH_NO }).ToList(); foreach (var item in strList) { if (item.Key > 1) { KryptonMessageBox.Show($"相同的物料:【{item.MATERIEL_CODE}】,批次号:【{item.BATCH_NO}】只能添加一行数据,请修正输入数据行!"); return; } } #endregion List finalInvoiceDtlList = new List(); foreach (WmsOutInvoiceDtlResult itemOld in InvoiceDataNotEdit.WmsOutInvoiceDtlList) { WmsOutInvoiceDtlResult arrDtlNew = mdInvoiceDtlList.Find(x => x.MATERIEL_CODE == itemOld.MATERIEL_CODE && x.BATCH_NO == itemOld.BATCH_NO); if (arrDtlNew != null) { arrDtlNew.INVOICE_DTL_STATUS = itemOld.INVOICE_DTL_STATUS; arrDtlNew.REMARKS1 = "更新"; finalInvoiceDtlList.Add(arrDtlNew); } else { itemOld.INVOICE_DTL_STATUS = (int)InvoiceStatus.已删除; itemOld.REMARKS1 = "删除"; finalInvoiceDtlList.Add(itemOld); } } foreach (WmsOutInvoiceDtlResult itemNew in mdInvoiceDtlList) { if (itemNew.INVOICE_DTL_ID == 0) { itemNew.REMARKS1 = "添加"; finalInvoiceDtlList.Add(itemNew); } } mdInvoice.WmsOutInvoiceDtlList = finalInvoiceDtlList; var result = WmsInvoiceService.wmsOutInvoiceService.EditWmsOutInvoiceData(mdInvoice); if (result.Status == OperateStatus.Success) { KryptonMessageBox.Show(result.Message); frmWmsOutInvoice.RefreshFrmHost(); this.Close(); } else { KryptonMessageBox.Show(result.Message); } } else { DialogResult dr = KryptonMessageBox.Show("由于明细为空,确定要删除发货单所有数据吗?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); if (dr == DialogResult.OK) { var result = WmsInvoiceService.wmsOutInvoiceService.DeleteWmsOutInvoiceData(new WmsOutInvoiceResult { INVOICE_NO = InvoiceDataNotEdit.INVOICE_ID.ToString(), UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId }); if (result.Status == OperateStatus.Success) { KryptonMessageBox.Show(result.Message); frmWmsOutInvoice.RefreshFrmHost(); this.Close(); } else { KryptonMessageBox.Show(result.Message); } } } } /// /// 校验DataGridView输入行数据的正确性 /// /// DataGridView输入行 /// 校验结果信息 /// private bool CheckDataGridViewRowFormat(DataGridViewRow dvr, ref string OutMssg) { if (dvr.Cells[6].Value == null) { OutMssg = $"第【{dvr.Index + 1}】行未输入发货数量!"; return false; } else { if (!Regex.IsMatch(dvr.Cells[6].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相关事件 #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) //{ // 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(); } private void 重新加载ToolStripMenuItem_Click(object sender, EventArgs e) { var loadfrm = new frmLoading(); loadfrm.Show(); var message = loadfrm.EventCalExec(LoadWmsOutInvoiceDtlData); if (!string.IsNullOrWhiteSpace(message)) { KryptonMessageBox.Show($"查询失败!\r\n{message}", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } #endregion } }