Browse Source

截图分时诊断优化,断网后会自动上传未来得及上传的视频/图像,图像上传状态优化,每次重连会重传失败的图像

felix 1 year ago
parent
commit
9f1494088e

+ 5 - 0
FISSDK/FISIMPL/LiveVideoServiceForAndroid.cs

@@ -529,5 +529,10 @@ namespace FISIMPL
         {
             throw new NotImplementedException();
         }
+
+        public void ReUploadRestVid()
+        {
+            throw new NotImplementedException();
+        }
     }
 }

+ 28 - 0
FISSDK/FISIMPL/LiveVideoServiceForWindows.cs

@@ -590,6 +590,7 @@ namespace FISIMPL
                     if (_liveVideoV2 == null)
                     {
                         Logger.WriteLineError($"ChangeRealTimeCaptureSetting error: live videoV2 feature is null");
+                        return;
                     }
                     _liveVideoV2.ChangeRealTimeCaptureSetting(isStart);
                 }
@@ -617,6 +618,7 @@ namespace FISIMPL
                     if (_liveVideoV2 == null)
                     {
                         Logger.WriteLineError($"CaptureCurrentImage error: live videoV2 feature is null");
+                        return;
                     }
                     _liveVideoV2.CaptureCurrentImage();
                 }
@@ -644,6 +646,7 @@ namespace FISIMPL
                     if (_liveVideoV2 == null)
                     {
                         Logger.WriteLineError($"StartRecordVideo error: live videoV2 feature is null");
+                        return;
                     }
                     _liveVideoV2.StartRecordVideo();
                 }
@@ -671,6 +674,7 @@ namespace FISIMPL
                     if (_liveVideoV2 == null)
                     {
                         Logger.WriteLineError($"StopRecordVideo error: live videoV2 feature is null");
+                        return;
                     }
                     _liveVideoV2.StopRecordVideo(isTimeOut);
                 }
@@ -680,5 +684,29 @@ namespace FISIMPL
                 Logger.WriteLineError($"LiveVideoServiceForWindows StopRecordVideo Error:{ex}");
             }
         }
+
+        public void ReUploadRestVid()
+        {
+            try
+            {
+                if (FISIMPL.IsConnectWithOldServer)
+                {
+                    Logger.WriteLineError($"ReUploadRestVid error: old Server doesn't support");
+                    return;
+                }
+                else
+                {
+                    if (_liveVideoV2 == null)
+                    {
+                        Logger.WriteLineError($"ReUploadRestVid error: live videoV2 feature is null");
+                    }
+                    _liveVideoV2.ReUploadRestVid();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"LiveVideoServiceForWindows StopRecordVideo Error:{ex}");
+            }
+        }
     }
 }

+ 5 - 0
FISSDK/FISSDK/LiveVideo/ILiveVideoService.cs

@@ -94,5 +94,10 @@ namespace FISLib.LiveVideo
         /// </summary>
         /// <param name="isStart"></param>
         void ChangeRealTimeCaptureSetting(bool isStart);
+
+        /// <summary>
+        /// 重新上传未来得及上传的VID文件
+        /// </summary>
+        void ReUploadRestVid();
     }
 }

+ 5 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/lang/en-us.json

@@ -244,5 +244,9 @@
   "ConfirmDeleteSetting": "Please confirm whether you want to delete custom configuration? <br> If you select delete, the sonopost automatically restarts after the deletion is complete.",
   "Yes": "Yes",
   "No": "No",
-  "ServerNotSupport": "Current vCloud server doesn't support image capture function."
+  "ServerNotSupport": "Current vCloud server doesn't support image capture function.",
+  "Uploading": "Uploading...",
+  "Creating": "Creating...",
+  "Waiting": "Waiting...",
+  "Status": "Status"
 }

+ 5 - 1
Vinno.FIS.Sonopost/Assets/wwwroot/lang/zh-cn.json

@@ -244,5 +244,9 @@
   "ConfirmDeleteSetting": "请确认是否要删除自定义配置文件? <br> 若选择删除,删除完成后魔盒会自动重启。",
   "Yes": "是",
   "No": "否",
-  "ServerNotSupport": "当前云服务不支持图像采集功能"
+  "ServerNotSupport": "当前云服务不支持图像采集功能",
+  "Uploading": "上传中...",
+  "Creating": "创建中...",
+  "Waiting": "等待中...",
+  "Status": "状态"
 }

+ 15 - 3
Vinno.FIS.Sonopost/Assets/wwwroot/pages/dicom/faillist.html

@@ -55,7 +55,7 @@
        lay-event="reupload"
        data-content="Reupload"></a>
     {{# } }}
-    {{# if(d.Status != 0){ }}
+    {{# if(d.Status != 0 && d.Status != 7){ }}
     <a class="layui-btn layui-btn-normal layui-btn-xs"
        lay-event="delete"
        data-content="Delete"></a>
@@ -66,11 +66,14 @@
         const { $api, $t } = runtime;
         const { table, laypage, util, layer, form } = layui;
         const FailReasonMap = {
+            Create: 0,
             ConvertFail: 1,
             CreateScanDataFail: 2,
             UploadFail: 3,
             UploadFailBecauseExamIsFinished: 4,
-            Unknown: 5
+            Unknown: 5,
+            Waiting: 6,
+            Uploading: 7
         };
         let tableIns = null;
         const PageSize = 15;
@@ -135,6 +138,15 @@
                     else if (x.Status === FailReasonMap.Unknown) {
                         x.FailReason = $t("Unknown");
                     }
+                    else if (x.Status === FailReasonMap.Create) {
+                        x.FailReason = $t("Creating");
+                    }
+                    else if (x.Status === FailReasonMap.Waiting) {
+                        x.FailReason = $t("Waiting");
+                    }
+                    else if (x.Status === FailReasonMap.Uploading) {
+                        x.FailReason = $t("Uploading");
+                    }
                     x.CreateTime = util.toDateString(
                         new Date(x.CreateTime),
                         "yyyy/MM/dd HH:mm:ss"
@@ -181,7 +193,7 @@
                         },
                         {
                             field: "FailReason",
-                            title: $t("FailReason")
+                            title: $t("Status")
                             // minWidth: 160
                         },
                         {

+ 3 - 0
Vinno.FIS.Sonopost/Assets/wwwroot/pages/server/login.html

@@ -307,6 +307,9 @@
                         hospitalNameInput.val("");
                         return layer.msg.error($t("OrganizationIsMissing"));
                     } else {
+                        if (data.ServerName == data.ServerAddress + ":" + data.ServerPort) {
+                            data.ServerName = "";
+                        }
                         return layer.msg.error($t(res.Code));
                     }
                 }

+ 2 - 0
Vinno.FIS.Sonopost/Features/Dicom/DicomUploadContext.cs

@@ -180,6 +180,8 @@ namespace Vinno.FIS.Sonopost.Features.Dicom
         UploadFail,
         UploadFailBecauseExamIsFinished,
         Unknown,
+        Waiting,
+        Uploading,
         Success
     }
 

+ 5 - 0
Vinno.FIS.Sonopost/Managers/Interfaces/ILiveVideoManager.cs

@@ -59,6 +59,11 @@ namespace Vinno.FIS.Sonopost.Managers.Interfaces
         /// </summary>
         void ChangeRealTimeCaptureSetting();
 
+        /// <summary>
+        /// 重新上传之前断网未上传的Vid文件
+        /// </summary>
+        void ReUploadRestVid();
+
         /// <summary>
         /// Init
         /// </summary>

+ 5 - 0
Vinno.FIS.Sonopost/Managers/Interfaces/IRemedicalManager.cs

@@ -61,5 +61,10 @@ namespace Vinno.FIS.Sonopost.Managers.Interfaces
         /// 清理缓存
         /// </summary>
         void ClearRemedicalCache();
+
+        /// <summary>
+        /// 重传所有
+        /// </summary>
+        void ReUploadAll();
     }
 }

+ 17 - 0
Vinno.FIS.Sonopost/Managers/LiveVideoManager.cs

@@ -110,6 +110,7 @@ namespace Vinno.FIS.Sonopost.Managers
                     {
                         _fisLiveVideoService.StopRecordVideo(false);
                         _isRecording = false;
+                        _checkImageRecordEvent.Set();
                     }
                 }
                 else
@@ -153,6 +154,7 @@ namespace Vinno.FIS.Sonopost.Managers
                     {
                         _fisLiveVideoService.StopRecordVideo(false);
                         _isRecording = false;
+                        _checkImageRecordEvent.Set();
                     }
                 }
                 else
@@ -462,6 +464,21 @@ namespace Vinno.FIS.Sonopost.Managers
             }
         }
 
+        public void ReUploadRestVid()
+        {
+            try
+            {
+                if (_loginManager.DeviceStatus == DeviceStatus.Logon)
+                {
+                    _fisLiveVideoService.ReUploadRestVid();
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"LiveVideoManager ReuploadRestVids Error:{ex}");
+            }
+        }
+
         public override void DoDispose()
         {
             try

+ 4 - 1
Vinno.FIS.Sonopost/Managers/LoginManager.cs

@@ -21,6 +21,7 @@ namespace Vinno.FIS.Sonopost.Managers
         private IVersionCheckManager _versionCheckManager;
         private ILiveVideoManager _liveVideoManager;
         private IOledManager _oledManager;
+        private IRemedicalManager _remedicalManager;
         private IKeyBoardListenManager _keyBoardListenManager;
 
         public bool IsLoginWithAccountAndPassword { get; private set; }
@@ -50,6 +51,7 @@ namespace Vinno.FIS.Sonopost.Managers
             _versionCheckManager = AppManager.Instance.GetManager<IVersionCheckManager>();
             _oledManager = AppManager.Instance.GetManager<IOledManager>();
             _keyBoardListenManager = AppManager.Instance.GetManager<IKeyBoardListenManager>();
+            _remedicalManager = AppManager.Instance.GetManager<IRemedicalManager>();
         }
 
         private void OnFISDeviceStatusChanged(object sender, FISDeviceStatusInfo e)
@@ -100,8 +102,9 @@ namespace Vinno.FIS.Sonopost.Managers
                         else
                         {
                             _liveVideoManager.ChangeRealTimeCaptureSetting();
-
+                            _liveVideoManager.ReUploadRestVid();
                         }
+                        _remedicalManager.ReUploadAll();
                         _versionCheckManager.CheckVersion();
                         var organization = _connectionService.GetOrganizationName();
                         if (organization != _ultrasoundMachineInfo.Organizataion)

+ 33 - 11
Vinno.FIS.Sonopost/Managers/RemedicalManager.cs

@@ -50,6 +50,14 @@ namespace Vinno.FIS.Sonopost.Managers
                     RemoveByScanDataId(scanDataId);
                     FileHelper.DeleteFile(item.DicomPath);
                 }
+                else if (e.FISVidData.Status == FISUploadStatus.Uploading && e.ChangeType == FISVidDataChangeType.Update)
+                {
+                    DicomUploadContextOperator.Instance.UpdateStatusByScanId(scanDataId, DicomUploadStatus.Uploading);
+                }
+                else if ((e.FISVidData.Status == FISUploadStatus.Waiting || e.FISVidData.Status == FISUploadStatus.Idle) && (e.ChangeType == FISVidDataChangeType.Update || e.ChangeType == FISVidDataChangeType.Added))
+                {
+                    DicomUploadContextOperator.Instance.UpdateStatusByScanId(scanDataId, DicomUploadStatus.Waiting);
+                }
             }
             catch (Exception ex)
             {
@@ -161,15 +169,6 @@ namespace Vinno.FIS.Sonopost.Managers
             }
         }
 
-        public void UploadGeneratedVidFile(string vidFilePath)
-        {
-            if (!File.Exists(vidFilePath))
-            {
-                Logger.WriteLineError($"UploadGeneratedVidFile Error:{vidFilePath} is not exist");
-                return;
-            }
-        }
-
         public void Delete(string id)
         {
             try
@@ -214,7 +213,7 @@ namespace Vinno.FIS.Sonopost.Managers
                 var count = retryItem.Count + 1;
                 DicomUploadContextOperator.Instance.UpdateRetryCount(retryItem, count);
                 Thread.Sleep(1000);
-                DicomUploadContextOperator.Instance.UpdateStatus(id, DicomUploadStatus.Create);
+                DicomUploadContextOperator.Instance.UpdateStatus(id, DicomUploadStatus.Waiting);
                 UploadWorkFlow(retryItem.VidPath, retryItem.PatientId);
             }
             else if (retryItem.Status == DicomUploadStatus.UploadFail || retryItem.Status == DicomUploadStatus.UploadFailBecauseExamIsFinished)
@@ -222,7 +221,7 @@ namespace Vinno.FIS.Sonopost.Managers
                 var count = retryItem.Count + 1;
                 DicomUploadContextOperator.Instance.UpdateRetryCount(retryItem, count);
                 Thread.Sleep(1000);
-                DicomUploadContextOperator.Instance.UpdateStatus(id, DicomUploadStatus.Create);
+                DicomUploadContextOperator.Instance.UpdateStatus(id, DicomUploadStatus.Waiting);
                 RetryUploadByScanId(retryItem.ScanId);
             }
         }
@@ -329,5 +328,28 @@ namespace Vinno.FIS.Sonopost.Managers
             }
             base.DoDispose();
         }
+
+        public void ReUploadAll()
+        {
+            try
+            {
+                if (_loginManager.DeviceStatus == DeviceStatus.Logon)
+                {
+                    var failList = _fisRemedicalService.LoadFailedScanDatas();
+                    if (failList != null)
+                    {
+                        foreach (var fail in failList)
+                        {
+                            RetryUploadByScanId(fail.Id);
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"RemedicalManager DoDispose Error:{ex}");
+            }
+            base.DoDispose();
+        }
     }
 }

+ 5 - 0
Vinno.vCloud.Common.FIS/LiveVideos/ILiveVideoV2.cs

@@ -94,5 +94,10 @@ namespace Vinno.vCloud.Common.FIS.LiveVideos
         /// </summary>
         /// <returns></returns>
         bool StartSpeedTest();
+
+        /// <summary>
+        /// 重新上传剩余未上传的Vid
+        /// </summary>
+        void ReUploadRestVid();
     }
 }

+ 20 - 9
Vinno.vCloud.Common.FIS/LiveVideos/LiveVideoV2.cs

@@ -100,9 +100,17 @@ namespace Vinno.vCloud.Common.FIS.LiveVideos
             _previewManager = new PreviewManagerV2(_pusherManager, _uniqueId);
             _previewManager.PreviewImageReceived += OnPreviewImageReceived;
             RainbowImageDetector.Instance.IsPaused += OnIsPaused;
-            _realtimeCaptureManager = new RealTimeCaptureManager();
-            _realtimeCaptureManager.CaptureImageGenerated += OnCaptureImageGenerated;
-            _realtimeCaptureManager.RecordVideoGenerated += OnRecordVideoGenerated;
+            if (CommonParameter.Instance.IsSonopost)
+            {
+                _realtimeCaptureManager = new RealTimeCaptureManager();
+                _realtimeCaptureManager.CaptureImageGenerated += OnCaptureImageGenerated;
+                _realtimeCaptureManager.RecordVideoGenerated += OnRecordVideoGenerated;
+            }
+        }
+
+        public void ReUploadRestVid()
+        {
+            _realtimeCaptureManager?.ReUploadRestVid();
         }
 
         private void OnRecordVideoGenerated(object sender, string e)
@@ -404,9 +412,12 @@ namespace Vinno.vCloud.Common.FIS.LiveVideos
                 _pusherManager.LiveVideoNotification -= OnLiveVideoNotification;//需放在Dispose之后,否则收不到Close的通知
                 _previewManager.PreviewImageReceived -= OnPreviewImageReceived;
                 _previewManager.Dispose();
-                _realtimeCaptureManager.CaptureImageGenerated -= OnCaptureImageGenerated;
-                _realtimeCaptureManager.RecordVideoGenerated -= OnRecordVideoGenerated;
-                _realtimeCaptureManager.StopRecordVideo(false);
+                if (_realtimeCaptureManager != null)
+                {
+                    _realtimeCaptureManager.CaptureImageGenerated -= OnCaptureImageGenerated;
+                    _realtimeCaptureManager.RecordVideoGenerated -= OnRecordVideoGenerated;
+                    _realtimeCaptureManager.StopRecordVideo(false);
+                }
                 _disposed = true;
             }
         }
@@ -916,17 +927,17 @@ namespace Vinno.vCloud.Common.FIS.LiveVideos
 
         public void CaptureCurrentImage()
         {
-            _realtimeCaptureManager.CaptureCurrentImage();
+            _realtimeCaptureManager?.CaptureCurrentImage();
         }
 
         public void StartRecordVideo()
         {
-            _realtimeCaptureManager.StartRecordVideo();
+            _realtimeCaptureManager?.StartRecordVideo();
         }
 
         public void StopRecordVideo(bool isTimeOut)
         {
-            _realtimeCaptureManager.StopRecordVideo(isTimeOut);
+            _realtimeCaptureManager?.StopRecordVideo(isTimeOut);
         }
     }
 }

+ 48 - 0
Vinno.vCloud.Common.FIS/LiveVideos/RealTimeCaptureManager.cs

@@ -35,6 +35,54 @@ namespace Vinno.vCloud.Common.FIS.LiveVideos
             DirectoryHelper.CreateDirectory(_storagePath);
         }
 
+        /// <summary>
+        /// 检查录制完而没有来得及上传就断网的视频
+        /// </summary>
+        public void ReUploadRestVid()
+        {
+            try
+            {
+                var restFiles = Directory.GetFiles(_storagePath);
+                if (restFiles != null)
+                {
+                    foreach (var restFile in restFiles)
+                    {
+                        if (!restFile.EndsWith(".vid"))
+                        {
+                            FileHelper.DeleteFile(restFile);
+                        }
+                        else
+                        {
+                            if (LiveVideoStatusChecker.Instance.IsRealTimeCapturing)
+                            {
+                                bool isVideo = false;
+                                using (var vinnoImage = new VinnoImageData(restFile, OperationMode.Open))
+                                {
+                                    isVideo = vinnoImage.ImageCount > 1;
+                                }
+                                if (isVideo)
+                                {
+                                    RecordVideoGenerated?.Invoke(this, restFile);
+                                }
+                                else
+                                {
+                                    CaptureImageGenerated?.Invoke(this, restFile);
+                                }
+                            }
+                            else
+                            {
+                                FileHelper.DeleteFile(restFile);
+                            }
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"RealTimeCaptureManager ReUploadRestVid Error:{ex}");
+            }
+        }
+
         public void CaptureCurrentImage()
         {
             if (!LiveVideoStatusChecker.Instance.IsRealTimeCapturing)