锐腾搅拌上料功能
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.

2392 lines
90 KiB

5 months ago
5 months ago
  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 FormICSWorkReport : 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 FormICSWorkReport()
  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. string sql = @"SELECT W.INVCODE,W.QUANTITY,W.LOCATIONCODE,'' as INVUNIT,BATCHCODE FROM {1}.ICSWareHouseLotInfo W
  816. LEFT JOIN {1}.ICSInventoryLot A
  817. ON A.LOTNO=W.LOTNO AND A.WORKPOINT=W.WORKPOINT
  818. LEFT JOIN {1}.ICSExtension b
  819. ON a.ExtensionID=b.ID
  820. WHERE W.Lotno='{0}' ";
  821. sql = string.Format(sql, txtItemLotno.EditValue.ToString(), WmsDbLink);
  822. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  823. if (table.Rows.Count <= 0)
  824. throw new Exception("没有查询到该物料条码信息!");
  825. if (table.Rows[0]["LOCATIONCODE"].ToString() != WmsLocationCode) //搅拌仓库判断
  826. throw new Exception("该条码不是线边仓条码!");
  827. //校验条码物料是否对用子件信息
  828. var exist = JbSources.Where(a => a.LotOpMix.SbItemCode == table.Rows[0]["INVCODE"].ToString() && a.LotOpMix.MixStatus != "已上料").OrderBy(a => a.LotOpMix.SendSeq).FirstOrDefault();
  829. if (exist == null)
  830. throw new Exception("未查询到和该物料条码对应的未上料的P/N料号!");
  831. if (exist.LotOpMix.SbItemUnit.ToUpper() != "KG" && exist.LotOpMix.SbItemUnit != "公斤" && exist.LotOpMix.SbItemUnit.ToUpper() != "G" && exist.LotOpMix.SbItemUnit.ToUpper() != "克")
  832. throw new Exception("条码对应的物料单位不是重量单位!");
  833. table.Rows[0]["INVUNIT"] = exist.LotOpMix.SbItemUnit;
  834. var seq = exist.LotOpMix.SendSeq;//物料条码对应投料次序
  835. var beforesources = JbSources.Where(a => a.LotOpMix.SendSeq < seq && string.IsNullOrEmpty(a.LotOpMix.Default3)).ToList();
  836. if (beforesources.Where(a => a.LotOpMix.MixStatus != "已上料").FirstOrDefault() != null)
  837. throw new Exception("存在前置P/N料号尚未投料完毕,请确认!");
  838. if (beforesources.Count > 0)
  839. {
  840. var beforeSeq=JbSources.Where(a => a.LotOpMix.SendSeq < seq).OrderByDescending(a => a.LotOpMix.SendSeq).FirstOrDefault().LotOpMix.SendSeq;
  841. var beforesource = JbSources.Where(a => a.LotOpMix.SendSeq == beforeSeq);
  842. var tickValue = DateTime.Now.Ticks - (beforesource.Max(a => a.MixDate).Ticks);
  843. TimeSpan span = new TimeSpan(tickValue);
  844. if (beforesource.Count() > 0)
  845. {
  846. //var date= beforesource.Max(a => a.MixDate);
  847. //var mixt = (double)beforesource.Where(a=>a.Default3=="搅拌").Sum(A => A.LotOpMix.MixTime);
  848. if (span.TotalMinutes < (double)beforesource.Sum(A => A.LotOpMix.MixTime))
  849. throw new Exception("距离前置P/N料号的上料时间小于搅拌时间,无法上料!");
  850. }
  851. }
  852. ItemLotNOMes = table;
  853. txtItemLotno.Enabled = false;
  854. if (this.model == ModelEnum.Default)
  855. {
  856. txtCheng.Enabled = true;
  857. txtCheng.Focus();
  858. }
  859. else
  860. {
  861. }
  862. SetLableText(lblMsg, "物料条码扫描成功!", true);
  863. SetRichTextboxContent(RTBox_Log, "物料条码扫描成功!", true);
  864. this.txtItemlotNoQty.Text = table.Rows[0]["QUANTITY"].ToString();
  865. }
  866. catch (Exception ex)
  867. {
  868. playSoundFromResource();
  869. SetLableText(lblMsg, ex.Message, false);
  870. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  871. }
  872. }
  873. private void txtCheng_KeyPress(object sender, KeyPressEventArgs e)
  874. {
  875. try
  876. {
  877. if (JbSources == null || JbSources.Count == 0)
  878. throw new Exception("获取搅拌单对应的子件信息失败!");
  879. //获取条码信息
  880. chengMes = GetFormNameByChengNo(txtCheng.Text);
  881. string FormName = chengMes.Parameter1;
  882. if (String.IsNullOrEmpty(chengMes.Parameter7))
  883. throw new Exception("未维护对应的串口端口信息!");
  884. if (string.IsNullOrEmpty(chengMes.Parameter5))
  885. throw new Exception("未维护对应的串口波特率信息!");
  886. if (port.IsOpen)
  887. port.Close();//防止串口处于占用状态
  888. if (!port.IsOpen)
  889. {
  890. port.BaudRate = Convert.ToInt32(chengMes.Parameter5);
  891. port.PortName = chengMes.Parameter7.ToUpper();
  892. port.Parity = Parity.None;
  893. port.StopBits = StopBits.One;
  894. port.Handshake = Handshake.None;
  895. port.DataBits = 8;
  896. var fieldInfo = (typeof(SerialPort)).GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
  897. var datarcv = fieldInfo.Where(a => a.Name == "DataReceived").FirstOrDefault();
  898. var value = (Delegate)datarcv.GetValue(port);
  899. if (value != null)
  900. datarcv.SetValue(port, null);
  901. port.DataReceived +=(object senderS, SerialDataReceivedEventArgs eS) =>
  902. {
  903. try
  904. {
  905. Thread.Sleep(500);
  906. var returns = port.ReadExisting();
  907. string weight = "";
  908. SetRichTextboxContent(RTBox_Log, "接收:" + returns, true);
  909. if (chengMes.Parameter3.StartsWith("天平")) //天平数据接收格式: +0009.11 G S
  910. {
  911. if (!returns.StartsWith("+") && !returns.StartsWith("-"))
  912. return;
  913. else
  914. {
  915. weight = returns.Replace("\r", "").Replace("\n", "").Replace(" ", "");
  916. weight = weight.Substring(1, weight.ToUpper().IndexOf("G")); ;
  917. }
  918. }
  919. //地秤数据接收格式: 一次称重发送八行数据 以第五行指令为准
  920. //????:2020-01-01
  921. //????:04:29:30
  922. //????:33.65kg
  923. //????:30.32kg
  924. //????:3.33kg
  925. //:
  926. //:
  927. //:
  928. else
  929. {
  930. var lines = returns.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
  931. weight = lines[4].Replace("\r", "").Replace("\n", "").Replace(" ", "").ToUpper();
  932. if (!weight.ToUpper().EndsWith("G"))
  933. return;
  934. else
  935. {
  936. weight = weight.Substring(weight.IndexOf(":") + 1);
  937. if (weight.StartsWith("+") || weight.StartsWith("-"))
  938. weight = weight.Substring(1);
  939. //if (revCounts == 2)
  940. //{
  941. // weight = weight.Substring(weight.IndexOf(":") + 1);
  942. // if (weight.StartsWith("+") || weight.StartsWith("-"))
  943. // weight = weight.Substring(1);
  944. // revCounts = 0;
  945. //}
  946. //else
  947. //{
  948. // revCounts++;
  949. // return;
  950. //}
  951. }
  952. }
  953. string invUnit = ItemLotNOMes.Rows[0]["INVUNIT"].ToString();
  954. if (weight.ToUpper().EndsWith("KG"))
  955. {
  956. if (invUnit.ToUpper() == "KG" || invUnit.ToUpper() == "公斤")
  957. {
  958. this.txtCurrentUse.Invoke(new Action(() =>
  959. {
  960. this.txtCurrentUse.Text = Convert.ToDecimal(weight.ToUpper().Replace("KG", "").Trim()).ToString("n2");
  961. }));
  962. }
  963. else
  964. this.txtCurrentUse.Invoke(new Action(() =>
  965. {
  966. this.txtCurrentUse.Text = (Convert.ToDecimal(weight.ToUpper().Replace("KG", "").Trim()) * 1000).ToString("n2");//转为G
  967. }));
  968. }
  969. else if (weight.ToUpper().EndsWith("G"))
  970. {
  971. if (invUnit.ToUpper() == "KG" || invUnit.ToUpper() == "公斤")
  972. this.txtCurrentUse.Invoke(new Action(() =>
  973. {
  974. this.txtCurrentUse.Text =(Convert.ToDecimal(weight.ToUpper().Replace("G", "").Trim()) / 1000).ToString("n2");//转为KG
  975. }));
  976. else
  977. this.txtCurrentUse.Invoke(new Action(() =>
  978. {
  979. this.txtCurrentUse.Text = (Convert.ToDecimal(weight.ToUpper().Replace("G", "").Trim())).ToString("n2");
  980. }));
  981. }
  982. this.txtCurrentLose.Invoke(new Action(() =>
  983. {
  984. this.txtCurrentLose.Text = GetGbl(Convert.ToDecimal(this.txtCurrentUse.Text), ItemLotNOMes.Rows[0]["INVCODE"].ToString(), invUnit);
  985. }));
  986. SetLableText(lblMsg, "获取重量成功", true);
  987. SetRichTextboxContent(RTBox_Log, "获取重量成功", true);
  988. //port.DiscardInBuffer();
  989. }
  990. catch (Exception ex)
  991. {
  992. playSoundFromResource();
  993. SetLableText(lblMsg, ex.Message, false);
  994. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  995. }
  996. };
  997. port.Open();
  998. //foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
  999. //{
  1000. // if (type.IsClass && type.Name == FormName)
  1001. // {
  1002. // var form = Assembly.GetExecutingAssembly().CreateInstance(type.FullName);
  1003. // if (form is Form)
  1004. // {
  1005. // if (!typeof(ComResult).IsAssignableFrom(type))
  1006. // throw new Exception("串口窗体错误,未维护result属性");
  1007. // if (((Form)form).ShowDialog() == DialogResult.OK)
  1008. // {
  1009. // var resPro = form.GetType().GetProperty("result");
  1010. // string value = resPro.GetValue(form, null).ToString();
  1011. // if (value.ToUpper().EndsWith("KG"))
  1012. // this.txtCurrentUse.Text = value.ToUpper().Replace("KG", "").Trim();
  1013. // else if (value.ToUpper().EndsWith("G"))
  1014. // this.txtCurrentUse.Text = (Convert.ToDecimal(value.ToUpper().Replace("G", "").Trim()) / 1000).ToString();//转为KG
  1015. // else
  1016. // throw new Exception("重量格式不正确,获取称重信息失败!");
  1017. // }
  1018. // else
  1019. // {
  1020. // SetLableText(lblMsg, "用户取消操作", false);
  1021. // SetRichTextboxContent(RTBox_Log, "用户取消操作", true);
  1022. // }
  1023. // }
  1024. // break;
  1025. // }
  1026. //}
  1027. }
  1028. SetLableText(lblMsg, "扫描成功,串口已打开", true);
  1029. SetRichTextboxContent(RTBox_Log, "扫描成功,串口已打开", true);
  1030. }
  1031. catch (Exception ex)
  1032. {
  1033. playSoundFromResource();
  1034. SetLableText(lblMsg, ex.Message, false);
  1035. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1036. }
  1037. }
  1038. private void StartJbSl()
  1039. {
  1040. if (Onwip.SegCode == "01040104" && Onwip.CollectStatus == "Begin" && !string.IsNullOrEmpty(Onwip.PotCode) && !string.IsNullOrEmpty(Onwip.EqpCode))//当前工单是搅拌工单并且开工状态开启搅拌功能
  1041. {
  1042. SetLableText(lblMsg, "搅拌上料功能解锁");
  1043. xPage_JbSl.PageEnabled = true;
  1044. tabPageArea.SelectedTabPage = xPage_JbSl;
  1045. txtItemLotno.Focus();
  1046. }
  1047. }
  1048. private void txtOPCode_KeyPress(object sender, KeyPressEventArgs e)
  1049. {
  1050. try
  1051. {
  1052. if (string.IsNullOrEmpty(UserMes.Value))
  1053. throw new Exception("请先扫描人员信息!");
  1054. //调用接口获取信息
  1055. var returnDto = WebHelper.HttpGet<ReturnDto<IcsOPListDto>>(OpApi + "?Value=" + txtOPCode.Text.Trim() + "", AuthenicateResult.AccessToken);
  1056. if (!returnDto.success)
  1057. throw new Exception(returnDto.error.message);
  1058. else
  1059. Op = returnDto.result;
  1060. this.txtOPName.Text = Op.opName;
  1061. SetRichTextboxContent(RTBox_Log, "工序信息获取成功", true);
  1062. SetLableText(lblMsg, "工序信息获取成功", true);
  1063. txtEQPCode.Focus();
  1064. txtEQPCode.Enabled = true;
  1065. txtOPCode.Enabled = false;
  1066. txtLotNo.Enabled = true;
  1067. Onwip.OpCode = Op.opCode;
  1068. Onwip.OpName = Op.opName;
  1069. }
  1070. catch (Exception ex)
  1071. {
  1072. SetLableText(lblMsg, ex.Message, false);
  1073. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1074. }
  1075. }
  1076. private void txtUserCode_KeyPress(object sender, KeyPressEventArgs e)
  1077. {
  1078. try
  1079. {
  1080. //调用接口获取信息
  1081. var returnDto = WebHelper.HttpGet<ReturnDto<SelectItemExt>>(UserApi + "?value=" + txtUserCode.Text + "", AuthenicateResult.AccessToken);
  1082. if (!returnDto.success)
  1083. throw new Exception(returnDto.error.message);
  1084. else
  1085. UserMes = returnDto.result;
  1086. this.txtUserName.Text = UserMes.Text;
  1087. SetRichTextboxContent(RTBox_Log, "人员信息获取成功", true);
  1088. SetLableText(lblMsg, "人员信息获取成功", true);
  1089. txtOPCode.Focus();
  1090. txtOPCode.Enabled = true;
  1091. txtUserCode.Enabled = false;
  1092. Onwip.UserCode = UserMes.Value;
  1093. Onwip.UserName = UserMes.Text;
  1094. }
  1095. catch (Exception ex)
  1096. {
  1097. SetLableText(lblMsg, ex.Message, false);
  1098. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1099. }
  1100. }
  1101. private void txtEQPCode_KeyPress(object sender, KeyPressEventArgs e)
  1102. {
  1103. try
  1104. {
  1105. //调用接口获取信息
  1106. var returnDto = WebHelper.HttpGet<ReturnDto<IcsEquipmentDto>>(EqpApi + "?value=" + txtEQPCode.Text.Trim() + "", AuthenicateResult.AccessToken);
  1107. if (!returnDto.success)
  1108. throw new Exception(returnDto.error.message);
  1109. else
  1110. EqpDto = returnDto.result;
  1111. this.txtEQPName.Text = EqpDto.EqpName;
  1112. Onwip.EqpCode = EqpDto.EqpCode;
  1113. Onwip.EqpName = EqpDto.EqpName;
  1114. Onwip.EqpType = EqpDto.EqpType;
  1115. Onwip.EqpModel = EqpDto.EqpModel;
  1116. SetRichTextboxContent(RTBox_Log, "设备信息获取成功", true);
  1117. SetLableText(lblMsg, "设备信息获取成功", true);
  1118. txtLotNo.Focus();
  1119. txtLotNo.Enabled = true;
  1120. txtEQPCode.Enabled = false;
  1121. StartJbSl();
  1122. }
  1123. catch (Exception ex)
  1124. {
  1125. SetLableText(lblMsg, ex.Message, false);
  1126. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1127. }
  1128. }
  1129. private void btnBigenOrSuspend_Click(object sender, EventArgs e)
  1130. {
  1131. try
  1132. {
  1133. if (string.IsNullOrEmpty(Onwip.LotNo))
  1134. throw new Exception("未扫描跟踪单号!");
  1135. if (string.IsNullOrEmpty(Onwip.OpCode))
  1136. throw new Exception("未扫描工序!");
  1137. if (string.IsNullOrEmpty(Onwip.UserCode))
  1138. throw new Exception("未扫描报工人!");
  1139. //if (string.IsNullOrEmpty(Onwip.EqpCode))
  1140. // throw new Exception("未扫描设备!");
  1141. //if (string.IsNullOrEmpty(Onwip.PotCode))
  1142. // throw new Exception("未扫描锅具!");
  1143. var returnDto = WebHelper.HttpPost<ReturnDto<IcsLotOnWipDto>>(OnwipStartApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1144. if (!returnDto.success)
  1145. throw new Exception(returnDto.error.message);
  1146. else
  1147. Onwip = returnDto.result;
  1148. SetRichTextboxContent(RTBox_Log, "开工成功!", true);
  1149. SetLableText(lblMsg, "开工成功", true);
  1150. btnBigenOrSuspend.Text = "已开工";
  1151. StartJbSl();
  1152. }
  1153. catch (Exception ex)
  1154. {
  1155. SetLableText(lblMsg, ex.Message, false);
  1156. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1157. }
  1158. }
  1159. private void txtMemo_EditValueChanged(object sender, EventArgs e)
  1160. {
  1161. }
  1162. private void btnSendFirstCheck_Click(object sender, EventArgs e)
  1163. {
  1164. try
  1165. {
  1166. if (string.IsNullOrEmpty(Onwip.LotNo))
  1167. throw new Exception("未扫描跟踪单号!");
  1168. if (string.IsNullOrEmpty(Onwip.OpCode))
  1169. throw new Exception("未扫描工序!");
  1170. if (string.IsNullOrEmpty(Onwip.UserCode))
  1171. throw new Exception("未扫描报工人!");
  1172. //if (string.IsNullOrEmpty(Onwip.EqpCode))
  1173. // throw new Exception("未扫描设备!");
  1174. //if (string.IsNullOrEmpty(Onwip.PotCode))
  1175. // throw new Exception("未扫描锅具!");
  1176. var returnDto = WebHelper.HttpPost<ReturnDto<String>>(FirtCheckApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1177. if (!returnDto.success)
  1178. throw new Exception(returnDto.error.message);
  1179. SetRichTextboxContent(RTBox_Log, "发送首检成功!", true);
  1180. SetLableText(lblMsg, "发送首检成功", true);
  1181. }
  1182. catch (Exception ex)
  1183. {
  1184. SetLableText(lblMsg, ex.Message, false);
  1185. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1186. }
  1187. }
  1188. private void btn_BackKg_Click(object sender, EventArgs e)
  1189. {
  1190. try
  1191. {
  1192. if (string.IsNullOrEmpty(Onwip.LotNo))
  1193. throw new Exception("未扫描跟踪单号!");
  1194. if (string.IsNullOrEmpty(Onwip.OpCode))
  1195. throw new Exception("未扫描工序!");
  1196. if (string.IsNullOrEmpty(Onwip.UserCode))
  1197. throw new Exception("未扫描报工人!");
  1198. //if (string.IsNullOrEmpty(Onwip.EqpCode))
  1199. // throw new Exception("未扫描设备!");
  1200. //if (string.IsNullOrEmpty(Onwip.PotCode))
  1201. // throw new Exception("未扫描锅具!");
  1202. var returnDto = WebHelper.HttpPost<ReturnDto<String>>(CancelLotOnWipBeginApi, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1203. if (!returnDto.success)
  1204. throw new Exception(returnDto.error.message);
  1205. //else
  1206. // Onwip = returnDto.result;
  1207. SetRichTextboxContent(RTBox_Log, "撤销开工成功!", true);
  1208. SetLableText(lblMsg, "撤销开工成功", true);
  1209. Clear();
  1210. }
  1211. catch (Exception ex)
  1212. {
  1213. SetLableText(lblMsg, ex.Message, false);
  1214. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1215. }
  1216. }
  1217. private List<SelectItemExt> GetEcMes()
  1218. {
  1219. try
  1220. {
  1221. var returnDto = WebHelper.HttpGet<ReturnDto<List<SelectItemExt>>>(GetEcApi, AuthenicateResult.AccessToken);
  1222. if (!returnDto.success)
  1223. throw new Exception(returnDto.error.message);
  1224. return returnDto.result;
  1225. }
  1226. catch (Exception ex)
  1227. {
  1228. throw ex;
  1229. }
  1230. }
  1231. private void btnAuthor_Click(object sender, EventArgs e)
  1232. {
  1233. this.Login();
  1234. }
  1235. private void BtnNgSend_Click(object sender, EventArgs e)
  1236. {
  1237. try
  1238. {
  1239. if (string.IsNullOrEmpty(Onwip.LotNo))
  1240. throw new Exception("未扫描跟踪单号!");
  1241. if (string.IsNullOrEmpty(Onwip.OpCode))
  1242. throw new Exception("未扫描工序!");
  1243. if (string.IsNullOrEmpty(Onwip.UserCode))
  1244. throw new Exception("未扫描报工人!");
  1245. if (string.IsNullOrEmpty(Onwip.EqpCode))
  1246. throw new Exception("未扫描设备!");
  1247. if (string.IsNullOrEmpty(Onwip.PotCode))
  1248. throw new Exception("未扫描锅具!");
  1249. Onwip.lotEcDataDtos = Onwip.lotEcDataDtos ?? new List<IcsLotEcDataDto>();
  1250. FormEcAdd add = new FormEcAdd(() => GetEcMes(), JsonConvert.DeserializeObject<List<IcsLotEcDataDto>>(JsonConvert.SerializeObject(Onwip.lotEcDataDtos)));
  1251. if (add.ShowDialog() == DialogResult.OK)
  1252. {
  1253. var ecDtos = add.EcDatas;
  1254. Onwip.lotEcDataDtos = ecDtos;
  1255. Onwip.NGQty = ecDtos.Sum(a => a.OpNgQty);
  1256. this.txtCurrentNgQty.Text = Onwip.NGQty.ToString();
  1257. SetLableText(lblMsg, "不良录入成功", true);
  1258. SetRichTextboxContent(RTBox_Log, "不良录入成功", true);
  1259. }
  1260. else
  1261. {
  1262. SetLableText(lblMsg, "取消不良录入", true);
  1263. SetRichTextboxContent(RTBox_Log, "取消不良录入", true);
  1264. }
  1265. }
  1266. catch (Exception ex)
  1267. {
  1268. SetLableText(lblMsg, ex.Message, false);
  1269. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1270. }
  1271. }
  1272. private void tabPageArea_TabIndexChanged(object sender, EventArgs e)
  1273. {
  1274. }
  1275. private void LoadMixMsg()
  1276. {
  1277. try
  1278. {
  1279. var returnDto = WebHelper.HttpGet<ReturnDto<List<IcsLot2OpMixDetailsListDto>>>(GetMixApi + "?ItemCode=" + Onwip.ItemCode + "&ProductQty=" + ((int)Onwip.LotQty) + "&LotNo="+txtLotNo.Text+ "&OpCode="+Onwip.OpCode+"", AuthenicateResult.AccessToken);
  1280. if (!returnDto.success)
  1281. throw new Exception(returnDto.error.message);
  1282. else
  1283. JbSources = returnDto.result.OrderBy(a => a.LotOpMix.SendSeq).ThenBy(a => a.LotOpMix.MixDetailId).ToList();
  1284. //JbDetails = MapHelper.Mapping(JbSources);
  1285. this.grdDetail.DataSource = JbSources;
  1286. this.txtTemperAture.Text = JbSources.FirstOrDefault().LotOpMix.TemperAture;
  1287. grvDetail.BestFitColumns();
  1288. grvDetail.RefreshData();
  1289. }
  1290. catch (Exception ex)
  1291. {
  1292. SetLableText(lblMsg, ex.Message, false);
  1293. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1294. }
  1295. }
  1296. public void SendCommand(string command)
  1297. {
  1298. try
  1299. {
  1300. if (port.IsOpen)
  1301. {
  1302. port.WriteLine(command); // 发送指令
  1303. }
  1304. else
  1305. {
  1306. throw new Exception("串口未打开.");
  1307. }
  1308. SetRichTextboxContent(RTBox_Log, "发送:" + command, false);
  1309. }
  1310. catch (Exception ex)
  1311. {
  1312. SetRichTextboxContent(RTBox_Log, "发送指令时出错: " + ex.Message, false);
  1313. }
  1314. }
  1315. private void btnSave_Click(object sender, EventArgs e)
  1316. {
  1317. try
  1318. {
  1319. if (string.IsNullOrEmpty(this.txtCurrentUse.Text))
  1320. {
  1321. throw new Exception("需要先连接秤获取本次用量!");
  1322. }
  1323. if (Convert.ToDecimal(this.txtCurrentUse.Text) <= 0)
  1324. throw new Exception("本次用量不能小于0!");
  1325. if (txtCurrentLose.Text == "")
  1326. throw new Exception("获取损耗量失败,如果是手动模式,请输入用量后按下Enter");
  1327. //if (Convert.ToDecimal(this.txtCurrentLose.Text) <= 0)
  1328. // throw new Exception("请在对应的搅拌损耗关系表中维护对应的损耗量,并重新称重!");
  1329. //var exist = JbDetails.Where(a => a.LotOpMix.Default1 == txtItemLotno.Text).FirstOrDefault();
  1330. //if (exist != null)
  1331. // throw new Exception("物料条码:" + txtItemLotno.Text + "已上料,请勿重复操作!");
  1332. var source = JbSources.Where(a => a.LotOpMix.SbItemCode == ItemLotNOMes.Rows[0]["INVCODE"].ToString()&&a.LotOpMix.MixStatus!="已上料").OrderBy(a=>a.LotOpMix.SendSeq).FirstOrDefault();
  1333. if (source.LotOpMix.TotalUseQty + source.UseQty + Convert.ToDecimal(txtCurrentUse.Text) > source.LotOpMix.MaxValue)
  1334. throw new Exception("P/N料号:" + ItemLotNOMes.Rows[0]["INVCODE"].ToString() + "上料后将超出最大用量,无法上料!");
  1335. if (source.LotOpMix.TotalUseQty + source.UseQty + Convert.ToDecimal(txtCurrentUse.Text) < source.LotOpMix.MinValue)
  1336. source.LotOpMix.MixStatus = "上料中";
  1337. 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)
  1338. source.LotOpMix.MixStatus = "已上料";
  1339. var nowdate = DateTime.Now; ;
  1340. //累计数量
  1341. source.LoseQty += Convert.ToDecimal(this.txtCurrentLose.Text);
  1342. source.UseQty += Convert.ToDecimal(this.txtCurrentUse.Text);
  1343. source.NewestMixDate = nowdate;
  1344. source.MixDate = nowdate;
  1345. source.Default4= ItemLotNOMes.Rows[0]["BATCHCODE"].ToString();
  1346. if (string.IsNullOrEmpty(source.LotOpMix.BatchCodes))
  1347. source.LotOpMix.BatchCodes += ItemLotNOMes.Rows[0]["BATCHCODE"].ToString();
  1348. else
  1349. {
  1350. if (!source.LotOpMix.BatchCodes.Contains(ItemLotNOMes.Rows[0]["BATCHCODE"].ToString()))
  1351. source.LotOpMix.BatchCodes += "," + ItemLotNOMes.Rows[0]["BATCHCODE"].ToString();
  1352. }
  1353. //保存上料记录
  1354. var copy = MapHelper.Mapping(source);
  1355. copy.Default1 = txtItemLotno.Text;//上料条码
  1356. copy.MixDate = nowdate;
  1357. copy.LoseQty = Convert.ToDecimal(this.txtCurrentLose.Text);
  1358. copy.UseQty = Convert.ToDecimal(this.txtCurrentUse.Text);
  1359. copy.Default2 = txtEQPCode.Text;
  1360. copy.Default3 = txtPotCode.Text;
  1361. JbDetails.Add(copy);
  1362. //获取条码打印信息
  1363. var printModel=GetPrintMes(txtItemLotno.Text);
  1364. var printMes = JbDetails.Where(a => a.Default1 == txtItemLotno.Text).ToList();
  1365. decimal costValue = 0;
  1366. if (printModel != null)
  1367. {
  1368. foreach (var detail in printMes)
  1369. {
  1370. if (detail.LotOpMix.Default2 != detail.LotOpMix.SbItemUnit)
  1371. {
  1372. if (detail.LotOpMix.Default2.ToUpper() == "KG" || detail.LotOpMix.Default2.ToUpper() == "公斤")
  1373. {
  1374. if (detail.LotOpMix.SbItemUnit.ToUpper() == "G")
  1375. {
  1376. costValue += Math.Round((detail.UseQty + detail.LoseQty) / 1000, 5);
  1377. }
  1378. else if (detail.LotOpMix.SbItemUnit.ToUpper() == "KG")
  1379. {
  1380. costValue += (detail.UseQty + detail.LoseQty);
  1381. }
  1382. else
  1383. throw new Exception("搅拌单子阶物料维护的重量单位不正确!");
  1384. }
  1385. else if (detail.LotOpMix.Default2.ToUpper() == "G" || detail.LotOpMix.Default2.ToUpper() == "克")
  1386. {
  1387. if (detail.LotOpMix.SbItemUnit.ToUpper() == "G")
  1388. {
  1389. costValue += (detail.UseQty + detail.LoseQty);
  1390. }
  1391. else if (detail.LotOpMix.SbItemUnit.ToUpper() == "KG")
  1392. {
  1393. costValue+= ((detail.UseQty + detail.LoseQty) * 1000);
  1394. }
  1395. else
  1396. throw new Exception("搅拌单子阶物料维护的重量单位不正确!");
  1397. }
  1398. else
  1399. throw new Exception("子阶物料对应的物料单位不正确!");
  1400. }
  1401. else
  1402. {
  1403. costValue += (detail.UseQty + detail.LoseQty);
  1404. }
  1405. }
  1406. printModel.Qty = (Convert.ToDecimal(printModel.Qty) - costValue).ToString();
  1407. FormPreview preView = new FormPreview(new List<PrintModel> { printModel });
  1408. preView.ShowDialog();
  1409. }
  1410. #region 发送清空指令,清空秤帮数据(待测试)
  1411. ///天平发送指令:"T \r\n"
  1412. if (chengMes.Parameter3.StartsWith("天平"))
  1413. {
  1414. SendCommand("T " + "\r\n");
  1415. }
  1416. else
  1417. {
  1418. SendCommand("SZ" + "\r\n");
  1419. }
  1420. #endregion
  1421. Reset();
  1422. SetLableText(lblMsg, "保存成功!", true);
  1423. SetRichTextboxContent(RTBox_Log, "保存成功", true);
  1424. grvDetail.RefreshData();
  1425. txtItemLotno.Focus();
  1426. }
  1427. catch (Exception ex)
  1428. {
  1429. playSoundFromResource();
  1430. SetLableText(lblMsg, ex.Message, false);
  1431. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1432. }
  1433. }
  1434. /// <summary>
  1435. /// 音频提示
  1436. /// </summary>
  1437. private void playSoundFromResource()
  1438. {
  1439. using (Stream stream = Properties.Resources.chord)
  1440. {
  1441. SoundPlayer player = new SoundPlayer(stream);
  1442. player.Play();
  1443. }
  1444. }
  1445. /// <summary>
  1446. /// 获取上料条码打印信息
  1447. /// </summary>
  1448. /// <param name="Lotno"></param>
  1449. private PrintModel GetPrintMes(string itemLotNo)
  1450. {
  1451. try
  1452. {
  1453. string sql = @"select
  1454. a.LotNo,
  1455. a.InvCode AS ItemCode,
  1456. d.InvName AS ItemDesc,
  1457. d.InvStd AS ItemStd,
  1458. cc.Quantity AS Qty,
  1459. D.InvUnit AS ItemUnit,
  1460. convert(nvarchar(50), cc.InDate, 23) InDate,
  1461. convert(nvarchar(50), A.ExpirationDate, 23) AS ExpirationDate,
  1462. convert(nvarchar(50), a.ProductDate, 23) AS ProductDate,
  1463. f.BatchCode
  1464. FROM {1}.ICSInventoryLot a
  1465. left join {1}.ICSInventoryLotDetail b on a.LotNo = b.LotNo and a.WorkPoint = b.WorkPoint
  1466. LEFT JOIN {1}.ICSExtension f on a.ExtensionID = f.ID AND f.WorkPoint = a.WorkPoint
  1467. left join {1}.ICSMO c on b.TransCode = c.MOCode and b.TransSequence = c.Sequence and b.WorkPoint = c.WorkPoint
  1468. left join {1}.ICSInventory d on a.InvCode = d.InvCode and a.WorkPoint = d.WorkPoint
  1469. left join {1}.ICSWareHouseLotInfo cc on a.LotNo = cc.LotNo
  1470. where A.LOTNO ='{0}'";
  1471. sql = string.Format(sql, itemLotNo, WmsDbLink);
  1472. PrintModel model = null;
  1473. using ( var reader=DBHelper.ExecuteReader(Conns, CommandType.Text, sql))
  1474. {
  1475. if (reader.HasRows)
  1476. {
  1477. model = new PrintModel();
  1478. reader.Read();
  1479. model.LotNo = reader.GetString(0)?.ToString();
  1480. model.ItemCode= reader.GetValue(1)?.ToString();
  1481. model.ItemDesc = reader.GetValue(2)?.ToString();
  1482. model.ItemStd = reader.GetValue(3)?.ToString();
  1483. model.Qty = reader.GetValue(4)?.ToString();
  1484. model.ItemUnit = reader.GetValue(5)?.ToString();
  1485. model.InDate = reader.GetValue(6)?.ToString();
  1486. model.ExpirationDate = reader.GetValue(7)?.ToString();
  1487. model.ProductDate = reader.GetValue(8)?.ToString();
  1488. model.BatchCode = reader.GetValue(9)?.ToString();
  1489. }
  1490. }
  1491. return model;
  1492. }
  1493. catch (Exception ex)
  1494. {
  1495. throw ex;
  1496. }
  1497. }
  1498. /// <summary>
  1499. /// 字符转16进制
  1500. /// </summary>
  1501. /// <param name="input"></param>
  1502. /// <returns></returns>
  1503. //string StringToHex(string input)
  1504. //{
  1505. // StringBuilder sb = new StringBuilder();
  1506. // foreach (char c in input)
  1507. // {
  1508. // sb.Append(Convert.ToInt32(c).ToString("X2")).Append(" ");
  1509. // }
  1510. // return sb.ToString();
  1511. //}
  1512. /// <summary>
  1513. /// 16进制转字符
  1514. /// </summary>
  1515. /// <param name="hex"></param>
  1516. /// <returns></returns>
  1517. string HexToString(string hex)
  1518. {
  1519. string[] hexValuesSplit = hex.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
  1520. StringBuilder sb = new StringBuilder();
  1521. foreach (string hexValue in hexValuesSplit)
  1522. {
  1523. sb.Append((char)Convert.ToInt32(hexValue, 16));
  1524. }
  1525. return sb.ToString();
  1526. }
  1527. public StringDtoEx GetFormNameByChengNo(string chengNo)
  1528. {
  1529. 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}'";
  1530. sql = string.Format(sql, chengNo);
  1531. DataTable table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  1532. StringDtoEx stringDto = new StringDtoEx();
  1533. if (table.Rows.Count > 0)
  1534. {
  1535. var row = table.Rows[0];
  1536. stringDto.Parameter1 = row["Parameter1"].ToString();
  1537. stringDto.Parameter2 = row["Parameter2"].ToString();
  1538. stringDto.Parameter3 = row["Parameter3"].ToString();
  1539. stringDto.Parameter4 = row["Parameter4"].ToString();
  1540. stringDto.Parameter5 = row["Parameter5"].ToString();
  1541. stringDto.Parameter6 = row["Parameter6"].ToString();
  1542. stringDto.Parameter7 = row["Parameter7"].ToString();
  1543. }
  1544. return stringDto;
  1545. }
  1546. //查询挂壁量
  1547. public string GetGbl(decimal value, string itemCode,string MixUnit)
  1548. {
  1549. try
  1550. {
  1551. string gbl = "0";
  1552. string sql = @"SELECT WallQty as VALUE,USEMIN,USEMAX,WallUnit,UseRate
  1553. FROM IcsLossRelation WHERE ITEMCODE='{0}'";
  1554. sql = string.Format(sql, itemCode, value);
  1555. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  1556. if (table.Rows.Count > 0)
  1557. {
  1558. if (MixUnit.ToUpper() == "KG" || MixUnit == "公斤")
  1559. {
  1560. 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();
  1561. if (table_KG != null)
  1562. {
  1563. var tableValue = Convert.ToDecimal(table_KG["VALUE"]);
  1564. if (tableValue == 0)
  1565. tableValue = value *Convert.ToDecimal(table_KG["UseRate"])/100;
  1566. gbl = tableValue.ToString();
  1567. }
  1568. 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();
  1569. if (table_G != null)
  1570. {
  1571. var tableValue = Convert.ToDecimal(table_G["VALUE"]);
  1572. if (tableValue == 0)
  1573. tableValue = value * Convert.ToDecimal(table_KG["UseRate"])/100;
  1574. else
  1575. tableValue = (tableValue / 1000);
  1576. gbl = tableValue.ToString();
  1577. }
  1578. }
  1579. else if (MixUnit.ToUpper() == "G" || MixUnit == "克")
  1580. {
  1581. 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();
  1582. if (table_KG != null)
  1583. {
  1584. var tableValue = Convert.ToDecimal(table_KG["VALUE"]);
  1585. if (tableValue == 0)
  1586. tableValue = value * Convert.ToDecimal(table_KG["UseRate"])/100;
  1587. else
  1588. tableValue = tableValue * 1000;
  1589. gbl = tableValue.ToString();
  1590. }
  1591. 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();
  1592. if (table_G != null)
  1593. {
  1594. var tableValue = Convert.ToDecimal(table_G["VALUE"]);
  1595. if (tableValue == 0)
  1596. tableValue = value * Convert.ToDecimal(table_KG["UseRate"]) / 100;
  1597. gbl = tableValue.ToString();
  1598. }
  1599. }
  1600. }
  1601. return gbl;
  1602. }
  1603. catch (Exception ex)
  1604. {
  1605. throw ex;
  1606. }
  1607. }
  1608. private void btnFlash_Click(object sender, EventArgs e)
  1609. {
  1610. if (ICSBaseSimpleCode.AppshowMessageBoxRepose("当前未扣料的数据会丢失,确定刷新吗?") != DialogResult.OK)
  1611. return;
  1612. else
  1613. {
  1614. JbFlash();
  1615. SetLableText(lblMsg, "刷新成功", true);
  1616. SetRichTextboxContent(RTBox_Log, "刷新成功", true);
  1617. }
  1618. }
  1619. private void btnReset_Click(object sender, EventArgs e)
  1620. {
  1621. Reset();
  1622. }
  1623. private void Reset()
  1624. {
  1625. txtCheng.Enabled = false;
  1626. txtItemLotno.Enabled = true;
  1627. txtCheng.Text = "";
  1628. txtItemLotno.Text = "";
  1629. txtCurrentLose.Text = "";
  1630. txtCurrentUse.Text = "";
  1631. this.txtItemlotNoQty.Text = "";
  1632. revCounts = 0;
  1633. CloseCom();
  1634. }
  1635. private void JbFlash()
  1636. {
  1637. JbDetails.Clear();
  1638. LoadMixMsg();
  1639. }
  1640. private void btnDct_Click(object sender, EventArgs e)
  1641. {
  1642. DevExpress.Utils.WaitDialogForm _wait = new DevExpress.Utils.WaitDialogForm("正在扣料...请稍等...");
  1643. try
  1644. {
  1645. if (JbDetails.Count <= 0)
  1646. throw new Exception("未获取到上料记录,无法扣料!");
  1647. JbDetails.ForEach(a =>
  1648. {
  1649. a.LotOpMix.LotNo = this.txtLotNo.Text;
  1650. a.LotOpMix.ProductQty = Convert.ToInt32(Onwip.LotQty);
  1651. a.LotOpMix.OpCode = this.txtOPCode.Text;
  1652. a.LotOpMix.ItemCode = this.txtItemCode.Text;
  1653. a.UserCode = this.txtUserCode.Text;
  1654. }
  1655. );
  1656. _wait.Show();
  1657. List<WmsStockDownDto> lists = new List<WmsStockDownDto>();
  1658. foreach (var detail in JbDetails)
  1659. {
  1660. var tup= GetTransIDAndSeq(detail.LotOpMix.SbItemCode); //获取备料单行号和ID
  1661. var dto = lists.Where(a => a.TransID == tup.Item1).FirstOrDefault();
  1662. bool isNew = false;
  1663. if (dto == null)
  1664. {
  1665. dto = new WmsStockDownDto();
  1666. dto.User = WmsUser;
  1667. dto.Workpoint = WmsWorkpoint;
  1668. dto.TransSequence = Onwip.MoSeq.ToString() + "~" + tup.Item2;
  1669. dto.TransCode = Onwip.MoCode.ToString();
  1670. dto.Quantity = Onwip.LotQty.ToString();
  1671. dto.TransType = "生产发料-生产订单备料表";
  1672. dto.MTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  1673. dto.TransID = tup.Item1;
  1674. dto.Detail = new List<WmsStockDownDetailsDto>();
  1675. isNew = true;
  1676. }
  1677. WmsStockDownDetailsDto detaildto = new WmsStockDownDetailsDto();
  1678. detaildto.LotNo = detail.Default1;
  1679. if (detail.LotOpMix.Default2 != detail.LotOpMix.SbItemUnit)
  1680. {
  1681. if (detail.LotOpMix.Default2.ToUpper() == "KG" || detail.LotOpMix.Default2.ToUpper() == "公斤")
  1682. {
  1683. if (detail.LotOpMix.SbItemUnit.ToUpper() == "G")
  1684. {
  1685. detaildto.CurrentQuantity = Math.Round((detail.UseQty + detail.LoseQty) / 1000, 5).ToString();
  1686. }
  1687. else if (detail.LotOpMix.SbItemUnit.ToUpper() == "KG")
  1688. {
  1689. detaildto.CurrentQuantity = (detail.UseQty + detail.LoseQty).ToString();
  1690. }
  1691. else
  1692. throw new Exception("搅拌单子阶物料维护的重量单位不正确!");
  1693. }
  1694. else if (detail.LotOpMix.Default2.ToUpper() == "G" || detail.LotOpMix.Default2.ToUpper() == "克")
  1695. {
  1696. if (detail.LotOpMix.SbItemUnit.ToUpper() == "G")
  1697. {
  1698. detaildto.CurrentQuantity = (detail.UseQty + detail.LoseQty).ToString();
  1699. }
  1700. else if (detail.LotOpMix.SbItemUnit.ToUpper() == "KG")
  1701. {
  1702. detaildto.CurrentQuantity = ((detail.UseQty + detail.LoseQty) * 1000).ToString();
  1703. }
  1704. else
  1705. throw new Exception("搅拌单子阶物料维护的重量单位不正确!");
  1706. }
  1707. else
  1708. throw new Exception("子阶物料对应的物料单位不正确!");
  1709. }
  1710. else
  1711. {
  1712. detaildto.CurrentQuantity = (detail.UseQty + detail.LoseQty).ToString();
  1713. }
  1714. dto.Detail.Add(detaildto);
  1715. if(isNew)
  1716. lists.Add(dto);
  1717. }
  1718. SetLableText(lblMsg, "验证是否可以扣料", true);
  1719. var checkDto = WebHelper.HttpPost<ReturnDto<object>>(CheckCreateOrUpdateIcsLot2OpMix, JsonConvert.SerializeObject(JbDetails), AuthenicateResult.AccessToken);
  1720. if (!checkDto.success)
  1721. throw new Exception(checkDto.error.message);
  1722. SetRichTextboxContent(RTBox_Log, "验证成功!", true);
  1723. SetLableText(lblMsg, "开始扣料", true);
  1724. var returndto = WebHelper.HttpPost<WmsReturnDto>(LOTStockDown, JsonConvert.SerializeObject(lists));
  1725. if (returndto.Success)
  1726. SetLableText(lblMsg, "扣料成功!", true);
  1727. else
  1728. throw new Exception(returndto.Message);
  1729. SetLableText(lblMsg, "开始保存上料记录", true);
  1730. var returnDto = WebHelper.HttpPost<ReturnDto<object>>(CreateOrUpdateIcsLot2OpMix, JsonConvert.SerializeObject(JbDetails), AuthenicateResult.AccessToken);
  1731. if (!returnDto.success)
  1732. throw new Exception(returnDto.error.message);
  1733. SetRichTextboxContent(RTBox_Log, "上料记录保存成功!", true);
  1734. _wait.Close();
  1735. Reset();
  1736. JbFlash();
  1737. }
  1738. catch (Exception ex)
  1739. {
  1740. _wait.Close();
  1741. playSoundFromResource();
  1742. SetLableText(lblMsg, ex.Message, false);
  1743. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1744. }
  1745. }
  1746. private void btnOpEnd_Click(object sender, EventArgs e)
  1747. {
  1748. try
  1749. {
  1750. if (string.IsNullOrEmpty(Onwip.LotNo))
  1751. throw new Exception("未扫描跟踪单号!");
  1752. if (string.IsNullOrEmpty(Onwip.OpCode))
  1753. throw new Exception("未扫描工序!");
  1754. if (string.IsNullOrEmpty(Onwip.UserCode))
  1755. throw new Exception("未扫描报工人!");
  1756. if (string.IsNullOrEmpty(Onwip.EqpCode))
  1757. throw new Exception("未扫描设备!");
  1758. if (string.IsNullOrEmpty(Onwip.PotCode))
  1759. throw new Exception("未扫描锅具!");
  1760. if (string.IsNullOrEmpty(txtCurrentQty.Text))
  1761. throw new Exception("完工请填写流转数量!");
  1762. if (xPage_JbSl.PageEnabled)//当前工单是搅拌工单并且开工状态开启搅拌功能
  1763. {
  1764. if (JbSources.Where(a => a.LotOpMix.MixStatus != "已上料"&&string.IsNullOrEmpty(a.LotOpMix.Default3)).FirstOrDefault() != null)
  1765. throw new Exception("当前跟踪单还未搅拌完毕,无法工序完工!");
  1766. }
  1767. Onwip.CollectQty = Convert.ToDecimal(txtCurrentQty.Text);
  1768. Onwip.Memo = txtMemo.Text;
  1769. var returnDto = WebHelper.HttpPost<ReturnDto<IcsLotOnWipDto>>(LotOnWipOpEnd, JsonConvert.SerializeObject(Onwip), AuthenicateResult.AccessToken);
  1770. if (!returnDto.success)
  1771. throw new Exception(returnDto.error.message);
  1772. else
  1773. Onwip = returnDto.result;
  1774. SetRichTextboxContent(RTBox_Log, "工序完工成功!", true);
  1775. SetLableText(lblMsg, "工序完工成功", true);
  1776. Clear();
  1777. }
  1778. catch (Exception ex)
  1779. {
  1780. SetLableText(lblMsg, ex.Message, false);
  1781. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1782. }
  1783. }
  1784. private void btnOpenCom_Click(object sender, EventArgs e)
  1785. {
  1786. CloseCom();
  1787. SetRichTextboxContent(RTBox_Log, "串口关闭成功!", true);
  1788. }
  1789. private void CloseCom()
  1790. {
  1791. if (port.IsOpen)
  1792. {
  1793. port.Close();
  1794. revCounts = 0;
  1795. }
  1796. }
  1797. private Tuple<string, string> GetTransIDAndSeq(string SbItemcode)
  1798. {
  1799. try
  1800. {
  1801. string sql = "select ID,Sequence From {0}.ICSMOPick WHERE PICKID=(SELECT DEFAULT1 FROM ICSMOBOM WHERE MOCODE='{1}' AND MOBITEMCODE='{2}' )";
  1802. sql = string.Format(sql, WmsDbLink, Onwip.MoCode, SbItemcode);
  1803. var table = DBHelper.ExecuteDataset(Conns, CommandType.Text, sql).Tables[0];
  1804. if (table.Rows.Count <= 0)
  1805. throw new Exception("获取WMS领料单对应的工单领料信息失败!");
  1806. return new Tuple<string, string>(table.Rows[0]["ID"].ToString(), table.Rows[0]["Sequence"].ToString());
  1807. }
  1808. catch (Exception ex)
  1809. {
  1810. throw ex;
  1811. }
  1812. }
  1813. private void tabPageArea_Click(object sender, EventArgs e)
  1814. {
  1815. }
  1816. private void btnCustomQty_Click(object sender, EventArgs e)
  1817. {
  1818. try
  1819. {
  1820. if (this.model == ModelEnum.Default)
  1821. {
  1822. if (ICSBaseSimpleCode.AppshowMessageBoxRepose("该功能将开启手动输入用量功能且输入用量单位需和下方搅拌单明细\r\n表维护物料的单位一致,确定吗?") != DialogResult.OK)
  1823. return;
  1824. GetCustomPower();
  1825. this._model = ModelEnum.Custom;
  1826. SetLableText(lblMsg, "变更为手动输入模式", true);
  1827. SetRichTextboxContent(RTBox_Log, "变更为手动输入模式", true);
  1828. }
  1829. else
  1830. {
  1831. this._model = ModelEnum.Default;
  1832. SetLableText(lblMsg, "变更为称重模式", true);
  1833. SetRichTextboxContent(RTBox_Log, "变更为称重模式", true);
  1834. }
  1835. }
  1836. catch (Exception ex)
  1837. {
  1838. SetLableText(lblMsg, ex.Message, false);
  1839. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1840. }
  1841. }
  1842. private void CustomModel()
  1843. {
  1844. try
  1845. {
  1846. CloseCom();
  1847. txtCheng.Enabled = false;
  1848. txtCheng.Text = "";
  1849. txtCurrentUse.Properties.ReadOnly = false;
  1850. txtCurrentUse.Text = "";
  1851. txtCurrentUse.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.Numeric;
  1852. txtCurrentUse.Properties.Mask.EditMask = "n5";//输入框数字模式
  1853. this.btnCustomQty.Text = "称重模式";
  1854. }
  1855. catch (Exception ex)
  1856. {
  1857. throw ex;
  1858. }
  1859. }
  1860. private void DefaultModel()
  1861. {
  1862. try
  1863. {
  1864. this.btnCustomQty.Text = "手动模式";
  1865. txtCurrentUse.Properties.ReadOnly = true;
  1866. txtCurrentUse.Text = "";
  1867. txtCurrentUse.Properties.Mask.MaskType = DevExpress.XtraEditors.Mask.MaskType.None;
  1868. this.txtCheng.Enabled = !txtItemLotno.Enabled;
  1869. }
  1870. catch (Exception ex)
  1871. {
  1872. throw ex;
  1873. }
  1874. }
  1875. private void txtCurrentUse_KeyPress(object sender, KeyPressEventArgs e)
  1876. {
  1877. try
  1878. {
  1879. if (e.KeyChar != (char)(Keys.Enter))
  1880. return;
  1881. if (txtCurrentUse.EditValue == null || Convert.ToDecimal(txtCurrentUse.EditValue) == 0)
  1882. throw new Exception("请输入大于0的用量!");
  1883. txtCurrentLose.Text=GetGbl(Convert.ToDecimal(this.txtCurrentUse.Text), ItemLotNOMes.Rows[0]["INVCODE"].ToString(), ItemLotNOMes.Rows[0]["INVUNIT"].ToString());
  1884. }
  1885. catch (Exception ex)
  1886. {
  1887. SetLableText(lblMsg, ex.Message, false);
  1888. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1889. }
  1890. }
  1891. private void lab22_Click(object sender, EventArgs e)
  1892. {
  1893. }
  1894. private void txtUnLockEqp_KeyPress(object sender, KeyPressEventArgs e)
  1895. {
  1896. try
  1897. {
  1898. //调用接口获取信息
  1899. var returnDto = WebHelper.HttpPost<ReturnDto<string>>(UnLockEqpUrl,JsonConvert.SerializeObject(new { Value=txtUnLockEqp.Text.Trim() }), AuthenicateResult.AccessToken);
  1900. if (!returnDto.success)
  1901. throw new Exception(returnDto.error.message);
  1902. SetRichTextboxContent(RTBox_Log, "设备:"+txtUnLockEqp.Text+"解锁成功", true);
  1903. SetLableText(lblMsg, "设备:" + txtUnLockEqp.Text + "解锁成功", true);
  1904. txtUnLockEqp.Text = "";
  1905. }
  1906. catch (Exception ex)
  1907. {
  1908. SetLableText(lblMsg, ex.Message, false);
  1909. SetRichTextboxContent(RTBox_Log, ex.Message, false);
  1910. }
  1911. }
  1912. private void grvDetail_RowCellStyle(object sender, RowCellStyleEventArgs e)
  1913. {
  1914. if (grvDetail.GetRowCellValue(e.RowHandle, colMixStatus).ToString() == "已上料")
  1915. e.Appearance.BackColor = Color.LightGreen;
  1916. }
  1917. private void tableLayoutPanel_Jb_Paint(object sender, PaintEventArgs e)
  1918. {
  1919. }
  1920. private void btnPrintDemo_Click(object sender, EventArgs e)
  1921. {
  1922. FormDesign design = new FormDesign();
  1923. design.ShowDialog();
  1924. }
  1925. private void btnShowPDF_General_Click(object sender, EventArgs e)
  1926. {
  1927. }
  1928. }
  1929. public enum ModelEnum
  1930. {
  1931. /// <summary>
  1932. /// 自定义手输
  1933. /// </summary>
  1934. Custom
  1935. ,
  1936. /// <summary>
  1937. /// 默认称重模式
  1938. /// </summary>
  1939. Default
  1940. }
  1941. }