frmChildAddWmsOutInvoice.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. using ComponentFactory.Krypton.Toolkit;
  2. using NXWMS.Client.Model.AppModels.Condition.Balance;
  3. using NXWMS.Client.Model.AppModels.Result.Balance;
  4. using NXWMS.Client.Model.AppModels.Result.Common;
  5. using NXWMS.Client.Model.AppModels.Result.OutStock;
  6. using NXWMS.Client.Model.CoreModels;
  7. using NXWMS.Commons;
  8. using NXWMS.Services;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.ComponentModel;
  12. using System.Data;
  13. using System.Drawing;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Text.RegularExpressions;
  17. using System.Threading;
  18. using System.Threading.Tasks;
  19. using System.Web.UI.WebControls;
  20. using System.Windows.Forms;
  21. namespace NXWMS.Forms.OutStock.frmOutstockChild
  22. {
  23. /// <summary>
  24. /// 添加发货单窗体类
  25. /// </summary>
  26. public partial class frmChildAddWmsOutInvoice : KryptonForm
  27. {
  28. /// <summary>
  29. /// 窗体构造函数
  30. /// </summary>
  31. public frmChildAddWmsOutInvoice()
  32. {
  33. InitializeComponent();
  34. InitmaterielBalanceDataControl();
  35. }
  36. #region 全局变量
  37. /// <summary>
  38. /// 库存物料数据的浮动DataGridView数据表
  39. /// </summary>
  40. private KryptonDataGridView kdgv_materielBalanceData = new KryptonDataGridView();
  41. #endregion
  42. #region 初始化数据
  43. private void frmChildAddWmsOutInvoice_Load(object sender, EventArgs e)
  44. {
  45. InitComboBoxItemData();
  46. kdtp_InvoiceEndTime.Checked = false;
  47. }
  48. /// <summary>
  49. /// 初始化下拉列表数据
  50. /// </summary>
  51. private void InitComboBoxItemData()
  52. {
  53. /*
  54. ToDo:后续把下拉列表转为 后台获取数据,目前是写死的。
  55. */
  56. List<BasDictionaryResult> results = new List<BasDictionaryResult>();
  57. #region 单据类型
  58. results = BasDictionaryUtil.basDictionaryResultLst.FindAll(x => x.DICTIONARY_CODE == "InvoiceTypeDesc");
  59. if (results.Count > 0)
  60. {
  61. kcmb_InvoiceType.Items.Clear();
  62. foreach (var item in results)
  63. {
  64. kcmb_InvoiceType.Items.Add(new ListItem
  65. {
  66. Value = item.DICTIONARY_ITEM_CODE,
  67. Text = item.DICTIONARY_ITEM_NAME,
  68. });
  69. }
  70. kcmb_InvoiceType.SelectedIndex = 0;
  71. }
  72. else
  73. {
  74. KryptonMessageBox.Show("未找到发货单类型的字典项数据!");
  75. }
  76. #endregion
  77. }
  78. private DataTable CreateTable(WmsStkBalanceDtlSearchMd SearchMd)
  79. {
  80. DataTable dt = new DataTable();
  81. DataColumn dc = new DataColumn("序号");
  82. dt.Columns.Add(dc);
  83. dc = new DataColumn("物料编码");
  84. dt.Columns.Add(dc);
  85. dc = new DataColumn("物料名称");
  86. dt.Columns.Add(dc);
  87. dc = new DataColumn("物料规格");
  88. dt.Columns.Add(dc);
  89. dc = new DataColumn("物料条码");
  90. dt.Columns.Add(dc);
  91. dc = new DataColumn("批次号");
  92. dt.Columns.Add(dc);
  93. dc = new DataColumn("库存数量");
  94. dt.Columns.Add(dc);
  95. dc = new DataColumn("单位");
  96. dt.Columns.Add(dc);
  97. dc = new DataColumn("包装");
  98. dt.Columns.Add(dc);
  99. var result = WmsInvoiceService.wmsOutInvoiceService.GetBalanceForInvoice(new WmsStkBalanceDtlSearchMd
  100. {
  101. MaterielMsg = ktb_MaterielMsg.Text,
  102. BatchNoMsg = ktb_BatchNoMsg.Text
  103. });
  104. if (result.Status == OperateStatus.Success)
  105. {
  106. if (result.Data.Count > 0)
  107. {
  108. int index = 0;
  109. foreach (WmsStkBalanceDtlResult item in result.Data)
  110. {
  111. index++;
  112. DataRow dr = dt.NewRow();
  113. dr["序号"] = index;
  114. dr["物料编码"] = item.MATERIEL_CODE;
  115. dr["物料名称"] = item.MATERIEL_NAME;
  116. dr["物料规格"] = item.MATERIEL_SPEC;
  117. dr["物料条码"] = item.MATERIEL_BARCODE;
  118. dr["批次号"] = item.BATCH_NO;
  119. dr["库存数量"] = item.QTY;
  120. dr["单位"] = item.UNIT_CODE;
  121. dr["包装"] = item.PACKAGE_CODE;
  122. dt.Rows.Add(dr);
  123. }
  124. }
  125. }
  126. return dt;
  127. }
  128. /// <summary>
  129. /// 初始化库存物料数据的浮动DataGridView数据表
  130. /// </summary>
  131. private void InitmaterielBalanceDataControl()
  132. {
  133. this.Controls.Add(kdgv_materielBalanceData);
  134. kdgv_materielBalanceData.Visible = false;
  135. kdgv_materielBalanceData.AllowUserToAddRows = false;
  136. kdgv_materielBalanceData.AllowUserToDeleteRows = false;
  137. kdgv_materielBalanceData.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
  138. kdgv_materielBalanceData.MultiSelect = false;
  139. kdgv_materielBalanceData.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
  140. kdgv_materielBalanceData.ScrollBars = System.Windows.Forms.ScrollBars.None;
  141. kdgv_materielBalanceData.BorderStyle = System.Windows.Forms.BorderStyle.None;
  142. kdgv_materielBalanceData.BackgroundColor = this.BackColor;
  143. kdgv_materielBalanceData.BringToFront();
  144. kdgv_materielBalanceData.ReadOnly = true;
  145. kdgv_materielBalanceData.CellDoubleClick += kdgv_materielBalanceData_CellDoubleClick;
  146. }
  147. private void kdgv_materielBalanceData_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
  148. {
  149. int rowIndex = e.RowIndex;
  150. if (rowIndex >= 0)
  151. {
  152. string idX = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["序号"].Value.ToString();
  153. string materielCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料编码"].Value.ToString();
  154. string materielName = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料名称"].Value.ToString();
  155. string materielBarCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料条码"].Value.ToString();
  156. string materielSpec = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["物料规格"].Value.ToString();
  157. string batchNo = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["批次号"].Value.ToString();
  158. string balanceQty = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["库存数量"].Value.ToString();
  159. string unitCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["单位"].Value.ToString();
  160. string packageCode = this.kdgv_materielBalanceData.Rows[rowIndex].Cells["包装"].Value.ToString();
  161. if (kdgv_InvoiceDtlData.Rows.Count > 0)
  162. {
  163. foreach (DataGridViewRow item in kdgv_InvoiceDtlData.Rows)
  164. {
  165. string tmpBatchNo = item.Cells[5].Value == null ? "" : item.Cells[5].Value.ToString();
  166. string tmpMateriel = item.Cells[1].Value == null ? "" : item.Cells[1].Value.ToString();
  167. if (batchNo == tmpBatchNo && materielCode == tmpMateriel && !item.IsNewRow)
  168. {
  169. KryptonMessageBox.Show($"物料条码:【{tmpMateriel}】,批次号:【{tmpBatchNo}】 已经被添加到发货单明细,不允许重复添加。");
  170. return;
  171. }
  172. }
  173. }
  174. int index = kdgv_InvoiceDtlData.Rows.Add();
  175. kdgv_InvoiceDtlData.Rows[index].Cells[0].Value = index + 1;
  176. kdgv_InvoiceDtlData.Rows[index].Cells[1].Value = materielCode;
  177. kdgv_InvoiceDtlData.Rows[index].Cells[2].Value = materielName;
  178. kdgv_InvoiceDtlData.Rows[index].Cells[3].Value = materielBarCode;
  179. kdgv_InvoiceDtlData.Rows[index].Cells[4].Value = materielSpec;
  180. kdgv_InvoiceDtlData.Rows[index].Cells[5].Value = batchNo;
  181. kdgv_InvoiceDtlData.Rows[index].Cells[6].Value = balanceQty;
  182. kdgv_InvoiceDtlData.Rows[index].Cells[8].Value = unitCode;
  183. kdgv_InvoiceDtlData.Rows[index].Cells[9].Value = packageCode;
  184. this.kdgv_materielBalanceData.Visible = false;
  185. this.kdgv_materielBalanceData.DataSource = null;
  186. this.ktb_BatchNoMsg.Text = "";
  187. this.ktb_MaterielMsg.Text = "";
  188. }
  189. }
  190. private void Delay(int milliseconds)
  191. {
  192. var timer = new System.Timers.Timer(milliseconds) { AutoReset = false };
  193. timer.Elapsed += delegate {
  194. Invoke(new Action(()=> {
  195. DataGridViewCellEventArgs evta = new DataGridViewCellEventArgs(1, 0);
  196. kdgv_materielBalanceData_CellDoubleClick(this.kdgv_materielBalanceData, evta);
  197. timer.Dispose();
  198. }));
  199. };
  200. timer.Start();
  201. }
  202. /// <summary>
  203. /// 物料信息输入内容变化事件
  204. /// </summary>
  205. /// <param name="sender"></param>
  206. /// <param name="e"></param>
  207. private void ktb_MaterielMsg_TextChanged(object sender, EventArgs e)
  208. {
  209. if (!string.IsNullOrEmpty(this.ktb_MaterielMsg.Text))
  210. {
  211. Point pot = this.ktb_MaterielMsg.Location;
  212. pot.X = pot.X + 2;
  213. pot.Y = pot.Y + this.ktb_MaterielMsg.Height * 2 + 2;
  214. DataTable dt = CreateTable(new WmsStkBalanceDtlSearchMd {
  215. MaterielMsg = this.ktb_MaterielMsg.Text
  216. //BatchNoMsg = this.ktb_BatchNoMsg.Text
  217. });
  218. if (dt.Rows.Count == 1 && this.ktb_MaterielMsg.Text == dt.Rows[0]["物料编码"].ToString())
  219. {
  220. this.kdgv_materielBalanceData.Location = pot;
  221. this.kdgv_materielBalanceData.DataSource = dt;
  222. int cWidth = 0;
  223. for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++)
  224. {
  225. cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width;
  226. }
  227. this.kdgv_materielBalanceData.Width = cWidth + 40;
  228. this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight;
  229. this.kdgv_materielBalanceData.Visible = true;
  230. this.kdgv_materielBalanceData.Invalidate();
  231. this.kdgv_materielBalanceData.CurrentCell = this.kdgv_materielBalanceData.Rows[0].Cells[0];
  232. Delay(300);
  233. }
  234. else
  235. {
  236. this.kdgv_materielBalanceData.Location = pot;
  237. this.kdgv_materielBalanceData.DataSource = dt;
  238. int cWidth = 0;
  239. for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++)
  240. {
  241. cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width;
  242. }
  243. this.kdgv_materielBalanceData.Width = cWidth + 40;
  244. this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight;
  245. this.kdgv_materielBalanceData.Visible = true;
  246. this.kdgv_materielBalanceData.Invalidate();
  247. }
  248. }
  249. else
  250. {
  251. this.kdgv_materielBalanceData.Visible = false;
  252. this.kdgv_materielBalanceData.DataSource = null;
  253. }
  254. }
  255. /// <summary>
  256. /// 批次号输入内容变化事件
  257. /// </summary>
  258. /// <param name="sender"></param>
  259. /// <param name="e"></param>
  260. private void ktb_BatchNoMsg_TextChanged(object sender, EventArgs e)
  261. {
  262. if (!string.IsNullOrEmpty(this.ktb_BatchNoMsg.Text))
  263. {
  264. Point pot = this.ktb_BatchNoMsg.Location;
  265. pot.X = pot.X + 2;
  266. pot.Y = pot.Y + this.ktb_BatchNoMsg.Height * 2 + 2;
  267. DataTable dt = CreateTable(new WmsStkBalanceDtlSearchMd
  268. {
  269. //MaterielMsg = this.ktb_MaterielMsg.Text,
  270. BatchNoMsg = this.ktb_BatchNoMsg.Text
  271. });
  272. if (dt.Rows.Count == 1 && this.ktb_BatchNoMsg.Text == dt.Rows[0]["物料编码"].ToString())
  273. {
  274. this.kdgv_materielBalanceData.Location = pot;
  275. this.kdgv_materielBalanceData.DataSource = dt;
  276. int cWidth = 0;
  277. for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++)
  278. {
  279. cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width;
  280. }
  281. this.kdgv_materielBalanceData.Width = cWidth + 40;
  282. this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight;
  283. this.kdgv_materielBalanceData.Visible = true;
  284. this.kdgv_materielBalanceData.Invalidate();
  285. this.kdgv_materielBalanceData.CurrentCell = this.kdgv_materielBalanceData.Rows[0].Cells[0];
  286. Delay(300);
  287. }
  288. else
  289. {
  290. this.kdgv_materielBalanceData.Location = pot;
  291. this.kdgv_materielBalanceData.DataSource = dt;
  292. int cWidth = 0;
  293. for (int i = 0; i < this.kdgv_materielBalanceData.Columns.Count; i++)
  294. {
  295. cWidth = cWidth + this.kdgv_materielBalanceData.Columns[i].Width;
  296. }
  297. this.kdgv_materielBalanceData.Width = cWidth + 40;
  298. this.kdgv_materielBalanceData.Height = this.kdgv_materielBalanceData.Rows.Count * this.kdgv_materielBalanceData.RowTemplate.Height + this.kdgv_materielBalanceData.ColumnHeadersHeight;
  299. this.kdgv_materielBalanceData.Visible = true;
  300. this.kdgv_materielBalanceData.Invalidate();
  301. }
  302. }
  303. else
  304. {
  305. this.kdgv_materielBalanceData.Visible = false;
  306. this.kdgv_materielBalanceData.DataSource = null;
  307. }
  308. }
  309. #endregion
  310. #region 按钮事件
  311. private void btnConfirm_Click(object sender, EventArgs e)
  312. {
  313. WmsOutInvoiceResult wmsOutInvoiceResult = new WmsOutInvoiceResult();
  314. wmsOutInvoiceResult.INVOICE_PRIORITY = Convert.ToInt32(knud_InvoicePriority.Value);
  315. wmsOutInvoiceResult.INVOICE_TYPE = ((ListItem)kcmb_InvoiceType.SelectedItem).Value;
  316. if (kdtp_InvoiceEndTime.Checked)
  317. {
  318. wmsOutInvoiceResult.INVOICE_END_TIME = kdtp_InvoiceEndTime.Value;
  319. }
  320. else
  321. {
  322. wmsOutInvoiceResult.INVOICE_END_TIME = new DateTime();
  323. }
  324. wmsOutInvoiceResult.DESCRIBE = ktb_Describe.Text.Trim();
  325. wmsOutInvoiceResult.CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId;
  326. wmsOutInvoiceResult.UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId;
  327. List<WmsOutInvoiceDtlResult> mdInvoiceDtlList = new List<WmsOutInvoiceDtlResult>();
  328. if (kdgv_InvoiceDtlData.Rows.Count > 0 && !kdgv_InvoiceDtlData.Rows[0].IsNewRow)
  329. {
  330. foreach (DataGridViewRow dvr in kdgv_InvoiceDtlData.Rows)
  331. {
  332. if (!dvr.IsNewRow)
  333. {
  334. #region 校验每一行数据的完整性
  335. string RowCheckMsg = string.Empty;
  336. if (!CheckDataGridViewRowFormat(dvr, ref RowCheckMsg))
  337. {
  338. KryptonMessageBox.Show(RowCheckMsg);
  339. return;
  340. }
  341. #endregion
  342. string materielCode = dvr.Cells[1].Value.ToString();
  343. string materielName = dvr.Cells[2].Value.ToString();
  344. string materielBarcode = dvr.Cells[3].Value == null ? null : dvr.Cells[3].Value.ToString();
  345. string materielSpec = dvr.Cells[4].Value == null ? null : dvr.Cells[4].Value.ToString();
  346. string batchNo = dvr.Cells[5].Value == null ? null : dvr.Cells[5].Value.ToString();
  347. decimal invoiceQty = Convert.ToDecimal(dvr.Cells[7].Value.ToString());
  348. string unitCode = dvr.Cells[8].Value == null ? null : dvr.Cells[8].Value.ToString();
  349. string packageCode = dvr.Cells[9].Value == null ? null : dvr.Cells[9].Value.ToString();
  350. mdInvoiceDtlList.Add(new WmsOutInvoiceDtlResult
  351. {
  352. MATERIEL_CODE = materielCode,
  353. MATERIEL_NAME = materielName,
  354. MATERIEL_BARCODE = materielBarcode,
  355. MATERIEL_SPEC = materielSpec,
  356. BATCH_NO = batchNo,
  357. INVOICE_DEMAND_QTY = invoiceQty,
  358. UNIT_CODE = unitCode,
  359. PACKAGE_CODE = packageCode,
  360. CREATE_BY = AppConfig.UserLoginResult.UserInfo.UserId,
  361. UPDATE_BY = AppConfig.UserLoginResult.UserInfo.UserId,
  362. DESCRIBE = null
  363. });
  364. }
  365. }
  366. wmsOutInvoiceResult.WmsOutInvoiceDtlList = mdInvoiceDtlList;
  367. var result = WmsInvoiceService.wmsOutInvoiceService.AddWmsOutInvoiceData(wmsOutInvoiceResult);
  368. if (result.Status == OperateStatus.Success)
  369. {
  370. KryptonMessageBox.Show(result.Message);
  371. frmWmsOutInvoice.RefreshFrmHost();
  372. this.Close();
  373. }
  374. else
  375. {
  376. KryptonMessageBox.Show(result.Message);
  377. }
  378. }
  379. else
  380. {
  381. KryptonMessageBox.Show("请添加发货单明细数据!");
  382. }
  383. }
  384. /// <summary>
  385. /// 校验DataGridView输入行数据的正确性
  386. /// </summary>
  387. /// <param name="dvr">DataGridView输入行</param>
  388. /// <param name="OutMssg">校验结果信息</param>
  389. /// <returns></returns>
  390. private bool CheckDataGridViewRowFormat(DataGridViewRow dvr, ref string OutMssg)
  391. {
  392. if (dvr.Cells[7].Value == null)
  393. {
  394. OutMssg = $"第【{dvr.Index + 1}】行未输入发货数量!";
  395. return false;
  396. }
  397. else
  398. {
  399. if (!Regex.IsMatch(dvr.Cells[7].Value.ToString(), @"([1-9]\d*(\.\d*[1-9])?)"))
  400. {
  401. OutMssg = $"第【{dvr.Index + 1}】行输入的发货数量不是合法的数字类型,请检查!";
  402. return false;
  403. }
  404. }
  405. OutMssg = "校验成功!";
  406. return true;
  407. }
  408. private void btnCancel_Click(object sender, EventArgs e)
  409. {
  410. this.Close();
  411. }
  412. #endregion
  413. #region DataGridView相关事件
  414. private void kdgv_ReceiptDtlData_RowsAdded(object sender, DataGridViewRowsAddedEventArgs e)
  415. {
  416. //int index = e.RowIndex;
  417. //kdgv_materielBalanceData.Rows[index].Cells[0].Value = index + 1;
  418. }
  419. #endregion
  420. #region 鼠标右键单击事件
  421. private void 删除选中行ToolStripMenuItem_Click(object sender, EventArgs e)
  422. {
  423. if (!kdgv_InvoiceDtlData.CurrentRow.IsNewRow)
  424. {
  425. kdgv_InvoiceDtlData.Rows.Remove(kdgv_InvoiceDtlData.CurrentCell.OwningRow);
  426. foreach (DataGridViewRow item in kdgv_InvoiceDtlData.Rows)
  427. {
  428. if (!item.IsNewRow)
  429. {
  430. int index = item.Index;
  431. kdgv_InvoiceDtlData.Rows[index].Cells[0].Value = index + 1;
  432. }
  433. }
  434. }
  435. }
  436. private void 全部删除ToolStripMenuItem_Click(object sender, EventArgs e)
  437. {
  438. kdgv_InvoiceDtlData.Rows.Clear();
  439. }
  440. #endregion
  441. }
  442. }