using com.hnshituo.core.webapp.vo;
using MeterPlugInLibrary;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CarLocalMeter
{
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
}
///
/// 服务端委托获取
///
private PreTrackScaleService PreTrackScaleService = new PreTrackScaleService();
RESTfulResult> rmScaleListCarTimer = new RESTfulResult>();
private MeterWorkCarActualFirstService workCarActualFirstService = new MeterWorkCarActualFirstService(); //一次计量数据
RESTfulResult> RESTfulResultOutTimer = new RESTfulResult>();
PlcCls plc = new PlcCls();
///
/// redis操作类
///
RedisOption redis = new RedisOption();
///
/// 图片操作类
///
ImageOption imgControl = new ImageOption();
///
/// 语音播放
///
VoicePlay vicPlayClass = new VoicePlay();
///
/// 摄像头车号识别
///
CarNoCls carCls = new CarNoCls();
///
/// rfid车号识别
///
RfIdCarNo rfid = new RfIdCarNo();
bool bVoice = false;
CamerEs ce = new CamerEs(AppConfigCache.voicePlayIp, $"{AppConfigCache.voicePlayPort}", AppConfigCache.voicePlayUid, AppConfigCache.voicePlayPwd);
List voPlay = new List();
int iPic = 0;
private void frmMain_Load(object sender, EventArgs e)
{
plImgShow.Visible = false;
lbPointName.Text = AppConfigCache.pointName;
foreach (string str in AppConfigCache.channelVis.Split(','))
{
voPlay.Add(Convert.ToInt32(str));
}
ce.Connection();
foreach(int i in voPlay)
{
PictureBox pb = new PictureBox();
pb.Dock = DockStyle.Top;
pb.DoubleClick += new EventHandler(PictureBoxDoubleClick);
pb.Height = AppConfigCache.channelVisHeight;
pb.Name = $"pb{i}";
panel1.Controls.Add(pb);
ce.RealPlay(pb, i);
}
rfid.Start();
/*
TaskMain();
TaskPing();
TaskDbUpload();
imgControl.Start();
plc.Start();
carCls.Login()
//*/
}
CancellationTokenSource _cts,_cts2,_dbCts;
bool getPreInfo = false, getFirst = false;
string strOldCarNo = "";
///
/// 主定时任务
///
private void TaskMain()
{
_cts = new CancellationTokenSource();
Task.Run(() => {
while (!_cts.IsCancellationRequested)
{
if (CacleCls.weight > 500)
{
CacleCls.isClear = false;
//是否能连上远程服务器,这里只是服务器,不是服务器上的服务端
pbLineOn.Load(CacleCls.serverFlag ? (AppConfigCache.path + "\\image\\icon\\green.gif") : (AppConfigCache.path + "\\image\\icon\\red.gif"));
if (!CacleCls.isLock)
{
if (!string.IsNullOrEmpty(CacleCls.lockCarNo))
{
//查询一次计量数据
if (!getFirst)
{
RESTfulResultOutTimer = workCarActualFirstService.doQueryWf(new MeterWorkCarActualFirst { valueFlag = "1", carNo = CacleCls.lockCarNo });
if (RESTfulResultOutTimer.Succeed)
{
if (RESTfulResultOutTimer.Data != null && RESTfulResultOutTimer.Data.Count > 0)
{
CacleCls.firstDb = RESTfulResultOutTimer.Data[0];
if (CacleCls.firstDb.predictionNo != null && !CacleCls.firstDb.predictionNo.Contains("_"))
{
this.panel3.Invoke(new Action(() => {
txtMATTER_NAME.Text = CacleCls.firstDb.matterName;
txtFORWARDING_UNIT_NAME.Text = CacleCls.firstDb.forwardingUnitName;
txtRECEIVING_UINT_NAME.Text = CacleCls.firstDb.receivingUintName;
txtMETER_TYPE.Text = CacleCls.firstDb.meterTypeName;
}));
}
}
}
getFirst = true;
}
//根据网络状态及车号以及是否存在一次计量数据,查询一次预报信息,然后将getPreInfo改为true
if (!getPreInfo && CacleCls.serverFlag)
{
if (CacleCls.firstDb == null || string.IsNullOrEmpty(CacleCls.firstDb?.predictionNo))
{
//如果没有一次信息或者一次信息里面没带预报信息,则查询一次预报信息
rmScaleListCarTimer = PreTrackScaleService.doQueryByFlag(new PreTrackScale { lineDesc = "1", carNo = CacleCls.lockCarNo });
if (rmScaleListCarTimer.Succeed)
{
if (rmScaleListCarTimer.Data != null && rmScaleListCarTimer.Data.Count == 1)
{
CacleCls.preTrackScale = rmScaleListCarTimer.Data[0];
this.panel3.Invoke(new Action(() => {
txtMATTER_NAME.Text = CacleCls.preTrackScale.matterName;
txtFORWARDING_UNIT_NAME.Text = CacleCls.preTrackScale.forwardingUnitName;
txtRECEIVING_UINT_NAME.Text = CacleCls.preTrackScale.receivingUintName;
txtMETER_TYPE.Text = CacleCls.preTrackScale.meterTypeName;
}));
}
}
}
getPreInfo = true;
}
}
}
}
else
{
getFirst = false;
getPreInfo = false;
}
this.panel3.Invoke(new Action(() => {
if (CacleCls.weight < 500)
{
if (!CacleCls.isClear)
{
CacleCls.Clear(); //清理一次数据
cbCarNo.Text = "";
cbCarNo.SelectedIndex = -1;
txtCarNo.Text = "";
txtMATTER_NAME.Text = "";
txtFORWARDING_UNIT_NAME.Text = "";
txtRECEIVING_UINT_NAME.Text = "";
txtMETER_TYPE.Text = "";
cbCarNo.Enabled = true;
txtCarNo.Enabled = true;
}
}
if (!CacleCls.isLock)
{
ucWeightT1.setWgt(Math.Round((double)CacleCls.weight / 1000, 2)); //2021年5月10日界面显示单位,调整为T
ucWeightT1.setStable(CacleCls.isWd != 1 ? true : false);
ucWeightT1.setExceed(CacleCls.weight > AppConfigCache.maxRange * 1000 ? false : true);
if (cbCarNo.Text.Trim() != "" && txtCarNo.Text.Trim() != "")
{
CacleCls.lockCarNo = cbCarNo.Text.Trim() + txtCarNo.Text.Trim();
}
else if (CacleCls.rfidCarNo != "")
{
CacleCls.lockCarNo = CacleCls.rfidCarNo;
}
else if (CacleCls.voicCarNo != "")
{
CacleCls.lockCarNo = CacleCls.voicCarNo;
}
if (CacleCls.lockCarNo != "" && cbCarNo.Text.Trim() == "" && txtCarNo.Text.Trim() == "")
{
cbCarNo.Text = CacleCls.lockCarNo.Substring(0, 1);
if (CacleCls.lockCarNo.Length > 1)
{
txtCarNo.Text = CacleCls.lockCarNo.Substring(1);
}
}
if (strOldCarNo != CacleCls.lockCarNo)
{
strOldCarNo = CacleCls.lockCarNo;
getPreInfo = false;
getFirst = false;
}
}
}));
Thread.Sleep(500);
}
}, _cts.Token);
}
///
/// ping服务器
///
private void TaskPing()
{
_cts2 = new CancellationTokenSource();
Task.Run(() => {
try
{
Ping pingSend = new Ping();
PingReply reply = pingSend.Send(AppConfigCache.ServiceIp, 1000);
if (reply.Status == IPStatus.Success)
CacleCls.serverFlag = true;
else
CacleCls.serverFlag = false;
}
catch (Exception)
{
CacleCls.serverFlag = false;
}
Thread.Sleep(500);
}, _cts2.Token);
}
///
/// 结净数据上传服务
/// 这里需等重量小于500且网络正常时触发
/// 因为假如网络正常且重量大于500的时候,会优先将当前计量的数据存储到服务器上,然后返回结果进行打印操作
/// 所以这里为了避免重复数据插入,所以需重量小于500且网络正常
///
private void TaskDbUpload()
{
Dictionary dic = new Dictionary();
_dbCts = new CancellationTokenSource();
Task.Run(() => {
try
{
if (CacleCls.weight < 500 && CacleCls.serverFlag)
{
//检索本地实时库中结净数据。(若本地数据结净后,一次数据得删除,而结净数据中会保留一次数据的编号、重量、计量时间、计量点信息)
//若本地存在结净数据未进行上传的,则进行数据上传并得到返回的结果:老一次计量编号|一次计量编号,老二次计量编号|新二次计量编号
//得到结果后构造成Dictionary然后进行图片操作,修改图片名称及位置
string str = "老一次计量编号|一次计量编号,老二次计量编号|新二次计量编号";
dic.Clear();
string[] strs = str.Split(',');
dic.Add(strs[0].Split('|')[0], strs[0].Split('|')[1]);
dic.Add(strs[1].Split('|')[0], strs[1].Split('|')[1]);
imgControl.ZipFiles(dic);
}
}
catch (Exception)
{
CacleCls.serverFlag = false;
}
Thread.Sleep(1000);
}, _dbCts.Token);
}
private void btnSave_Click(object sender, EventArgs e)
{
#region 下面是业务逻辑代码
string msgInfo = "";
if (txtCarNo.Focused)
{
return; //如果正在修改车号,就必须等光标离开后再保存,否则容易导致车号输入了一半保存了
}
if (CacleCls.serverFlag) //网络正常
{
if (CacleCls.firstDb != null)
{
//进行结净
}
else
{
//进行一次计量
}
}
else
{
//写本地文件
bool flag = FileOption.WriterDb(new ActualFirstModel { actualFirstNo = "", baseSpotNo = "", baseSpotName = "", carNo = "", createTime = DateTime.Now, meterWeight = 999 },out msgInfo);
if (flag)
{
//计量完成
}
else
{
txtMsgInfo.Text = msgInfo;
}
}
cbCarNo.Enabled = false;
txtCarNo.Enabled = false;
#endregion
/*
List lt = RedisCls.getValue>("MeterWorkMonitor");
RedisCls.remoeItemValue("test001", JsonConvert.SerializeObject(new MeterWorkMonitor { pointNo = "00002", pointName = "计量点2" },
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
}));
//*/
/*
List lt = new List()
{
new MeterWorkMonitor{ pointNo="00001",pointName="计量点1",updateTime=DateTime.Now },
new MeterWorkMonitor{ pointNo="00002",pointName="计量点2" }
};
try
{
RedisCls.setVaule>("MeterWorkMonitor", lt, DateTime.Now.AddMinutes(2));
}
catch { }
RedisCls.setItemVaule("test001", JsonConvert.SerializeObject(lt[0],
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
}),
DateTime.Now.AddSeconds(120));
RedisCls.setItemVaule("test001", JsonConvert.SerializeObject(lt[1],
new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
}), DateTime.Now.AddSeconds(60));
//*/
}
private void btnOpenVoice_Click(object sender, EventArgs e)
{
/*
if (btnOpenVoice.Text == "打开对讲")
{
VoiceOpen();
}
else
{
VoiceClose();
}
//*/
}
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
{
rfid.ClosingCollect();
if (bVoice) ce.StopTalk();
foreach (int i in voPlay)
{
ce.StopRealPlay(i);
}
plc.Stop();
_cts?.Cancel();
_cts2?.Cancel();
_dbCts?.Cancel();
carCls?.LoginOut();
imgControl.Stop();
}
///
/// 必须先打开视频,然后再打开语音
///
private void VoiceOpen()
{
try
{
if (ce.StartTalk())
{
btnOpenVoice.Text = "关闭对讲";
bVoice = true;
}
}
catch (Exception ex)
{
txtMsgInfo.Text = "打开对讲失败:" + ex.Message;
}
}
///
/// 关闭语音对讲
///
private void VoiceClose()
{
try
{
if (ce.StopTalk())
{
btnOpenVoice.Text = "打开对讲";
bVoice = false;
}
}
catch (Exception ex)
{
txtMsgInfo.Text = "关闭对讲失败:" + ex.Message;
}
}
private void btnExport_Click(object sender, EventArgs e)
{
ClsControlPack.ExportDataWithSaveDialog2(ref ultraGridFirst, DateTime.Now.ToString("yyyyMMddHHmmss"));
}
private void cbCarNo_SelectedIndexChanged(object sender, EventArgs e)
{
CacleCls.isLock = false;
}
private void txtCarNo_TextChanged(object sender, EventArgs e)
{
CacleCls.isLock = false;
}
private void PictureBoxDoubleClick(object sender, EventArgs e)
{
if (iPic != 0)
{
ce.StopRealPlay(iPic);
}
PictureBox picture = (PictureBox)sender;
iPic = Convert.ToInt32(picture.Name.Substring(picture.Name.Length - 1, 1));
plImgShow.Visible = true;
ce.RealPlay(pictureShow, iPic);
}
private void pictureShow_DoubleClick(object sender, EventArgs e)
{
plImgShow.Visible = false;
ce.StopRealPlay(iPic);
iPic = 0;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(CacleCls.voicCarNo))
{
txtMsgInfo.Text += CacleCls.voicCarNo + "\n\r";
}
CacleCls.voicCarNo = "";
if(!string.IsNullOrEmpty(CacleCls.rfidCarNo))
txtMsgInfo.Text += CacleCls.rfidCarNo + "\n\r";
//*/
}
}
}