using CirculateTool.Attribute; using WcsMain.Business.Convey.HistoryDataHandler; using WcsMain.DataBase.Dao; using WcsMain.DataBase.TableEntity; using WcsMain.DataService; using WcsMain.Enum.General; using WcsMain.EquipOperation.Convey; namespace WcsMain.Business.CirculationTask.Convey; /// /// 箱式线读取扫码信息 /// [Circulation] public class ReadScanCode(AppRouterMethodDao routerMethodDao, ConveyOperation conveyOperation, HistoryConveyDataHander historyConveyDataHander, AppScanRecordDao scanRecordDao, DataBaseData dataBaseData) { private static List? routers; /// /// 读取扫码数据 /// /// [Circulation("读取扫码数据", 300)] public bool ReadData() { if(routers == default) { routers = routerMethodDao.Query(new AppRouterMethod() { RouterStatus = (int)TrueFalseEnum.TRUE }); return true; } List tasks = []; foreach(AppRouterMethod router in routers) { tasks.Add(Task.Factory.StartNew(() => { (var readErrText, var scanOk, var code) = conveyOperation.ReadScanInfo(router.Area); if (!string.IsNullOrEmpty(readErrText)) { ConsoleLog.Exception($"【异常】读取扫码:{router.Area} 数据异常,信息:{readErrText}"); Thread.Sleep(5000); return; // 不读了,估计网断了 } if (scanOk != (short)TrueFalseEnum.TRUE) { return; } if (!CheckCode(code, router.Area ?? "")) { return; } string clearErrText = conveyOperation.ClearScanStatus(router.Area); if (!string.IsNullOrEmpty(clearErrText)) { ConsoleLog.Exception($"【异常】扫码:{router.Area} 清理读码信号异常,信息:{clearErrText}"); } else { ConsoleLog.Success($"扫码:{router.Area} 清理读码信号成功,点位:{router.Area}"); } historyConveyDataHander.GetData("-", code, router.Area ?? ""); scanRecordDao.Insert(new AppScanRecord() { RecordId = dataBaseData.GetNewUUID2(), ScanId = router.Area, Code = code, ScanTime = DateTime.Now }); })); } Task.WaitAll([.. tasks]); return true; } Dictionary? codeData; DateTime firstTime = DateTime.Now; private bool CheckCode(string codeIn, string area) { string code = codeIn + area; if(codeData == default) codeData = []; if ((DateTime.Now - firstTime).TotalSeconds > 5.5) { codeData.Clear(); } firstTime = DateTime.Now; if (!codeData.TryGetValue(code, out DateTime value)) { value = DateTime.Now; codeData.Add(code, value); return true; } DateTime dateTime = value; TimeSpan timeSpan = DateTime.Now - dateTime; if(timeSpan.TotalSeconds > 5) { codeData[code] = dateTime; return true; } return false; } }