|
|
@@ -42,6 +42,8 @@ namespace CarLocalMeter
|
|
|
RESTfulResult<List<PreTrackScale>> rmScaleListCarTimer = new RESTfulResult<List<PreTrackScale>>();
|
|
|
private MeterWorkCarActualFirstService workCarActualFirstService = new MeterWorkCarActualFirstService(); //一次计量数据
|
|
|
RESTfulResult<List<MeterWorkCarActualFirst>> RESTfulResultOutTimer = new RESTfulResult<List<MeterWorkCarActualFirst>>();
|
|
|
+ MeterBaseRfidInfoService rfidServer = new MeterBaseRfidInfoService();
|
|
|
+
|
|
|
PlcCls plc = new PlcCls();
|
|
|
|
|
|
/// <summary>
|
|
|
@@ -54,6 +56,11 @@ namespace CarLocalMeter
|
|
|
/// </summary>
|
|
|
ImageOption imgControl = new ImageOption();
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 重量采集类
|
|
|
+ /// </summary>
|
|
|
+ MoxaCls mx = new MoxaCls();
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// 语音播放
|
|
|
/// </summary>
|
|
|
@@ -86,6 +93,8 @@ namespace CarLocalMeter
|
|
|
|
|
|
private void frmMain_Load(object sender, EventArgs e)
|
|
|
{
|
|
|
+ CacleCls.updateRfidInfoTime = DateTime.Now;
|
|
|
+
|
|
|
btnSave.Enabled = false;
|
|
|
if (!string.IsNullOrEmpty(AppConfigCache.ledIp))
|
|
|
{
|
|
|
@@ -141,16 +150,18 @@ namespace CarLocalMeter
|
|
|
ce.RealPlay(pb, i);
|
|
|
}
|
|
|
|
|
|
- rfid.Start();
|
|
|
+ mx.start();
|
|
|
|
|
|
+ TaskPing();
|
|
|
/*
|
|
|
+ rfid.Start();
|
|
|
TaskMain();
|
|
|
- TaskPing();
|
|
|
+
|
|
|
TaskDbUpload();
|
|
|
imgControl.Start();
|
|
|
plc.Start();
|
|
|
- //*/
|
|
|
carCls.Login(AppConfigCache.voiceCarNoIp, AppConfigCache.voiceCarNoPort, AppConfigCache.voiceCarNoUid, AppConfigCache.voiceCarNoPwd);
|
|
|
+ //*/
|
|
|
//carCls2.Login(AppConfigCache.voiceCarNoIp2, AppConfigCache.voiceCarNoPort2, AppConfigCache.voiceCarNoUid2, AppConfigCache.voiceCarNoPwd2, false);
|
|
|
}
|
|
|
|
|
|
@@ -410,6 +421,8 @@ namespace CarLocalMeter
|
|
|
}, _cts.Token);
|
|
|
}
|
|
|
|
|
|
+ string dbFile = Path.Combine(AppConfigCache.path, "data/rfidDb.data");
|
|
|
+
|
|
|
/// <summary>
|
|
|
/// ping服务器
|
|
|
/// </summary>
|
|
|
@@ -417,20 +430,97 @@ namespace CarLocalMeter
|
|
|
{
|
|
|
_cts2 = new CancellationTokenSource();
|
|
|
Task.Run(() => {
|
|
|
- try
|
|
|
+ while (!_cts2.IsCancellationRequested)
|
|
|
{
|
|
|
- Ping pingSend = new Ping();
|
|
|
- PingReply reply = pingSend.Send(AppConfigCache.ServiceIp, 1000);
|
|
|
- if (reply.Status == IPStatus.Success)
|
|
|
- CacleCls.serverFlag = true;
|
|
|
- else
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ finally
|
|
|
+ {
|
|
|
+ if (CacleCls.serverFlag)
|
|
|
+ {
|
|
|
+ if (CacleCls.weight < 500 && DateTime.Now > CacleCls.updateRfidInfoTime)
|
|
|
+ {
|
|
|
+ CacleCls.updateRfidInfoTime.Value.AddHours(1); //每隔一小时更新一次rfid数据
|
|
|
+
|
|
|
+ Dictionary<string, string> rfidInfo = new Dictionary<string, string>();
|
|
|
+ RESTfulResult<List<MeterBaseRfidInfo>> rfids = rfidServer.doQueryRfid(new MeterBaseRfidInfo { valueFlag = "0" });
|
|
|
+ if (rfids.Succeed)
|
|
|
+ {
|
|
|
+ if (rfids.Data != null && rfids.Data.Count > 0)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ foreach (MeterBaseRfidInfo rfid in rfids.Data)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ sb.AppendLine($"{rfid.rfidCode},{rfid.carNo}");
|
|
|
+ rfidInfo.Add(rfid.rfidCode, rfid.carNo);
|
|
|
+ }
|
|
|
+ catch { }
|
|
|
+ }
|
|
|
+ try
|
|
|
+ {
|
|
|
+ //如果目标文件存在则覆盖,不存在则创建
|
|
|
+ File.WriteAllText(dbFile, sb.ToString());
|
|
|
+ }
|
|
|
+ catch(Exception ex)
|
|
|
+ {
|
|
|
+ lg.WriteLog(LogType.SystemLog, "写入rfid数据到本地失败:" + ex.Message);
|
|
|
+ }
|
|
|
+ CacleCls.rifdInfo = rfidInfo;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ lg.WriteLog(LogType.serverLog, $"获取RFID信息失败:{rfids.Message}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (CacleCls.rifdInfo == null || CacleCls.rifdInfo.Count == 0)
|
|
|
+ {
|
|
|
+ //读取本地rfid数据文件
|
|
|
+ try
|
|
|
+ {
|
|
|
+ if (File.Exists(dbFile))
|
|
|
+ {
|
|
|
+ Dictionary<string, string> rfidInfo = new Dictionary<string, string>();
|
|
|
+ string[] strs = File.ReadAllLines(dbFile);
|
|
|
+ foreach (string str in strs)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ string[] strInfo = str.Split(',');
|
|
|
+ if (strInfo.Length == 2)
|
|
|
+ {
|
|
|
+ rfidInfo.Add(strInfo[0], strInfo[1]);
|
|
|
+ }
|
|
|
+ } catch { }
|
|
|
+ }
|
|
|
+ CacleCls.rifdInfo = rfidInfo;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ catch (Exception ex)
|
|
|
+ {
|
|
|
+ lg.WriteLog(LogType.WriteDbLog, "写入信息失败:" + ex.Message);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Thread.Sleep(500);
|
|
|
}
|
|
|
- catch (Exception)
|
|
|
- {
|
|
|
- CacleCls.serverFlag = false;
|
|
|
- }
|
|
|
- Thread.Sleep(500);
|
|
|
}, _cts2.Token);
|
|
|
}
|
|
|
|
|
|
@@ -444,77 +534,81 @@ namespace CarLocalMeter
|
|
|
{
|
|
|
Dictionary<string, string> dic = new Dictionary<string, string>();
|
|
|
_dbCts = new CancellationTokenSource();
|
|
|
- Task.Run(() => {
|
|
|
- try
|
|
|
+ Task.Run(() =>
|
|
|
+ {
|
|
|
+ while (!_cts2.IsCancellationRequested)
|
|
|
{
|
|
|
- if (CacleCls.weight < 500 && CacleCls.serverFlag)
|
|
|
+ try
|
|
|
{
|
|
|
- dic.Clear();
|
|
|
- //检索本地实时库中结净数据。(若本地数据结净后,一次数据得删除,而结净数据中会保留一次数据的编号、重量、计量时间、计量点信息)
|
|
|
- //若本地存在结净数据未进行上传的,则进行数据上传并得到返回的结果:老一次计量编号|一次计量编号,老二次计量编号|新二次计量编号
|
|
|
- //得到结果后构造成Dictionary然后进行图片操作,修改图片名称及位置
|
|
|
- bool bReadFlag = false;
|
|
|
- string strRtMsgInfo = "";
|
|
|
- List<MeterWorkCarActualFirst> lm = FileOption.ReadDb(ref bReadFlag, ref strRtMsgInfo);
|
|
|
- if (bReadFlag)
|
|
|
+ if (CacleCls.weight < 500 && CacleCls.serverFlag)
|
|
|
{
|
|
|
- //进行结净
|
|
|
- RESTfulResult<List<DjPbModel>> rmRst = workCarActualFirstService.doDbUpload(lm);
|
|
|
- if (rmRst.Succeed)
|
|
|
+ dic.Clear();
|
|
|
+ //检索本地实时库中结净数据。(若本地数据结净后,一次数据得删除,而结净数据中会保留一次数据的编号、重量、计量时间、计量点信息)
|
|
|
+ //若本地存在结净数据未进行上传的,则进行数据上传并得到返回的结果:老一次计量编号|一次计量编号,老二次计量编号|新二次计量编号
|
|
|
+ //得到结果后构造成Dictionary然后进行图片操作,修改图片名称及位置
|
|
|
+ bool bReadFlag = false;
|
|
|
+ string strRtMsgInfo = "";
|
|
|
+ List<MeterWorkCarActualFirst> lm = FileOption.ReadDb(ref bReadFlag, ref strRtMsgInfo);
|
|
|
+ if (bReadFlag)
|
|
|
{
|
|
|
- if (rmRst.Data.Count == lm.Count)
|
|
|
+ //进行结净
|
|
|
+ RESTfulResult<List<DjPbModel>> rmRst = workCarActualFirstService.doDbUpload(lm);
|
|
|
+ if (rmRst.Succeed)
|
|
|
{
|
|
|
- //直接重写文件
|
|
|
- FileOption.clearFile();
|
|
|
- //然后对图片进行压缩及修改名称处理
|
|
|
- foreach (DjPbModel dm in rmRst.Data)
|
|
|
+ if (rmRst.Data.Count == lm.Count)
|
|
|
{
|
|
|
- dic.Add(dm.key, dm.value);
|
|
|
+ //直接重写文件
|
|
|
+ FileOption.clearFile();
|
|
|
+ //然后对图片进行压缩及修改名称处理
|
|
|
+ foreach (DjPbModel dm in rmRst.Data)
|
|
|
+ {
|
|
|
+ dic.Add(dm.key, dm.value);
|
|
|
+ }
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //清理下文件
|
|
|
- FileOption.clearFile();
|
|
|
- //重写下未成功的数据
|
|
|
- foreach (MeterWorkCarActualFirst first in lm)
|
|
|
+ else
|
|
|
{
|
|
|
- DjPbModel pm = rmRst.Data.Where(s => s.key == first.actualFirstNo).FirstOrDefault();
|
|
|
- if (pm == null || string.IsNullOrEmpty(pm.key) || string.IsNullOrEmpty(pm.value))
|
|
|
+ //清理下文件
|
|
|
+ FileOption.clearFile();
|
|
|
+ //重写下未成功的数据
|
|
|
+ foreach (MeterWorkCarActualFirst first in lm)
|
|
|
{
|
|
|
- //Thread.Sleep(100);
|
|
|
- bool flag = FileOption.WriterDb(new ActualFirstModel { actualFirstNo = first.actualFirstNo, baseSpotNo = first.baseSpotNo, baseSpotName = first.baseSpotName, carNo = first.carNo, createTime = first.createTime, meterWeight = first.meterWeight }, out string msgInfo);
|
|
|
- if (!flag)
|
|
|
+ DjPbModel pm = rmRst.Data.Where(s => s.key == first.actualFirstNo).FirstOrDefault();
|
|
|
+ if (pm == null || string.IsNullOrEmpty(pm.key) || string.IsNullOrEmpty(pm.value))
|
|
|
{
|
|
|
- lg.WriteLog(LogType.serverLog, $"重写失败:{msgInfo},数据:actualFirstNo{first.actualFirstNo},baseSpotNo:{first.baseSpotNo},baseSpotName:{first.baseSpotName},carNo:{first.carNo},createTime:{first.createTime},meterWeight:{first.meterWeight}");
|
|
|
+ //Thread.Sleep(100);
|
|
|
+ bool flag = FileOption.WriterDb(new ActualFirstModel { actualFirstNo = first.actualFirstNo, baseSpotNo = first.baseSpotNo, baseSpotName = first.baseSpotName, carNo = first.carNo, createTime = first.createTime, meterWeight = first.meterWeight }, out string msgInfo);
|
|
|
+ if (!flag)
|
|
|
+ {
|
|
|
+ lg.WriteLog(LogType.serverLog, $"重写失败:{msgInfo},数据:actualFirstNo{first.actualFirstNo},baseSpotNo:{first.baseSpotNo},baseSpotName:{first.baseSpotName},carNo:{first.carNo},createTime:{first.createTime},meterWeight:{first.meterWeight}");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ dic.Add(pm.key, pm.value);
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- dic.Add(pm.key, pm.value);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- if (dic.Count > 0) imgControl.ZipFiles(dic);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //计量失败,播报失败,然后写led屏幕及日志
|
|
|
- led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
|
|
|
- txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
|
|
|
- lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
|
|
|
- CacleCls.isLock = false;
|
|
|
- return;
|
|
|
+ if (dic.Count > 0) imgControl.ZipFiles(dic);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //计量失败,播报失败,然后写led屏幕及日志
|
|
|
+ led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
|
|
|
+ txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
|
|
|
+ lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
|
|
|
+ CacleCls.isLock = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ catch (Exception)
|
|
|
+ {
|
|
|
+ CacleCls.serverFlag = false;
|
|
|
+ }
|
|
|
+ Thread.Sleep(1000);
|
|
|
}
|
|
|
- catch (Exception)
|
|
|
- {
|
|
|
- CacleCls.serverFlag = false;
|
|
|
- }
|
|
|
- Thread.Sleep(1000);
|
|
|
}, _dbCts.Token);
|
|
|
}
|
|
|
|
|
|
@@ -671,6 +765,7 @@ namespace CarLocalMeter
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
//一次计量
|
|
|
if (CacleCls.firstDb == null)
|
|
|
{
|
|
|
@@ -690,6 +785,22 @@ namespace CarLocalMeter
|
|
|
dataSource = "1",
|
|
|
checkFlag = "1"
|
|
|
});
|
|
|
+
|
|
|
+ if (rmRst.Succeed)
|
|
|
+ {
|
|
|
+ isMeasureSuccess = true;
|
|
|
+ CacleCls.actualNo = rmRst.Data?.actualFirstNo;
|
|
|
+ CacleCls.tempNo = strGuid;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //计量失败,播报失败,然后写led屏幕及日志
|
|
|
+ led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
|
|
|
+ txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
|
|
|
+ lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
|
|
|
+ CacleCls.isLock = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
else //结净操作
|
|
|
{
|
|
|
@@ -708,24 +819,22 @@ namespace CarLocalMeter
|
|
|
dataSource = "1",
|
|
|
checkFlag = "1"
|
|
|
});
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
|
|
|
- if (rmRst.Succeed)
|
|
|
- {
|
|
|
- isMeasureSuccess = true;
|
|
|
- CacleCls.actualNo = rmRst.Data?.actualFirstNo;
|
|
|
- CacleCls.tempNo = strGuid;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //计量失败,播报失败,然后写led屏幕及日志
|
|
|
- led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
|
|
|
- txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
|
|
|
- lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
|
|
|
- CacleCls.isLock = false;
|
|
|
- return;
|
|
|
+ if (rmRst.Succeed)
|
|
|
+ {
|
|
|
+ isMeasureSuccess = true;
|
|
|
+ CacleCls.actualNo = rmRst.Data;
|
|
|
+ CacleCls.tempNo = strGuid;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //计量失败,播报失败,然后写led屏幕及日志
|
|
|
+ led_controler.setStaticLineMsg(AppConfigCache.ledIp, "计量失败,请联系管理员");
|
|
|
+ txtMsgInfo.Text = "计量失败:" + rmRst.ResultMessage;
|
|
|
+ lg.WriteLog(LogType.serverLog, rmRst.ResultMessage);
|
|
|
+ CacleCls.isLock = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
@@ -795,6 +904,8 @@ namespace CarLocalMeter
|
|
|
|
|
|
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
|
|
|
{
|
|
|
+
|
|
|
+ try { mx.ClosingCollect(); } catch { }
|
|
|
try { rfid.ClosingCollect(); } catch { }
|
|
|
try { if (bVoice) ce.StopTalk(); } catch { }
|
|
|
|