ucHotDeliveryBelt.cs 60 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398
  1. using com.hnshituo.core.webapp.vo;
  2. using Common;
  3. using Infragistics.Win;
  4. using Infragistics.Win.UltraWinEditors;
  5. using Infragistics.Win.UltraWinGrid;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Data;
  9. using System.Drawing;
  10. using System.Net;
  11. using System.Net.Sockets;
  12. using System.Windows.Forms;
  13. namespace MeterModuleLibrary
  14. {
  15. public partial class ucHotDeliveryBelt : UserControl
  16. {
  17. public delegate void EventOpenWarnMsgBelt(string e);
  18. public ucHotDeliveryBelt()
  19. {
  20. InitializeComponent();
  21. }
  22. public CoreAppUser appUser = null;//登陆信息
  23. private Log l = Log.GetInstance();//日志信息
  24. private ComBaseInfoService comBaseInfoService = new ComBaseInfoService(); //基础数服务
  25. private PreStorageScaleService preStorageScaleService = new PreStorageScaleService();//热送预报数据服务
  26. private MeterWorkStorageActualService actualService = new MeterWorkStorageActualService();//热送实绩数据服务
  27. private MeterWorkStorageSingleWgtService singleWgtService = new MeterWorkStorageSingleWgtService(); //热送单只重量(标准重量)服务
  28. private MeterWorkStorageCalibrationService calibrationService = new MeterWorkStorageCalibrationService(); //热送校秤服务
  29. private meterworkzeroalarmservice zeroAlarmService = new meterworkzeroalarmservice();//零点报警服务
  30. private PreStorageScale preTack = new PreStorageScale(); //预报实体类
  31. public DbHelper db = null; //服务端请求
  32. public event EventOpenWarnMsgBelt openWarnMsgBelt; //打开预警弹窗
  33. private bool bCheckWarn = false;//是否已经进行未勾选自动计量提醒;
  34. /// <summary>
  35. /// 计量点
  36. /// </summary>
  37. public string sPointNo = "", sPointName = "";
  38. /// <summary>
  39. /// 登录人及登陆IP信息;用户选择的预报编号
  40. /// </summary>
  41. public string sUserId = "", sUserName = "", sIpAddress = "", sClickPredictionNo = "";
  42. /// <summary>
  43. /// 新增的计量表监控数据
  44. /// </summary>
  45. public MeterBaseScalePoint drOldData = null, rowPointInfo = null;
  46. /// <summary>
  47. /// 初始载入一次数据
  48. /// </summary>
  49. private bool flagLoad = true;
  50. /// <summary>
  51. /// 数据保存标志;fasle=未保存,可以进行保存操作,true=已保存,不允许重复保存!
  52. /// </summary>
  53. private bool flagSaved = false;
  54. /// <summary>
  55. /// 重量稳定状态:0稳定,1不稳定,2空磅
  56. /// </summary>
  57. private int weightStatus = 2;
  58. /// <summary>
  59. /// 重量稳定次数:累计值
  60. /// </summary>
  61. private int weightStableTimes = 0, weightStableTimesZero = 0;
  62. /// <summary>
  63. /// 重量稳定次数:超过此值则稳定
  64. /// </summary>
  65. private int weightStableSchedule = 6, weightStableScheduleZero = 6;
  66. /// <summary>
  67. /// 上一次重量:记录上一次重量,用于判断重量是否稳定
  68. /// </summary>
  69. private double weightLast = 0, weightLastZero = 0;
  70. /// <summary>
  71. /// 重量稳定的差值:默认3kg
  72. /// </summary>
  73. private double weightDiff = 3, weightDiffZero = 3;
  74. /// <summary>
  75. /// 是否为测试标志位
  76. /// </summary>
  77. private bool testFlage = false;
  78. /// <summary>
  79. ///完整终端地址:MOXAIP+MOXAPORT
  80. /// </summary>
  81. private IPEndPoint serverFullAddr;
  82. /// <summary>
  83. /// 连接套接字
  84. /// </summary>
  85. private Socket sock;
  86. /// <summary>
  87. /// load事件
  88. /// </summary>
  89. /// <param name="sender"></param>
  90. /// <param name="e"></param>
  91. private void ucHotDeliveryBelt_Load(object sender, EventArgs e)
  92. {
  93. //ClsControlPack.UseFixedHeader(this.ultraGridActual, "UNCK");
  94. //ClsControlPack.UseFixedHeader(this.ultraGridActual, "heatNo");
  95. //ClsControlPack.UseFixedHeader(this.ultraGridActual, "packageNo");
  96. #region 基础数据载入
  97. //热送磅班组信息载入cmbMeterGroupUp
  98. RESTfulResult<List<ComBaseInfo>> rrComMeterGroop = comBaseInfoService.doQueryBaseList(new ComBaseInfo { validFlag = "1", pBaseCode = "001044" });
  99. if (rrComMeterGroop.Succeed && rrComMeterGroop.Data != null && rrComMeterGroop.Data.Count > 0)
  100. {
  101. ClsControlPack.SetUltraComboDataSource(cmbMeterGroup, rrComMeterGroop.Data.ListToDataTable<ComBaseInfo>(), "baseCode", "baseName");
  102. }
  103. else
  104. {
  105. MessageBox.Show("热送磅班组信息载入失败!");
  106. return;
  107. }
  108. //热送磅班次信息载入cmbMeterClassUp
  109. RESTfulResult<List<ComBaseInfo>> rrComMeterClass = comBaseInfoService.doQueryBaseList(new ComBaseInfo { validFlag = "1", pBaseCode = "001043" });
  110. if (rrComMeterClass.Succeed && rrComMeterClass.Data != null && rrComMeterClass.Data.Count > 0)
  111. {
  112. ClsControlPack.SetUltraComboDataSource(cmbMeterClass, rrComMeterClass.Data.ListToDataTable<ComBaseInfo>(), "baseCode", "baseName");
  113. }
  114. else
  115. {
  116. MessageBox.Show("热送磅班次信息载入失败!");
  117. return;
  118. }
  119. //预报表转换
  120. ValueList vlistFlag1 = new ValueList();
  121. vlistFlag1.ValueListItems.Add("0", "无效");
  122. vlistFlag1.ValueListItems.Add("1", "未使用");
  123. vlistFlag1.ValueListItems.Add("2", "使用中");
  124. vlistFlag1.ValueListItems.Add("3", "已完成");
  125. this.ultraGrid1.DisplayLayout.Bands[0].Columns["valueFlag"].ValueList = vlistFlag1;
  126. //ClsControlPack.SetUltraGridRowFilter(ref ultraGrid1, true);
  127. //实绩表转换
  128. ValueList vlistFlag3 = new ValueList();
  129. vlistFlag3.ValueListItems.Add("0", "无效");
  130. vlistFlag3.ValueListItems.Add("1", "有效");
  131. this.ultraGridActual.DisplayLayout.Bands[0].Columns["valueFlag"].ValueList = vlistFlag3;
  132. //ClsControlPack.SetUltraGridRowFilter(ref ultraGrid2, true);
  133. #endregion 基础数据载入
  134. //班次、班组初始化
  135. if (appUser != null && !string.IsNullOrEmpty(appUser.userClass) && !string.IsNullOrEmpty(appUser.userGroup))
  136. {
  137. cmbMeterClass.Text = appUser.userClass;
  138. cmbMeterGroup.Text = appUser.userGroup;
  139. }
  140. }
  141. #region timer1事件
  142. /// <summary>
  143. /// 时间控制器,每秒钟执行一次
  144. /// 1、用于重量采集
  145. /// 2、用于称重保存
  146. /// </summary>
  147. /// <param name="sender"></param>
  148. /// <param name="e"></param>
  149. private void timer1_Tick(object sender, EventArgs e)
  150. {
  151. try
  152. {
  153. if (!string.IsNullOrEmpty(sPointName) && !string.IsNullOrEmpty(sPointNo) && flagLoad)
  154. {
  155. lbPointName.Text = sPointName;
  156. lbCreateManName.Text = sUserName;
  157. queryScale(); //界面第一次加载
  158. queryActual(); //界面第一次加载
  159. flagLoad = false;
  160. flagSaved = false;
  161. }
  162. if (rowPointInfo != null && rowPointInfo.weight != null)
  163. {
  164. if (testFlage)
  165. {
  166. rowPointInfo.weight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim());
  167. //rowPointInfo.weightZero = Convert.ToDouble(txtReferWeight.Text.Replace("kg", "").Trim());
  168. }
  169. //重量小于100,将保存标志位置为未保存;
  170. if (rowPointInfo.weight < 100)
  171. {
  172. flagSaved = false;
  173. bCheckWarn = false;
  174. }
  175. //界面重量显示赋值
  176. setWeightCollect(rowPointInfo.weight.ToString());
  177. //判断是否为零点;并在界面显示
  178. judgmentWeightZero();
  179. //判稳逻辑;2021年10月20日切换为自动采集;0.5s一次,6次波动范围在3以内为稳定;
  180. //judgmentWeightStatus();
  181. //平台的重量判稳逻辑;
  182. judgmentWeightStatusPT();
  183. //自动保存;
  184. if (ckAutoSave.Checked)
  185. {
  186. //普棒热送00032:重量小于4000kg不进行自动保存操作
  187. double collectWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim());
  188. if ("00032".Equals(sPointNo) && collectWeight < 4000)
  189. {
  190. return;
  191. }
  192. if (!flagSaved && weightStatus == 0)
  193. {
  194. aotuSaveDB();//自动保存
  195. }
  196. }
  197. //未勾选自动计量报警
  198. if (!bCheckWarn && !ckAutoSave.Checked && !flagSaved && weightStatus == 0 && !"00033".Equals(sPointNo))
  199. {
  200. bCheckWarn = true;
  201. setMsgMsg(tbMsg, "color", "Red");
  202. openWarnMsgBelt(sPointName + "重量已稳定,未勾选【自动计量】!");//回调主界面方法
  203. }
  204. }
  205. else
  206. {
  207. setMsgInfo(tbMsg, "未采集到重量数据!请联系系统维护人员处理!", "");
  208. }
  209. }
  210. catch (Exception ex)
  211. {
  212. l.WriteLog(19, sPointName + ":" + ex.Message);
  213. throw ex;
  214. }
  215. }
  216. #endregion timer1事件
  217. #region 按钮点击事件汇总
  218. /// <summary>
  219. /// 预报查询按钮点击事件
  220. /// </summary>
  221. /// <param name="sender"></param>
  222. /// <param name="e"></param>
  223. private void btQueryInfo_Click(object sender, EventArgs e)
  224. {
  225. queryScale(); //预报查询按钮查询预报
  226. queryActual();//预报查询按钮查询实绩
  227. }
  228. /// <summary>
  229. /// 保存按钮,将预报数据转换为实绩数据
  230. /// </summary>
  231. /// <param name="sender"></param>
  232. /// <param name="e"></param>
  233. private void btSave_Click(object sender, EventArgs e)
  234. {
  235. saveDB(); //手动保存
  236. queryScale(); //手动保存后,查预报;
  237. queryActual();//手动保存后,查实绩;
  238. }
  239. /// <summary>
  240. /// 是否自动计量
  241. /// </summary>
  242. /// <param name="sender"></param>
  243. /// <param name="e"></param>
  244. private void ckAutoSave_CheckedChanged(object sender, EventArgs e)
  245. {
  246. queryScale();//自动计量时复选框变化时,重新查询预报;
  247. }
  248. /// <summary>
  249. /// 手动完成
  250. /// </summary>
  251. /// <param name="sender"></param>
  252. /// <param name="e"></param>
  253. private void btnComplete_Click(object sender, EventArgs e)
  254. {
  255. try
  256. {
  257. if (string.IsNullOrEmpty(tbPredictionNo.Text.Trim()))
  258. {
  259. setMsgInfo(tbMsg, "预报编号为空不允许进行[手动完成]!", "");
  260. return;
  261. }
  262. DialogResult dr = MessageBox.Show("是否将预报[" + tbPredictionNo.Text.Trim() + "]手动完成!", "提示", MessageBoxButtons.OKCancel);
  263. if (dr == DialogResult.Cancel)
  264. {
  265. return;
  266. }
  267. List<PreStorageScale> lt = new List<PreStorageScale>();
  268. PreStorageScale preStorageUpdate = new PreStorageScale();
  269. preStorageUpdate.predictionNo = tbPredictionNo.Text.Trim();
  270. preStorageUpdate.updateManNo = sUserId;
  271. preStorageUpdate.updateManName = sUserName;
  272. preStorageUpdate.valueFlag = "3"; //作废;状态(0=无效,1=有效,2=使用中,3=已完成)
  273. preStorageUpdate.memo = preTack.memo + ";" + DateTime.Now + "司磅工:" + sUserName + "进行[手动完成]操作!";
  274. lt.Add(preStorageUpdate);
  275. RESTfulResult<String> rms = preStorageScaleService.doUpdateWf(lt);
  276. if (rms.Succeed)
  277. {
  278. setMsgInfo(tbMsg, "预报编号[" + preStorageUpdate.predictionNo + "]手动完成,操作成功!", "");
  279. queryScale(); //手动完成后,自动查询一次
  280. }
  281. else
  282. {
  283. setMsgInfo(tbMsg, "预报编号[" + preStorageUpdate.predictionNo + "]手动完成,操作失败!", "");
  284. }
  285. }
  286. catch (Exception ex)
  287. {
  288. l.WriteLog(19, sPointName + ":" + ex.Message);
  289. throw ex;
  290. }
  291. }
  292. /// <summary>
  293. /// 调整班次
  294. /// </summary>
  295. /// <param name="sender"></param>
  296. /// <param name="e"></param>
  297. private void btnUpdateClass_Click(object sender, EventArgs e)
  298. {
  299. try
  300. {
  301. int iCount = 0;
  302. ultraGridActual.UpdateData();
  303. frmHotDeliveryUpdateClass frmPrint = new frmHotDeliveryUpdateClass();
  304. foreach (UltraGridRow ugr in ultraGridActual.Rows)
  305. {
  306. if (ugr.Cells["UNCK"].Value.ToString().Trim().ToUpper() == "TRUE")
  307. {
  308. frmPrint.productDateShow = ugr.Cells["productDate"].Text.Trim().Substring(0, 10);
  309. frmPrint.meterClassShow = ugr.Cells["meterClass"].Text.Trim();
  310. frmPrint.meterGroupShow = ugr.Cells["meterGroup"].Text.Trim();
  311. iCount++;
  312. }
  313. }
  314. if (iCount == 0)
  315. {
  316. setMsgInfo(tbMsg, "请至少勾选一条数据后再进行更新操作!", "");
  317. frmPrint.Dispose();
  318. return;
  319. }
  320. frmPrint.StartPosition = FormStartPosition.CenterScreen;
  321. frmPrint.callBack += updateActualClass;
  322. frmPrint.ShowDialog();
  323. frmPrint.Dispose();
  324. }
  325. catch (Exception ex)
  326. {
  327. l.WriteLog(19, sPointName + ":" + ex.Message);
  328. throw ex;
  329. }
  330. }
  331. /// <summary>
  332. /// 跳转到计量实绩维护界面
  333. /// </summary>
  334. /// <param name="sender"></param>
  335. /// <param name="e"></param>
  336. private void btEditWeightResult_Click(object sender, EventArgs e)
  337. {
  338. //ST_MainForm mainForm = new ST_MainForm(new CoreAppUser { userid = sUserId, username = sUserName });
  339. //ToolStripMenuItem mItem = new System.Windows.Forms.ToolStripMenuItem();
  340. //mItem.Text = "热送磅实绩维护";
  341. ////mItem.Tag = new ArrayList() { "页面名称", "页面所属的dll", "具体的页面frm" };
  342. //mItem.Tag = new ArrayList() { "热送磅实绩维护", "StorageMeterSystem", "frmHotDeliveryActual" };
  343. ////mItem.Click += new EventHandler(mainForm.SysMenuItem_Click);
  344. //mainForm.SysMenuItem_Click(mItem, e);
  345. }
  346. /// <summary>
  347. /// 选择实绩进行校秤功能
  348. /// </summary>
  349. /// <param name="sender"></param>
  350. /// <param name="e"></param>
  351. private void btCalibrationScale_Click(object sender, EventArgs e)
  352. {
  353. try
  354. {
  355. string msg = "";
  356. List<MeterWorkStorageActual> lt = new List<MeterWorkStorageActual>();
  357. ultraGridActual.UpdateData();
  358. foreach (UltraGridRow ugr in ultraGridActual.Rows)
  359. {
  360. if (ugr.Cells["UNCK"].Value.ToString().Trim().ToUpper() == "TRUE")
  361. {
  362. MeterWorkStorageActual preStorageUpdate = new MeterWorkStorageActual();
  363. preStorageUpdate.actualNo = ugr.Cells["actualNo"].Text.Trim();
  364. preStorageUpdate.predictionNo = ugr.Cells["predictionNo"].Text.Trim();
  365. preStorageUpdate.actualWeight = Convert.ToDouble(ugr.Cells["actualWeight"].Text.Trim());
  366. lt.Add(preStorageUpdate);
  367. }
  368. }
  369. if (lt == null || lt.Count != 1)
  370. {
  371. setMsgInfo(tbMsg, "校秤需要勾选1条计量实绩数据!", "");
  372. return;
  373. }
  374. MeterWorkStorageCalibration calibration = new MeterWorkStorageCalibration();
  375. RESTfulResult<List<MeterWorkStorageSingleWgt>> rms = singleWgtService.doQuery(
  376. new MeterWorkStorageSingleWgt { baseSpotNo = sPointNo, valueFlag = "1", weightType = "2" });
  377. if (rms.Succeed && rms.Data != null && rms.Data.Count > 0)
  378. {
  379. MeterWorkStorageSingleWgt singleWgt = rms.Data[0];
  380. calibration.actualWeight = lt[0].actualWeight; //校秤的实际重量(取选中的那条实绩的数据)
  381. calibration.wgtNo = lt[0].actualNo; //选中的计量实绩的值,用于更新实绩表的数据
  382. calibration.valueFlag = "1"; //状态(1 = 有效,0 = 无效)
  383. calibration.createManNo = sUserId;
  384. calibration.createManName = sUserName;
  385. calibration.baseSpotNo = sPointNo; //校秤计量点的编号
  386. calibration.baseSpotName = sPointName;//校秤计量点的名称
  387. calibration.baseSpotName = sPointName;//校秤计量点的名称
  388. calibration.meterClass = cmbMeterClass.Text;
  389. calibration.meterGroup = cmbMeterGroup.Text;
  390. calibration.gradeNo = singleWgt.gradeNo;
  391. calibration.gradeName = singleWgt.gradeName;
  392. calibration.specNo = singleWgt.specNo;
  393. calibration.specName = singleWgt.specName;
  394. calibration.theoryWeight = singleWgt.singleWeight; //理论重量
  395. calibration.theoryWeightDiff = singleWgt.weightDiff; //理论重量差值
  396. calibration.actualWeightDiff = calibration.actualWeight - calibration.theoryWeight;//校秤重量与理论重量实际差值
  397. //实际的偏差值大于理论偏差值
  398. if (Math.Abs(Convert.ToDouble(calibration.actualWeightDiff)) > Math.Abs(Convert.ToDouble(calibration.theoryWeightDiff)))
  399. {
  400. calibration.qualifiedFlag = "0";//状态(1=合格,0=不合格)
  401. msg = "校秤未通过!";
  402. }
  403. else
  404. {
  405. calibration.qualifiedFlag = "1";
  406. msg = "校秤通过!";
  407. }
  408. RESTfulResult<string> rm = calibrationService.doAddWf(calibration);
  409. if (rm.Succeed)
  410. {
  411. setMsgInfo(tbMsg, "校秤数据保存成功,计量重量:" + calibration.actualWeight + "kg;标准件理论重量:" + calibration.theoryWeight + "kg;重量差值:" + calibration.actualWeightDiff + "kg;" + msg, "");
  412. l.WriteLog(8, tbMsg.Text);
  413. }
  414. else
  415. {
  416. setMsgInfo(tbMsg, "保存失败:" + rm.Data, "");
  417. }
  418. queryActual(); //较秤成功,进行实绩查询
  419. }
  420. else
  421. {
  422. setMsgInfo(tbMsg, "未查询到秤点的校秤标准重量,不允许进行校秤!", "");
  423. }
  424. }
  425. catch (Exception ex)
  426. {
  427. l.WriteLog(19, sPointName + ":" + ex.Message);
  428. throw ex;
  429. }
  430. }
  431. /// <summary>
  432. /// 按界面重量进行数据采集
  433. /// </summary>
  434. /// <param name="sender"></param>
  435. /// <param name="e"></param>
  436. private void btCalibrationSD_Click(object sender, EventArgs e)
  437. {
  438. try
  439. {
  440. string msg = "";
  441. MeterWorkStorageCalibration calibration = new MeterWorkStorageCalibration();
  442. RESTfulResult<List<MeterWorkStorageSingleWgt>> rms = singleWgtService.doQuery(
  443. new MeterWorkStorageSingleWgt { baseSpotNo = sPointNo, valueFlag = "1", weightType = "2" });
  444. if (rms.Succeed && rms.Data != null && rms.Data.Count > 0)
  445. {
  446. MeterWorkStorageSingleWgt singleWgt = rms.Data[0];
  447. calibration.valueFlag = "1"; //状态(1 = 有效,0 = 无效)
  448. calibration.createManNo = sUserId;
  449. calibration.createManName = sUserName;
  450. calibration.baseSpotNo = sPointNo; //校秤计量点的编号
  451. calibration.baseSpotName = sPointName;//校秤计量点的名称
  452. calibration.baseSpotName = sPointName;//校秤计量点的名称
  453. calibration.meterClass = cmbMeterClass.Text;
  454. calibration.meterGroup = cmbMeterGroup.Text;
  455. calibration.gradeNo = singleWgt.gradeNo;
  456. calibration.gradeName = singleWgt.gradeName;
  457. calibration.specNo = singleWgt.specNo;
  458. calibration.specName = singleWgt.specName;
  459. calibration.theoryWeight = singleWgt.singleWeight; //理论重量
  460. calibration.theoryWeightDiff = singleWgt.weightDiff; //理论重量差值
  461. calibration.actualWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); //校秤的实际重量
  462. calibration.actualWeightDiff = calibration.actualWeight - calibration.theoryWeight;//校秤重量与理论重量实际差值
  463. //实际的偏差值大于理论偏差值
  464. if (Math.Abs(Convert.ToDouble(calibration.actualWeightDiff)) > Math.Abs(Convert.ToDouble(calibration.theoryWeightDiff)))
  465. {
  466. calibration.qualifiedFlag = "0";//状态(1=合格,0=不合格)
  467. msg = "校秤未通过!";
  468. }
  469. else
  470. {
  471. calibration.qualifiedFlag = "1";
  472. msg = "校秤通过!";
  473. }
  474. RESTfulResult<string> rm = calibrationService.doAddManual(calibration);
  475. if (rm.Succeed)
  476. {
  477. setMsgInfo(tbMsg, "校秤数据保存成功,计量重量:" + calibration.actualWeight + "kg;标准件理论重量:" + calibration.theoryWeight + "kg;重量差值:" + calibration.actualWeightDiff + "kg;" + msg, "");
  478. l.WriteLog(8, tbMsg.Text);
  479. }
  480. else
  481. {
  482. setMsgInfo(tbMsg, "保存失败:" + rm.Data, "");
  483. }
  484. }
  485. else
  486. {
  487. setMsgInfo(tbMsg, "未查询到秤点的校秤标准重量,不允许进行校秤!", "");
  488. }
  489. }
  490. catch (Exception ex)
  491. {
  492. l.WriteLog(19, sPointName + ":" + ex.Message);
  493. throw ex;
  494. }
  495. }
  496. /// <summary>
  497. /// 预报编号点击按钮;用于做测试重量置为600kg
  498. /// </summary>
  499. /// <param name="sender"></param>
  500. /// <param name="e"></param>
  501. private void label15_Click(object sender, EventArgs e)
  502. {
  503. if (sIpAddress.Contains("192.168.137.1") && rowPointInfo != null)
  504. {
  505. testFlage = true;
  506. setWeightCollect("4000"); //测试重量
  507. setWeightZero("7");//测试重量
  508. rowPointInfo.weight = 700;
  509. rowPointInfo.weightZero = 7;
  510. }
  511. }
  512. /// <summary>
  513. /// 预报编号点击按钮;用于做测试重量置为600kg
  514. /// </summary>
  515. /// <param name="sender"></param>
  516. /// <param name="e"></param>
  517. private void label12_Click(object sender, EventArgs e)
  518. {
  519. if (sIpAddress.Contains("192.168") && rowPointInfo != null)
  520. {
  521. testFlage = true;
  522. setWeightCollect("0"); //测试重量
  523. setWeightZero("0");//测试重量
  524. rowPointInfo.weight = 0;
  525. }
  526. }
  527. /// <summary>
  528. /// 远程清零
  529. /// </summary>
  530. /// <param name="sender"></param>
  531. /// <param name="e"></param>
  532. private void btClear_Click(object sender, EventArgs e)
  533. {
  534. if (string.IsNullOrEmpty(rowPointInfo.moxaIp) || string.IsNullOrEmpty(rowPointInfo.moxaPort))
  535. {
  536. MessageBox.Show("[" + sPointName + "]远程清零的IP及端口未配置,请联系系统管理员!");
  537. return;
  538. }
  539. try
  540. {
  541. //设置IP和端口
  542. serverFullAddr = new IPEndPoint(IPAddress.Parse(rowPointInfo.moxaIp), int.Parse(rowPointInfo.moxaPort));
  543. sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  544. //指定本地主机地址和端口号
  545. sock.Connect(serverFullAddr);
  546. //发送固定的指令“Z“到串口服务器
  547. byte[] byteSend = System.Text.Encoding.Default.GetBytes("Z");
  548. byte[] message = new byte[1024];
  549. string mess = "";
  550. int bytes = 0;
  551. try
  552. {
  553. //发送数据
  554. sock.Send(byteSend);
  555. //接收数据
  556. //bytes = sock.Receive(message);
  557. //mess = mess + Encoding.Default.GetString(message, 0, bytes);//编码(当接收的字节大于1024的时候应当循环接收,仪表传回的不需要)
  558. //do
  559. //{
  560. // bytes = newSocket.Receive(message, message.Length, 0);
  561. // mess = mess + Encoding.ASCII.GetString(message, 0, bytes);
  562. //}
  563. // while (bytes > 0);
  564. l.WriteLog(19, rowPointInfo.moxaIp + ":" + rowPointInfo.moxaPort + ":远程清零成功!");
  565. MessageBox.Show("远程清零下发指令下发成功,请关注重量变化!");
  566. }
  567. catch (Exception ex)
  568. {
  569. sock.Close();
  570. MessageBox.Show("远程清零下发指令出现错误,请联系管理员" + ex);
  571. }
  572. sock.Close();
  573. }
  574. catch (Exception ee)
  575. {
  576. MessageBox.Show("连接服务器失败[" + rowPointInfo.moxaIp + ":" + rowPointInfo.moxaPort + "]。。。请联系系统管理员" + ee);
  577. }
  578. }
  579. #endregion 按钮点击事件汇总
  580. #region 计量相关方法
  581. /// <summary>
  582. /// 更新实绩表生产时间、班次、班组
  583. /// </summary>
  584. private void updateActualClass(DateTime productDate, string meterClass, string meterGroup)
  585. {
  586. try
  587. {
  588. int iCount = 0;
  589. List<MeterWorkStorageActual> lt = new List<MeterWorkStorageActual>();
  590. ultraGridActual.UpdateData();
  591. foreach (UltraGridRow ugr in ultraGridActual.Rows)
  592. {
  593. if (ugr.Cells["UNCK"].Value.ToString().Trim().ToUpper() == "TRUE")
  594. {
  595. MeterWorkStorageActual preStorageUpdate = new MeterWorkStorageActual();
  596. preStorageUpdate.actualNo = ugr.Cells["actualNo"].Text.Trim();
  597. preStorageUpdate.predictionNo = ugr.Cells["predictionNo"].Text.Trim();
  598. preStorageUpdate.updateManNo = sUserId;
  599. preStorageUpdate.updateManName = sUserName;
  600. preStorageUpdate.productDate = productDate;
  601. preStorageUpdate.meterClass = meterClass;
  602. preStorageUpdate.meterGroup = meterGroup;
  603. lt.Add(preStorageUpdate);
  604. iCount++;
  605. }
  606. }
  607. if (lt == null || lt.Count == 0)
  608. {
  609. setMsgInfo(tbMsg, "请至少勾选一条数据后再进行更新操作!", "");
  610. return;
  611. }
  612. RESTfulResult<String> rms = actualService.doUpdateClient(lt);
  613. if (rms.Succeed)
  614. {
  615. setMsgInfo(tbMsg, "共完成" + iCount + "条数据的修改!", "");
  616. queryActual(); //更新班次信息后查询
  617. }
  618. else
  619. {
  620. setMsgInfo(tbMsg, "修改班次信息失败!", "");
  621. }
  622. }
  623. catch (Exception ex)
  624. {
  625. l.WriteLog(19, sPointName + ":" + ex.Message);
  626. throw ex;
  627. }
  628. }
  629. /// <summary>
  630. /// 自动判断重量是否为零点
  631. /// </summary>
  632. private void judgmentWeightZero()
  633. {
  634. try
  635. {
  636. //零点清零;只有在重量回零的时候,才进行零点清零;
  637. if (rowPointInfo.weightZero == 0)
  638. {
  639. PbCache.isZeroAlarm = false;
  640. weightLast = 0;
  641. setWeightZero(rowPointInfo.weightZero.ToString());
  642. setStableZero(true);//默认为红色,此处需要变成绿色;
  643. return;
  644. }
  645. //零点判断及赋值;注意此处不清空零点的值
  646. if (rowPointInfo.weight < 200 && rowPointInfo.weightZero < 200)
  647. {
  648. if (weightDiffZero > Math.Abs(rowPointInfo.weightZero.Value - weightLastZero))
  649. {
  650. weightStableTimesZero++;
  651. }
  652. else
  653. {
  654. weightStableTimesZero = 0;
  655. }
  656. //零点值赋值
  657. if (weightStableTimesZero > weightStableScheduleZero)
  658. {
  659. setWeightZero(rowPointInfo.weightZero.ToString());
  660. setStableZero(false);//true=绿色,false=红色;控件默认为红色,若从绿色变过来则此处需要变成红色;
  661. doInsertZeroAlarm();//新增零点报警的数据
  662. l.WriteLog(20, sPointName + ":零点报警,报警值:" + rowPointInfo.weightZero);
  663. }
  664. }
  665. else
  666. {
  667. PbCache.isZeroAlarm = true;
  668. weightStableTimesZero = 0;
  669. }
  670. weightLastZero = rowPointInfo.weightZero.Value;
  671. }
  672. catch (Exception ex)
  673. {
  674. l.WriteLog(19, sPointName + ":" + ex.Message);
  675. throw ex;
  676. }
  677. }
  678. /// <summary>
  679. /// 自动判断重量是否稳定
  680. /// </summary>
  681. private void judgmentWeightStatus()
  682. {
  683. try
  684. {
  685. if (rowPointInfo.weight > 100)
  686. {
  687. if (weightDiff > Math.Abs(rowPointInfo.weight.Value - weightLast))
  688. {
  689. weightStableTimes++;
  690. }
  691. else
  692. {
  693. weightStableTimes = 0;
  694. }
  695. if (weightStableTimes > weightStableSchedule)
  696. {
  697. //理论重量不为0的时候,采集重量需要大于理论重量-800kg才能作为稳定值
  698. if (preTack != null && preTack.theoreticalWeight != null && preTack.theoreticalWeight > 0)
  699. {
  700. if (rowPointInfo.weight > (preTack.theoreticalWeight - 800))
  701. {
  702. weightStatus = 0;
  703. setStableWeight(true);
  704. }
  705. else
  706. {
  707. weightStatus = 1;
  708. setStableWeight(false);
  709. }
  710. }
  711. else
  712. {
  713. weightStatus = 0;
  714. setStableWeight(true);
  715. }
  716. }
  717. else
  718. {
  719. weightStatus = 1;
  720. setStableWeight(false);
  721. }
  722. weightLast = rowPointInfo.weight.Value;
  723. }
  724. else
  725. {
  726. weightStatus = 2;
  727. weightStableTimes = 0;
  728. setStableWeight(false);
  729. }
  730. }
  731. catch (Exception ex)
  732. {
  733. l.WriteLog(19, sPointName + ":" + ex.Message);
  734. throw ex;
  735. }
  736. }
  737. /// <summary>
  738. /// 界面重量赋值,平台判断是否稳定
  739. /// 重量稳定状态:0稳定,1不稳定,2空磅
  740. /// </summary>
  741. private void judgmentWeightStatusPT()
  742. {
  743. try
  744. {
  745. if (rowPointInfo.weight > 100)
  746. {
  747. if (preTack != null && preTack.theoreticalWeight != null && preTack.theoreticalWeight > 0)
  748. {
  749. if (rowPointInfo.weightStatus == 0 && rowPointInfo.weight > (preTack.theoreticalWeight - 800))
  750. {
  751. weightStatus = 0;
  752. setStableWeight(true);
  753. }
  754. else
  755. {
  756. weightStatus = 1;
  757. setStableWeight(false);
  758. }
  759. }
  760. else
  761. {
  762. if (rowPointInfo.weightStatus == 0)
  763. {
  764. weightStatus = 0;
  765. setStableWeight(true);
  766. }
  767. else
  768. {
  769. weightStatus = 1;
  770. setStableWeight(false);
  771. }
  772. }
  773. }
  774. else
  775. {
  776. weightStatus = 2;
  777. setStableWeight(false);
  778. }
  779. }
  780. catch (Exception ex)
  781. {
  782. l.WriteLog(19, sPointName + ":" + ex.Message);
  783. throw ex;
  784. }
  785. }
  786. /// <summary>
  787. /// 自动保存方法
  788. /// </summary>
  789. /// <returns></returns>
  790. private bool aotuSaveDB()
  791. {
  792. try
  793. {
  794. if (string.IsNullOrEmpty(tbPredictionNo.Text) && !"00033".Equals(sPointNo))
  795. {
  796. queryScale(); //自动保存前,若预报为空,进行预报查询
  797. }
  798. if (flagSaved)
  799. {
  800. setMsgInfo(tbMsg, "已经保存,不允许重复保存!", "");
  801. return false;
  802. }
  803. bool saveSuccessful = saveDB();
  804. if (!saveSuccessful)
  805. {
  806. //保存失败不再自动计量;2021年10月20日保存失败也继续计量,避免出现更新导致的服务端异常!
  807. //ckAutoSave.Checked = false;
  808. }
  809. queryScale(); //自动保存成功,进行预报查询
  810. queryActual(); //自动保存成功,进行预报查询
  811. return saveSuccessful;
  812. }
  813. catch (Exception ex)
  814. {
  815. l.WriteLog(19, sPointName + ":" + ex.Message);
  816. throw ex;
  817. }
  818. }
  819. /// <summary>
  820. /// 计量保存方法
  821. /// </summary>
  822. /// <returns></returns>
  823. private bool saveDB()
  824. {
  825. try
  826. {
  827. if (string.IsNullOrEmpty(cmbMeterGroup.Text) || string.IsNullOrEmpty(cmbMeterClass.Text))
  828. {
  829. setMsgInfo(tbMsg, "班次、班组均不允许为空!", "");
  830. return false;
  831. }
  832. MeterWorkStorageActual storageActual = new MeterWorkStorageActual();
  833. storageActual.predictionNo = tbPredictionNo.Text.Trim();
  834. storageActual.netWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim());
  835. storageActual.grossWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); //采集的重量
  836. if (storageActual.grossWeight < 100)
  837. {
  838. setMsgInfo(tbMsg, "重量小于100,不允许进行保存!", "");
  839. return false;
  840. }
  841. //减零点操作
  842. if (ckMinusZero.Checked && !string.IsNullOrEmpty(numupTareWeight.Text))
  843. {
  844. storageActual.tareWeight = Convert.ToDouble(numupTareWeight.Value);//注意减零点勾选后,直接加上零点的值就可以,此处的±计量员处理;
  845. storageActual.netWeight = storageActual.grossWeight + storageActual.tareWeight; //注意:此处是“+”;
  846. }
  847. //秤体无法回零时候的操作
  848. if (!"0".Equals(txtReferWeight.Text.Replace("kg", "").Trim()))
  849. {
  850. storageActual.referWeight = Convert.ToDouble(txtReferWeight.Text.Replace("kg", "").Trim());
  851. storageActual.netWeight = storageActual.netWeight - storageActual.referWeight; //注意:此处是“-”;
  852. }
  853. storageActual.actualWeight = storageActual.netWeight;
  854. //产量时间;班组;班次
  855. storageActual.productDate = dtpProductDate.Value;
  856. storageActual.meterGroup = cmbMeterGroup.Text;
  857. storageActual.meterClass = cmbMeterClass.Text;
  858. storageActual.baseSpotNo = sPointNo;
  859. storageActual.baseSpotName = sPointName;
  860. storageActual.createManNo = sUserId;
  861. storageActual.createManName = sUserName;
  862. RESTfulResult<string> rm = actualService.doAddHotDeliveryBelt(storageActual);
  863. if (rm.Succeed)
  864. {
  865. //actNo = rm.Data;
  866. setMsgInfo(tbMsg, "保存成功" + rm.Data.Split('#')[1] + "", "");
  867. if (storageActual.referWeight != null && storageActual.referWeight > 0)
  868. {
  869. openWarnMsgBelt(sPointName + "仪表存在底数[ " + storageActual.referWeight + " kg ],请及时处理!");//回调主界面方法
  870. }
  871. if (rm.Data.Contains("5支报警") && ultraGrid1.Rows != null && ultraGrid1.Rows.Count == 1)
  872. {
  873. setMsgMsg(tbMsg, "color", "Red");
  874. openWarnMsgBelt(sPointName + "预报仅剩余 5 支,请及时做预报!");//回调主界面方法
  875. }
  876. else if (rm.Data.Contains("10支报警") && ultraGrid1.Rows != null && ultraGrid1.Rows.Count == 1)
  877. {
  878. setMsgMsg(tbMsg, "color", "Lime");
  879. openWarnMsgBelt(sPointName + "预报仅剩余 10 支,请及时做预报!");//回调主界面方法
  880. }
  881. else
  882. {
  883. setMsgMsg(tbMsg, "color", "White");
  884. }
  885. //实绩重量与预报重量差值报警
  886. if (preTack != null && preTack.theoreticalWeight != null && preTack.theoreticalWeight > 0 && preTack.weightDiff > 0)
  887. {
  888. if (Math.Abs(preTack.theoreticalWeight.Value - storageActual.actualWeight.Value) > preTack.weightDiff.Value)
  889. {
  890. setMsgInfo(tbMsg, "保存成功" + rm.Data.Split('#')[1] + ";" +
  891. "重量偏差超过[" + preTack.weightDiff.Value + "]kg", "");
  892. openWarnMsgBelt(sPointName + "偏差超过[" + preTack.weightDiff.Value + "]kg");
  893. setMsgMsg(tbMsg, "color", "Red");
  894. }
  895. }
  896. flagSaved = true;
  897. return true;
  898. }
  899. else
  900. {
  901. setMsgInfo(tbMsg, "本次保存失败:" + rm.Data, "");
  902. setMsgMsg(tbMsg, "color", "Red");
  903. openWarnMsgBelt(sPointName + "本次保存失败,系统将会重新自动保存,请核查是否保存成功!");//回调主界面方法
  904. l.WriteLog(19, "本次保存失败:" + rm.Message);
  905. return false;
  906. }
  907. }
  908. catch (Exception ex)
  909. {
  910. l.WriteLog(19, sPointName + ":" + ex.Message);
  911. throw ex;
  912. }
  913. }
  914. /// <summary>
  915. /// 预报查询接口
  916. /// </summary>
  917. private void queryScale()
  918. {
  919. try
  920. {
  921. DataTable dtScaleTable = dataTable1.Clone();
  922. CommonPage<PreStorageScale> cp = new CommonPage<PreStorageScale>();
  923. cp.param = new PreStorageScale { valueFlag = "9", baseSpotNo = sPointNo };
  924. RESTfulResult<List<PreStorageScale>> rms = preStorageScaleService.doQueryWf(cp.param);
  925. if (rms.Succeed)
  926. {
  927. if (rms.Data != null && rms.Data.Count > 0)
  928. {
  929. //此处进行倒序排列
  930. rms.Data.Sort((a, b) => a.predictionNo.CompareTo(b.predictionNo));
  931. dtScaleTable = rms.Data.ListToDataTable<PreStorageScale>();
  932. ClsControlPack.CopyDataToDatatable(ref dtScaleTable, ref dataTable1, true);
  933. ClsControlPack.RefreshAndAutoSize(ultraGrid1);
  934. if (ckAutoSave.Checked)
  935. {
  936. //自动计量时填充最新的预报到界面;若用户选择了预报,则以用户选择的为准!
  937. DataRow[] dr = null;
  938. if (!string.IsNullOrEmpty(sClickPredictionNo))
  939. {
  940. dr = dtScaleTable.Select("predictionNo='" + sClickPredictionNo + "'");
  941. }
  942. if (dr == null || dr.Length == 0)
  943. {
  944. dr = dtScaleTable.Select("predictionNo='" + ultraGrid1.Rows[0].Cells["predictionNo"].Text.Trim() + "'");
  945. sClickPredictionNo = "";
  946. }
  947. if (dr != null && dr.Length > 0)
  948. {
  949. preTack = dr[0].CreateItem<PreStorageScale>();
  950. }
  951. }
  952. }
  953. else
  954. {
  955. dtScaleTable.Clear();
  956. preTack = null;
  957. ClsControlPack.CopyDataToDatatable(ref dtScaleTable, ref dataTable1, true);
  958. ClsControlPack.RefreshAndAutoSize(ultraGrid1);
  959. }
  960. }
  961. autoAutoFill(preTack); //查询预报后,不管有没有数据,都重新填充一次界面
  962. }
  963. catch (Exception ex)
  964. {
  965. preTack = null;
  966. l.WriteLog(19, sPointName + ":" + ex.Message);
  967. throw ex;
  968. }
  969. }
  970. /// <summary>
  971. /// 实绩查询接口
  972. /// </summary>
  973. private void queryActual()
  974. {
  975. try
  976. {
  977. DataTable dtActualTable = dataTable2.Clone();
  978. CommonPage<MeterWorkStorageActual> cp = new CommonPage<MeterWorkStorageActual>();
  979. cp.param = new MeterWorkStorageActual(); //{ valueFlag = "1", baseSpotNo = cmbPoint.Value?.ToString() };
  980. cp.param.baseSpotNo = sPointNo;
  981. cp.param.startTime = Convert.ToDateTime(DateTime.Now.AddDays(-0.5).ToString("yyyy-MM-dd") + " 00:00:00").ToString("yyyy-MM-dd HH:mm:ss");
  982. cp.param.endTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 23:59:59").ToString("yyyy-MM-dd HH:mm:ss");
  983. RESTfulResult<List<MeterWorkStorageActual>> rms = actualService.doQuery(cp.param);
  984. if (rms.Succeed)
  985. {
  986. if (rms.Data != null && rms.Data.Count > 0)
  987. {
  988. dtActualTable = rms.Data.ListToDataTable<MeterWorkStorageActual>();
  989. ClsControlPack.CopyDataToDatatable(ref dtActualTable, ref dataTable2, true);
  990. ClsControlPack.RefreshAndAutoSize(ultraGridActual);
  991. foreach (UltraGridRow ugr in ultraGridActual.Rows)
  992. {
  993. if (ugr.Cells["valueFlag"].Value.ToString() == "0")
  994. {
  995. ugr.Appearance.BackColor = Color.Red;
  996. }
  997. else
  998. {
  999. ugr.Appearance.BackColor = Color.White;
  1000. }
  1001. }
  1002. }
  1003. else
  1004. {
  1005. dtActualTable.Clear();
  1006. ClsControlPack.CopyDataToDatatable(ref dtActualTable, ref dataTable2, true);
  1007. ClsControlPack.RefreshAndAutoSize(ultraGridActual);
  1008. }
  1009. }
  1010. }
  1011. catch (Exception ex)
  1012. {
  1013. l.WriteLog(19, sPointName + ":" + ex.Message);
  1014. throw ex;
  1015. }
  1016. }
  1017. /// <summary>
  1018. /// 新增零点报警的数据
  1019. /// </summary>
  1020. private void doInsertZeroAlarm()
  1021. {
  1022. if (!PbCache.isZeroAlarm)
  1023. {
  1024. PbCache.isZeroAlarm = true;
  1025. MeterWorkZeroAlarm workZeroAlarm = new MeterWorkZeroAlarm();
  1026. workZeroAlarm.zeroWeight = PbCache.collect.weight;
  1027. workZeroAlarm.spotTypeNo = PbCache.sportInfo.spotTypeNo;
  1028. workZeroAlarm.spotTypeName = PbCache.sportInfo.spotTypeName;
  1029. workZeroAlarm.baseSpotNo = PbCache.sportInfo.baseSpotNo;
  1030. workZeroAlarm.baseSpotName = PbCache.sportInfo.baseSpotName;
  1031. workZeroAlarm.scalePointNo = PbCache.collect_no;
  1032. workZeroAlarm.createManNo = PbCache.sportInfo.baseSpotNo;
  1033. workZeroAlarm.createManName = PbCache.sportInfo.baseSpotName;
  1034. RESTfulResult<String> rms = zeroAlarmService.doInsertZeroAlarm(workZeroAlarm);
  1035. if (rms.Succeed)
  1036. {
  1037. l.WriteLog(20, "新增成功:" + workZeroAlarm.baseSpotName + ":" + workZeroAlarm.zeroWeight);
  1038. }
  1039. else
  1040. {
  1041. l.WriteLog(20, "操作失败:" + workZeroAlarm.baseSpotName + ":" + workZeroAlarm.zeroWeight + rms.Data + rms.Message);
  1042. }
  1043. }
  1044. }
  1045. /// <summary>
  1046. /// 自动填充表格的数据
  1047. /// </summary>
  1048. private void autoAutoFill(PreStorageScale preTack)
  1049. {
  1050. if (preTack == null || string.IsNullOrEmpty(preTack.predictionNo))
  1051. {
  1052. tbPredictionNo.Text = ""; //预报编号
  1053. tbSpecName.Text = ""; //规格
  1054. tbGradeName.Text = ""; //钢号
  1055. tbHeatNo.Text = "";//批次号
  1056. tbPackageNo.Text = "";//顺序号
  1057. tbBlockNum.Text = "";//总支数
  1058. }
  1059. else
  1060. {
  1061. if (string.IsNullOrEmpty(preTack.specName))
  1062. {
  1063. setMsgInfo(tbMsg, "规格为空,不允许进行计量操作,请联系预报人员进行补充!", "");
  1064. return;
  1065. }
  1066. if (string.IsNullOrEmpty(preTack.gradeName))
  1067. {
  1068. setMsgInfo(tbMsg, "钢种为空,不允许进行计量操作,请联系预报人员进行补充!", "");
  1069. return;
  1070. }
  1071. if (string.IsNullOrEmpty(preTack.heatNo))
  1072. {
  1073. setMsgInfo(tbMsg, "炉号为空,不允许进行计量操作,请联系预报人员进行补充!", "");
  1074. return;
  1075. }
  1076. if (string.IsNullOrEmpty(preTack.packageNo))
  1077. {
  1078. setMsgInfo(tbMsg, "顺序号为空,不允许进行计量操作,请联系预报人员进行补充!", "");
  1079. return;
  1080. }
  1081. if (string.IsNullOrEmpty(preTack.blockNum))
  1082. {
  1083. setMsgInfo(tbMsg, "总支数为空,不允许进行计量操作,请联系预报人员进行补充!", "");
  1084. return;
  1085. }
  1086. tbPredictionNo.Text = preTack.predictionNo; //预报编号
  1087. tbSpecName.Text = preTack.specName; //规格
  1088. tbGradeName.Text = preTack.gradeName; //钢号
  1089. tbHeatNo.Text = preTack.heatNo;//批次号
  1090. tbPackageNo.Text = preTack.packageNo;//顺序号
  1091. tbBlockNum.Text = preTack.blockNum;//总支数
  1092. if (string.IsNullOrEmpty(cmbMeterClass.Text) && string.IsNullOrEmpty(cmbMeterGroup.Text))
  1093. {
  1094. cmbMeterClass.Text = preTack.meterClass;//班次
  1095. cmbMeterGroup.Text = preTack.meterGroup; //班组
  1096. }
  1097. }
  1098. }
  1099. #endregion 计量相关方法
  1100. #region 线程中赋值的控件需使用委托
  1101. private delegate void UpdateUIEventHander(object sender, UpdateUIArgs args); //自定义事件用来从线程中更新控件的值
  1102. public class UpdateUIArgs : EventArgs
  1103. {
  1104. public string textValue { get; private set; }
  1105. public UpdateUIArgs(string textValue)
  1106. {
  1107. this.textValue = textValue;
  1108. }
  1109. }
  1110. /// <summary>
  1111. /// 更新界面的UI
  1112. /// </summary>
  1113. /// <param name="sender"></param>
  1114. /// <param name="args"></param>
  1115. private void UpdateUI_Method(object sender, UpdateUIArgs args)
  1116. {
  1117. if (sender is UltraTextEditor)
  1118. {
  1119. if (args.textValue == "" || args.textValue == null)
  1120. {
  1121. ((UltraTextEditor)sender).Text = "0 kg";
  1122. }
  1123. else
  1124. {
  1125. ((UltraTextEditor)sender).Text = args.textValue + " kg";
  1126. }
  1127. }
  1128. else if (sender is Button)
  1129. {
  1130. if (args.textValue == "red")
  1131. {
  1132. ((Button)sender).BackColor = Color.Red;
  1133. ((Button)sender).ForeColor = Color.White;
  1134. }
  1135. else if (args.textValue == "green")
  1136. {
  1137. ((Button)sender).BackColor = Color.White;
  1138. ((Button)sender).ForeColor = Color.Black;
  1139. }
  1140. else
  1141. {
  1142. ((Label)sender).Text = args.textValue;
  1143. }
  1144. }
  1145. else if (sender is PictureBox)
  1146. {
  1147. if (args.textValue == "red")
  1148. {
  1149. ((PictureBox)sender).Load(PbCache.path + "\\image\\icon\\red.gif");
  1150. }
  1151. else
  1152. {
  1153. ((PictureBox)sender).Load(PbCache.path + "\\image\\icon\\green.gif");
  1154. }
  1155. }
  1156. }
  1157. /// <summary>
  1158. /// 记录当前的颜色,在线程中窑调用下面的setControl方法前
  1159. /// 可先判断当前的颜色与显示颜色是否一致
  1160. /// 若一致则可不调用setControl,不一致再调用
  1161. /// </summary>
  1162. public bool isWeightCollectGreen = true;
  1163. public bool isWeightZeroGreen = true;
  1164. /// <summary>
  1165. /// 采集重量赋值
  1166. /// </summary>
  1167. /// <param name="bGreen"></param>
  1168. public void setWeightCollect(string weight)
  1169. {
  1170. txtWeight.Invoke(new UpdateUIEventHander(UpdateUI_Method), txtWeight, new UpdateUIArgs(weight));
  1171. }
  1172. private void tableLayoutPanelButton_Paint(object sender, PaintEventArgs e)
  1173. {
  1174. }
  1175. /// <summary>
  1176. /// 采集重量赋值
  1177. /// </summary>
  1178. /// <param name="bGreen"></param>
  1179. public void setWeightZero(string weight)
  1180. {
  1181. txtReferWeight.Invoke(new UpdateUIEventHander(UpdateUI_Method), txtReferWeight, new UpdateUIArgs(weight));
  1182. }
  1183. /// <summary>
  1184. /// 预报实体类点击事件
  1185. /// </summary>
  1186. /// <param name="sender"></param>
  1187. /// <param name="e"></param>
  1188. private void ultraGrid1_ClickCell(object sender, ClickCellEventArgs e)
  1189. {
  1190. try
  1191. {
  1192. if (ultraGrid1.ActiveRow == null)
  1193. {
  1194. return;
  1195. }
  1196. //界面赋值
  1197. UltraGridRow ugr = ultraGrid1.ActiveRow;
  1198. if (ugr != null)
  1199. {
  1200. preTack.predictionNo = ugr.Cells["predictionNo"].Text.Trim(); //预报编号
  1201. preTack.specName = ugr.Cells["specName"].Text.Trim(); //规格
  1202. preTack.gradeName = ugr.Cells["gradeName"].Text.Trim(); //钢号
  1203. preTack.batchNo = ugr.Cells["batchNo"].Text.Trim(); //批次号
  1204. preTack.heatNo = ugr.Cells["heatNo"].Text.Trim(); //炉号
  1205. preTack.packageNo = ugr.Cells["packageNo"].Text.Trim(); //顺序号
  1206. preTack.blockNum = ugr.Cells["blockNum"].Text.Trim(); //总支数
  1207. preTack.theoreticalWeight = Convert.ToDouble(string.IsNullOrEmpty(ugr.Cells["theoreticalWeight"].Text.Trim()) ? "0" : ugr.Cells["theoreticalWeight"].Text.Trim()); //理论重量
  1208. preTack.weightDiff = Convert.ToDouble(string.IsNullOrEmpty(ugr.Cells["weightDiff"].Text.Trim()) ? "0" : ugr.Cells["weightDiff"].Text.Trim()); //理论重量差值
  1209. preTack.meterGroup = ugr.Cells["meterGroup"].Text.Trim(); //班次
  1210. preTack.meterClass = ugr.Cells["meterClass"].Text.Trim(); //班次
  1211. preTack.memo = ugr.Cells["memo"].Text.Trim();//备注
  1212. sClickPredictionNo = preTack.predictionNo; //设置点击的预报编号
  1213. DialogResult dr = MessageBox.Show("是否将预报[" + preTack.predictionNo + "]设置为当前过磅预报,设置后在预报计量完成前,不会自动更换预报!", "提示", MessageBoxButtons.OKCancel);
  1214. if (dr == DialogResult.Cancel)
  1215. {
  1216. return;
  1217. }
  1218. autoAutoFill(preTack); //点击行进行自动填充
  1219. }
  1220. }
  1221. catch (Exception ex)
  1222. {
  1223. MessageBox.Show("ultraGrid1_ClickCell方法处理异常:" + ex);
  1224. }
  1225. }
  1226. /// <summary>
  1227. /// 重量稳定圆钮
  1228. /// </summary>
  1229. /// <param name="bGreen"></param>
  1230. public void setStableWeight(bool bGreen)
  1231. {
  1232. string sValue = bGreen ? "green" : "red";
  1233. picStableWeight.Invoke(new UpdateUIEventHander(UpdateUI_Method), picStableWeight, new UpdateUIArgs(sValue));
  1234. isWeightCollectGreen = bGreen;
  1235. }
  1236. /// <summary>
  1237. /// 零点报警圆钮
  1238. /// </summary>
  1239. /// <param name="bGreen"></param>
  1240. public void setStableZero(bool bGreen)
  1241. {
  1242. string sValue = bGreen ? "green" : "red";
  1243. picStableZero.Invoke(new UpdateUIEventHander(UpdateUI_Method), picStableZero, new UpdateUIArgs(sValue));
  1244. isWeightZeroGreen = bGreen;
  1245. }
  1246. /// <summary>
  1247. /// 控件值设置
  1248. /// </summary>
  1249. /// <param name="control"></param>
  1250. /// <param name="ResultMessage"></param>
  1251. /// <param name="sType"></param>
  1252. public void setMsgInfo(Control control, string ResultMessage, string sType)
  1253. {
  1254. setMsgMsg(control, ResultMessage, sType);
  1255. }
  1256. /// <summary>
  1257. /// 如果ResultMessage为true或者false,则sType 为0的时候readonly 1为enable 2为visable 3为check
  1258. /// </summary>
  1259. /// <param name="control"></param>
  1260. /// <param name="ResultMessage"></param>
  1261. /// <param name="sType"></param>
  1262. private void setMsgMsg(Control control, string ResultMessage, string sType)
  1263. {
  1264. if (control.InvokeRequired)
  1265. {
  1266. Action<Control, string, string> action = new Action<Control, string, string>(setMsgInfo);
  1267. Invoke(action, new object[] { control, ResultMessage, sType });
  1268. }
  1269. else
  1270. {
  1271. if (ResultMessage == "true" || ResultMessage == "false")
  1272. {
  1273. switch (sType)
  1274. {
  1275. case "1":
  1276. control.Enabled = ResultMessage == "true" ? true : false;
  1277. ; break;
  1278. case "2":
  1279. control.Visible = ResultMessage == "true" ? true : false;
  1280. ; break;
  1281. case "3":
  1282. ((CheckBox)control).Checked = ResultMessage == "true" ? true : false;
  1283. break;
  1284. default: break;
  1285. }
  1286. }
  1287. else if (ResultMessage == "color")
  1288. {
  1289. switch (sType)
  1290. {
  1291. case "Red":
  1292. control.BackColor = Color.Red;
  1293. ; break;
  1294. case "Lime":
  1295. control.BackColor = Color.Lime;
  1296. ; break;
  1297. case "White":
  1298. control.BackColor = Color.White;
  1299. ; break;
  1300. default: break;
  1301. }
  1302. }
  1303. else
  1304. {
  1305. control.Text = ResultMessage == null ? "" : ResultMessage;
  1306. l.WriteLog(8, sPointName + ":" + tbMsg.Text);
  1307. }
  1308. }
  1309. }
  1310. #endregion 线程中赋值的控件需使用委托
  1311. }
  1312. }