using com.hnshituo.core.webapp.vo; using Common; using Infragistics.Win; using Infragistics.Win.UltraWinEditors; using Infragistics.Win.UltraWinGrid; using System; using System.Collections.Generic; using System.Data; using System.Drawing; using System.Net; using System.Net.Sockets; using System.Windows.Forms; namespace MeterModuleLibrary { public partial class ucHotDeliveryBelt : UserControl { public delegate void EventOpenWarnMsgBelt(string e); public ucHotDeliveryBelt() { InitializeComponent(); } public CoreAppUser appUser = null;//登陆信息 private Log l = Log.GetInstance();//日志信息 private ComBaseInfoService comBaseInfoService = new ComBaseInfoService(); //基础数服务 private PreStorageScaleService preStorageScaleService = new PreStorageScaleService();//热送预报数据服务 private MeterWorkStorageActualService actualService = new MeterWorkStorageActualService();//热送实绩数据服务 private MeterWorkStorageSingleWgtService singleWgtService = new MeterWorkStorageSingleWgtService(); //热送单只重量(标准重量)服务 private MeterWorkStorageCalibrationService calibrationService = new MeterWorkStorageCalibrationService(); //热送校秤服务 private meterworkzeroalarmservice zeroAlarmService = new meterworkzeroalarmservice();//零点报警服务 private PreStorageScale preTack = new PreStorageScale(); //预报实体类 public DbHelper db = null; //服务端请求 public event EventOpenWarnMsgBelt openWarnMsgBelt; //打开预警弹窗 private bool bCheckWarn = false;//是否已经进行未勾选自动计量提醒; /// /// 计量点 /// public string sPointNo = "", sPointName = ""; /// /// 登录人及登陆IP信息;用户选择的预报编号 /// public string sUserId = "", sUserName = "", sIpAddress = "", sClickPredictionNo = ""; /// /// 新增的计量表监控数据 /// public MeterBaseScalePoint drOldData = null, rowPointInfo = null; /// /// 初始载入一次数据 /// private bool flagLoad = true; /// /// 数据保存标志;fasle=未保存,可以进行保存操作,true=已保存,不允许重复保存! /// private bool flagSaved = false; /// /// 重量稳定状态:0稳定,1不稳定,2空磅 /// private int weightStatus = 2; /// /// 重量稳定次数:累计值 /// private int weightStableTimes = 0, weightStableTimesZero = 0; /// /// 重量稳定次数:超过此值则稳定 /// private int weightStableSchedule = 6, weightStableScheduleZero = 6; /// /// 上一次重量:记录上一次重量,用于判断重量是否稳定 /// private double weightLast = 0, weightLastZero = 0; /// /// 重量稳定的差值:默认3kg /// private double weightDiff = 3, weightDiffZero = 3; /// /// 是否为测试标志位 /// private bool testFlage = false; /// ///完整终端地址:MOXAIP+MOXAPORT /// private IPEndPoint serverFullAddr; /// /// 连接套接字 /// private Socket sock; /// /// load事件 /// /// /// private void ucHotDeliveryBelt_Load(object sender, EventArgs e) { //ClsControlPack.UseFixedHeader(this.ultraGridActual, "UNCK"); //ClsControlPack.UseFixedHeader(this.ultraGridActual, "heatNo"); //ClsControlPack.UseFixedHeader(this.ultraGridActual, "packageNo"); #region 基础数据载入 //热送磅班组信息载入cmbMeterGroupUp RESTfulResult> rrComMeterGroop = comBaseInfoService.doQueryBaseList(new ComBaseInfo { validFlag = "1", pBaseCode = "001044" }); if (rrComMeterGroop.Succeed && rrComMeterGroop.Data != null && rrComMeterGroop.Data.Count > 0) { ClsControlPack.SetUltraComboDataSource(cmbMeterGroup, rrComMeterGroop.Data.ListToDataTable(), "baseCode", "baseName"); } else { MessageBox.Show("热送磅班组信息载入失败!"); return; } //热送磅班次信息载入cmbMeterClassUp RESTfulResult> rrComMeterClass = comBaseInfoService.doQueryBaseList(new ComBaseInfo { validFlag = "1", pBaseCode = "001043" }); if (rrComMeterClass.Succeed && rrComMeterClass.Data != null && rrComMeterClass.Data.Count > 0) { ClsControlPack.SetUltraComboDataSource(cmbMeterClass, rrComMeterClass.Data.ListToDataTable(), "baseCode", "baseName"); } else { MessageBox.Show("热送磅班次信息载入失败!"); return; } //预报表转换 ValueList vlistFlag1 = new ValueList(); vlistFlag1.ValueListItems.Add("0", "无效"); vlistFlag1.ValueListItems.Add("1", "未使用"); vlistFlag1.ValueListItems.Add("2", "使用中"); vlistFlag1.ValueListItems.Add("3", "已完成"); this.ultraGrid1.DisplayLayout.Bands[0].Columns["valueFlag"].ValueList = vlistFlag1; //ClsControlPack.SetUltraGridRowFilter(ref ultraGrid1, true); //实绩表转换 ValueList vlistFlag3 = new ValueList(); vlistFlag3.ValueListItems.Add("0", "无效"); vlistFlag3.ValueListItems.Add("1", "有效"); this.ultraGridActual.DisplayLayout.Bands[0].Columns["valueFlag"].ValueList = vlistFlag3; //ClsControlPack.SetUltraGridRowFilter(ref ultraGrid2, true); #endregion 基础数据载入 //班次、班组初始化 if (appUser != null && !string.IsNullOrEmpty(appUser.userClass) && !string.IsNullOrEmpty(appUser.userGroup)) { cmbMeterClass.Text = appUser.userClass; cmbMeterGroup.Text = appUser.userGroup; } } #region timer1事件 /// /// 时间控制器,每秒钟执行一次 /// 1、用于重量采集 /// 2、用于称重保存 /// /// /// private void timer1_Tick(object sender, EventArgs e) { try { if (!string.IsNullOrEmpty(sPointName) && !string.IsNullOrEmpty(sPointNo) && flagLoad) { lbPointName.Text = sPointName; lbCreateManName.Text = sUserName; queryScale(); //界面第一次加载 queryActual(); //界面第一次加载 flagLoad = false; flagSaved = false; } if (rowPointInfo != null && rowPointInfo.weight != null) { if (testFlage) { rowPointInfo.weight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); //rowPointInfo.weightZero = Convert.ToDouble(txtReferWeight.Text.Replace("kg", "").Trim()); } //重量小于100,将保存标志位置为未保存; if (rowPointInfo.weight < 100) { flagSaved = false; bCheckWarn = false; } //界面重量显示赋值 setWeightCollect(rowPointInfo.weight.ToString()); //判断是否为零点;并在界面显示 judgmentWeightZero(); //判稳逻辑;2021年10月20日切换为自动采集;0.5s一次,6次波动范围在3以内为稳定; //judgmentWeightStatus(); //平台的重量判稳逻辑; judgmentWeightStatusPT(); //自动保存; if (ckAutoSave.Checked) { //普棒热送00032:重量小于4000kg不进行自动保存操作 double collectWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); if ("00032".Equals(sPointNo) && collectWeight < 4000) { return; } if (!flagSaved && weightStatus == 0) { aotuSaveDB();//自动保存 } } //未勾选自动计量报警 if (!bCheckWarn && !ckAutoSave.Checked && !flagSaved && weightStatus == 0 && !"00033".Equals(sPointNo)) { bCheckWarn = true; setMsgMsg(tbMsg, "color", "Red"); openWarnMsgBelt(sPointName + "重量已稳定,未勾选【自动计量】!");//回调主界面方法 } } else { setMsgInfo(tbMsg, "未采集到重量数据!请联系系统维护人员处理!", ""); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } #endregion timer1事件 #region 按钮点击事件汇总 /// /// 预报查询按钮点击事件 /// /// /// private void btQueryInfo_Click(object sender, EventArgs e) { queryScale(); //预报查询按钮查询预报 queryActual();//预报查询按钮查询实绩 } /// /// 保存按钮,将预报数据转换为实绩数据 /// /// /// private void btSave_Click(object sender, EventArgs e) { saveDB(); //手动保存 queryScale(); //手动保存后,查预报; queryActual();//手动保存后,查实绩; } /// /// 是否自动计量 /// /// /// private void ckAutoSave_CheckedChanged(object sender, EventArgs e) { queryScale();//自动计量时复选框变化时,重新查询预报; } /// /// 手动完成 /// /// /// private void btnComplete_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(tbPredictionNo.Text.Trim())) { setMsgInfo(tbMsg, "预报编号为空不允许进行[手动完成]!", ""); return; } DialogResult dr = MessageBox.Show("是否将预报[" + tbPredictionNo.Text.Trim() + "]手动完成!", "提示", MessageBoxButtons.OKCancel); if (dr == DialogResult.Cancel) { return; } List lt = new List(); PreStorageScale preStorageUpdate = new PreStorageScale(); preStorageUpdate.predictionNo = tbPredictionNo.Text.Trim(); preStorageUpdate.updateManNo = sUserId; preStorageUpdate.updateManName = sUserName; preStorageUpdate.valueFlag = "3"; //作废;状态(0=无效,1=有效,2=使用中,3=已完成) preStorageUpdate.memo = preTack.memo + ";" + DateTime.Now + "司磅工:" + sUserName + "进行[手动完成]操作!"; lt.Add(preStorageUpdate); RESTfulResult rms = preStorageScaleService.doUpdateWf(lt); if (rms.Succeed) { setMsgInfo(tbMsg, "预报编号[" + preStorageUpdate.predictionNo + "]手动完成,操作成功!", ""); queryScale(); //手动完成后,自动查询一次 } else { setMsgInfo(tbMsg, "预报编号[" + preStorageUpdate.predictionNo + "]手动完成,操作失败!", ""); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 调整班次 /// /// /// private void btnUpdateClass_Click(object sender, EventArgs e) { try { int iCount = 0; ultraGridActual.UpdateData(); frmHotDeliveryUpdateClass frmPrint = new frmHotDeliveryUpdateClass(); foreach (UltraGridRow ugr in ultraGridActual.Rows) { if (ugr.Cells["UNCK"].Value.ToString().Trim().ToUpper() == "TRUE") { frmPrint.productDateShow = ugr.Cells["productDate"].Text.Trim().Substring(0, 10); frmPrint.meterClassShow = ugr.Cells["meterClass"].Text.Trim(); frmPrint.meterGroupShow = ugr.Cells["meterGroup"].Text.Trim(); iCount++; } } if (iCount == 0) { setMsgInfo(tbMsg, "请至少勾选一条数据后再进行更新操作!", ""); frmPrint.Dispose(); return; } frmPrint.StartPosition = FormStartPosition.CenterScreen; frmPrint.callBack += updateActualClass; frmPrint.ShowDialog(); frmPrint.Dispose(); } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 跳转到计量实绩维护界面 /// /// /// private void btEditWeightResult_Click(object sender, EventArgs e) { //ST_MainForm mainForm = new ST_MainForm(new CoreAppUser { userid = sUserId, username = sUserName }); //ToolStripMenuItem mItem = new System.Windows.Forms.ToolStripMenuItem(); //mItem.Text = "热送磅实绩维护"; ////mItem.Tag = new ArrayList() { "页面名称", "页面所属的dll", "具体的页面frm" }; //mItem.Tag = new ArrayList() { "热送磅实绩维护", "StorageMeterSystem", "frmHotDeliveryActual" }; ////mItem.Click += new EventHandler(mainForm.SysMenuItem_Click); //mainForm.SysMenuItem_Click(mItem, e); } /// /// 选择实绩进行校秤功能 /// /// /// private void btCalibrationScale_Click(object sender, EventArgs e) { try { string msg = ""; List lt = new List(); ultraGridActual.UpdateData(); foreach (UltraGridRow ugr in ultraGridActual.Rows) { if (ugr.Cells["UNCK"].Value.ToString().Trim().ToUpper() == "TRUE") { MeterWorkStorageActual preStorageUpdate = new MeterWorkStorageActual(); preStorageUpdate.actualNo = ugr.Cells["actualNo"].Text.Trim(); preStorageUpdate.predictionNo = ugr.Cells["predictionNo"].Text.Trim(); preStorageUpdate.actualWeight = Convert.ToDouble(ugr.Cells["actualWeight"].Text.Trim()); lt.Add(preStorageUpdate); } } if (lt == null || lt.Count != 1) { setMsgInfo(tbMsg, "校秤需要勾选1条计量实绩数据!", ""); return; } MeterWorkStorageCalibration calibration = new MeterWorkStorageCalibration(); RESTfulResult> rms = singleWgtService.doQuery( new MeterWorkStorageSingleWgt { baseSpotNo = sPointNo, valueFlag = "1", weightType = "2" }); if (rms.Succeed && rms.Data != null && rms.Data.Count > 0) { MeterWorkStorageSingleWgt singleWgt = rms.Data[0]; calibration.actualWeight = lt[0].actualWeight; //校秤的实际重量(取选中的那条实绩的数据) calibration.wgtNo = lt[0].actualNo; //选中的计量实绩的值,用于更新实绩表的数据 calibration.valueFlag = "1"; //状态(1 = 有效,0 = 无效) calibration.createManNo = sUserId; calibration.createManName = sUserName; calibration.baseSpotNo = sPointNo; //校秤计量点的编号 calibration.baseSpotName = sPointName;//校秤计量点的名称 calibration.baseSpotName = sPointName;//校秤计量点的名称 calibration.meterClass = cmbMeterClass.Text; calibration.meterGroup = cmbMeterGroup.Text; calibration.gradeNo = singleWgt.gradeNo; calibration.gradeName = singleWgt.gradeName; calibration.specNo = singleWgt.specNo; calibration.specName = singleWgt.specName; calibration.theoryWeight = singleWgt.singleWeight; //理论重量 calibration.theoryWeightDiff = singleWgt.weightDiff; //理论重量差值 calibration.actualWeightDiff = calibration.actualWeight - calibration.theoryWeight;//校秤重量与理论重量实际差值 //实际的偏差值大于理论偏差值 if (Math.Abs(Convert.ToDouble(calibration.actualWeightDiff)) > Math.Abs(Convert.ToDouble(calibration.theoryWeightDiff))) { calibration.qualifiedFlag = "0";//状态(1=合格,0=不合格) msg = "校秤未通过!"; } else { calibration.qualifiedFlag = "1"; msg = "校秤通过!"; } RESTfulResult rm = calibrationService.doAddWf(calibration); if (rm.Succeed) { setMsgInfo(tbMsg, "校秤数据保存成功,计量重量:" + calibration.actualWeight + "kg;标准件理论重量:" + calibration.theoryWeight + "kg;重量差值:" + calibration.actualWeightDiff + "kg;" + msg, ""); l.WriteLog(8, tbMsg.Text); } else { setMsgInfo(tbMsg, "保存失败:" + rm.Data, ""); } queryActual(); //较秤成功,进行实绩查询 } else { setMsgInfo(tbMsg, "未查询到秤点的校秤标准重量,不允许进行校秤!", ""); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 按界面重量进行数据采集 /// /// /// private void btCalibrationSD_Click(object sender, EventArgs e) { try { string msg = ""; MeterWorkStorageCalibration calibration = new MeterWorkStorageCalibration(); RESTfulResult> rms = singleWgtService.doQuery( new MeterWorkStorageSingleWgt { baseSpotNo = sPointNo, valueFlag = "1", weightType = "2" }); if (rms.Succeed && rms.Data != null && rms.Data.Count > 0) { MeterWorkStorageSingleWgt singleWgt = rms.Data[0]; calibration.valueFlag = "1"; //状态(1 = 有效,0 = 无效) calibration.createManNo = sUserId; calibration.createManName = sUserName; calibration.baseSpotNo = sPointNo; //校秤计量点的编号 calibration.baseSpotName = sPointName;//校秤计量点的名称 calibration.baseSpotName = sPointName;//校秤计量点的名称 calibration.meterClass = cmbMeterClass.Text; calibration.meterGroup = cmbMeterGroup.Text; calibration.gradeNo = singleWgt.gradeNo; calibration.gradeName = singleWgt.gradeName; calibration.specNo = singleWgt.specNo; calibration.specName = singleWgt.specName; calibration.theoryWeight = singleWgt.singleWeight; //理论重量 calibration.theoryWeightDiff = singleWgt.weightDiff; //理论重量差值 calibration.actualWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); //校秤的实际重量 calibration.actualWeightDiff = calibration.actualWeight - calibration.theoryWeight;//校秤重量与理论重量实际差值 //实际的偏差值大于理论偏差值 if (Math.Abs(Convert.ToDouble(calibration.actualWeightDiff)) > Math.Abs(Convert.ToDouble(calibration.theoryWeightDiff))) { calibration.qualifiedFlag = "0";//状态(1=合格,0=不合格) msg = "校秤未通过!"; } else { calibration.qualifiedFlag = "1"; msg = "校秤通过!"; } RESTfulResult rm = calibrationService.doAddManual(calibration); if (rm.Succeed) { setMsgInfo(tbMsg, "校秤数据保存成功,计量重量:" + calibration.actualWeight + "kg;标准件理论重量:" + calibration.theoryWeight + "kg;重量差值:" + calibration.actualWeightDiff + "kg;" + msg, ""); l.WriteLog(8, tbMsg.Text); } else { setMsgInfo(tbMsg, "保存失败:" + rm.Data, ""); } } else { setMsgInfo(tbMsg, "未查询到秤点的校秤标准重量,不允许进行校秤!", ""); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 预报编号点击按钮;用于做测试重量置为600kg /// /// /// private void label15_Click(object sender, EventArgs e) { if (sIpAddress.Contains("192.168.137.1") && rowPointInfo != null) { testFlage = true; setWeightCollect("4000"); //测试重量 setWeightZero("7");//测试重量 rowPointInfo.weight = 700; rowPointInfo.weightZero = 7; } } /// /// 预报编号点击按钮;用于做测试重量置为600kg /// /// /// private void label12_Click(object sender, EventArgs e) { if (sIpAddress.Contains("192.168") && rowPointInfo != null) { testFlage = true; setWeightCollect("0"); //测试重量 setWeightZero("0");//测试重量 rowPointInfo.weight = 0; } } /// /// 远程清零 /// /// /// private void btClear_Click(object sender, EventArgs e) { if (string.IsNullOrEmpty(rowPointInfo.moxaIp) || string.IsNullOrEmpty(rowPointInfo.moxaPort)) { MessageBox.Show("[" + sPointName + "]远程清零的IP及端口未配置,请联系系统管理员!"); return; } try { //设置IP和端口 serverFullAddr = new IPEndPoint(IPAddress.Parse(rowPointInfo.moxaIp), int.Parse(rowPointInfo.moxaPort)); sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定本地主机地址和端口号 sock.Connect(serverFullAddr); //发送固定的指令“Z“到串口服务器 byte[] byteSend = System.Text.Encoding.Default.GetBytes("Z"); byte[] message = new byte[1024]; string mess = ""; int bytes = 0; try { //发送数据 sock.Send(byteSend); //接收数据 //bytes = sock.Receive(message); //mess = mess + Encoding.Default.GetString(message, 0, bytes);//编码(当接收的字节大于1024的时候应当循环接收,仪表传回的不需要) //do //{ // bytes = newSocket.Receive(message, message.Length, 0); // mess = mess + Encoding.ASCII.GetString(message, 0, bytes); //} // while (bytes > 0); l.WriteLog(19, rowPointInfo.moxaIp + ":" + rowPointInfo.moxaPort + ":远程清零成功!"); MessageBox.Show("远程清零下发指令下发成功,请关注重量变化!"); } catch (Exception ex) { sock.Close(); MessageBox.Show("远程清零下发指令出现错误,请联系管理员" + ex); } sock.Close(); } catch (Exception ee) { MessageBox.Show("连接服务器失败[" + rowPointInfo.moxaIp + ":" + rowPointInfo.moxaPort + "]。。。请联系系统管理员" + ee); } } #endregion 按钮点击事件汇总 #region 计量相关方法 /// /// 更新实绩表生产时间、班次、班组 /// private void updateActualClass(DateTime productDate, string meterClass, string meterGroup) { try { int iCount = 0; List lt = new List(); ultraGridActual.UpdateData(); foreach (UltraGridRow ugr in ultraGridActual.Rows) { if (ugr.Cells["UNCK"].Value.ToString().Trim().ToUpper() == "TRUE") { MeterWorkStorageActual preStorageUpdate = new MeterWorkStorageActual(); preStorageUpdate.actualNo = ugr.Cells["actualNo"].Text.Trim(); preStorageUpdate.predictionNo = ugr.Cells["predictionNo"].Text.Trim(); preStorageUpdate.updateManNo = sUserId; preStorageUpdate.updateManName = sUserName; preStorageUpdate.productDate = productDate; preStorageUpdate.meterClass = meterClass; preStorageUpdate.meterGroup = meterGroup; lt.Add(preStorageUpdate); iCount++; } } if (lt == null || lt.Count == 0) { setMsgInfo(tbMsg, "请至少勾选一条数据后再进行更新操作!", ""); return; } RESTfulResult rms = actualService.doUpdateClient(lt); if (rms.Succeed) { setMsgInfo(tbMsg, "共完成" + iCount + "条数据的修改!", ""); queryActual(); //更新班次信息后查询 } else { setMsgInfo(tbMsg, "修改班次信息失败!", ""); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 自动判断重量是否为零点 /// private void judgmentWeightZero() { try { //零点清零;只有在重量回零的时候,才进行零点清零; if (rowPointInfo.weightZero == 0) { PbCache.isZeroAlarm = false; weightLast = 0; setWeightZero(rowPointInfo.weightZero.ToString()); setStableZero(true);//默认为红色,此处需要变成绿色; return; } //零点判断及赋值;注意此处不清空零点的值 if (rowPointInfo.weight < 200 && rowPointInfo.weightZero < 200) { if (weightDiffZero > Math.Abs(rowPointInfo.weightZero.Value - weightLastZero)) { weightStableTimesZero++; } else { weightStableTimesZero = 0; } //零点值赋值 if (weightStableTimesZero > weightStableScheduleZero) { setWeightZero(rowPointInfo.weightZero.ToString()); setStableZero(false);//true=绿色,false=红色;控件默认为红色,若从绿色变过来则此处需要变成红色; doInsertZeroAlarm();//新增零点报警的数据 l.WriteLog(20, sPointName + ":零点报警,报警值:" + rowPointInfo.weightZero); } } else { PbCache.isZeroAlarm = true; weightStableTimesZero = 0; } weightLastZero = rowPointInfo.weightZero.Value; } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 自动判断重量是否稳定 /// private void judgmentWeightStatus() { try { if (rowPointInfo.weight > 100) { if (weightDiff > Math.Abs(rowPointInfo.weight.Value - weightLast)) { weightStableTimes++; } else { weightStableTimes = 0; } if (weightStableTimes > weightStableSchedule) { //理论重量不为0的时候,采集重量需要大于理论重量-800kg才能作为稳定值 if (preTack != null && preTack.theoreticalWeight != null && preTack.theoreticalWeight > 0) { if (rowPointInfo.weight > (preTack.theoreticalWeight - 800)) { weightStatus = 0; setStableWeight(true); } else { weightStatus = 1; setStableWeight(false); } } else { weightStatus = 0; setStableWeight(true); } } else { weightStatus = 1; setStableWeight(false); } weightLast = rowPointInfo.weight.Value; } else { weightStatus = 2; weightStableTimes = 0; setStableWeight(false); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 界面重量赋值,平台判断是否稳定 /// 重量稳定状态:0稳定,1不稳定,2空磅 /// private void judgmentWeightStatusPT() { try { if (rowPointInfo.weight > 100) { if (preTack != null && preTack.theoreticalWeight != null && preTack.theoreticalWeight > 0) { if (rowPointInfo.weightStatus == 0 && rowPointInfo.weight > (preTack.theoreticalWeight - 800)) { weightStatus = 0; setStableWeight(true); } else { weightStatus = 1; setStableWeight(false); } } else { if (rowPointInfo.weightStatus == 0) { weightStatus = 0; setStableWeight(true); } else { weightStatus = 1; setStableWeight(false); } } } else { weightStatus = 2; setStableWeight(false); } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 自动保存方法 /// /// private bool aotuSaveDB() { try { if (string.IsNullOrEmpty(tbPredictionNo.Text) && !"00033".Equals(sPointNo)) { queryScale(); //自动保存前,若预报为空,进行预报查询 } if (flagSaved) { setMsgInfo(tbMsg, "已经保存,不允许重复保存!", ""); return false; } bool saveSuccessful = saveDB(); if (!saveSuccessful) { //保存失败不再自动计量;2021年10月20日保存失败也继续计量,避免出现更新导致的服务端异常! //ckAutoSave.Checked = false; } queryScale(); //自动保存成功,进行预报查询 queryActual(); //自动保存成功,进行预报查询 return saveSuccessful; } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 计量保存方法 /// /// private bool saveDB() { try { if (string.IsNullOrEmpty(cmbMeterGroup.Text) || string.IsNullOrEmpty(cmbMeterClass.Text)) { setMsgInfo(tbMsg, "班次、班组均不允许为空!", ""); return false; } MeterWorkStorageActual storageActual = new MeterWorkStorageActual(); storageActual.predictionNo = tbPredictionNo.Text.Trim(); storageActual.netWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); storageActual.grossWeight = Convert.ToDouble(txtWeight.Text.Replace("kg", "").Trim()); //采集的重量 if (storageActual.grossWeight < 100) { setMsgInfo(tbMsg, "重量小于100,不允许进行保存!", ""); return false; } //减零点操作 if (ckMinusZero.Checked && !string.IsNullOrEmpty(numupTareWeight.Text)) { storageActual.tareWeight = Convert.ToDouble(numupTareWeight.Value);//注意减零点勾选后,直接加上零点的值就可以,此处的±计量员处理; storageActual.netWeight = storageActual.grossWeight + storageActual.tareWeight; //注意:此处是“+”; } //秤体无法回零时候的操作 if (!"0".Equals(txtReferWeight.Text.Replace("kg", "").Trim())) { storageActual.referWeight = Convert.ToDouble(txtReferWeight.Text.Replace("kg", "").Trim()); storageActual.netWeight = storageActual.netWeight - storageActual.referWeight; //注意:此处是“-”; } storageActual.actualWeight = storageActual.netWeight; //产量时间;班组;班次 storageActual.productDate = dtpProductDate.Value; storageActual.meterGroup = cmbMeterGroup.Text; storageActual.meterClass = cmbMeterClass.Text; storageActual.baseSpotNo = sPointNo; storageActual.baseSpotName = sPointName; storageActual.createManNo = sUserId; storageActual.createManName = sUserName; RESTfulResult rm = actualService.doAddHotDeliveryBelt(storageActual); if (rm.Succeed) { //actNo = rm.Data; setMsgInfo(tbMsg, "保存成功" + rm.Data.Split('#')[1] + "", ""); if (storageActual.referWeight != null && storageActual.referWeight > 0) { openWarnMsgBelt(sPointName + "仪表存在底数[ " + storageActual.referWeight + " kg ],请及时处理!");//回调主界面方法 } if (rm.Data.Contains("5支报警") && ultraGrid1.Rows != null && ultraGrid1.Rows.Count == 1) { setMsgMsg(tbMsg, "color", "Red"); openWarnMsgBelt(sPointName + "预报仅剩余 5 支,请及时做预报!");//回调主界面方法 } else if (rm.Data.Contains("10支报警") && ultraGrid1.Rows != null && ultraGrid1.Rows.Count == 1) { setMsgMsg(tbMsg, "color", "Lime"); openWarnMsgBelt(sPointName + "预报仅剩余 10 支,请及时做预报!");//回调主界面方法 } else { setMsgMsg(tbMsg, "color", "White"); } //实绩重量与预报重量差值报警 if (preTack != null && preTack.theoreticalWeight != null && preTack.theoreticalWeight > 0 && preTack.weightDiff > 0) { if (Math.Abs(preTack.theoreticalWeight.Value - storageActual.actualWeight.Value) > preTack.weightDiff.Value) { setMsgInfo(tbMsg, "保存成功" + rm.Data.Split('#')[1] + ";" + "重量偏差超过[" + preTack.weightDiff.Value + "]kg", ""); openWarnMsgBelt(sPointName + "偏差超过[" + preTack.weightDiff.Value + "]kg"); setMsgMsg(tbMsg, "color", "Red"); } } flagSaved = true; return true; } else { setMsgInfo(tbMsg, "本次保存失败:" + rm.Data, ""); setMsgMsg(tbMsg, "color", "Red"); openWarnMsgBelt(sPointName + "本次保存失败,系统将会重新自动保存,请核查是否保存成功!");//回调主界面方法 l.WriteLog(19, "本次保存失败:" + rm.Message); return false; } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 预报查询接口 /// private void queryScale() { try { DataTable dtScaleTable = dataTable1.Clone(); CommonPage cp = new CommonPage(); cp.param = new PreStorageScale { valueFlag = "9", baseSpotNo = sPointNo }; RESTfulResult> rms = preStorageScaleService.doQueryWf(cp.param); if (rms.Succeed) { if (rms.Data != null && rms.Data.Count > 0) { //此处进行倒序排列 rms.Data.Sort((a, b) => a.predictionNo.CompareTo(b.predictionNo)); dtScaleTable = rms.Data.ListToDataTable(); ClsControlPack.CopyDataToDatatable(ref dtScaleTable, ref dataTable1, true); ClsControlPack.RefreshAndAutoSize(ultraGrid1); if (ckAutoSave.Checked) { //自动计量时填充最新的预报到界面;若用户选择了预报,则以用户选择的为准! DataRow[] dr = null; if (!string.IsNullOrEmpty(sClickPredictionNo)) { dr = dtScaleTable.Select("predictionNo='" + sClickPredictionNo + "'"); } if (dr == null || dr.Length == 0) { dr = dtScaleTable.Select("predictionNo='" + ultraGrid1.Rows[0].Cells["predictionNo"].Text.Trim() + "'"); sClickPredictionNo = ""; } if (dr != null && dr.Length > 0) { preTack = dr[0].CreateItem(); } } } else { dtScaleTable.Clear(); preTack = null; ClsControlPack.CopyDataToDatatable(ref dtScaleTable, ref dataTable1, true); ClsControlPack.RefreshAndAutoSize(ultraGrid1); } } autoAutoFill(preTack); //查询预报后,不管有没有数据,都重新填充一次界面 } catch (Exception ex) { preTack = null; l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 实绩查询接口 /// private void queryActual() { try { DataTable dtActualTable = dataTable2.Clone(); CommonPage cp = new CommonPage(); cp.param = new MeterWorkStorageActual(); //{ valueFlag = "1", baseSpotNo = cmbPoint.Value?.ToString() }; cp.param.baseSpotNo = sPointNo; cp.param.startTime = Convert.ToDateTime(DateTime.Now.AddDays(-0.5).ToString("yyyy-MM-dd") + " 00:00:00").ToString("yyyy-MM-dd HH:mm:ss"); cp.param.endTime = Convert.ToDateTime(DateTime.Now.ToString("yyyy-MM-dd") + " 23:59:59").ToString("yyyy-MM-dd HH:mm:ss"); RESTfulResult> rms = actualService.doQuery(cp.param); if (rms.Succeed) { if (rms.Data != null && rms.Data.Count > 0) { dtActualTable = rms.Data.ListToDataTable(); ClsControlPack.CopyDataToDatatable(ref dtActualTable, ref dataTable2, true); ClsControlPack.RefreshAndAutoSize(ultraGridActual); foreach (UltraGridRow ugr in ultraGridActual.Rows) { if (ugr.Cells["valueFlag"].Value.ToString() == "0") { ugr.Appearance.BackColor = Color.Red; } else { ugr.Appearance.BackColor = Color.White; } } } else { dtActualTable.Clear(); ClsControlPack.CopyDataToDatatable(ref dtActualTable, ref dataTable2, true); ClsControlPack.RefreshAndAutoSize(ultraGridActual); } } } catch (Exception ex) { l.WriteLog(19, sPointName + ":" + ex.Message); throw ex; } } /// /// 新增零点报警的数据 /// private void doInsertZeroAlarm() { if (!PbCache.isZeroAlarm) { PbCache.isZeroAlarm = true; MeterWorkZeroAlarm workZeroAlarm = new MeterWorkZeroAlarm(); workZeroAlarm.zeroWeight = PbCache.collect.weight; workZeroAlarm.spotTypeNo = PbCache.sportInfo.spotTypeNo; workZeroAlarm.spotTypeName = PbCache.sportInfo.spotTypeName; workZeroAlarm.baseSpotNo = PbCache.sportInfo.baseSpotNo; workZeroAlarm.baseSpotName = PbCache.sportInfo.baseSpotName; workZeroAlarm.scalePointNo = PbCache.collect_no; workZeroAlarm.createManNo = PbCache.sportInfo.baseSpotNo; workZeroAlarm.createManName = PbCache.sportInfo.baseSpotName; RESTfulResult rms = zeroAlarmService.doInsertZeroAlarm(workZeroAlarm); if (rms.Succeed) { l.WriteLog(20, "新增成功:" + workZeroAlarm.baseSpotName + ":" + workZeroAlarm.zeroWeight); } else { l.WriteLog(20, "操作失败:" + workZeroAlarm.baseSpotName + ":" + workZeroAlarm.zeroWeight + rms.Data + rms.Message); } } } /// /// 自动填充表格的数据 /// private void autoAutoFill(PreStorageScale preTack) { if (preTack == null || string.IsNullOrEmpty(preTack.predictionNo)) { tbPredictionNo.Text = ""; //预报编号 tbSpecName.Text = ""; //规格 tbGradeName.Text = ""; //钢号 tbHeatNo.Text = "";//批次号 tbPackageNo.Text = "";//顺序号 tbBlockNum.Text = "";//总支数 } else { if (string.IsNullOrEmpty(preTack.specName)) { setMsgInfo(tbMsg, "规格为空,不允许进行计量操作,请联系预报人员进行补充!", ""); return; } if (string.IsNullOrEmpty(preTack.gradeName)) { setMsgInfo(tbMsg, "钢种为空,不允许进行计量操作,请联系预报人员进行补充!", ""); return; } if (string.IsNullOrEmpty(preTack.heatNo)) { setMsgInfo(tbMsg, "炉号为空,不允许进行计量操作,请联系预报人员进行补充!", ""); return; } if (string.IsNullOrEmpty(preTack.packageNo)) { setMsgInfo(tbMsg, "顺序号为空,不允许进行计量操作,请联系预报人员进行补充!", ""); return; } if (string.IsNullOrEmpty(preTack.blockNum)) { setMsgInfo(tbMsg, "总支数为空,不允许进行计量操作,请联系预报人员进行补充!", ""); return; } tbPredictionNo.Text = preTack.predictionNo; //预报编号 tbSpecName.Text = preTack.specName; //规格 tbGradeName.Text = preTack.gradeName; //钢号 tbHeatNo.Text = preTack.heatNo;//批次号 tbPackageNo.Text = preTack.packageNo;//顺序号 tbBlockNum.Text = preTack.blockNum;//总支数 if (string.IsNullOrEmpty(cmbMeterClass.Text) && string.IsNullOrEmpty(cmbMeterGroup.Text)) { cmbMeterClass.Text = preTack.meterClass;//班次 cmbMeterGroup.Text = preTack.meterGroup; //班组 } } } #endregion 计量相关方法 #region 线程中赋值的控件需使用委托 private delegate void UpdateUIEventHander(object sender, UpdateUIArgs args); //自定义事件用来从线程中更新控件的值 public class UpdateUIArgs : EventArgs { public string textValue { get; private set; } public UpdateUIArgs(string textValue) { this.textValue = textValue; } } /// /// 更新界面的UI /// /// /// private void UpdateUI_Method(object sender, UpdateUIArgs args) { if (sender is UltraTextEditor) { if (args.textValue == "" || args.textValue == null) { ((UltraTextEditor)sender).Text = "0 kg"; } else { ((UltraTextEditor)sender).Text = args.textValue + " kg"; } } else if (sender is Button) { if (args.textValue == "red") { ((Button)sender).BackColor = Color.Red; ((Button)sender).ForeColor = Color.White; } else if (args.textValue == "green") { ((Button)sender).BackColor = Color.White; ((Button)sender).ForeColor = Color.Black; } else { ((Label)sender).Text = args.textValue; } } else if (sender is PictureBox) { if (args.textValue == "red") { ((PictureBox)sender).Load(PbCache.path + "\\image\\icon\\red.gif"); } else { ((PictureBox)sender).Load(PbCache.path + "\\image\\icon\\green.gif"); } } } /// /// 记录当前的颜色,在线程中窑调用下面的setControl方法前 /// 可先判断当前的颜色与显示颜色是否一致 /// 若一致则可不调用setControl,不一致再调用 /// public bool isWeightCollectGreen = true; public bool isWeightZeroGreen = true; /// /// 采集重量赋值 /// /// public void setWeightCollect(string weight) { txtWeight.Invoke(new UpdateUIEventHander(UpdateUI_Method), txtWeight, new UpdateUIArgs(weight)); } private void tableLayoutPanelButton_Paint(object sender, PaintEventArgs e) { } /// /// 采集重量赋值 /// /// public void setWeightZero(string weight) { txtReferWeight.Invoke(new UpdateUIEventHander(UpdateUI_Method), txtReferWeight, new UpdateUIArgs(weight)); } /// /// 预报实体类点击事件 /// /// /// private void ultraGrid1_ClickCell(object sender, ClickCellEventArgs e) { try { if (ultraGrid1.ActiveRow == null) { return; } //界面赋值 UltraGridRow ugr = ultraGrid1.ActiveRow; if (ugr != null) { preTack.predictionNo = ugr.Cells["predictionNo"].Text.Trim(); //预报编号 preTack.specName = ugr.Cells["specName"].Text.Trim(); //规格 preTack.gradeName = ugr.Cells["gradeName"].Text.Trim(); //钢号 preTack.batchNo = ugr.Cells["batchNo"].Text.Trim(); //批次号 preTack.heatNo = ugr.Cells["heatNo"].Text.Trim(); //炉号 preTack.packageNo = ugr.Cells["packageNo"].Text.Trim(); //顺序号 preTack.blockNum = ugr.Cells["blockNum"].Text.Trim(); //总支数 preTack.theoreticalWeight = Convert.ToDouble(string.IsNullOrEmpty(ugr.Cells["theoreticalWeight"].Text.Trim()) ? "0" : ugr.Cells["theoreticalWeight"].Text.Trim()); //理论重量 preTack.weightDiff = Convert.ToDouble(string.IsNullOrEmpty(ugr.Cells["weightDiff"].Text.Trim()) ? "0" : ugr.Cells["weightDiff"].Text.Trim()); //理论重量差值 preTack.meterGroup = ugr.Cells["meterGroup"].Text.Trim(); //班次 preTack.meterClass = ugr.Cells["meterClass"].Text.Trim(); //班次 preTack.memo = ugr.Cells["memo"].Text.Trim();//备注 sClickPredictionNo = preTack.predictionNo; //设置点击的预报编号 DialogResult dr = MessageBox.Show("是否将预报[" + preTack.predictionNo + "]设置为当前过磅预报,设置后在预报计量完成前,不会自动更换预报!", "提示", MessageBoxButtons.OKCancel); if (dr == DialogResult.Cancel) { return; } autoAutoFill(preTack); //点击行进行自动填充 } } catch (Exception ex) { MessageBox.Show("ultraGrid1_ClickCell方法处理异常:" + ex); } } /// /// 重量稳定圆钮 /// /// public void setStableWeight(bool bGreen) { string sValue = bGreen ? "green" : "red"; picStableWeight.Invoke(new UpdateUIEventHander(UpdateUI_Method), picStableWeight, new UpdateUIArgs(sValue)); isWeightCollectGreen = bGreen; } /// /// 零点报警圆钮 /// /// public void setStableZero(bool bGreen) { string sValue = bGreen ? "green" : "red"; picStableZero.Invoke(new UpdateUIEventHander(UpdateUI_Method), picStableZero, new UpdateUIArgs(sValue)); isWeightZeroGreen = bGreen; } /// /// 控件值设置 /// /// /// /// public void setMsgInfo(Control control, string ResultMessage, string sType) { setMsgMsg(control, ResultMessage, sType); } /// /// 如果ResultMessage为true或者false,则sType 为0的时候readonly 1为enable 2为visable 3为check /// /// /// /// private void setMsgMsg(Control control, string ResultMessage, string sType) { if (control.InvokeRequired) { Action action = new Action(setMsgInfo); Invoke(action, new object[] { control, ResultMessage, sType }); } else { if (ResultMessage == "true" || ResultMessage == "false") { switch (sType) { case "1": control.Enabled = ResultMessage == "true" ? true : false; ; break; case "2": control.Visible = ResultMessage == "true" ? true : false; ; break; case "3": ((CheckBox)control).Checked = ResultMessage == "true" ? true : false; break; default: break; } } else if (ResultMessage == "color") { switch (sType) { case "Red": control.BackColor = Color.Red; ; break; case "Lime": control.BackColor = Color.Lime; ; break; case "White": control.BackColor = Color.White; ; break; default: break; } } else { control.Text = ResultMessage == null ? "" : ResultMessage; l.WriteLog(8, sPointName + ":" + tbMsg.Text); } } } #endregion 线程中赋值的控件需使用委托 } }