Make_SeqProgramTransform.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10. using UAS_MES.DataOperate;
  11. using UAS_MES.Entity;
  12. using UAS_MES.PublicMethod;
  13. namespace UAS_MES.FunctionCode.Make
  14. {
  15. public partial class Make_SeqProgramTransform : Form
  16. {
  17. AutoSizeFormClass asc = new AutoSizeFormClass();
  18. LogStringBuilder sql = new LogStringBuilder();
  19. DataHelper dh;
  20. //原序列号
  21. string TSN="";
  22. //转换后序列号
  23. string SN="";
  24. //错误信息
  25. string errorMessage;
  26. //存放productsnrelation表中的数据
  27. DataTable ListA;
  28. //存放工单信息
  29. DataTable dt;
  30. //step 记录检验规则的进度
  31. int step=0;
  32. //记录采集的IMEI,BT,MAC等信息
  33. Hashtable hs;
  34. //存放关联信息类型
  35. string type;
  36. public Make_SeqProgramTransform()
  37. {
  38. InitializeComponent();
  39. }
  40. private void Make_SeqProgramTransform_Load(object sender, EventArgs e)
  41. {
  42. asc.controllInitializeSize(this);
  43. dh = new DataHelper();
  44. code.Focus();
  45. //提示用户“>>请输入TSN号”
  46. OperateResult.AppendText(">>请输入TSN号\n", Color.Green);
  47. }
  48. private void 序列烧录转换_SizeChanged(object sender, EventArgs e)
  49. {
  50. asc.controlAutoSize(this);
  51. }
  52. private void code_KeyDown(object sender, KeyEventArgs e)
  53. {
  54. if (e.KeyCode==Keys.Enter)
  55. {
  56. if (code.Text != "")
  57. {
  58. //为0,输入TSN
  59. if (step==0)
  60. {
  61. OperateResult.AppendText(">>序列号:" + code.Text + " , 发送请求\n", Color.Green);
  62. string oMakecode = "";
  63. string oMsid = "";
  64. //核对工序
  65. if (LogicHandler.CheckStepSNAndMacode(ms_macode.Text, User.UserSourceCode, code.Text, User.UserCode, out oMakecode, out oMsid, out errorMessage))
  66. {
  67. //核对TSN是否正确
  68. string beforesn = dh.getFieldDataByCondition("makeserial", "ms_beforesn", "ms_sncode='" + code.Text + "'").ToString().Trim();
  69. if (beforesn == "" || beforesn == null)
  70. {
  71. //按照out出的工单号查出工单相关信息,并赋值到相关控件
  72. sql.Clear();
  73. sql.Append("select ma_code as ms_macode,mcd_okqty,ma_qty,ma_qty-mcd_inqty as remain_qty,pr_detail,pr_code as ma_prodcode");
  74. sql.Append("from makeserial left join make on ms_makecode=ma_code left join product on ");
  75. sql.Append("ms_prodcode=pr_code left join makecraftdetail on ms_makecode=mcd_macode where ms_sncode=:sncode");
  76. dt = (DataTable)dh.ExecuteSql(sql.GetString(), "select", code.Text);
  77. if (dt.Rows.Count > 0)
  78. {
  79. BaseUtil.SetFormValue(this.Controls, dt);
  80. //判断用户是否锁定输入TSN长度,
  81. if (!checkLengthOrPre(TSNLength_checkBox, TSNLength, "长度"))
  82. {
  83. return;
  84. }
  85. //判断用户是否锁定输入TSN前缀,
  86. if (!checkLengthOrPre(TSNPre_checkBox, TSNPre, "前缀"))
  87. {
  88. return;
  89. }
  90. }
  91. else
  92. {
  93. OperateResult.AppendText(">>序列号" + code.Text + "不存在\n", Color.Red);
  94. return;
  95. }
  96. //获取需要关联采集的信息,以及校验规则
  97. ListA = (DataTable)dh.ExecuteSql("select * from productsnrelation where psr_prodcode='" + ma_prodcode.Text + "' order by psr_detno", "select");
  98. hs = new Hashtable();
  99. step = 1;
  100. //记录转换前的序列号
  101. TSN = code.Text;
  102. code.Text = "";
  103. OperateResult.AppendText("<<请输入SN\n", Color.Green);
  104. }
  105. else
  106. //不为空,进行过转换。不勾选修改结果,就不能再修改
  107. {
  108. OperateResult.AppendText(">>序列号" + code.Text + "已进行了转换\n", Color.Red);
  109. code.Text = "";
  110. OperateResult.AppendText("<<请重新输入TSN\n", Color.Green);
  111. }
  112. }
  113. else
  114. {
  115. OperateResult.AppendText(">>" + errorMessage + "\n", Color.Red);
  116. }
  117. }
  118. else if (step==1)
  119. {
  120. //开始录入SN
  121. if (!dh.CheckExist("makeserial", "ms_sncode='" + code.Text + "'"))
  122. {
  123. //判断用户是否锁定输入SN长度,
  124. if (!checkLengthOrPre(SNLength_checkBox, SNLength, "长度"))
  125. {
  126. return;
  127. }
  128. //判断用户是否锁定输入SN前缀,
  129. if (!checkLengthOrPre(SNPre_checkBox, SNPre, "前缀"))
  130. {
  131. return;
  132. }
  133. //SN校验成功,合法,记录下SN
  134. SN = code.Text;
  135. //开始进行校验规则
  136. OperateResult.AppendText("<<请输入" + ListA.Rows[0]["psr_type"] + "\n", Color.Green);
  137. //step+1
  138. step = 2;
  139. }
  140. else
  141. {
  142. OperateResult.AppendText(">>序列号" + code.Text + "已存在,请输入其他序列号\n", Color.Red);
  143. }
  144. }
  145. else if(step < ListA.Rows.Count + 2)
  146. {
  147. //开始进行校验规则
  148. if (checkRules(step)) {
  149. step += 1;
  150. }
  151. }
  152. }
  153. else {
  154. OperateResult.AppendText(">>输入不能为空\n", Color.Red);
  155. }
  156. }
  157. }
  158. /// <summary>
  159. /// 检验长度或者前缀是否合法
  160. /// </summary>
  161. /// <param name="checkbox"></param>
  162. /// <param name="c"></param>
  163. /// <param name="info"></param>
  164. private bool checkLengthOrPre(CheckBox checkbox, TextBox textbox, string type)
  165. {
  166. if (checkbox.Checked == true)
  167. {
  168. if (type == "长度")
  169. {
  170. //则判断输入转换前的序列号长度是否合法,不合法则提示
  171. if (code.Text.Trim().Length != int.Parse(textbox.Text))
  172. {
  173. //序列号校验错误,长度错误
  174. OperateResult.AppendText(">>TSN号" + code.Text + "校验错误,长度错误\n", Color.Red);
  175. code.Text = "";
  176. OperateResult.AppendText("<<请重新输入TSN\n", Color.Green);
  177. return false;
  178. }
  179. }
  180. else if (type == "前缀")
  181. {
  182. //则判断输入转换前的序列号前缀是否合法,不合法则提示
  183. if (!code.Text.StartsWith(textbox.Text.Trim()))
  184. {
  185. //序列号校验错误,前缀错误
  186. OperateResult.AppendText(">>TSN号" + code.Text + "校验错误,前缀错误\n", Color.Red);
  187. code.Text = "";
  188. OperateResult.AppendText("<<请重新输入TSN\n", Color.Green);
  189. return false;
  190. }
  191. }
  192. return true;
  193. }
  194. return true;
  195. }
  196. /// <summary>
  197. /// 关联采集的校验
  198. /// </summary>
  199. /// <param name="step"></param>
  200. private bool checkRules(int step)
  201. {
  202. type = ListA.Rows[step - 1]["psr_type"].ToString()=="WIFI"?"MAC": ListA.Rows[step - 1]["psr_type"].ToString();
  203. //如果前缀和长度都满足的话
  204. if ((ListA.Rows[step-1]["psr_length"].ToString() == "" ? true : code.Text.Length == ListA.Rows[step-1]["psr_length"].ToString().Length) && (ListA.Rows[0]["psr_prefix"].ToString() == "" ? true : code.Text.StartsWith(ListA.Rows[0]["psr_prefix"].ToString())))
  205. {
  206. switch (type)
  207. {
  208. case "IMEI1":
  209. case "IMEI2":
  210. case "IMEI3":
  211. if (checkExist("ms_imei1='" + code.Text + "' or ms_imei2 = '" + code.Text + "' or ms_imei3 = '" + code.Text + "'"))
  212. {
  213. return false;
  214. }
  215. else
  216. {
  217. //判断IMEI1,IMEI2,IMEI3中是否已经有这个号了
  218. foreach (DictionaryEntry de in hs) {
  219. if (de.Key.ToString().Contains("IMEI")&&de.Value.ToString()==code.Text) {
  220. OperateResult.AppendText(">>" + type + ":" + code.Text + "已录,请重新输入\n", Color.Red);
  221. code.Text = "";
  222. return false;
  223. }
  224. }
  225. }
  226. break;
  227. case "BT":
  228. case "MAC":
  229. case "NETCODE":
  230. if (checkExist("MS_"+type+"='"+code.Text+"'")) {
  231. return false;
  232. }
  233. break;
  234. }
  235. //满足规则,则采集
  236. hs.Add(type,code.Text);
  237. //说明已经是最后一个校验规则
  238. if (step == ListA.Rows.Count+1)
  239. {
  240. //校验已经完成,此时要再次校验之前的SN和关联采集信息
  241. //再次校验SN
  242. if (!dh.CheckExist("makeserial", "ms_sncode='" + SN + "'"))
  243. {
  244. bool flag = true;
  245. StringBuilder s1 = new StringBuilder();
  246. //再次校验关联采集信息
  247. foreach (DictionaryEntry de in hs)
  248. {
  249. s1.Append("MS_"+ de.Key.ToString()+" = '"+de.Value.ToString()+"',");
  250. if (de.Key.ToString().Contains("IMEI"))
  251. {
  252. if (checkExist("ms_imei1='" + de.Value.ToString() + "' or ms_imei2 = '" + de.Value.ToString() + "' or ms_imei3 = '" + de.Value.ToString() + "'"))
  253. {
  254. flag = false;
  255. OperateResult.AppendText(">>"+de.Key.ToString()+":" + de.Value.ToString() + "已存在,请重新输入TSN\n", Color.Red);
  256. //清空信息
  257. clearInfo();
  258. break;
  259. }
  260. }
  261. else
  262. {
  263. if (checkExist("MS_" + de.Key.ToString() + "='" + de.Value.ToString() + "'"))
  264. {
  265. flag = false;
  266. OperateResult.AppendText(">>" + de.Key.ToString() + ":" + de.Value.ToString() + "已存在,请重新输入TSN\n", Color.Red);
  267. //清空信息
  268. clearInfo();
  269. break;
  270. }
  271. }
  272. }
  273. //根据flag判断关联采集信息二次校验结果
  274. if (flag=true) {
  275. //说明SN和关联采集信息二次校验通过,则进行转换和采集信息绑定
  276. //查询ms_firstsn
  277. string firstsn = dh.getFieldDataByCondition("makeserial", "ms_firstsn", "ms_sncode='" + TSN + "'").ToString();
  278. //记录本次修改,存入makesnrelation表中
  279. string updateSql = "update makeserial set ms_sncode='" + SN + "', ms_beforesn='" + TSN + "',"+ s1.Remove(s1.Length - 1, 1).ToString() + " where ms_sncode='" + TSN + "'";
  280. string insertSql = "insert into makesnrelation (BEFORESN,SN,FIRSTSN,MAKECODE,msr_indate, msr_inman)values('" + TSN + "','" + SN + "','" + firstsn + "','" + ms_macode.Text + "', sysdate ,'" + User.UserCode + "')";
  281. dh.ExecuteSQLTran(updateSql, insertSql);
  282. OperateResult.AppendText(">>序列号转换成功\n", Color.Green);
  283. //写入日志
  284. LogManager.DoLog("修改序列号:" + TSN + "为" + SN + "成功!" + "操作人:" + User.UserCode);
  285. //完成该道工序 setFinish
  286. LogicHandler.UpdateMakeMessage(TSN, ms_macode.Text, "序列烧录转换", User.UserSourceCode, User.UserCode, "序列烧录转换成功", out errorMessage);
  287. //输出提示用户“>>序列号转换成功”,“>>关联采集成功”
  288. OperateResult.AppendText(">>关联采集成功\n", Color.Green);
  289. //更新页面计数+1
  290. count.Text = int.Parse(count.Text) + 1 + "";
  291. }
  292. }
  293. else
  294. {
  295. OperateResult.AppendText(">>序列号" + SN + "已存在,请重新输入TSN\n", Color.Red);
  296. //清空信息
  297. clearInfo();
  298. }
  299. return false;
  300. }
  301. else {
  302. OperateResult.AppendText("<<请输入"+ ListA.Rows[step]["psr_type"] + "\n", Color.Green);
  303. return true;
  304. }
  305. }
  306. else {
  307. //重新输入
  308. OperateResult.AppendText(">>" + ListA.Rows[step-1]["psr_type"] + "校验不通过,请重新输入\n", Color.Red);
  309. return false;
  310. }
  311. }
  312. /// <summary>
  313. /// 工单号变化时,带出校验规则
  314. /// </summary>
  315. /// <param name="sender"></param>
  316. /// <param name="e"></param>
  317. private void ms_macode_TextChanged(object sender, EventArgs e)
  318. {
  319. //清空
  320. TSNPre.Text = "";
  321. TSNLength.Text = "";
  322. SNPre.Text = "";
  323. SNLength.Text = "";
  324. //取消勾选
  325. TSNPre_checkBox.Checked = false;
  326. TSNLength_checkBox.Checked = false;
  327. SNPre_checkBox.Checked = false;
  328. SNLength_checkBox.Checked = false;
  329. //设置可编辑
  330. TSNLength.Enabled = true;
  331. TSNPre.Enabled = true;
  332. SNLength.Enabled = true;
  333. SNPre.Enabled = true;
  334. //查询表工单序列号防呆规则表
  335. dt = (DataTable)dh.ExecuteSql("select msr_type, msr_prefix ,msr_length from makesnrule where msr_makecode='" + ms_macode.Text + "'", "select");
  336. if (dt.Rows.Count > 0)
  337. {
  338. foreach (DataRow dr in dt.Rows)
  339. {
  340. //如果有值,则这个字段自动勾选,并且不可编辑
  341. if (dr["msr_type"].ToString().ToLower() == "before")
  342. {
  343. //msr_type=before 的值赋值到转换前
  344. //临时变量记录
  345. string length = dr["msr_length"].ToString();
  346. string prefix = dr["msr_prefix"].ToString();
  347. //不为空
  348. if (prefix != "" && prefix != null)
  349. {
  350. //则赋值
  351. TSNPre.Text = prefix;
  352. //设置不可编辑
  353. TSNPre.Enabled = false;
  354. //勾选
  355. TSNPre_checkBox.Checked = true;
  356. }
  357. if (length != "" && length != null)
  358. {
  359. //赋值
  360. TSNLength.Text = length;
  361. //设置不可编辑
  362. TSNLength.Enabled = false;
  363. //勾选
  364. TSNLength_checkBox.Checked = true;
  365. }
  366. }
  367. else if (dr["msr_type"].ToString().ToLower() == "after")
  368. {
  369. //msr_type=after 的值赋值到转换后
  370. //临时变量记录
  371. string length = dr["msr_length"].ToString();
  372. string prefix = dr["msr_prefix"].ToString();
  373. //不为空
  374. if (prefix != "" && prefix != null)
  375. {
  376. //则赋值
  377. SNPre.Text = prefix;
  378. //设置不可编辑
  379. SNPre.Enabled = false;
  380. //勾选
  381. SNPre_checkBox.Checked = true;
  382. }
  383. if (length != "" && length != null)
  384. {
  385. //赋值
  386. SNLength.Text = length;
  387. //设置不可编辑
  388. SNLength.Enabled = false;
  389. //勾选
  390. SNLength_checkBox.Checked = true;
  391. }
  392. }
  393. }
  394. }
  395. else
  396. {
  397. /* 如果转换前没有值,则取 select productsnrule where psr_prodcode=? 产品编号,
  398. * 有值则赋值到 转换前,并且自动勾选不可编辑。*/
  399. //dt = (DataTable)dh.ExecuteSql("select psr_prefix ,psr_length from productsnrule where psr_prodcode = " + ma_prodcode.Text, "select");
  400. //if (dt.Rows.Count > 0)
  401. //{
  402. // //将产品序列号防呆规则查出的数据填充
  403. // beforeTransSNPre.Text = dt.Rows[0]["psr_prefix"].ToString();
  404. // beforeTransSNPre.ReadOnly = true;
  405. // beforeTransSNPre_checkBox.Checked = true;
  406. // beforeTransSNLength.Text = dt.Rows[0]["psr_length"].ToString();
  407. // beforeTransSNLength.ReadOnly = true;
  408. // beforeTransSNLength_checkBox.Checked = true;
  409. //}
  410. }
  411. }
  412. private bool checkExist(string fields) {
  413. //不存在
  414. if (!dh.CheckExist("makeserial", fields))
  415. {
  416. //则记录
  417. return false;
  418. }
  419. else {
  420. OperateResult.AppendText(">>"+type+"错误,不允许重复\n", Color.Red);
  421. return true;
  422. }
  423. }
  424. private void clearInfo() {
  425. //步骤重置为0
  426. step = 0;
  427. //关联采集信息清空
  428. hs.Clear();
  429. }
  430. private void cancel_Click(object sender, EventArgs e)
  431. {
  432. //清除已经采集的所有信息
  433. clearInfo();
  434. //提示用户输入TSN
  435. OperateResult.AppendText("<<请输入TSN\n", Color.Green);
  436. }
  437. }
  438. }