Make_ShipmentVerify.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564
  1. 
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using UAS_MES_NEW.CustomControl.ButtonUtil;
  12. using UAS_MES_NEW.CustomControl.RichText;
  13. using UAS_MES_NEW.DataOperate;
  14. using UAS_MES_NEW.Entity;
  15. using UAS_MES_NEW.PublicMethod;
  16. namespace UAS_MES_NEW.Make
  17. {
  18. public partial class Make_ShipmentVerify : Form
  19. {
  20. public Make_ShipmentVerify()
  21. {
  22. InitializeComponent();
  23. }
  24. DataTable dt, data;
  25. DataHelper dh;
  26. int panelQty;
  27. string oMakeCode, oMSID, reworkstatus, ifrework, ErrorMessage;
  28. private void Make_HandFeedRegistration_Load(object sender, EventArgs e)
  29. {
  30. dh = SystemInf.dh;
  31. data = new DataTable();
  32. data.Columns.Add("isDel", typeof(bool));
  33. data.Columns.Add("rn", typeof(int));
  34. data.Columns.Add("ms_sncode", typeof(string));
  35. data.Columns.Add("ms_makecode", typeof(string));
  36. dgv.AutoGenerateColumns = false;
  37. dgv.DataSource = data;
  38. snVal.Enabled = false;
  39. if (string.IsNullOrEmpty(BoxQtyVal.Text))
  40. BoxQtyVal.Text = "0";
  41. PanelQtyVal.Focus();
  42. }
  43. private void Confirm_Click(object sender, EventArgs e)
  44. {
  45. if (Confirm.Text == "确认")
  46. {
  47. if (string.IsNullOrEmpty(PanelQtyVal.Text))
  48. {
  49. PanelQtyVal.Text = "";
  50. ShowMsg(Msg1, 0, "请输入拼板数");
  51. PanelQtyVal.Focus();
  52. return;
  53. }
  54. if (!int.TryParse(PanelQtyVal.Text, out int qty) || qty <= 0)
  55. {
  56. PanelQtyVal.Text = "";
  57. ShowMsg(Msg1, 0, "拼板数请输入正整数");
  58. PanelQtyVal.Focus();
  59. return;
  60. }
  61. if (!int.TryParse(BoxQtyVal.Text.Trim(), out int boxQty) || boxQty < 0)
  62. {
  63. ShowMsg(Msg1, 0, "当前箱容量请输入非负整数");
  64. BoxQtyVal.Focus();
  65. BoxQtyVal.SelectAll();
  66. return;
  67. }
  68. panelQty = qty;
  69. BoxQtyVal.Text = boxQty.ToString();
  70. Confirm.Text = "取消";
  71. PanelQtyVal.Enabled = false;
  72. BoxQtyVal.Enabled = false;
  73. snVal.Enabled = true;
  74. snVal.Focus();
  75. snVal.SelectAll();
  76. }
  77. else if (Confirm.Text == "取消")
  78. {
  79. Confirm.Text = "确认";
  80. panelQty = 0;
  81. PanelQtyVal.Enabled = true;
  82. BoxQtyVal.Enabled = true;
  83. snVal.Enabled = false;
  84. snVal.Text = "";
  85. data.Rows.Clear();
  86. UpdateSN("C");
  87. PanelQtyVal.Focus();
  88. PanelQtyVal.SelectAll();
  89. }
  90. }
  91. private void snVal_KeyDown(object sender, KeyEventArgs e)
  92. {
  93. if (e.KeyCode != Keys.Enter) return;
  94. e.Handled = true;
  95. e.SuppressKeyPress = true;
  96. if (PanelQtyVal.Enabled || panelQty <= 0)
  97. {
  98. ShowMsg(Msg1, 0, "请先确认拼板数量");
  99. return;
  100. }
  101. string scanSn = snVal.Text.Trim();
  102. if (string.IsNullOrEmpty(scanSn))
  103. {
  104. ShowMsg(Msg1, 0, "请扫描序列号");
  105. snVal.Focus();
  106. return;
  107. }
  108. if (data.Rows.Count >= panelQty)
  109. {
  110. ShowMsg(Msg1, 0, "已达到拼板数量");
  111. snVal.Focus();
  112. snVal.SelectAll();
  113. return;
  114. }
  115. string snSql = scanSn.Replace("'", "''");
  116. dt = (DataTable)dh.ExecuteSql($@"SELECT ms_sncode, ms_makecode FROM makeserial a WHERE
  117. a.ms_sncode = '{snSql}'", "select");
  118. if (dt.Rows.Count > 0)
  119. {
  120. string snCode = dt.Rows[0]["ms_sncode"].ToString();
  121. string makeCode = dt.Rows[0]["ms_makecode"].ToString();
  122. foreach (DataRow row in data.Rows)
  123. {
  124. if (string.Equals(row["ms_sncode"].ToString(), snCode, StringComparison.OrdinalIgnoreCase))
  125. {
  126. ShowMsg(Msg1, 0, "序列号已扫描");
  127. snVal.Focus();
  128. snVal.SelectAll();
  129. return;
  130. }
  131. }
  132. if (!CheckCollectSN(snCode, makeCode))
  133. {
  134. snVal.Focus();
  135. snVal.SelectAll();
  136. return;
  137. }
  138. data.Rows.Add(false, data.Rows.Count + 1, snCode, makeCode);
  139. UpdateSN("L", snCode);
  140. snVal.Text = "";
  141. snVal.Focus();
  142. if (data.Rows.Count >= panelQty)
  143. {
  144. ShowMsg(Msg1, 1, "拼板数量已扫满");
  145. PanelFull();
  146. }
  147. }
  148. else
  149. {
  150. ShowMsg(Msg1, 0, "序列号不存在");
  151. UpdateSN("C");
  152. snVal.Focus();
  153. snVal.SelectAll();
  154. }
  155. }
  156. /// <summary>
  157. /// 采集工序校验。不通过时已输出红色提示,调用处只需处理焦点。
  158. /// </summary>
  159. private bool CheckCollectSN(string snCode, string makeCode)
  160. {
  161. if (!LogicHandler.CheckStepAttribute(Tag.ToString(), User.UserSourceCode, out ErrorMessage))
  162. {
  163. ShowMsg(Msg1, 0, ErrorMessage);
  164. return false;
  165. }
  166. bool NoteAlready = LogicHandler.CheckDiffMakeCodeBeforeStepCheck(snCode, makeCode, true, out oMakeCode, out ErrorMessage);
  167. if (!NoteAlready)
  168. {
  169. ShowMsg(Msg1, 0, ErrorMessage);
  170. return false;
  171. }
  172. if (!LogicHandler.CheckStepSNAndMacode(oMakeCode, User.UserSourceCode, snCode, User.UserCode, out oMakeCode, out oMSID, out ErrorMessage))
  173. {
  174. ShowMsg(Msg1, 0, ErrorMessage);
  175. return false;
  176. }
  177. if (!LogicHandler.CheckDiffMakeCodeAfterStepCheck(snCode, oMakeCode, true, NoteAlready, workOrder, out ErrorMessage))
  178. {
  179. ShowMsg(Msg1, 0, ErrorMessage);
  180. return false;
  181. }
  182. if (workOrder.Text != oMakeCode && oMakeCode != null)
  183. {
  184. string makeSql = oMakeCode.Replace("'", "''");
  185. dt = (DataTable)dh.ExecuteSql("select ma_code,ma_prodcode,ma_softversion,ma_salecode,pr_spec,nvl(pr_sendchecktype,'LineCode')pr_sendchecktype,ma_qty from make left join product on ma_prodcode=pr_code where ma_code='" + makeSql + "'", "select");
  186. if (dt.Rows.Count > 0)
  187. {
  188. BaseUtil.SetFormValue(this.Controls, dt);
  189. workOrder.Text = dt.Rows[0]["ma_code"].ToString();
  190. productCode.Text = dt.Rows[0]["ma_prodcode"].ToString();
  191. productName.Text = dt.Rows[0]["pr_spec"].ToString();
  192. LoadMakeSummary(workOrder.Text);
  193. }
  194. }
  195. string msIdSql = (oMSID ?? "").Replace("'", "''");
  196. dt = (DataTable)dh.ExecuteSql("select ms_nextstepcode,ms_sncode,ms_reworkstatus,nvl(ms_ifrework,0)ms_ifrework,ms_stepcode,ms_status,nvl(st_ifrepair,0) st_ifrepair from makeserial left join step on ms_stepcode=st_code where ms_id='" + msIdSql + "'", "select");
  197. if (dt.Rows.Count == 0)
  198. {
  199. ShowMsg(Msg1, 0, "未查询到序列号工序信息");
  200. return false;
  201. }
  202. string status = dt.Rows[0]["ms_status"].ToString();
  203. reworkstatus = dt.Rows[0]["ms_reworkstatus"].ToString();
  204. string stepcode = dt.Rows[0]["ms_stepcode"].ToString();
  205. string ifrepair = dt.Rows[0]["st_ifrepair"].ToString();
  206. string ms_nextstepcode = dt.Rows[0]["ms_nextstepcode"].ToString();
  207. string sncode = dt.Rows[0]["ms_sncode"].ToString();
  208. if (sncode != snCode)
  209. {
  210. ShowMsg(Msg1, 0, snCode + " 序列号已执行过转号,不允许使用TSN采集");
  211. return false;
  212. }
  213. ifrework = dt.Rows[0]["ms_ifrework"].ToString();
  214. bool sameStep = stepcode == User.CurrentStepCode && ms_nextstepcode != User.CurrentStepCode && ifrepair == "0";
  215. if (ifrework != "0" && sameStep && (reworkstatus == "1" || reworkstatus == "2"))
  216. {
  217. ShowMsg(Msg1, 0, snCode + " 序列号已执行过" + User.CurrentStepCode + "工序,采集结果为良品");
  218. return false;
  219. }
  220. if (ifrework == "0" && sameStep && (status == "1" || status == "2"))
  221. {
  222. ShowMsg(Msg1, 0, snCode + " 序列号已执行过" + User.CurrentStepCode + "工序,采集结果为良品");
  223. return false;
  224. }
  225. return true;
  226. }
  227. /// <summary>
  228. /// 拼板扫满后,表格中的序列号一次全部过站。
  229. /// </summary>
  230. private void PanelFull()
  231. {
  232. dgv.EndEdit();
  233. List<DataRow> rows = new List<DataRow>();
  234. foreach (DataRow row in data.Rows)
  235. {
  236. if (row.RowState == DataRowState.Deleted) continue;
  237. rows.Add(row);
  238. }
  239. if (rows.Count == 0)
  240. {
  241. ShowMsg(Msg1, 0, "没有可过站的序列号");
  242. return;
  243. }
  244. List<string> successList = new List<string>();
  245. List<string> afterList = new List<string>();
  246. List<string> failList = new List<string>();
  247. List<DataRow> passedRows = new List<DataRow>();
  248. foreach (DataRow row in rows)
  249. {
  250. string snCode = row["ms_sncode"].ToString();
  251. string makeCode = row["ms_makecode"].ToString();
  252. string stepError;
  253. if (!PassOneSN(snCode, makeCode, out stepError))
  254. {
  255. failList.Add(string.IsNullOrEmpty(stepError) ? snCode : snCode + "(" + stepError + ")");
  256. continue;
  257. }
  258. successList.Add(snCode);
  259. passedRows.Add(row);
  260. if (!string.IsNullOrEmpty(stepError) && stepError.IndexOf("AFTERSUCCESS", StringComparison.OrdinalIgnoreCase) >= 0)
  261. afterList.Add(snCode + " " + stepError);
  262. LogicHandler.DoCommandLog(Tag.ToString(), User.UserCode, makeCode, User.UserLineCode, User.UserSourceCode, "出货核对", "过站成功", snCode, "");
  263. }
  264. foreach (DataRow row in passedRows)
  265. data.Rows.Remove(row);
  266. for (int i = 0; i < data.Rows.Count; i++)
  267. data.Rows[i]["rn"] = i + 1;
  268. if (successList.Count > 0 && failList.Count == 0)
  269. {
  270. int boxQty = 0;
  271. int.TryParse(BoxQtyVal.Text.Trim(), out boxQty);
  272. boxQty += successList.Count;
  273. BoxQtyVal.Text = boxQty.ToString();
  274. ShowMsg(Msg1, 1, $"过站成功{successList.Count}条,序列号:{string.Join("、", successList)},当前箱容量:{boxQty}");
  275. }
  276. else if (successList.Count > 0)
  277. {
  278. ShowMsg(Msg1, 1, $"过站成功{successList.Count}条,序列号:{string.Join("、", successList)}");
  279. }
  280. foreach (string afterMsg in afterList)
  281. ShowMsg(Msg1, 2, afterMsg);
  282. if (failList.Count > 0)
  283. ShowMsg(Msg1, 0, $"过站失败{failList.Count}条,序列号:{string.Join("、", failList)}");
  284. if (successList.Count > 0)
  285. LoadMakeSummary(workOrder.Text);
  286. if (snVal.Enabled)
  287. {
  288. snVal.Focus();
  289. snVal.SelectAll();
  290. }
  291. }
  292. /// <summary>
  293. /// 单条过站。失败原因写入 stepError,成功且带 AFTERSUCCESS 时 stepError 为附加信息。
  294. /// </summary>
  295. private bool PassOneSN(string snCode, string makeCode, out string stepError)
  296. {
  297. stepError = "";
  298. try
  299. {
  300. string snSql = (snCode ?? "").Replace("'", "''");
  301. string makeSql = (makeCode ?? "").Replace("'", "''");
  302. DataTable reworkDt = (DataTable)dh.ExecuteSql($@"SELECT nvl(ms_ifrework,0) ms_ifrework, ms_reworkstatus FROM makeserial WHERE ms_sncode='{snSql}' AND ms_makecode='{makeSql}'", "select");
  303. if (reworkDt.Rows.Count == 0)
  304. {
  305. stepError = "未查询到序列号";
  306. return false;
  307. }
  308. string rowIfRework = reworkDt.Rows[0]["ms_ifrework"].ToString();
  309. string rowReworkStatus = reworkDt.Rows[0]["ms_reworkstatus"].ToString();
  310. if (rowIfRework != "0" && rowReworkStatus == "3")
  311. {
  312. stepError = "返修不良必须先维修";
  313. return false;
  314. }
  315. if (rowIfRework == "0")
  316. {
  317. DataTable badDt = (DataTable)dh.ExecuteSql($@"SELECT mb_id,bc_name,mbr_mbid FROM makebad LEFT JOIN makebadreason ON mbr_mbid=mb_id LEFT JOIN badcode ON mb_badcode=bc_code WHERE mb_sncode='{snSql}' AND mb_makecode='{makeSql}' AND mb_status=0", "select");
  318. List<string> badNames = new List<string>();
  319. for (int i = 0; i < badDt.Rows.Count; i++)
  320. {
  321. if (badDt.Rows[i]["mb_id"].ToString() != badDt.Rows[i]["mbr_mbid"].ToString())
  322. badNames.Add("【" + badDt.Rows[i]["bc_name"].ToString() + "】");
  323. }
  324. if (badNames.Count > 0)
  325. {
  326. stepError = "已判为不良品" + string.Join("", badNames);
  327. return false;
  328. }
  329. }
  330. if (!LogicHandler.SetStepResult(makeCode, User.UserSourceCode, snCode, "出货核对", "检测合格", User.UserCode, out stepError))
  331. {
  332. if (string.IsNullOrEmpty(stepError) || stepError == "null")
  333. stepError = "过站失败";
  334. return false;
  335. }
  336. if (stepError == "null")
  337. stepError = "";
  338. return true;
  339. }
  340. catch (Exception ex)
  341. {
  342. stepError = ex.Message;
  343. return false;
  344. }
  345. }
  346. private void Delete_Click(object sender, EventArgs e)
  347. {
  348. dgv.EndEdit();
  349. List<DataRow> removeRows = new List<DataRow>();
  350. foreach (DataRow row in data.Rows)
  351. {
  352. if (row.RowState == DataRowState.Deleted) continue;
  353. if (row["isDel"] != DBNull.Value && Convert.ToBoolean(row["isDel"]))
  354. removeRows.Add(row);
  355. }
  356. if (removeRows.Count == 0)
  357. {
  358. ShowMsg(Msg1, 0, "请勾选要删除的序列号");
  359. return;
  360. }
  361. List<string> snList = new List<string>();
  362. foreach (DataRow row in removeRows)
  363. {
  364. snList.Add(row["ms_sncode"].ToString());
  365. data.Rows.Remove(row);
  366. }
  367. for (int i = 0; i < data.Rows.Count; i++)
  368. data.Rows[i]["rn"] = i + 1;
  369. ShowMsg(Msg1, 1, $"已删除{removeRows.Count}条,序列号:{string.Join("、", snList)}");
  370. if (snVal.Enabled)
  371. {
  372. snVal.Focus();
  373. snVal.SelectAll();
  374. }
  375. }
  376. private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
  377. {
  378. if (e.RowIndex < 0 || e.ColumnIndex < 0) return;
  379. var column = dgv.Columns[e.ColumnIndex];
  380. if (column is DataGridViewCheckBoxColumn)
  381. {
  382. var cell = dgv[e.ColumnIndex, e.RowIndex] as DataGridViewCheckBoxCell;
  383. if (cell != null && !cell.ReadOnly)
  384. {
  385. bool currentValue = false;
  386. if (cell.Value != null && cell.Value != DBNull.Value)
  387. {
  388. currentValue = Convert.ToBoolean(cell.Value);
  389. }
  390. bool nextValue = !currentValue;
  391. cell.Value = nextValue;
  392. if (e.RowIndex < data.Rows.Count)
  393. data.Rows[e.RowIndex]["isDel"] = nextValue;
  394. dgv.CommitEdit(DataGridViewDataErrorContexts.Commit);
  395. dgv.EndEdit();
  396. var row = dgv.Rows[e.RowIndex];
  397. if (currentValue)
  398. {
  399. row.DefaultCellStyle.BackColor = dgv.DefaultCellStyle.BackColor;
  400. row.DefaultCellStyle.ForeColor = dgv.DefaultCellStyle.ForeColor;
  401. }
  402. else
  403. {
  404. row.DefaultCellStyle.BackColor = Color.LightSkyBlue;
  405. row.DefaultCellStyle.ForeColor = Color.Black;
  406. }
  407. }
  408. }
  409. }
  410. private void UpdateSN(string type, string sn = "")
  411. {
  412. if (type == "C")
  413. {
  414. serialNumber.Text = "";
  415. workOrder.Text = "";
  416. productCode.Text = "";
  417. productName.Text = "";
  418. makeQty.Text = "";
  419. stepCollectQty.Text = "";
  420. }
  421. else if (type == "L")
  422. {
  423. string snSql = sn.Replace("'", "''");
  424. dt = (DataTable)dh.ExecuteSql($@"SELECT ms_sncode,ma_code,pr_code,pr_spec FROM makeserial,make,product
  425. WHERE ms_sncode = '{snSql}' AND ms_makecode = ma_code AND ms_prodcode = pr_code", "select");
  426. if (dt.Rows.Count > 0)
  427. {
  428. serialNumber.Text = dt.Rows[0]["ms_sncode"].ToString();
  429. workOrder.Text = dt.Rows[0]["ma_code"].ToString();
  430. productCode.Text = dt.Rows[0]["pr_code"].ToString();
  431. productName.Text = dt.Rows[0]["pr_spec"].ToString();
  432. LoadMakeSummary(workOrder.Text);
  433. }
  434. else
  435. {
  436. UpdateSN("C", sn);
  437. }
  438. }
  439. }
  440. private void LoadMakeSummary(string makeCode)
  441. {
  442. makeQty.Text = "";
  443. stepCollectQty.Text = "";
  444. if (string.IsNullOrEmpty(makeCode))
  445. return;
  446. string makeSql = makeCode.Replace("'", "''");
  447. DataTable qtyDt = (DataTable)dh.ExecuteSql("select ma_qty from make where ma_code='" + makeSql + "'", "select");
  448. if (qtyDt.Rows.Count > 0)
  449. makeQty.Text = qtyDt.Rows[0]["ma_qty"].ToString();
  450. string stepCode = User.CurrentStepCode ?? "";
  451. if (string.IsNullOrEmpty(stepCode))
  452. return;
  453. string stepSql = stepCode.Replace("'", "''");
  454. DataTable countDt = (DataTable)dh.ExecuteSql($@"SELECT COUNT(*) collect_qty FROM (
  455. SELECT mp_sncode FROM makeprocess
  456. WHERE mp_makecode = '{makeSql}' AND mp_stepcode = '{stepSql}'
  457. GROUP BY mp_sncode)", "select");
  458. if (countDt.Rows.Count > 0)
  459. stepCollectQty.Text = countDt.Rows[0]["collect_qty"].ToString();
  460. }
  461. private void claerBtn_Click(object sender, EventArgs e)
  462. {
  463. Msg1.Clear();
  464. }
  465. private void boxResetBtn_Click(object sender, EventArgs e)
  466. {
  467. BoxQtyVal.Text = "0";
  468. ShowMsg(Msg1, 1, "当前箱容量已归零");
  469. }
  470. private void ShowMsg(RichTextAutoBottom msgBox, int type, string msg)
  471. {
  472. msg = msg.Replace("\r", "").Replace("\n", "");
  473. string msgTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  474. string showMsg = $"{msgTime}: {msg}\n";
  475. if (type == 0)
  476. {
  477. msgBox.AppendText(showMsg, Color.Red);
  478. msgBox.SelectionStart = msgBox.Text.Length;
  479. msgBox.ScrollToCaret();
  480. }
  481. else if (type == 1)
  482. {
  483. msgBox.AppendText(showMsg, Color.Green);
  484. msgBox.SelectionStart = msgBox.Text.Length;
  485. msgBox.ScrollToCaret();
  486. }
  487. else if (type == 2)
  488. {
  489. msgBox.AppendText(showMsg, Color.YellowGreen);
  490. msgBox.SelectionStart = msgBox.Text.Length;
  491. msgBox.ScrollToCaret();
  492. }
  493. }
  494. }
  495. }