锐腾搅拌上料功能
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2542 lines
97 KiB

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using DevExpress.XtraEditors;
  10. using ICSSoft.Base.Language.Tool;
  11. using ICSSoft.Base.UserControl.MessageControl;
  12. using System.Data.SqlClient;
  13. using ICSSoft.Base.Config.AppConfig;
  14. using ICSSoft.Base.Report.Filter;
  15. using ICSSoft.Base.Config.DBHelper;
  16. using ICSSoft.Base.UserControl.FormControl;
  17. using ICSSoft.Base.ReferForm.AppReferForm;
  18. using ICSSoft.Base.Lable.PrintTool;
  19. using System.IO;
  20. using Newtonsoft.Json;
  21. using System.Timers;
  22. using DevExpress.XtraGrid.Views.Grid;
  23. using Newtonsoft.Json.Linq;
  24. using DevExpress.XtraBars.Helpers;
  25. using DevExpress.LookAndFeel;
  26. using System.Configuration;
  27. using ICSSoft.Frame.APP.Model;
  28. using ICSSoft.Frame.APP.Helper;
  29. using DevExpress.XtraGrid.Columns;
  30. using System.Media;
  31. using System.Reflection;
  32. using System.IO.Ports;
  33. using FastReport;
  34. using System.Threading;
  35. using ICSSoft.Frame.APP;
  36. namespace ICSSoft.Frame.APP
  37. {
  38. //ICSLOTSIMULATION 批次lotNo =>开工完工,其他信息无用
  39. //ICSLOTONWIP 批次lotNo,工序OP =>开工完工
  40. //ICSLOTONWIPDetail 批次lotNo,工序OP,人员User,每次 (多人多次)=>开工,完工,暂停
  41. public partial class FormICSWorkReportNew : DevExpress.XtraEditors.XtraForm
  42. {
  43. System.Timers.Timer timerUser = new System.Timers.Timer();
  44. System.Timers.Timer timerOP = new System.Timers.Timer();
  45. #region 参数
  46. System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch();
  47. static string OnwipIpAddress = ConfigurationManager.AppSettings["OnwipApiAddress"];
  48. static string MixApiAddress = ConfigurationManager.AppSettings["MixApiAddress"];
  49. static string OpApi = OnwipIpAddress + ConfigurationManager.AppSettings["OpApi"];
  50. static string PotApi = OnwipIpAddress + ConfigurationManager.AppSettings["PotApi"];
  51. static string EqpApi = OnwipIpAddress + ConfigurationManager.AppSettings["EqpApi"];
  52. static string OnwipStartApi = OnwipIpAddress + ConfigurationManager.AppSettings["OnwipStartApi"];
  53. static string OnwipEndApi = OnwipIpAddress + ConfigurationManager.AppSettings["OnwipEndApi"];
  54. static string LotNoApi = OnwipIpAddress + ConfigurationManager.AppSettings["LotNoApi"];
  55. static string UserApi = OnwipIpAddress + ConfigurationManager.AppSettings["UserApi"];
  56. //static string CheckApi = OnwipIpAddress + ConfigurationManager.AppSettings["CheckApi"];
  57. static string AuthenticateApi = ConfigurationManager.AppSettings["AuthenticateApi"];
  58. static string Account = ConfigurationManager.AppSettings["Account"];
  59. static string PassWord = ConfigurationManager.AppSettings["PassWord"];
  60. static string Tenant = ConfigurationManager.AppSettings["Tenant"];
  61. static string CancelLotOnWipBeginApi = OnwipIpAddress + ConfigurationManager.AppSettings["CancelLotOnWipBeginApi"];
  62. static string FirtCheckApi = OnwipIpAddress + ConfigurationManager.AppSettings["FirtCheckApi"];
  63. static string GetMixApi = MixApiAddress + ConfigurationManager.AppSettings["GetMixApi"];
  64. static string GetCurrentConnectStrings = MixApiAddress + ConfigurationManager.AppSettings["GetCurrentConnectStrings"];
  65. static string CreateOrUpdateIcsLot2OpMix = MixApiAddress + ConfigurationManager.AppSettings["CreateOrUpdateIcsLot2OpMix"];
  66. static string CheckCreateOrUpdateIcsLot2OpMix = MixApiAddress + "CheckCanSl";
  67. static string WmsDbLink = ConfigurationManager.AppSettings["WmsDbLink"];
  68. static string WmsWorkpoint = ConfigurationManager.AppSettings["WmsWorkpoint"];
  69. static string WmsUser = ConfigurationManager.AppSettings["WmsUser"];
  70. static string LOTStockDown = ConfigurationManager.AppSettings["LOTStockDown"];
  71. static string LotOnWipOpEnd = OnwipIpAddress + ConfigurationManager.AppSettings["LotOnWipOpEnd"];
  72. static string UnLockEqpUrl = OnwipIpAddress + ConfigurationManager.AppSettings["UnLockEqpUrl"];
  73. static string WmsLocationCode = ConfigurationManager.AppSettings["LOCATIONCODE"];
  74. static string CustomPower = ConfigurationManager.AppSettings["CustomPower"];
  75. static IcsOPListDto Op = new IcsOPListDto();
  76. static SelectItemExt UserMes = new SelectItemExt();
  77. static AuthenticateResultDto AuthenicateResult = new AuthenticateResultDto();//Tocken实体
  78. static AuthenticateModel Authenticate = new AuthenticateModel();//认证实体
  79. static IcsLotOnWipDto Onwip = new IcsLotOnWipDto();//报工实体
  80. static IcsEquipmentDto EqpDto = new IcsEquipmentDto();//设备实体
  81. static IcsPotListDto PoDto = new IcsPotListDto();//锅具实体
  82. static string GetEcApi = ConfigurationManager.AppSettings["GetEcApi"];
  83. static List<IcsLot2OpMixDetailsListDto> JbSources;//搅拌信息数据源
  84. static List<IcsLot2OpMixDetailsListDto> JbDetails = new List<IcsLot2OpMixDetailsListDto>();//本次搅拌上料记录
  85. static string Conns { get; set; }
  86. static DataTable ItemLotNOMes { get; set; }
  87. decimal revCounts = 0;
  88. StringDtoEx chengMes { get; set; }
  89. SerialPort port = new SerialPort();
  90. ModelEnum model;
  91. ModelEnum _model { get { return model; } set { OnModelChange(value); model = value; } }
  92. System.Windows.Forms.Timer ColorTimer = new System.Windows.Forms.Timer();//定时器更新搅拌时间颜色
  93. public void OnModelChange(ModelEnum model)
  94. {
  95. if (model != this.model)
  96. {
  97. if (model == ModelEnum.Default)
  98. {
  99. DefaultModel();
  100. }
  101. else if (model == ModelEnum.Custom)
  102. {
  103. CustomModel();
  104. }
  105. }
  106. }
  107. #endregion
  108. #region SystemOptition
  109. /// <summary>
  110. /// 操作权限
  111. /// </summary>
  112. /// <returns></returns>
  113. public DataTable RightOfExute()
  114. {
  115. DataTable rData = new DataTable();
  116. rData.Columns.Add("BtnName");
  117. rData.Columns.Add("ActionName");
  118. //查看权限(必须有)
  119. DataRow seeRow = rData.NewRow();
  120. seeRow["BtnName"] = "see";
  121. seeRow["ActionName"] = "查看";
  122. rData.Rows.Add(seeRow);
  123. rData.AcceptChanges();
  124. return rData;
  125. }
  126. /// <summary>
  127. /// 数据权限
  128. /// </summary>
  129. /// <returns></returns>
  130. public DataTable RightOfData()
  131. {
  132. DataTable rData = new DataTable();
  133. rData.Columns.Add("BodyName");
  134. rData.Columns.Add("ControlName");
  135. rData.Columns.Add("ControlCaption");
  136. rData.AcceptChanges();
  137. return rData;
  138. }
  139. #endregion
  140. #region 构造函数
  141. public FormICSWorkReportNew()
  142. {
  143. InitializeComponent();
  144. this.MaximumSize = new Size(Screen.PrimaryScreen.WorkingArea.Width, Screen.PrimaryScreen.WorkingArea.Height);
  145. this.WindowState = FormWindowState.Maximized;
  146. txtUserCode.Enabled = true;
  147. txtLotNo.Enabled = false;
  148. txtOPCode.Enabled = false;
  149. xPage_JbSl.PageEnabled = false;
  150. XPage_Pic.PageEnabled = false;
  151. foreach (GridColumn column in grvDetail.Columns)
  152. {
  153. if (column.Tag?.ToString() == "是")
  154. column.OptionsColumn.AllowEdit = false;
  155. else
  156. column.OptionsColumn.AllowEdit = true;
  157. }
  158. this.model = ModelEnum.Default;//默认称重模式
  159. //禁用表头排序功能
  160. foreach (GridColumn column in grvDetail.Columns)
  161. {
  162. column.OptionsColumn.AllowSort = DevExpress.Utils.DefaultBoolean.False;
  163. }
  164. //ColorTimer.Interval =2000;
  165. //ColorTimer.Tick += (object sender1, EventArgs e1) =>
  166. //{
  167. // if (xPage_JbSl.PageEnabled)
  168. // {
  169. // if (JbSources != null)
  170. // {
  171. // JbSources.
  172. // }
  173. // }
  174. //};
  175. }
  176. #endregion
  177. string StringToHex(string input)
  178. {
  179. StringBuilder sb = new StringBuilder();
  180. foreach (char c in input)
  181. {
  182. sb.Append(Convert.ToInt32(c).ToString("X2")).Append(" ");
  183. }
  184. return sb.ToString();
  185. }
  186. // 判断字符串是否是十六进制格式
  187. static bool IsHexFormat(string data)
  188. {
  189. foreach (char c in data)
  190. {
  191. if (!Uri.IsHexDigit(c))
  192. {
  193. return false;
  194. }
  195. }
  196. return true;
  197. }
  198. #region 加载
  199. private void FormICSWorkReport_Load(object sender, EventArgs e)
  200. {
  201. try
  202. {
  203. pdfViewer1.Dock = DockStyle.Fill;
  204. pdfViewer1.Visible = true;
  205. btnPDFMax.Visible = true;
  206. Authenticate.UserNameOrEmailAddress = Account;
  207. Authenticate.Password = PassWord;
  208. Authenticate.ClientType = "App";
  209. Authenticate.PdaTenantName = Tenant;
  210. if (string.IsNullOrEmpty(AuthenicateResult.AccessToken))//未认证
  211. {
  212. Login();
  213. }
  214. GetConns();
  215. foreach (GridColumn column in grvDetail.Columns)
  216. {
  217. column.OptionsColumn.ReadOnly = true;
  218. }
  219. }
  220. catch (Exception ex)
  221. {
  222. SetLableText(lblMsg, ex.Message, false);
  223. SetRichTextboxContent(RTBox_Log, ex.Message);
  224. }
  225. }
  226. private void GetConns()
  227. {
  228. try
  229. {
  230. var returnDto = WebHelper.HttpGet<ReturnDto<string>>(GetCurrentConnectStrings, AuthenicateResult.AccessToken);
  231. if (!returnDto.success)
  232. throw new Exception(returnDto.error.message);
  233. else
  234. Conns = returnDto.result;
  235. }
  236. catch (Exception ex)
  237. {
  238. throw ex;
  239. }
  240. }
  241. private void Login()
  242. {
  243. try
  244. {
  245. SetRichTextboxContent(RTBox_Log, "开始认证... ");
  246. if (string.IsNullOrEmpty(Authenticate.UserNameOrEmailAddress))
  247. throw new Exception("请维护认证账号信息!");
  248. if (string.IsNullOrEmpty(Authenticate.Password))
  249. throw new Exception("请维护认证账号密码!");
  250. var returnDto = WebHelper.HttpPost<ReturnDto<AuthenticateResultDto>>(AuthenticateApi, JsonConvert.SerializeObject(Authenticate));
  251. if (!returnDto.success)
  252. throw new Exception(returnDto.error.message);
  253. else
  254. AuthenicateResult = returnDto.result;
  255. SetRichTextboxContent(RTBox_Log, "认证成功... ");
  256. }
  257. catch (Exception ex)
  258. {
  259. SetLableText(lblMsg, ex.Message, false);
  260. SetRichTextboxContent(RTBox_Log, ex.Message);
  261. }
  262. }
  263. private void GetCustomPower()
  264. {
  265. string sql = $@"select EnumValue from SysEnumValue a
  266. left join SysWorkPoint b on a.TenantId = b.TenantId
  267. where EnumKey = '{CustomPower}' and b.TenantCode ='{Tenant}'";
  268. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  269. if (!table.AsEnumerable().Select(a => a["EnumValue"].ToString()).ToList().Contains(UserMes.Value))
  270. throw new Exception("你无权限做此操作!");
  271. }
  272. #endregion
  273. #region 重置
  274. private void btnResetUI_Click(object sender, EventArgs e)
  275. {
  276. SetLableText(lblMsg, "");
  277. SetRichTextboxContent(RTBox_Log, "操作 => ", true, "点击 " + btnResetUI.Text);
  278. Clear();
  279. SetLableText(lblMsg, "重置!");
  280. //LoadPrint();
  281. }
  282. #endregion
  283. private void Clear()
  284. {
  285. SetLableText(lblMsg, "");
  286. Onwip = new IcsLotOnWipDto();
  287. Op = new IcsOPListDto();
  288. UserMes = new SelectItemExt();
  289. PoDto = new IcsPotListDto();
  290. EqpDto = new IcsEquipmentDto();
  291. txtUserCode.Enabled = true;
  292. txtUserCode.Focus();
  293. txtOPCode.Enabled = false;
  294. txtLotNo.Enabled = false;
  295. txtItemLotno.Enabled = true;
  296. txtCheng.Enabled = false;
  297. btnBigenOrSuspend.Text = "开工";
  298. foreach (var Control in tabLPnl_Header.Controls)
  299. {
  300. if (Control is TextEdit)
  301. {
  302. (Control as TextEdit).Text = "";
  303. }
  304. }
  305. xPage_JbSl.PageEnabled = false;
  306. XPage_Pic.PageEnabled = false;
  307. foreach (var Control in tableLayoutPanel_Jb.Controls)
  308. {
  309. if (Control is TextEdit)
  310. {
  311. (Control as TextEdit).Text = "";
  312. }
  313. }
  314. grdDetail.DataSource = null;
  315. ItemLotNOMes = null;
  316. JbSources = null;
  317. JbDetails.Clear(); revCounts = 0;
  318. Reset();
  319. this.model = ModelEnum.Default;
  320. }
  321. #region 工序结束(完工)
  322. private void btnEndAll_Click(object sender, EventArgs e)
  323. {
  324. try
  325. {
  326. if (string.IsNullOrEmpty(Onwip.LotNo))
  327. throw new Exception("未扫描跟踪单号!");
  328. if (string.IsNullOrEmpty(Onwip.OpCode))
  329. throw new Exception("未扫描工序!");
  330. if (string.IsNullOrEmpty(Onwip.UserCode))
  331. throw new Exception("未扫描报工人!");
  332. if (string.IsNullOrEmpty(Onwip.EqpCode))
  333. throw new Exception("未扫描设备!");
  334. if (string.IsNullOrEmpty(Onwip.PotCode))
  335. throw new Exception("未扫描锅具!");
  336. if (string.IsNullOrEmpty(txtCurrentQty.Text))
  337. throw new Exception("完工请填写流转数量!");
  338. Onwip.CollectQty = Convert.ToDecimal(txtCurrentQty.Text);
  339. Onwip.Memo = txtMemo.Text;
  340. var returnDto = WebHelper.HttpPost<ReturnDto<IcsLotOnWipDto>>(OnwipEndApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  341. if (!returnDto.success)
  342. throw new Exception(returnDto.error.message);
  343. else
  344. Onwip = returnDto.result;
  345. SetRichTextboxContent(RTBox_Log, "完工成功!", true);
  346. SetLableText(lblMsg, "完工成功", true);
  347. Clear();
  348. }
  349. catch (Exception ex)
  350. {
  351. SetLableText(lblMsg, ex.Message, false);
  352. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  353. }
  354. }
  355. #endregion
  356. #region TabPage初始化
  357. private void tabPageArea_SelectedPageChanged(object sender, DevExpress.XtraTab.TabPageChangedEventArgs e)
  358. {
  359. try
  360. {
  361. if (e.Page == xPage_JbSl)
  362. {
  363. if (grdDetail.DataSource == null)
  364. LoadMixMsg();
  365. }
  366. }
  367. catch (Exception ex)
  368. {
  369. tabPageArea.SelectedTabPageIndex = 0;
  370. SetLableText(lblMsg, ex.Message, false);
  371. }
  372. }
  373. #endregion
  374. string msgKod = "";
  375. #region tabPage主页
  376. private void btnShowPDF_Click(object sender, EventArgs e)
  377. {
  378. if (!txtLotNo.Properties.ReadOnly || !txtOPCode.Properties.ReadOnly || !txtUserCode.Properties.ReadOnly || !txtEQPCode.Properties.ReadOnly)
  379. {
  380. return;
  381. }
  382. SimpleButton btn = sender as SimpleButton;
  383. DevExpress.Utils.WaitDialogForm _wait = new DevExpress.Utils.WaitDialogForm("正在加载...请稍等...");
  384. try
  385. {
  386. _wait.Show();
  387. //axAcroPDF.LoadFile("");
  388. //axAcroPDF.Dock = DockStyle.Fill;
  389. //axAcroPDF.Visible = true;
  390. //pdfViewer1.LoadFile("");
  391. pdfViewer1.Dock = DockStyle.Fill;
  392. pdfViewer1.Visible = true;
  393. btnPDFMax.Visible = true;
  394. var tag = "";
  395. if (tag.EndsWith(".pdf"))
  396. {
  397. //axAcroPDF.LoadFile(tag.local);
  398. //axAcroPDF.setShowToolbar(false);
  399. //axAcroPDF.setShowScrollbars(false);
  400. //axAcroPDF.setPageMode("thumbs");
  401. //axAcroPDF.setLayoutMode("SinglePage");
  402. //axAcroPDF.setView("Fit");
  403. //axAcroPDF.Show();
  404. //try { File.Delete(tag.local); }
  405. //catch { }
  406. pdfViewer1.LoadFile(tag);
  407. }
  408. else
  409. {
  410. try
  411. {
  412. System.Diagnostics.Process.Start(tag);
  413. }
  414. catch (Exception)
  415. {
  416. }
  417. }
  418. btnPDFMax.Tag = tag;
  419. SetLableText(lblMsg, "成功!");
  420. SetRichTextboxContent(RTBox_Log, "图纸查看成功! ", true);
  421. }
  422. catch (Exception ex)
  423. {
  424. SetLableText(lblMsg, ex.Message, false);
  425. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  426. }
  427. finally
  428. {
  429. _wait.Close();
  430. }
  431. }
  432. #endregion
  433. #region baseForm
  434. #region 移动窗体
  435. private const int WM_NCHITTEST = 0x84;
  436. private const int HTCLIENT = 0x1;
  437. private const int HTCAPTION = 0x2;
  438. //首先必须了解Windows的消息传递机制,当有鼠标活动消息时,
  439. //系统发送WM_NCHITTEST 消息给窗体作为判断消息发生地的根据。 nchittest
  440. //假如你点击的是标题栏,窗体收到的消息值就是 HTCAPTION ,
  441. //同样地,若接受到的消息是 HTCLIENT,说明用户点击的是客户区,也就是鼠标消息发生在客户区。
  442. //重写窗体,使窗体可以不通过自带标题栏实现移动
  443. protected override void WndProc(ref Message m)
  444. {
  445. //当重载窗体的 WndProc 方法时,可以截获 WM_NCHITTEST 消息并改些该消息,
  446. //当判断鼠标事件发生在客户区时,改写改消息,发送 HTCAPTION 给窗体,
  447. //这样,窗体收到的消息就时 HTCAPTION ,在客户区通过鼠标来拖动窗体就如同通过标题栏来拖动一样。
  448. //注意:当你重载 WndProc 并改写鼠标事件后,整个窗体的鼠标事件也就随之改变了。
  449. switch (m.Msg)
  450. {
  451. case WM_NCHITTEST:
  452. base.WndProc(ref m);
  453. if ((int)m.Result == HTCLIENT)
  454. m.Result = (IntPtr)HTCAPTION;
  455. return;
  456. }
  457. //拦截双击标题栏、移动窗体的系统消息
  458. if (m.Msg != 0xA3)
  459. {
  460. base.WndProc(ref m);
  461. }
  462. }
  463. #endregion
  464. #region 行号
  465. private void gv_CustomDrawRowIndicator(object sender, DevExpress.XtraGrid.Views.Grid.RowIndicatorCustomDrawEventArgs e)
  466. {
  467. if (e.Info.IsRowIndicator && e.RowHandle > -1)
  468. {
  469. e.Info.DisplayText = (e.RowHandle + 1).ToString();
  470. }
  471. }
  472. #endregion
  473. #region 退出
  474. private void btnClose_Click(object sender, EventArgs e)
  475. {
  476. AppConfig.CloseFormShow(this.Text);
  477. this.Close();
  478. }
  479. private void btnExit_Click(object sender, EventArgs e)
  480. {
  481. AppConfig.CloseFormShow(this.Text);
  482. this.Close();
  483. }
  484. #endregion
  485. #region 获取枚举注解
  486. static public string GetEnumDescription<TEnum>(object value)
  487. {
  488. Type enumType = typeof(TEnum);
  489. if (!enumType.IsEnum)
  490. throw new ArgumentException("不是枚举类型");
  491. var name = Enum.GetName(enumType, value);
  492. if (name == null)
  493. return string.Empty;
  494. object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(DescriptionAttribute), false);
  495. if (objs == null || objs.Length == 0)
  496. return string.Empty;
  497. DescriptionAttribute attr = objs[0] as DescriptionAttribute;
  498. return attr.Description;
  499. }
  500. //static public string GetEnumDescriptionEn<TEnum>(object value)
  501. //{
  502. // Type enumType = typeof(TEnum);
  503. // if (!enumType.IsEnum)
  504. // throw new ArgumentException("不是枚举类型");
  505. // var name = Enum.GetName(enumType, value);
  506. // if (name == null)
  507. // return string.Empty;
  508. // object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(DescriptionEn), false);
  509. // if (objs == null || objs.Length == 0)
  510. // return string.Empty;
  511. // DescriptionEn attr = objs[0] as DescriptionEn;
  512. // return attr.Description;
  513. //}
  514. //static public string GetEnumShowOnButton<TEnum>(object value)
  515. //{
  516. // Type enumType = typeof(TEnum);
  517. // if (!enumType.IsEnum)
  518. // throw new ArgumentException("不是枚举类型");
  519. // var name = Enum.GetName(enumType, value);
  520. // if (name == null)
  521. // return string.Empty;
  522. // object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(ShowOnButton), false);
  523. // if (objs == null || objs.Length == 0)
  524. // return string.Empty;
  525. // ShowOnButton attr = objs[0] as ShowOnButton;
  526. // return attr.Description;
  527. //}
  528. //static public string GetEnumDBValue<TEnum>(object value)
  529. //{
  530. // Type enumType = typeof(TEnum);
  531. // if (!enumType.IsEnum)
  532. // throw new ArgumentException("不是枚举类型");
  533. // var name = Enum.GetName(enumType, value);
  534. // if (name == null)
  535. // return string.Empty;
  536. // object[] objs = enumType.GetField(name).GetCustomAttributes(typeof(DBValue), false);
  537. // if (objs == null || objs.Length == 0)
  538. // return string.Empty;
  539. // DBValue attr = objs[0] as DBValue;
  540. // return attr.Description;
  541. //}
  542. #endregion
  543. /// <summary>
  544. /// 随机获取double
  545. /// </summary>
  546. /// <param name="minimum"></param>
  547. /// <param name="maximum"></param>
  548. /// <param name="Len">小数位数</param>
  549. /// <returns></returns>
  550. public double GetRandomNumber(double minimum, double maximum, int Len)
  551. {
  552. Random random = new Random();
  553. return Math.Round(random.NextDouble() * (maximum - minimum) + minimum, Len);
  554. }
  555. /// <summary>
  556. /// 只是简单的格式化,没啥判断
  557. /// </summary>
  558. /// <param name="str"></param>
  559. /// <returns></returns>
  560. private string ConvertJsonString(string str)
  561. {
  562. JsonSerializer serializer = new JsonSerializer();
  563. TextReader tr = new StringReader(str);
  564. JsonTextReader jtr = new JsonTextReader(tr);
  565. object obj = serializer.Deserialize(jtr);
  566. if (obj != null)
  567. {
  568. StringWriter textWriter = new StringWriter();
  569. JsonTextWriter jsonWriter = new JsonTextWriter(textWriter)
  570. {
  571. Formatting = Formatting.Indented,
  572. Indentation = 4,
  573. IndentChar = ' '
  574. };
  575. serializer.Serialize(jsonWriter, obj);
  576. return textWriter.ToString();
  577. }
  578. else
  579. {
  580. return str;
  581. }
  582. }
  583. #region 界面消息
  584. private void SetLableText(Label lbl, string txt, bool ok = true)
  585. {
  586. if (lbl.InvokeRequired)
  587. {
  588. lbl.Invoke(new Action(() => { SetLableText(lbl, txt, ok); }));
  589. }
  590. else
  591. {
  592. lbl.Text = txt;
  593. lbl.ForeColor = Color.White;
  594. lbl.BackColor = string.IsNullOrEmpty(txt) ? Color.White : (ok ? Color.Green : Color.Red);
  595. }
  596. }
  597. //关键字颜色列表
  598. List<Color> color = new List<Color>()
  599. {
  600. Color.BlueViolet,
  601. Color.Orange,
  602. Color.Black,
  603. Color.Blue,
  604. Color.YellowGreen
  605. };
  606. /// <summary>
  607. /// RichTextBox记录
  608. /// </summary>
  609. /// <param name="rtb">RichTextBox</param>
  610. /// <param name="txt1">基本信息</param>
  611. /// <param name="ok">Pass Or Fail</param>
  612. /// <param name="keys">特殊颜色所标识的关键字列表</param>
  613. private void SetRichTextboxContent(RichTextBox rtb, string txt1, bool ok = true, params string[] keys)
  614. {
  615. if (rtb.InvokeRequired)
  616. {
  617. rtb.Invoke(new Action(() => { SetRichTextboxContent(rtb, txt1, ok, keys); }));
  618. }
  619. else
  620. {
  621. if (rtb.Lines.Length > 200)
  622. {
  623. rtb.Clear();
  624. }
  625. rtb.SelectionColor = Color.Black;
  626. rtb.AppendText(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff "));
  627. rtb.SelectionColor = ok ? Color.LimeGreen : Color.Red;
  628. rtb.AppendText(txt1);
  629. for (int i = 0; i < keys.Length; i++)
  630. {
  631. rtb.SelectionColor = color[i];
  632. rtb.AppendText(" " + keys[i]);
  633. }
  634. rtb.AppendText("\r\n");
  635. rtb.SelectionStart = rtb.Text.Length;
  636. rtb.ScrollToCaret();
  637. }
  638. }
  639. #endregion
  640. private void FormICSWorkReport_Activated(object sender, EventArgs e)
  641. {
  642. txtUserCode.Focus();
  643. }
  644. private void btnJianYanSave_Click(object sender, EventArgs e)
  645. {
  646. }
  647. string sjAgainCode = "";
  648. #region 翻页
  649. //private void rptPage_PageIndexChanged(object Sender, EventArgs e)
  650. //{
  651. // DataTable data = AppConfig.GetPageData(dataSource, rptPage.PageIndex, rptPage.PageSize).Copy();
  652. // //DataTable data = AppConfig.GetPageDataByDb(tempTableName, "pagerowindex", rptPage.PageSize, rptPage.PageIndex, dataSource.Rows.Count);
  653. // grdDetail.DataSource = data;
  654. //}
  655. #endregion
  656. #endregion
  657. private void FormICSWorkReport_FormClosing(object sender, FormClosingEventArgs e)
  658. {
  659. }
  660. private void LoadPrint()
  661. {
  662. //FormPreview pre = new FormPreview();
  663. //pre.ShowDialog();
  664. }
  665. private void btnPDFMax_Click(object sender, EventArgs e)
  666. {
  667. if (btnPDFMax.Tag == null)
  668. {
  669. return;
  670. }
  671. string local = btnPDFMax.Tag.ToString();
  672. if (string.IsNullOrEmpty(local))
  673. {
  674. return;
  675. }
  676. FormPDFMax fmax = new FormPDFMax(local);
  677. fmax.ShowDialog(this);
  678. }
  679. private void btnOpenKodTree_Click(object sender, EventArgs e)
  680. {
  681. }
  682. private void Common_KeyPress(object sender, KeyPressEventArgs e)
  683. {
  684. if (e.KeyChar != (char)Keys.Enter || string.IsNullOrEmpty(((Control)sender).Text))
  685. return;
  686. try
  687. {
  688. revCounts = 0;
  689. //权限认证
  690. if (String.IsNullOrEmpty(AuthenicateResult.AccessToken))
  691. throw new Exception("程序还未认证,请先认证!");
  692. if (((Control)sender).Name == "txtUserCode")
  693. txtUserCode_KeyPress(sender, e);
  694. if (((Control)sender).Name == "txtOPCode")
  695. txtOPCode_KeyPress(sender, e);
  696. if (((Control)sender).Name == "txtLotNo")
  697. txtLotNo_KeyPress(sender, e);
  698. if (((Control)sender).Name == "txtEQPCode")
  699. txtEQPCode_KeyPress(sender, e);
  700. if (((Control)sender).Name == "txtPotCode")
  701. txtPoCode_KeyPress(sender, e);
  702. if (((Control)sender).Name == "txtItemLotno")
  703. txtItemLotno_KeyPress(sender, e);
  704. if (((Control)sender).Name == "txtCheng")
  705. txtCheng_KeyPress(sender, e);
  706. if (((Control)sender).Name == "txtUnLockEqp")
  707. txtUnLockEqp_KeyPress(sender, e);
  708. }
  709. catch (Exception ex)
  710. {
  711. SetLableText(lblMsg, ex.Message, false);
  712. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  713. }
  714. }
  715. private void txtPoCode_KeyPress(object sender, KeyPressEventArgs e)
  716. {
  717. try
  718. {
  719. //调用接口获取信息
  720. var returnDto = WebHelper.HttpGet<ReturnDto<IcsPotListDto>>(PotApi + "?Value=" + txtPotCode.Text.Trim() + "", AuthenicateResult.AccessToken);
  721. if (!returnDto.success)
  722. throw new Exception(returnDto.error.message);
  723. else
  724. PoDto = returnDto.result;
  725. Onwip.PotCode = PoDto.PotCode;
  726. Onwip.PotName = PoDto.PotName;
  727. txtPotName.Text = PoDto.PotName;
  728. SetRichTextboxContent(RTBox_Log, "锅具信息获取成功", true);
  729. SetLableText(lblMsg, "锅具信息获取成功", true);
  730. StartJbSl();
  731. }
  732. catch (Exception ex)
  733. {
  734. SetLableText(lblMsg, ex.Message, false);
  735. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  736. }
  737. }
  738. private void txtLotNo_KeyPress(object sender, KeyPressEventArgs e)
  739. {
  740. try
  741. {
  742. if (string.IsNullOrEmpty(UserMes.Value))
  743. throw new Exception("请先扫描人员信息!");
  744. if (string.IsNullOrEmpty(Op.opCode))
  745. throw new Exception("请先扫描工序信息!");
  746. var onwipCopy = JsonConvert.DeserializeObject<IcsLotOnWipDto>(JsonConvert.SerializeObject(Onwip));
  747. onwipCopy.LotNo = txtLotNo.Text;
  748. //获取条码信息
  749. var returnDto = WebHelper.HttpPost<ReturnDto<IcsLotOnWipDto>>(LotNoApi, JsonConvert.SerializeObject(onwipCopy), AuthenicateResult.AccessToken);
  750. if (!returnDto.success)
  751. throw new Exception(returnDto.error.message);
  752. else
  753. {
  754. if (string.IsNullOrEmpty(returnDto.result.EqpCode) && !string.IsNullOrEmpty(Onwip.EqpCode))
  755. {
  756. returnDto.result.EqpCode = Onwip.EqpCode;
  757. returnDto.result.EqpName = Onwip.EqpName;
  758. returnDto.result.EqpType = Onwip.EqpType;
  759. returnDto.result.EqpModel = Onwip.EqpModel;
  760. }
  761. Onwip = returnDto.result;
  762. }
  763. this.txtMOCode.Text = Onwip.MoCode;
  764. this.txtItemCode.Text = Onwip.ItemCode;
  765. this.txtItemName.Text = Onwip.ItemName;
  766. this.txtLotQty.Text = Onwip.LotQty.ToString();
  767. this.txtCurrentQty.Text = Onwip.CollectQty.ToString();
  768. this.txtRemainOpQty.Text = Onwip.LeftCollectQty.ToString();
  769. this.txtCurrentNgQty.Text = Onwip.NGQty.ToString();
  770. this.txtItemOpPerCent.Text = Onwip.ItemOpTransRate.ToString();
  771. this.txtOverPerCent.Text = Onwip.ItemBeyondRate.ToString();
  772. this.txtMoSeq.Text = Onwip.MoSeq.ToString();
  773. this.txtOpQty.Text = Onwip.OpQty.ToString();
  774. this.txtIsFirstCheck.Text = Onwip.Default2;
  775. this.txtBatchCode.Text = Onwip.TrackingCode;
  776. SetRichTextboxContent(RTBox_Log, "跟踪单扫描成功", true);
  777. txtLotNo.Enabled = false;
  778. if (Onwip.CollectStatus == "Begin")
  779. {
  780. btnBigenOrSuspend.Text = "已开工";
  781. }
  782. else
  783. {
  784. btnBigenOrSuspend.Text = "开工";
  785. }
  786. txtPotCode.Focus();
  787. /* StartJbSl(); *///当前工单是搅拌工单并且开工状态开启搅拌功能
  788. if (string.IsNullOrEmpty(txtEQPCode.Text) && !string.IsNullOrEmpty(Onwip.EqpCode))
  789. {
  790. txtEQPCode.Text = Onwip.EqpCode;
  791. txtEQPCode_KeyPress(null, null);
  792. }
  793. if (string.IsNullOrEmpty(txtPotCode.Text) && !string.IsNullOrEmpty(Onwip.PotCode))
  794. {
  795. this.txtPotCode.Text = Onwip.PotCode;
  796. txtPoCode_KeyPress(null, null);
  797. }
  798. txtLotNo.Enabled = false;
  799. }
  800. catch (Exception ex)
  801. {
  802. SetLableText(lblMsg, ex.Message, false);
  803. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  804. }
  805. }
  806. private void txtItemLotno_KeyPress(object sender, KeyPressEventArgs e)
  807. {
  808. try
  809. {
  810. GetConns();
  811. if (JbSources == null || JbSources.Count == 0)
  812. throw new Exception("获取搅拌单对应的子件信息失败!");
  813. if (string.IsNullOrEmpty(Conns))
  814. throw new Exception("获取数据库信息失败!");
  815. #region 封装
  816. //var itemLotno = txtItemLotno.EditValue.ToString();
  817. //string sql = @"SELECT W.INVCODE,W.QUANTITY,W.LOCATIONCODE,'' as INVUNIT,BATCHCODE FROM {1}.ICSWareHouseLotInfo W
  818. // LEFT JOIN {1}.ICSInventoryLot A
  819. // ON A.LOTNO=W.LOTNO AND A.WORKPOINT=W.WORKPOINT
  820. // LEFT JOIN {1}.ICSExtension b
  821. // ON a.ExtensionID=b.ID
  822. // WHERE W.Lotno='{0}' ";
  823. //sql = string.Format(sql, itemLotno, WmsDbLink);
  824. //var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  825. //if (table.Rows.Count <= 0)
  826. // throw new Exception("没有查询到该物料条码信息!");
  827. //if (table.Rows[0]["LOCATIONCODE"].ToString() != WmsLocationCode) //搅拌仓库判断
  828. // throw new Exception("该条码不是线边仓条码!");
  829. ////校验条码物料是否对用子件信息
  830. //var exist = JbSources.Where(a => a.LotOpMix.SbItemCode == table.Rows[0]["INVCODE"].ToString() && a.LotOpMix.MixStatus != "已上料").OrderBy(a => a.LotOpMix.SendSeq).FirstOrDefault();
  831. //if (exist == null)
  832. // throw new Exception("未查询到和该物料条码对应的未上料的P/N料号!");
  833. //if (exist.LotOpMix.SbItemUnit.ToUpper() != "KG" && exist.LotOpMix.SbItemUnit != "公斤" && exist.LotOpMix.SbItemUnit.ToUpper() != "G" && exist.LotOpMix.SbItemUnit.ToUpper() != "克")
  834. // throw new Exception("条码对应的物料单位不是重量单位!");
  835. //table.Rows[0]["INVUNIT"] = exist.LotOpMix.SbItemUnit;
  836. //var seq = exist.LotOpMix.SendSeq;//物料条码对应投料次序
  837. //var beforesources = JbSources.Where(a => a.LotOpMix.SendSeq < seq && string.IsNullOrEmpty(a.LotOpMix.Default3)).ToList();
  838. //if (beforesources.Where(a => a.LotOpMix.MixStatus != "已上料").FirstOrDefault() != null)
  839. // throw new Exception("存在前置P/N料号尚未投料完毕,请确认!");
  840. //if (beforesources.Count > 0)
  841. //{
  842. // var beforeSeq=JbSources.Where(a => a.LotOpMix.SendSeq < seq).OrderByDescending(a => a.LotOpMix.SendSeq).FirstOrDefault().LotOpMix.SendSeq;
  843. // var beforesource = JbSources.Where(a => a.LotOpMix.SendSeq == beforeSeq);
  844. // var tickValue = DateTime.Now.Ticks - (beforesource.Max(a => a.MixDate).Ticks);
  845. // TimeSpan span = new TimeSpan(tickValue);
  846. // if (beforesource.Count() > 0)
  847. // {
  848. // //var date= beforesource.Max(a => a.MixDate);
  849. // //var mixt = (double)beforesource.Where(a=>a.Default3=="搅拌").Sum(A => A.LotOpMix.MixTime);
  850. // if (span.TotalMinutes < (double)beforesource.Sum(A => A.LotOpMix.MixTime))
  851. // throw new Exception("距离前置P/N料号的上料时间小于搅拌时间,无法上料!");
  852. // }
  853. //}
  854. #endregion
  855. ItemLotNOMes = CheckItemLotno(new List<string>() { txtItemLotno.EditValue.ToString() });
  856. txtItemLotno.Enabled = false;
  857. if (this.model == ModelEnum.Default)
  858. {
  859. txtCheng.Enabled = true;
  860. txtCheng.Focus();
  861. }
  862. else
  863. {
  864. }
  865. SetLableText(lblMsg, "物料条码扫描成功!", true);
  866. SetRichTextboxContent(RTBox_Log, "物料条码扫描成功!", true);
  867. this.txtItemlotNoQty.Text = ItemLotNOMes.Rows[0]["QUANTITY"].ToString();
  868. }
  869. catch (Exception ex)
  870. {
  871. playSoundFromResource();
  872. SetLableText(lblMsg, ex.Message, false);
  873. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  874. }
  875. }
  876. private DataTable CheckItemLotno(List<string> Lotnos)
  877. {
  878. try
  879. {
  880. DataTable mergeTable = null;
  881. if (Lotnos.GroupBy(a => a).Count() != Lotnos.Count())
  882. throw new Exception("请勿扫描重复的物料条码!");
  883. foreach (var itemLotno in Lotnos)
  884. {
  885. string sql = @"SELECT W.INVCODE,W.QUANTITY,W.LOCATIONCODE,'' as INVUNIT,BATCHCODE,W.LotNo as ItemLotNo FROM {1}.ICSWareHouseLotInfo W
  886. LEFT JOIN {1}.ICSInventoryLot A
  887. ON A.LOTNO=W.LOTNO AND A.WORKPOINT=W.WORKPOINT
  888. LEFT JOIN {1}.ICSExtension b
  889. ON a.ExtensionID=b.ID
  890. WHERE W.Lotno='{0}' ";
  891. sql = string.Format(sql, itemLotno, WmsDbLink);
  892. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  893. if (table.Rows.Count <= 0)
  894. throw new Exception("没有查询到该物料条码信息!");
  895. if (mergeTable!=null&&mergeTable.Rows.Count > 0)
  896. {
  897. if (mergeTable.Rows[0]["INVCODE"].ToString() != table.Rows[0]["INVCODE"].ToString())
  898. throw new Exception("扫描的物料条码物料需保持一致!");
  899. }
  900. //if (mergeTable.Rows.Count > 0)
  901. //{
  902. // if (mergeTable.Rows[0]["INVUNIT"].ToString() != table.Rows[0]["INVUNIT"].ToString())
  903. // throw new Exception("扫描的物料条码单位需保持一致!");
  904. //}
  905. if (table.Rows[0]["LOCATIONCODE"].ToString() != WmsLocationCode) //搅拌仓库判断
  906. throw new Exception("该条码不是线边仓条码!");
  907. //校验条码物料是否对用子件信息
  908. var exist = JbSources.Where(a => a.LotOpMix.SbItemCode == table.Rows[0]["INVCODE"].ToString() && a.LotOpMix.MixStatus != "已上料").OrderBy(a => a.LotOpMix.SendSeq).FirstOrDefault();
  909. if (exist == null)
  910. throw new Exception("未查询到和该物料条码对应的未上料的P/N料号!");
  911. if (exist.LotOpMix.SbItemUnit.ToUpper() != "KG" && exist.LotOpMix.SbItemUnit != "公斤" && exist.LotOpMix.SbItemUnit.ToUpper() != "G" && exist.LotOpMix.SbItemUnit.ToUpper() != "克")
  912. throw new Exception("条码对应的物料单位不是重量单位!");
  913. table.Rows[0]["INVUNIT"] = exist.LotOpMix.SbItemUnit;
  914. var seq = exist.LotOpMix.SendSeq;//物料条码对应投料次序
  915. var beforesources = JbSources.Where(a => a.LotOpMix.SendSeq < seq && string.IsNullOrEmpty(a.LotOpMix.Default3)).ToList();
  916. if (beforesources.Where(a => a.LotOpMix.MixStatus != "已上料").FirstOrDefault() != null)
  917. throw new Exception("存在前置P/N料号尚未投料完毕,请确认!");
  918. if (beforesources.Count > 0)
  919. {
  920. var beforeSeq = JbSources.Where(a => a.LotOpMix.SendSeq < seq).OrderByDescending(a => a.LotOpMix.SendSeq).FirstOrDefault().LotOpMix.SendSeq;
  921. var beforesource = JbSources.Where(a => a.LotOpMix.SendSeq == beforeSeq);
  922. var tickValue = DateTime.Now.Ticks - (beforesource.Max(a => a.MixDate).Ticks);
  923. TimeSpan span = new TimeSpan(tickValue);
  924. if (beforesource.Count() > 0)
  925. {
  926. //var date= beforesource.Max(a => a.MixDate);
  927. //var mixt = (double)beforesource.Where(a=>a.Default3=="搅拌").Sum(A => A.LotOpMix.MixTime);
  928. if (span.TotalMinutes < (double)beforesource.Sum(A => A.LotOpMix.MixTime))
  929. throw new Exception("距离前置P/N料号的上料时间小于搅拌时间,无法上料!");
  930. }
  931. }
  932. if (mergeTable == null)
  933. {
  934. mergeTable = table.Copy();
  935. }
  936. else
  937. {
  938. mergeTable.Merge(table.Copy());
  939. }
  940. }
  941. return mergeTable;
  942. }
  943. catch (Exception ex)
  944. {
  945. throw ex;
  946. }
  947. }
  948. private void txtCheng_KeyPress(object sender, KeyPressEventArgs e)
  949. {
  950. try
  951. {
  952. if (JbSources == null || JbSources.Count == 0)
  953. throw new Exception("获取搅拌单对应的子件信息失败!");
  954. //获取条码信息
  955. chengMes = GetFormNameByChengNo(txtCheng.Text);
  956. string FormName = chengMes.Parameter1;
  957. if (String.IsNullOrEmpty(chengMes.Parameter7))
  958. throw new Exception("未维护对应的串口端口信息!");
  959. if (string.IsNullOrEmpty(chengMes.Parameter5))
  960. throw new Exception("未维护对应的串口波特率信息!");
  961. if (port.IsOpen)
  962. port.Close();//防止串口处于占用状态
  963. if (!port.IsOpen)
  964. {
  965. port.BaudRate = Convert.ToInt32(chengMes.Parameter5);
  966. port.PortName = chengMes.Parameter7.ToUpper();
  967. port.Parity = Parity.None;
  968. port.StopBits = StopBits.One;
  969. port.Handshake = Handshake.None;
  970. port.DataBits = 8;
  971. var fieldInfo = (typeof(SerialPort)).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  972. var datarcv = fieldInfo.Where(a => a.Name == "DataReceived").FirstOrDefault();
  973. var value = (Delegate)datarcv.GetValue(port);
  974. if (value != null)
  975. datarcv.SetValue(port, null);
  976. port.DataReceived += (object senderS, SerialDataReceivedEventArgs eS) =>
  977. {
  978. try
  979. {
  980. Thread.Sleep(500);
  981. var returns = port.ReadExisting();
  982. string weight = "";
  983. SetRichTextboxContent(RTBox_Log, "接收:" + returns, true);
  984. if (chengMes.Parameter3.StartsWith("天平")) //天平数据接收格式: +0009.11 G S
  985. {
  986. if (!returns.StartsWith("+") && !returns.StartsWith("-"))
  987. return;
  988. else
  989. {
  990. weight = returns.Replace("\r", "").Replace("\n", "").Replace(" ", "");
  991. weight = weight.Substring(1, weight.ToUpper().IndexOf("G")); ;
  992. }
  993. }
  994. //地秤数据接收格式: 一次称重发送八行数据 以第五行指令为准
  995. //????:2020-01-01
  996. //????:04:29:30
  997. //????:33.65kg
  998. //????:30.32kg
  999. //????:3.33kg
  1000. //:
  1001. //:
  1002. //:
  1003. else
  1004. {
  1005. var lines = returns.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  1006. weight = lines[4].Replace("\r", "").Replace("\n", "").Replace(" ", "").ToUpper();
  1007. if (!weight.ToUpper().EndsWith("G"))
  1008. return;
  1009. else
  1010. {
  1011. weight = weight.Substring(weight.IndexOf(":") + 1);
  1012. if (weight.StartsWith("+") || weight.StartsWith("-"))
  1013. weight = weight.Substring(1);
  1014. //if (revCounts == 2)
  1015. //{
  1016. // weight = weight.Substring(weight.IndexOf(":") + 1);
  1017. // if (weight.StartsWith("+") || weight.StartsWith("-"))
  1018. // weight = weight.Substring(1);
  1019. // revCounts = 0;
  1020. //}
  1021. //else
  1022. //{
  1023. // revCounts++;
  1024. // return;
  1025. //}
  1026. }
  1027. }
  1028. string invUnit = ItemLotNOMes.Rows[0]["INVUNIT"].ToString();
  1029. if (weight.ToUpper().EndsWith("KG"))
  1030. {
  1031. if (invUnit.ToUpper() == "KG" || invUnit.ToUpper() == "公斤")
  1032. {
  1033. this.txtCurrentUse.Invoke(new Action(() =>
  1034. {
  1035. this.txtCurrentUse.Text = Convert.ToDecimal(weight.ToUpper().Replace("KG", "").Trim()).ToString("n2");
  1036. }));
  1037. }
  1038. else
  1039. this.txtCurrentUse.Invoke(new Action(() =>
  1040. {
  1041. this.txtCurrentUse.Text = (Convert.ToDecimal(weight.ToUpper().Replace("KG", "").Trim()) * 1000).ToString("n2");//转为G
  1042. }));
  1043. }
  1044. else if (weight.ToUpper().EndsWith("G"))
  1045. {
  1046. if (invUnit.ToUpper() == "KG" || invUnit.ToUpper() == "公斤")
  1047. this.txtCurrentUse.Invoke(new Action(() =>
  1048. {
  1049. this.txtCurrentUse.Text = (Convert.ToDecimal(weight.ToUpper().Replace("G", "").Trim()) / 1000).ToString("n2");//转为KG
  1050. }));
  1051. else
  1052. this.txtCurrentUse.Invoke(new Action(() =>
  1053. {
  1054. this.txtCurrentUse.Text = (Convert.ToDecimal(weight.ToUpper().Replace("G", "").Trim())).ToString("n2");
  1055. }));
  1056. }
  1057. this.txtCurrentLose.Invoke(new Action(() =>
  1058. {
  1059. this.txtCurrentLose.Text = GetGbl(Convert.ToDecimal(this.txtCurrentUse.Text), ItemLotNOMes.Rows[0]["INVCODE"].ToString(), invUnit);
  1060. }));
  1061. SetLableText(lblMsg, "获取重量成功", true);
  1062. SetRichTextboxContent(RTBox_Log, "获取重量成功", true);
  1063. //port.DiscardInBuffer();
  1064. }
  1065. catch (Exception ex)
  1066. {
  1067. playSoundFromResource();
  1068. SetLableText(lblMsg, ex.Message, false);
  1069. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1070. }
  1071. };
  1072. port.Open();
  1073. //foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
  1074. //{
  1075. // if (type.IsClass && type.Name == FormName)
  1076. // {
  1077. // var form = Assembly.GetExecutingAssembly().CreateInstance(type.FullName);
  1078. // if (form is Form)
  1079. // {
  1080. // if (!typeof(ComResult).IsAssignableFrom(type))
  1081. // throw new Exception("串口窗体错误,未维护result属性");
  1082. // if (((Form)form).ShowDialog() == DialogResult.OK)
  1083. // {
  1084. // var resPro = form.GetType().GetProperty("result");
  1085. // string value = resPro.GetValue(form, null).ToString();
  1086. // if (value.ToUpper().EndsWith("KG"))
  1087. // this.txtCurrentUse.Text = value.ToUpper().Replace("KG", "").Trim();
  1088. // else if (value.ToUpper().EndsWith("G"))
  1089. // this.txtCurrentUse.Text = (Convert.ToDecimal(value.ToUpper().Replace("G", "").Trim()) / 1000).ToString();//转为KG
  1090. // else
  1091. // throw new Exception("重量格式不正确,获取称重信息失败!");
  1092. // }
  1093. // else
  1094. // {
  1095. // SetLableText(lblMsg, "用户取消操作", false);
  1096. // SetRichTextboxContent(RTBox_Log, "用户取消操作", true);
  1097. // }
  1098. // }
  1099. // break;
  1100. // }
  1101. //}
  1102. }
  1103. SetLableText(lblMsg, "扫描成功,串口已打开", true);
  1104. SetRichTextboxContent(RTBox_Log, "扫描成功,串口已打开", true);
  1105. }
  1106. catch (Exception ex)
  1107. {
  1108. playSoundFromResource();
  1109. SetLableText(lblMsg, ex.Message, false);
  1110. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1111. }
  1112. }
  1113. private void StartJbSl()
  1114. {
  1115. if (Onwip.SegCode == "01040104" && Onwip.CollectStatus == "Begin" && !string.IsNullOrEmpty(Onwip.PotCode) && !string.IsNullOrEmpty(Onwip.EqpCode))//当前工单是搅拌工单并且开工状态开启搅拌功能
  1116. {
  1117. SetLableText(lblMsg, "搅拌上料功能解锁");
  1118. xPage_JbSl.PageEnabled = true;
  1119. tabPageArea.SelectedTabPage = xPage_JbSl;
  1120. txtItemLotno.Focus();
  1121. }
  1122. }
  1123. private void txtOPCode_KeyPress(object sender, KeyPressEventArgs e)
  1124. {
  1125. try
  1126. {
  1127. if (string.IsNullOrEmpty(UserMes.Value))
  1128. throw new Exception("请先扫描人员信息!");
  1129. //调用接口获取信息
  1130. var returnDto = WebHelper.HttpGet<ReturnDto<IcsOPListDto>>(OpApi + "?Value=" + txtOPCode.Text.Trim() + "", AuthenicateResult.AccessToken);
  1131. if (!returnDto.success)
  1132. throw new Exception(returnDto.error.message);
  1133. else
  1134. Op = returnDto.result;
  1135. this.txtOPName.Text = Op.opName;
  1136. SetRichTextboxContent(RTBox_Log, "工序信息获取成功", true);
  1137. SetLableText(lblMsg, "工序信息获取成功", true);
  1138. txtEQPCode.Focus();
  1139. txtEQPCode.Enabled = true;
  1140. txtOPCode.Enabled = false;
  1141. txtLotNo.Enabled = true;
  1142. Onwip.OpCode = Op.opCode;
  1143. Onwip.OpName = Op.opName;
  1144. }
  1145. catch (Exception ex)
  1146. {
  1147. SetLableText(lblMsg, ex.Message, false);
  1148. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1149. }
  1150. }
  1151. private void txtUserCode_KeyPress(object sender, KeyPressEventArgs e)
  1152. {
  1153. try
  1154. {
  1155. //调用接口获取信息
  1156. var returnDto = WebHelper.HttpGet<ReturnDto<SelectItemExt>>(UserApi + "?value=" + txtUserCode.Text + "", AuthenicateResult.AccessToken);
  1157. if (!returnDto.success)
  1158. throw new Exception(returnDto.error.message);
  1159. else
  1160. UserMes = returnDto.result;
  1161. this.txtUserName.Text = UserMes.Text;
  1162. SetRichTextboxContent(RTBox_Log, "人员信息获取成功", true);
  1163. SetLableText(lblMsg, "人员信息获取成功", true);
  1164. txtOPCode.Focus();
  1165. txtOPCode.Enabled = true;
  1166. txtUserCode.Enabled = false;
  1167. Onwip.UserCode = UserMes.Value;
  1168. Onwip.UserName = UserMes.Text;
  1169. }
  1170. catch (Exception ex)
  1171. {
  1172. SetLableText(lblMsg, ex.Message, false);
  1173. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1174. }
  1175. }
  1176. private void txtEQPCode_KeyPress(object sender, KeyPressEventArgs e)
  1177. {
  1178. try
  1179. {
  1180. //调用接口获取信息
  1181. var returnDto = WebHelper.HttpGet<ReturnDto<IcsEquipmentDto>>(EqpApi + "?value=" + txtEQPCode.Text.Trim() + "", AuthenicateResult.AccessToken);
  1182. if (!returnDto.success)
  1183. throw new Exception(returnDto.error.message);
  1184. else
  1185. EqpDto = returnDto.result;
  1186. this.txtEQPName.Text = EqpDto.EqpName;
  1187. Onwip.EqpCode = EqpDto.EqpCode;
  1188. Onwip.EqpName = EqpDto.EqpName;
  1189. Onwip.EqpType = EqpDto.EqpType;
  1190. Onwip.EqpModel = EqpDto.EqpModel;
  1191. SetRichTextboxContent(RTBox_Log, "设备信息获取成功", true);
  1192. SetLableText(lblMsg, "设备信息获取成功", true);
  1193. txtLotNo.Focus();
  1194. txtLotNo.Enabled = true;
  1195. txtEQPCode.Enabled = false;
  1196. StartJbSl();
  1197. }
  1198. catch (Exception ex)
  1199. {
  1200. SetLableText(lblMsg, ex.Message, false);
  1201. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1202. }
  1203. }
  1204. private void btnBigenOrSuspend_Click(object sender, EventArgs e)
  1205. {
  1206. try
  1207. {
  1208. if (string.IsNullOrEmpty(Onwip.LotNo))
  1209. throw new Exception("未扫描跟踪单号!");
  1210. if (string.IsNullOrEmpty(Onwip.OpCode))
  1211. throw new Exception("未扫描工序!");
  1212. if (string.IsNullOrEmpty(Onwip.UserCode))
  1213. throw new Exception("未扫描报工人!");
  1214. //if (string.IsNullOrEmpty(Onwip.EqpCode))
  1215. // throw new Exception("未扫描设备!");
  1216. //if (string.IsNullOrEmpty(Onwip.PotCode))
  1217. // throw new Exception("未扫描锅具!");
  1218. var returnDto = WebHelper.HttpPost<ReturnDto<IcsLotOnWipDto>>(OnwipStartApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1219. if (!returnDto.success)
  1220. throw new Exception(returnDto.error.message);
  1221. else
  1222. Onwip = returnDto.result;
  1223. SetRichTextboxContent(RTBox_Log, "开工成功!", true);
  1224. SetLableText(lblMsg, "开工成功", true);
  1225. btnBigenOrSuspend.Text = "已开工";
  1226. StartJbSl();
  1227. }
  1228. catch (Exception ex)
  1229. {
  1230. SetLableText(lblMsg, ex.Message, false);
  1231. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1232. }
  1233. }
  1234. private void txtMemo_EditValueChanged(object sender, EventArgs e)
  1235. {
  1236. }
  1237. private void btnSendFirstCheck_Click(object sender, EventArgs e)
  1238. {
  1239. try
  1240. {
  1241. if (string.IsNullOrEmpty(Onwip.LotNo))
  1242. throw new Exception("未扫描跟踪单号!");
  1243. if (string.IsNullOrEmpty(Onwip.OpCode))
  1244. throw new Exception("未扫描工序!");
  1245. if (string.IsNullOrEmpty(Onwip.UserCode))
  1246. throw new Exception("未扫描报工人!");
  1247. //if (string.IsNullOrEmpty(Onwip.EqpCode))
  1248. // throw new Exception("未扫描设备!");
  1249. //if (string.IsNullOrEmpty(Onwip.PotCode))
  1250. // throw new Exception("未扫描锅具!");
  1251. var returnDto = WebHelper.HttpPost<ReturnDto<String>>(FirtCheckApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1252. if (!returnDto.success)
  1253. throw new Exception(returnDto.error.message);
  1254. SetRichTextboxContent(RTBox_Log, "发送首检成功!", true);
  1255. SetLableText(lblMsg, "发送首检成功", true);
  1256. }
  1257. catch (Exception ex)
  1258. {
  1259. SetLableText(lblMsg, ex.Message, false);
  1260. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1261. }
  1262. }
  1263. private void btn_BackKg_Click(object sender, EventArgs e)
  1264. {
  1265. try
  1266. {
  1267. if (string.IsNullOrEmpty(Onwip.LotNo))
  1268. throw new Exception("未扫描跟踪单号!");
  1269. if (string.IsNullOrEmpty(Onwip.OpCode))
  1270. throw new Exception("未扫描工序!");
  1271. if (string.IsNullOrEmpty(Onwip.UserCode))
  1272. throw new Exception("未扫描报工人!");
  1273. //if (string.IsNullOrEmpty(Onwip.EqpCode))
  1274. // throw new Exception("未扫描设备!");
  1275. //if (string.IsNullOrEmpty(Onwip.PotCode))
  1276. // throw new Exception("未扫描锅具!");
  1277. var returnDto = WebHelper.HttpPost<ReturnDto<String>>(CancelLotOnWipBeginApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1278. if (!returnDto.success)
  1279. throw new Exception(returnDto.error.message);
  1280. //else
  1281. // Onwip = returnDto.result;
  1282. SetRichTextboxContent(RTBox_Log, "撤销开工成功!", true);
  1283. SetLableText(lblMsg, "撤销开工成功", true);
  1284. Clear();
  1285. }
  1286. catch (Exception ex)
  1287. {
  1288. SetLableText(lblMsg, ex.Message, false);
  1289. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1290. }
  1291. }
  1292. private List<SelectItemExt> GetEcMes()
  1293. {
  1294. try
  1295. {
  1296. var returnDto = WebHelper.HttpGet<ReturnDto<List<SelectItemExt>>>(GetEcApi, AuthenicateResult.AccessToken);
  1297. if (!returnDto.success)
  1298. throw new Exception(returnDto.error.message);
  1299. return returnDto.result;
  1300. }
  1301. catch (Exception ex)
  1302. {
  1303. throw ex;
  1304. }
  1305. }
  1306. private void btnAuthor_Click(object sender, EventArgs e)
  1307. {
  1308. this.Login();
  1309. }
  1310. private void BtnNgSend_Click(object sender, EventArgs e)
  1311. {
  1312. try
  1313. {
  1314. if (string.IsNullOrEmpty(Onwip.LotNo))
  1315. throw new Exception("未扫描跟踪单号!");
  1316. if (string.IsNullOrEmpty(Onwip.OpCode))
  1317. throw new Exception("未扫描工序!");
  1318. if (string.IsNullOrEmpty(Onwip.UserCode))
  1319. throw new Exception("未扫描报工人!");
  1320. if (string.IsNullOrEmpty(Onwip.EqpCode))
  1321. throw new Exception("未扫描设备!");
  1322. if (string.IsNullOrEmpty(Onwip.PotCode))
  1323. throw new Exception("未扫描锅具!");
  1324. Onwip.lotEcDataDtos = Onwip.lotEcDataDtos ?? new List<IcsLotEcDataDto>();
  1325. FormEcAdd add = new FormEcAdd(() => GetEcMes(), JsonConvert.DeserializeObject<List<IcsLotEcDataDto>>(JsonConvert.SerializeObject(Onwip.lotEcDataDtos)));
  1326. if (add.ShowDialog() == DialogResult.OK)
  1327. {
  1328. var ecDtos = add.EcDatas;
  1329. Onwip.lotEcDataDtos = ecDtos;
  1330. Onwip.NGQty = ecDtos.Sum(a => a.OpNgQty);
  1331. this.txtCurrentNgQty.Text = Onwip.NGQty.ToString();
  1332. SetLableText(lblMsg, "不良录入成功", true);
  1333. SetRichTextboxContent(RTBox_Log, "不良录入成功", true);
  1334. }
  1335. else
  1336. {
  1337. SetLableText(lblMsg, "取消不良录入", true);
  1338. SetRichTextboxContent(RTBox_Log, "取消不良录入", true);
  1339. }
  1340. }
  1341. catch (Exception ex)
  1342. {
  1343. SetLableText(lblMsg, ex.Message, false);
  1344. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1345. }
  1346. }
  1347. private void tabPageArea_TabIndexChanged(object sender, EventArgs e)
  1348. {
  1349. }
  1350. private void LoadMixMsg()
  1351. {
  1352. try
  1353. {
  1354. var returnDto = WebHelper.HttpGet<ReturnDto<List<IcsLot2OpMixDetailsListDto>>>(GetMixApi + "?ItemCode=" + Onwip.ItemCode + "&ProductQty=" + ((int)Onwip.LotQty) + "&LotNo=" + txtLotNo.Text + "&OpCode=" + Onwip.OpCode + "", AuthenicateResult.AccessToken);
  1355. if (!returnDto.success)
  1356. throw new Exception(returnDto.error.message);
  1357. else
  1358. JbSources = returnDto.result.OrderBy(a => a.LotOpMix.SendSeq).ThenBy(a => a.LotOpMix.MixDetailId).ToList();
  1359. //JbDetails = MapHelper.Mapping(JbSources);
  1360. this.grdDetail.DataSource = JbSources;
  1361. this.txtTemperAture.Text = JbSources.FirstOrDefault().LotOpMix.TemperAture;
  1362. grvDetail.BestFitColumns();
  1363. grvDetail.RefreshData();
  1364. }
  1365. catch (Exception ex)
  1366. {
  1367. SetLableText(lblMsg, ex.Message, false);
  1368. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1369. }
  1370. }
  1371. public void SendCommand(string command)
  1372. {
  1373. try
  1374. {
  1375. if (port.IsOpen)
  1376. {
  1377. port.WriteLine(command); // 发送指令
  1378. }
  1379. else
  1380. {
  1381. throw new Exception("串口未打开.");
  1382. }
  1383. SetRichTextboxContent(RTBox_Log, "发送:" + command, false);
  1384. }
  1385. catch (Exception ex)
  1386. {
  1387. SetRichTextboxContent(RTBox_Log, "发送指令时出错: " + ex.Message, false);
  1388. }
  1389. }
  1390. private void btnSave_Click(object sender, EventArgs e)
  1391. {
  1392. try
  1393. {
  1394. if (string.IsNullOrEmpty(this.txtCurrentUse.Text))
  1395. {
  1396. throw new Exception("需要先连接秤获取本次用量!");
  1397. }
  1398. if (Convert.ToDecimal(this.txtCurrentUse.Text) <= 0)
  1399. throw new Exception("本次用量不能小于0!");
  1400. if (txtCurrentLose.Text == "")
  1401. throw new Exception("获取损耗量失败,如果是手动模式,请输入用量后按下Enter");
  1402. var source = JbSources.Where(a => a.LotOpMix.SbItemCode == ItemLotNOMes.Rows[0]["INVCODE"].ToString() && a.LotOpMix.MixStatus != "已上料").OrderBy(a => a.LotOpMix.SendSeq).FirstOrDefault();
  1403. if (source.LotOpMix.TotalUseQty + source.UseQty + Convert.ToDecimal(txtCurrentUse.Text) > source.LotOpMix.MaxValue)
  1404. throw new Exception("P/N料号:" + ItemLotNOMes.Rows[0]["INVCODE"].ToString() + "上料后将超出最大用量,无法上料!");
  1405. var nowdate = DateTime.Now; ;
  1406. var mixUnitQty = Convert.ToDecimal(this.txtCurrentUse.Text);
  1407. //搅拌单位 转为 物料单位后的数量
  1408. var sbitemUnitQty = UnitQtyChange(source.LotOpMix.SbItemUnit, source.LotOpMix.Default2, mixUnitQty);
  1409. List<PrintModel> printModels = new List<PrintModel>();
  1410. decimal count = 1;
  1411. string MixStatus = source.LotOpMix.MixStatus;
  1412. var LocalJbDetails =JsonConvert.DeserializeObject<List<IcsLot2OpMixDetailsListDto>>(JsonConvert.SerializeObject(JbDetails));
  1413. foreach (DataRow row in ItemLotNOMes.Rows)
  1414. {
  1415. if (string.IsNullOrEmpty(source.LotOpMix.BatchCodes))
  1416. source.LotOpMix.BatchCodes += row["BATCHCODE"].ToString();
  1417. else
  1418. {
  1419. if (!source.LotOpMix.BatchCodes.Contains(row["BATCHCODE"].ToString()))
  1420. source.LotOpMix.BatchCodes += "," + row["BATCHCODE"].ToString();
  1421. }
  1422. //保存上料记录
  1423. var copy = MapHelper.Mapping(source);
  1424. copy.Default1 = row["ItemLotNo"].ToString();//上料条码
  1425. copy.MixDate = nowdate;
  1426. copy.LoseQty = 0;
  1427. copy.Default2 = txtEQPCode.Text;
  1428. copy.Default3 = txtPotCode.Text;
  1429. copy.Default4 = row["BATCHCODE"].ToString();
  1430. //获取条码打印信息
  1431. var printModel = GetPrintMes(copy.Default1);
  1432. //批量扫描
  1433. if (ItemLotNOMes.Rows.Count != count)
  1434. {
  1435. var itemLotQty = Convert.ToDecimal(printModel.Qty);//条码剩余数量
  1436. //条码未扣 已扫描数量 需要单位转换
  1437. var hasKeyPressQty = LocalJbDetails.Where(a => a.Default1 == copy.Default1).Sum(a => a.UseQty);
  1438. if (hasKeyPressQty > 0)
  1439. hasKeyPressQty = UnitQtyChange(source.LotOpMix.SbItemUnit, source.LotOpMix.Default2, hasKeyPressQty);
  1440. if (itemLotQty - hasKeyPressQty >= sbitemUnitQty)
  1441. throw new Exception($"上料条码:{copy.Default1}剩余数量大于称重量,无需批量扫描!");
  1442. copy.UseQty = UnitQtyChange(source.LotOpMix.Default2, source.LotOpMix.SbItemUnit, itemLotQty - hasKeyPressQty);
  1443. mixUnitQty -= copy.UseQty;
  1444. }
  1445. else
  1446. copy.UseQty = mixUnitQty;
  1447. LocalJbDetails.Add(copy);
  1448. var printMes = LocalJbDetails.Where(a => a.Default1 == txtItemLotno.Text).ToList();
  1449. decimal costValue = 0;
  1450. if (printModel != null)
  1451. {
  1452. foreach (var detail in printMes)
  1453. {
  1454. costValue += UnitQtyChange(detail.LotOpMix.SbItemUnit, detail.LotOpMix.Default2, detail.UseQty);
  1455. }
  1456. printModel.Qty = (Convert.ToDecimal(printModel.Qty) - costValue).ToString();
  1457. printModels.Add(printModel);
  1458. }
  1459. if (source.LotOpMix.TotalUseQty + source.UseQty + Convert.ToDecimal(txtCurrentUse.Text) < source.LotOpMix.MinValue)
  1460. MixStatus = "上料中";
  1461. if (source.LotOpMix.TotalUseQty + source.UseQty + Convert.ToDecimal(txtCurrentUse.Text) <= source.LotOpMix.MaxValue && source.LotOpMix.TotalUseQty + source.UseQty + Convert.ToDecimal(txtCurrentUse.Text) >= source.LotOpMix.MinValue)
  1462. MixStatus = "已上料";
  1463. count++;
  1464. }
  1465. FormPreview preView = new FormPreview(printModels);
  1466. preView.ShowDialog();
  1467. #region 发送清空指令,清空秤帮数据(待测试)
  1468. if (model == ModelEnum.Default)
  1469. {
  1470. ///天平发送指令:"T \r\n"
  1471. if (chengMes.Parameter3.StartsWith("天平"))
  1472. {
  1473. SendCommand("T " + "\r");
  1474. }
  1475. else
  1476. {
  1477. SendCommand("SZ" + "\r\n");
  1478. }
  1479. // Thread.Sleep(500);//等待串口返回信息
  1480. }
  1481. #endregion
  1482. //累计数量
  1483. source.LoseQty += Convert.ToDecimal(this.txtCurrentLose.Text);
  1484. source.UseQty += Convert.ToDecimal(this.txtCurrentUse.Text);
  1485. source.NewestMixDate = nowdate;
  1486. source.MixDate = nowdate;
  1487. source.LotOpMix.MixStatus = MixStatus;
  1488. JbDetails = LocalJbDetails;
  1489. Reset();
  1490. SetLableText(lblMsg, "保存成功!", true);
  1491. SetRichTextboxContent(RTBox_Log, "保存成功", true);
  1492. grvDetail.RefreshData();
  1493. txtItemLotno.Focus();
  1494. }
  1495. catch (Exception ex)
  1496. {
  1497. playSoundFromResource();
  1498. SetLableText(lblMsg, ex.Message, false);
  1499. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1500. }
  1501. }
  1502. /// <summary>
  1503. /// 称重数量转为上料条码对应的单位后的数量
  1504. /// </summary>
  1505. /// <param name="unitFrom">传入数量的单位</param>
  1506. /// <param name="unitTo">要转换的单位</param>
  1507. /// <param name="FromQty">传入数量</param>
  1508. /// <returns></returns>
  1509. private decimal UnitQtyChange(string unitFrom,string unitTo,decimal FromQty)
  1510. {
  1511. try
  1512. {
  1513. decimal costValue;
  1514. if (unitFrom != unitTo)
  1515. {
  1516. if (unitFrom.ToUpper() == "KG" || unitFrom.ToUpper() == "公斤")
  1517. {
  1518. if (unitTo.ToUpper() == "G"|| unitTo.ToUpper() == "克")
  1519. {
  1520. costValue= Math.Round(FromQty*1000, 5);
  1521. }
  1522. else if (unitTo.ToUpper() == "KG" || unitTo.ToUpper() == "公斤")
  1523. {
  1524. costValue= FromQty;
  1525. }
  1526. else
  1527. throw new Exception("重量单位不正确!");
  1528. }
  1529. else if (unitFrom.ToUpper() == "G" || unitFrom.ToUpper() == "克")
  1530. {
  1531. if (unitTo.ToUpper() == "G"|| unitTo.ToUpper() == "克" )
  1532. {
  1533. costValue= FromQty;
  1534. }
  1535. else if (unitTo.ToUpper() == "KG"|| unitTo.ToUpper() == "公斤")
  1536. {
  1537. costValue=Math.Round((FromQty/1000),5);
  1538. }
  1539. else
  1540. throw new Exception("重量单位不正确!");
  1541. }
  1542. else
  1543. throw new Exception("重量单位不正确!");
  1544. }
  1545. else
  1546. {
  1547. costValue = FromQty;
  1548. }
  1549. return costValue;
  1550. }
  1551. catch (Exception ex)
  1552. {
  1553. throw ex;
  1554. throw;
  1555. }
  1556. }
  1557. /// <summary>
  1558. /// 音频提示
  1559. /// </summary>
  1560. private void playSoundFromResource()
  1561. {
  1562. using (Stream stream = Properties.Resources.chord)
  1563. {
  1564. SoundPlayer player = new SoundPlayer(stream);
  1565. player.Play();
  1566. }
  1567. }
  1568. /// <summary>
  1569. /// 获取上料条码打印信息
  1570. /// </summary>
  1571. /// <param name="Lotno"></param>
  1572. private PrintModel GetPrintMes(string itemLotNo)
  1573. {
  1574. try
  1575. {
  1576. string sql = @"select
  1577. a.LotNo,
  1578. a.InvCode AS ItemCode,
  1579. d.InvName AS ItemDesc,
  1580. d.InvStd AS ItemStd,
  1581. cc.Quantity AS Qty,
  1582. D.InvUnit AS ItemUnit,
  1583. convert(nvarchar(50), cc.InDate, 23) InDate,
  1584. convert(nvarchar(50), A.ExpirationDate, 23) AS ExpirationDate,
  1585. convert(nvarchar(50), a.ProductDate, 23) AS ProductDate,
  1586. f.BatchCode
  1587. FROM {1}.ICSInventoryLot a
  1588. left join {1}.ICSInventoryLotDetail b on a.LotNo = b.LotNo and a.WorkPoint = b.WorkPoint
  1589. LEFT JOIN {1}.ICSExtension f on a.ExtensionID = f.ID AND f.WorkPoint = a.WorkPoint
  1590. left join {1}.ICSMO c on b.TransCode = c.MOCode and b.TransSequence = c.Sequence and b.WorkPoint = c.WorkPoint
  1591. left join {1}.ICSInventory d on a.InvCode = d.InvCode and a.WorkPoint = d.WorkPoint
  1592. left join {1}.ICSWareHouseLotInfo cc on a.LotNo = cc.LotNo
  1593. where A.LOTNO ='{0}'";
  1594. sql = string.Format(sql, itemLotNo, WmsDbLink);
  1595. PrintModel model = null;
  1596. using (var reader = DBHelper.ExecuteReader(Conns, CommandType.Text, sql))
  1597. {
  1598. if (reader.HasRows)
  1599. {
  1600. model = new PrintModel();
  1601. reader.Read();
  1602. model.LotNo = reader.GetString(0)?.ToString();
  1603. model.ItemCode = reader.GetValue(1)?.ToString();
  1604. model.ItemDesc = reader.GetValue(2)?.ToString();
  1605. model.ItemStd = reader.GetValue(3)?.ToString();
  1606. model.Qty = reader.GetValue(4)?.ToString();
  1607. model.ItemUnit = reader.GetValue(5)?.ToString();
  1608. model.InDate = reader.GetValue(6)?.ToString();
  1609. model.ExpirationDate = reader.GetValue(7)?.ToString();
  1610. model.ProductDate = reader.GetValue(8)?.ToString();
  1611. model.BatchCode = reader.GetValue(9)?.ToString();
  1612. }
  1613. }
  1614. return model;
  1615. }
  1616. catch (Exception ex)
  1617. {
  1618. throw ex;
  1619. }
  1620. }
  1621. /// <summary>
  1622. /// 字符转16进制
  1623. /// </summary>
  1624. /// <param name="input"></param>
  1625. /// <returns></returns>
  1626. //string StringToHex(string input)
  1627. //{
  1628. // StringBuilder sb = new StringBuilder();
  1629. // foreach (char c in input)
  1630. // {
  1631. // sb.Append(Convert.ToInt32(c).ToString("X2")).Append(" ");
  1632. // }
  1633. // return sb.ToString();
  1634. //}
  1635. /// <summary>
  1636. /// 16进制转字符
  1637. /// </summary>
  1638. /// <param name="hex"></param>
  1639. /// <returns></returns>
  1640. string HexToString(string hex)
  1641. {
  1642. string[] hexValuesSplit = hex.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  1643. StringBuilder sb = new StringBuilder();
  1644. foreach (string hexValue in hexValuesSplit)
  1645. {
  1646. sb.Append((char)Convert.ToInt32(hexValue, 16));
  1647. }
  1648. return sb.ToString();
  1649. }
  1650. public StringDtoEx GetFormNameByChengNo(string chengNo)
  1651. {
  1652. string sql = "select Cname as Parameter1,Ccode as Parameter2,Ctype as Parameter3,ComCode as Parameter4,ComBaudRate as Parameter5,CbarCode as Parameter6,ComNumber as Parameter7 from ICSMIXCHENG where Ccode='{0}'";
  1653. sql = string.Format(sql, chengNo);
  1654. DataTable table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  1655. StringDtoEx stringDto = new StringDtoEx();
  1656. if (table.Rows.Count > 0)
  1657. {
  1658. var row = table.Rows[0];
  1659. stringDto.Parameter1 = row["Parameter1"].ToString();
  1660. stringDto.Parameter2 = row["Parameter2"].ToString();
  1661. stringDto.Parameter3 = row["Parameter3"].ToString();
  1662. stringDto.Parameter4 = row["Parameter4"].ToString();
  1663. stringDto.Parameter5 = row["Parameter5"].ToString();
  1664. stringDto.Parameter6 = row["Parameter6"].ToString();
  1665. stringDto.Parameter7 = row["Parameter7"].ToString();
  1666. }
  1667. return stringDto;
  1668. }
  1669. //查询挂壁量
  1670. public string GetGbl(decimal value, string itemCode, string MixUnit)
  1671. {
  1672. try
  1673. {
  1674. string gbl = "0";
  1675. string sql = @"SELECT WallQty as VALUE,USEMIN,USEMAX,WallUnit,UseRate
  1676. FROM IcsLossRelation WHERE ITEMCODE='{0}'";
  1677. sql = string.Format(sql, itemCode, value);
  1678. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  1679. if (table.Rows.Count > 0)
  1680. {
  1681. if (MixUnit.ToUpper() == "KG" || MixUnit == "公斤")
  1682. {
  1683. var table_KG = table.AsEnumerable().Where(a => (a["WallUnit"].ToString() == "KG" || a["WallUnit"].ToString() == "公斤") && Convert.ToDecimal(a["USEMIN"]) <= value && Convert.ToDecimal(a["USEMAX"]) >= value).FirstOrDefault();
  1684. if (table_KG != null)
  1685. {
  1686. var tableValue = Convert.ToDecimal(table_KG["VALUE"]);
  1687. if (tableValue == 0)
  1688. tableValue = value * Convert.ToDecimal(table_KG["UseRate"]) / 100;
  1689. gbl = tableValue.ToString();
  1690. }
  1691. var table_G = table.AsEnumerable().Where(a => (a["WallUnit"].ToString() == "G" || a["WallUnit"].ToString() == "克") && Convert.ToDecimal(a["USEMIN"]) / 1000 <= value && Convert.ToDecimal(a["USEMAX"]) / 1000 >= value).FirstOrDefault();
  1692. if (table_G != null)
  1693. {
  1694. var tableValue = Convert.ToDecimal(table_G["VALUE"]);
  1695. if (tableValue == 0)
  1696. tableValue = value * Convert.ToDecimal(table_KG["UseRate"]) / 100;
  1697. else
  1698. tableValue = (tableValue / 1000);
  1699. gbl = tableValue.ToString();
  1700. }
  1701. }
  1702. else if (MixUnit.ToUpper() == "G" || MixUnit == "克")
  1703. {
  1704. var table_KG = table.AsEnumerable().Where(a => (a["WallUnit"].ToString() == "KG" || a["WallUnit"].ToString() == "公斤") && Convert.ToDecimal(a["USEMIN"]) * 1000 <= value && Convert.ToDecimal(a["USEMAX"]) * 1000 >= value).FirstOrDefault();
  1705. if (table_KG != null)
  1706. {
  1707. var tableValue = Convert.ToDecimal(table_KG["VALUE"]);
  1708. if (tableValue == 0)
  1709. tableValue = value * Convert.ToDecimal(table_KG["UseRate"]) / 100;
  1710. else
  1711. tableValue = tableValue * 1000;
  1712. gbl = tableValue.ToString();
  1713. }
  1714. var table_G = table.AsEnumerable().Where(a => (a["WallUnit"].ToString() == "G" || a["WallUnit"].ToString() == "克") && Convert.ToDecimal(a["USEMIN"]) <= value && Convert.ToDecimal(a["USEMAX"]) >= value).FirstOrDefault();
  1715. if (table_G != null)
  1716. {
  1717. var tableValue = Convert.ToDecimal(table_G["VALUE"]);
  1718. if (tableValue == 0)
  1719. tableValue = value * Convert.ToDecimal(table_KG["UseRate"]) / 100;
  1720. gbl = tableValue.ToString();
  1721. }
  1722. }
  1723. }
  1724. return gbl;
  1725. }
  1726. catch (Exception ex)
  1727. {
  1728. throw ex;
  1729. }
  1730. }
  1731. private void btnFlash_Click(object sender, EventArgs e)
  1732. {
  1733. if (ICSBaseSimpleCode.AppshowMessageBoxRepose("当前未扣料的数据会丢失,确定刷新吗?") != DialogResult.OK)
  1734. return;
  1735. else
  1736. {
  1737. JbFlash();
  1738. SetLableText(lblMsg, "刷新成功", true);
  1739. SetRichTextboxContent(RTBox_Log, "刷新成功", true);
  1740. }
  1741. }
  1742. private void btnReset_Click(object sender, EventArgs e)
  1743. {
  1744. Reset();
  1745. }
  1746. private void Reset()
  1747. {
  1748. txtCheng.Enabled = false;
  1749. txtItemLotno.Enabled = true;
  1750. txtCheng.Text = "";
  1751. txtItemLotno.Text = "";
  1752. txtCurrentLose.Text = "";
  1753. txtCurrentUse.Text = "";
  1754. this.txtItemlotNoQty.Text = "";
  1755. ItemLotNOMes.Clear();
  1756. revCounts = 0;
  1757. CloseCom();
  1758. }
  1759. private void JbFlash()
  1760. {
  1761. JbDetails.Clear();
  1762. LoadMixMsg();
  1763. }
  1764. private void btnDct_Click(object sender, EventArgs e)
  1765. {
  1766. DevExpress.Utils.WaitDialogForm _wait = new DevExpress.Utils.WaitDialogForm("正在扣料...请稍等...");
  1767. try
  1768. {
  1769. if (JbDetails.Count <= 0)
  1770. throw new Exception("未获取到上料记录,无法扣料!");
  1771. JbDetails.ForEach(a =>
  1772. {
  1773. a.LotOpMix.LotNo = this.txtLotNo.Text;
  1774. a.LotOpMix.ProductQty = Convert.ToInt32(Onwip.LotQty);
  1775. a.LotOpMix.OpCode = this.txtOPCode.Text;
  1776. a.LotOpMix.ItemCode = this.txtItemCode.Text;
  1777. a.UserCode = this.txtUserCode.Text;
  1778. }
  1779. );
  1780. _wait.Show();
  1781. List<WmsStockDownDto> lists = new List<WmsStockDownDto>();
  1782. foreach (var detail in JbDetails)
  1783. {
  1784. var tup = GetTransIDAndSeq(detail.LotOpMix.SbItemCode); //获取备料单行号和ID
  1785. var dto = lists.Where(a => a.TransID == tup.Item1).FirstOrDefault();
  1786. bool isNew = false;
  1787. if (dto == null)
  1788. {
  1789. dto = new WmsStockDownDto();
  1790. dto.User = WmsUser;
  1791. dto.Workpoint = WmsWorkpoint;
  1792. dto.TransSequence = Onwip.MoSeq.ToString() + "~" + tup.Item2;
  1793. dto.TransCode = Onwip.MoCode.ToString();
  1794. dto.Quantity = Onwip.LotQty.ToString();
  1795. dto.TransType = "生产发料-生产订单备料表";
  1796. dto.MTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  1797. dto.TransID = tup.Item1;
  1798. dto.Detail = new List<WmsStockDownDetailsDto>();
  1799. isNew = true;
  1800. }
  1801. WmsStockDownDetailsDto detaildto = new WmsStockDownDetailsDto();
  1802. detaildto.LotNo = detail.Default1;
  1803. detaildto.CurrentQuantity = UnitQtyChange(detail.LotOpMix.SbItemUnit,detail.LotOpMix.Default2,detail.UseQty+detail.LoseQty).ToString();
  1804. dto.Detail.Add(detaildto);
  1805. if (isNew)
  1806. lists.Add(dto);
  1807. }
  1808. SetLableText(lblMsg, "验证是否可以扣料", true);
  1809. var checkDto = WebHelper.HttpPost<ReturnDto<object>>(CheckCreateOrUpdateIcsLot2OpMix, JsonConvert.SerializeObject(JbDetails), AuthenicateResult.AccessToken);
  1810. if (!checkDto.success)
  1811. throw new Exception(checkDto.error.message);
  1812. SetRichTextboxContent(RTBox_Log, "验证成功!", true);
  1813. SetLableText(lblMsg, "开始扣料", true);
  1814. var returndto = WebHelper.HttpPost<WmsReturnDto>(LOTStockDown, JsonConvert.SerializeObject(lists));
  1815. if (returndto.Success)
  1816. SetLableText(lblMsg, "扣料成功!", true);
  1817. else
  1818. throw new Exception(returndto.Message);
  1819. SetLableText(lblMsg, "开始保存上料记录", true);
  1820. var returnDto = WebHelper.HttpPost<ReturnDto<object>>(CreateOrUpdateIcsLot2OpMix, JsonConvert.SerializeObject(JbDetails), AuthenicateResult.AccessToken);
  1821. if (!returnDto.success)
  1822. throw new Exception(returnDto.error.message);
  1823. SetRichTextboxContent(RTBox_Log, "上料记录保存成功!", true);
  1824. _wait.Close();
  1825. Reset();
  1826. JbFlash();
  1827. }
  1828. catch (Exception ex)
  1829. {
  1830. _wait.Close();
  1831. playSoundFromResource();
  1832. SetLableText(lblMsg, ex.Message, false);
  1833. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1834. }
  1835. }
  1836. private void btnOpEnd_Click(object sender, EventArgs e)
  1837. {
  1838. try
  1839. {
  1840. if (string.IsNullOrEmpty(Onwip.LotNo))
  1841. throw new Exception("未扫描跟踪单号!");
  1842. if (string.IsNullOrEmpty(Onwip.OpCode))
  1843. throw new Exception("未扫描工序!");
  1844. if (string.IsNullOrEmpty(Onwip.UserCode))
  1845. throw new Exception("未扫描报工人!");
  1846. if (string.IsNullOrEmpty(Onwip.EqpCode))
  1847. throw new Exception("未扫描设备!");
  1848. if (string.IsNullOrEmpty(Onwip.PotCode))
  1849. throw new Exception("未扫描锅具!");
  1850. if (string.IsNullOrEmpty(txtCurrentQty.Text))
  1851. throw new Exception("完工请填写流转数量!");
  1852. if (xPage_JbSl.PageEnabled)//当前工单是搅拌工单并且开工状态开启搅拌功能
  1853. {
  1854. if (JbSources.Where(a => a.LotOpMix.MixStatus != "已上料" && string.IsNullOrEmpty(a.LotOpMix.Default3)).FirstOrDefault() != null)
  1855. throw new Exception("当前跟踪单还未搅拌完毕,无法工序完工!");
  1856. }
  1857. Onwip.CollectQty = Convert.ToDecimal(txtCurrentQty.Text);
  1858. Onwip.Memo = txtMemo.Text;
  1859. var returnDto = WebHelper.HttpPost<ReturnDto<IcsLotOnWipDto>>(LotOnWipOpEnd, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1860. if (!returnDto.success)
  1861. throw new Exception(returnDto.error.message);
  1862. else
  1863. Onwip = returnDto.result;
  1864. SetRichTextboxContent(RTBox_Log, "工序完工成功!", true);
  1865. SetLableText(lblMsg, "工序完工成功", true);
  1866. Clear();
  1867. }
  1868. catch (Exception ex)
  1869. {
  1870. SetLableText(lblMsg, ex.Message, false);
  1871. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1872. }
  1873. }
  1874. private void btnOpenCom_Click(object sender, EventArgs e)
  1875. {
  1876. CloseCom();
  1877. SetRichTextboxContent(RTBox_Log, "串口关闭成功!", true);
  1878. }
  1879. private void CloseCom()
  1880. {
  1881. if (port.IsOpen)
  1882. {
  1883. port.Close();
  1884. revCounts = 0;
  1885. }
  1886. }
  1887. private Tuple<string, string> GetTransIDAndSeq(string SbItemcode)
  1888. {
  1889. try
  1890. {
  1891. string sql = "select ID,Sequence From {0}.ICSMOPick WHERE PICKID=(SELECT DEFAULT1 FROM ICSMOBOM WHERE MOCODE='{1}' AND MOBITEMCODE='{2}' )";
  1892. sql = string.Format(sql, WmsDbLink, Onwip.MoCode, SbItemcode);
  1893. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  1894. if (table.Rows.Count <= 0)
  1895. throw new Exception("获取WMS领料单对应的工单领料信息失败!");
  1896. return new Tuple<string, string>(table.Rows[0]["ID"].ToString(), table.Rows[0]["Sequence"].ToString());
  1897. }
  1898. catch (Exception ex)
  1899. {
  1900. throw ex;
  1901. }
  1902. }
  1903. private void tabPageArea_Click(object sender, EventArgs e)
  1904. {
  1905. }
  1906. private void btnCustomQty_Click(object sender, EventArgs e)
  1907. {
  1908. try
  1909. {
  1910. if (this.model == ModelEnum.Default)
  1911. {
  1912. if (ICSBaseSimpleCode.AppshowMessageBoxRepose("该功能将开启手动输入用量功能且输入用量单位需和下方搅拌单明细\r\n表维护物料的单位一致,确定吗?") != DialogResult.OK)
  1913. return;
  1914. GetCustomPower();
  1915. this._model = ModelEnum.Custom;
  1916. SetLableText(lblMsg, "变更为手动输入模式", true);
  1917. SetRichTextboxContent(RTBox_Log, "变更为手动输入模式", true);
  1918. }
  1919. else
  1920. {
  1921. this._model = ModelEnum.Default;
  1922. SetLableText(lblMsg, "变更为称重模式", true);
  1923. SetRichTextboxContent(RTBox_Log, "变更为称重模式", true);
  1924. }
  1925. }
  1926. catch (Exception ex)
  1927. {
  1928. SetLableText(lblMsg, ex.Message, false);
  1929. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1930. }
  1931. }
  1932. private void CustomModel()
  1933. {
  1934. try
  1935. {
  1936. CloseCom();
  1937. txtCheng.Enabled = false;
  1938. txtCheng.Text = "";
  1939. txtCurrentUse.Properties.ReadOnly = false;
  1940. txtCurrentUse.Text = "";
  1941. txtCurrentUse.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric;
  1942. txtCurrentUse.Properties.Mask.EditMask = "n5";//输入框数字模式
  1943. this.btnCustomQty.Text = "称重模式";
  1944. }
  1945. catch (Exception ex)
  1946. {
  1947. throw ex;
  1948. }
  1949. }
  1950. private void DefaultModel()
  1951. {
  1952. try
  1953. {
  1954. this.btnCustomQty.Text = "手动模式";
  1955. txtCurrentUse.Properties.ReadOnly = true;
  1956. txtCurrentUse.Text = "";
  1957. txtCurrentUse.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.None;
  1958. this.txtCheng.Enabled = !txtItemLotno.Enabled;
  1959. }
  1960. catch (Exception ex)
  1961. {
  1962. throw ex;
  1963. }
  1964. }
  1965. private void txtCurrentUse_KeyPress(object sender, KeyPressEventArgs e)
  1966. {
  1967. try
  1968. {
  1969. if (e.KeyChar != (char)(Keys.Enter))
  1970. return;
  1971. if (txtCurrentUse.EditValue == null || Convert.ToDecimal(txtCurrentUse.EditValue) == 0)
  1972. throw new Exception("请输入大于0的用量!");
  1973. txtCurrentLose.Text = GetGbl(Convert.ToDecimal(this.txtCurrentUse.Text), ItemLotNOMes.Rows[0]["INVCODE"].ToString(), ItemLotNOMes.Rows[0]["INVUNIT"].ToString());
  1974. }
  1975. catch (Exception ex)
  1976. {
  1977. SetLableText(lblMsg, ex.Message, false);
  1978. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1979. }
  1980. }
  1981. private void lab22_Click(object sender, EventArgs e)
  1982. {
  1983. }
  1984. private void txtUnLockEqp_KeyPress(object sender, KeyPressEventArgs e)
  1985. {
  1986. try
  1987. {
  1988. //调用接口获取信息
  1989. var returnDto = WebHelper.HttpPost<ReturnDto<string>>(UnLockEqpUrl, JsonConvert.SerializeObject(new { Value = txtUnLockEqp.Text.Trim() }), AuthenicateResult.AccessToken);
  1990. if (!returnDto.success)
  1991. throw new Exception(returnDto.error.message);
  1992. SetRichTextboxContent(RTBox_Log, "设备:" + txtUnLockEqp.Text + "解锁成功", true);
  1993. SetLableText(lblMsg, "设备:" + txtUnLockEqp.Text + "解锁成功", true);
  1994. txtUnLockEqp.Text = "";
  1995. }
  1996. catch (Exception ex)
  1997. {
  1998. SetLableText(lblMsg, ex.Message, false);
  1999. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  2000. }
  2001. }
  2002. private void grvDetail_RowCellStyle(object sender, RowCellStyleEventArgs e)
  2003. {
  2004. if (grvDetail.GetRowCellValue(e.RowHandle, colMixStatus).ToString() == "已上料")
  2005. e.Appearance.BackColor = Color.LightGreen;
  2006. }
  2007. private void tableLayoutPanel_Jb_Paint(object sender, PaintEventArgs e)
  2008. {
  2009. }
  2010. private void btnPrintDemo_Click(object sender, EventArgs e)
  2011. {
  2012. FormDesign design = new FormDesign();
  2013. design.ShowDialog();
  2014. }
  2015. private void btnShowPDF_General_Click(object sender, EventArgs e)
  2016. {
  2017. }
  2018. private void btnEqpUnLock_Click(object sender, EventArgs e)
  2019. {
  2020. }
  2021. private void BtnBatchKeyPress_Click(object sender, EventArgs e)
  2022. {
  2023. try
  2024. {
  2025. GetConns();
  2026. if (JbSources == null || JbSources.Count == 0)
  2027. throw new Exception("获取搅拌单对应的子件信息失败!");
  2028. if (string.IsNullOrEmpty(Conns))
  2029. throw new Exception("获取数据库信息失败!");
  2030. if (ItemLotNOMes!=null&&ItemLotNOMes.Rows.Count > 0)
  2031. throw new Exception("存在未保存的上料记录,请先保存或重置!");
  2032. FormItemLotBatchInput Input = new FormItemLotBatchInput(CheckItemLotno);
  2033. if (Input.ShowDialog() == DialogResult.OK)
  2034. {
  2035. ItemLotNOMes = Input.itemLotnoMsg;
  2036. this.txtItemLotno.Text = string.Join(",", ItemLotNOMes.AsEnumerable().Select(a => a["ItemLotNo"].ToString()).ToList());
  2037. txtItemLotno.Enabled = false;
  2038. if (this.model == ModelEnum.Default)
  2039. {
  2040. txtCheng.Enabled = true;
  2041. txtCheng.Focus();
  2042. }
  2043. else
  2044. {
  2045. }
  2046. SetLableText(lblMsg, "物料条码扫描成功!", true);
  2047. SetRichTextboxContent(RTBox_Log, "物料条码扫描成功!", true);
  2048. txtItemlotNoQty.Text = ItemLotNOMes.AsEnumerable().Sum(a => Convert.ToDecimal(a["QUANTITY"])).ToString();
  2049. }
  2050. else
  2051. throw new Exception("未获取到批量扫描的条码记录!");
  2052. }
  2053. catch (Exception ex)
  2054. {
  2055. playSoundFromResource();
  2056. SetLableText(lblMsg, ex.Message, false);
  2057. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  2058. }
  2059. }
  2060. }
  2061. }