Browse Source

迁移系统安装包

jeremy 1 year ago
parent
commit
6489a8649e

+ 97 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/Package.cs

@@ -0,0 +1,97 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Flyinsono.DBCopy.Tool.Entities
+{
+    internal class Package
+    {
+        public string Id { get; private set; }
+
+        public DateTime CreateTime { get; private set; }
+
+        public DateTime UpdateTime { get; set; }
+        public bool IsDeleted { get; set; }
+        /// <summary>
+        /// Create User Info
+        /// </summary>
+        public UserInfo CreateUser { get; set; }
+
+        /// <summary>
+        /// Description Info
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// File Token
+        /// </summary>
+        public string FileToken { get; set; }
+
+        /// <summary>
+        /// Version info
+        /// </summary>
+        public string Version { get; set; }
+
+        /// <summary>
+        /// File Size
+        /// </summary>
+        public int FileSize { get; set; }
+
+        /// <summary>
+        /// Package Type
+        /// </summary>
+        public PackageType PackageType { get; set; }
+
+        /// <summary>
+        /// File Name
+        /// </summary>
+        public string FileName { get; set; }
+        /// <summary>
+        /// Uniqued Code
+        /// </summary>
+        public string UniquedCode { get; set; }
+    }
+
+    /// <summary>
+    /// Package Type
+    /// </summary>
+    public enum PackageType
+    {
+        /// <summary>
+        /// Ultrasound Machine Android Package for usb version
+        /// </summary>
+        UltrasoundMachineAndroidPackage = 0,
+
+        /// <summary>
+        /// vCloud AI Package
+        /// </summary>
+        vCloudAIPackage,
+
+        /// <summary>
+        /// vCloud Terminal Package
+        /// </summary>Package
+        vCloudTerminalPackage,
+
+        /// <summary>
+        /// 生命一体机
+        /// </summary>
+        LifeMachinePackage,
+
+        /// <summary>
+        /// Ultrasound Machine Android Package for wifi version
+        /// </summary>
+        UltrasoundMachineAndroidPackageForWifi,
+
+        /// <summary>
+        /// Ultrasound Machine Android Package for Abroad usb version
+        /// </summary>
+        UltrasoundMachineAndroidPackageForAbroad,
+
+        /// <summary>
+        /// Other
+        /// </summary>
+        Other = 99,
+    }
+}

+ 10 - 6
Tools/Flyinsono.DBCopy.Tool/MainWindow.xaml

@@ -41,6 +41,7 @@
                 <RowDefinition Height="Auto"></RowDefinition>
                 <RowDefinition Height="Auto"></RowDefinition>
                 <RowDefinition Height="Auto"></RowDefinition>
+                <RowDefinition Height="Auto"></RowDefinition>
             </Grid.RowDefinitions>
 
             <StackPanel Grid.Row="0" Orientation="Horizontal">
@@ -89,15 +90,18 @@
                 <Button Command="{Binding DataDiffCommand}">DeviceModel</Button>
             </StackPanel>
             <StackPanel Grid.Row="4" Orientation="Horizontal">
+                <Button Command="{Binding MigratePackageDataCommand}">SyncPackages</Button>
+            </StackPanel>
+            <StackPanel Grid.Row="5" Orientation="Horizontal">
                 <Label VerticalAlignment="Center">Real-time Sync:</Label>
                 <Button Command="{Binding WingUpgradeMigrateCommand}">SyncDatas</Button>
             </StackPanel>
 
-            <StackPanel Grid.Row="5" Orientation="Horizontal">
+            <StackPanel Grid.Row="6" Orientation="Horizontal">
                 <Label VerticalAlignment="Center">DCServiceUrl:</Label>
                 <TextBox Text="{Binding DCServiceUrl}" MinWidth="340"></TextBox>
             </StackPanel>
-            <StackPanel Grid.Row="6" Orientation="Horizontal">
+            <StackPanel Grid.Row="7" Orientation="Horizontal">
                 <Label VerticalAlignment="Center">Backup Migrate:</Label>
                 <Button Command="{Binding MigrateStaticCommand}" MinWidth="110">Static</Button>
                 <Button Command="{Binding MigrateRemoteDiagnosisCommand}" MinWidth="110">RemoteDiagnoais</Button>
@@ -106,18 +110,18 @@
                 <Button Command="{Binding MigrateCourseCommand}" MinWidth="110">Course</Button>
                 <Button Command="{Binding MigrateExamPaperCommand}" MinWidth="110">ExamPaper</Button>
             </StackPanel>
-            <StackPanel Grid.Row="7" Orientation="Horizontal">
+            <StackPanel Grid.Row="8" Orientation="Horizontal">
                 <Label VerticalAlignment="Center">Backup Migrate:</Label>
                 <Button Command="{Binding MigrateReportCommand}" MinWidth="110">Report</Button>
                 <Button Command="{Binding MigrateAIDataCommand}" MinWidth="110">AIData</Button>
             </StackPanel>
 
-            <StackPanel Grid.Row="8" Orientation="Horizontal">
+            <StackPanel Grid.Row="9" Orientation="Horizontal">
                 <Label VerticalAlignment="Center">Online Data Cleaning:</Label>
                 <Button Command="{Binding ConnectDbServerCommand}" MinWidth="150">Connect Remote DB</Button>
                 <Button Command="{Binding ClearRemoteDataCommand}" MinWidth="150">Clear Data</Button>
             </StackPanel>
-            <GroupBox Grid.Row="9" Header="COS Clear">
+            <GroupBox Grid.Row="10" Header="COS Clear">
                 <StackPanel>
                     <StackPanel Orientation="Horizontal">
                         <Label VerticalAlignment="Center">Exclude list:</Label>
@@ -138,7 +142,7 @@
                 </StackPanel>
             </GroupBox>
 
-            <StackPanel Grid.Row="10" Orientation="Horizontal">
+            <StackPanel Grid.Row="11" Orientation="Horizontal">
                 <Label VerticalAlignment="Center">TerminalRecords Sync:</Label>
                 <TextBox Text="{Binding TerminalRecordCode}" MinWidth="280"></TextBox>
                 <Button Command="{Binding ConnectDbServerCommand}" MinWidth="250">Connect Local Flyinsono1.7 DB</Button>

+ 110 - 15
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.BasicInfo.cs

@@ -159,7 +159,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             try
             {
                 Logger.WriteLineInfo($" Update Organization short code Migrate Starting");
-                
+
                 var request = new ModifyUserBindDeviceOrganizationRequest
                 {
                     OrganizationCodes = records,
@@ -846,7 +846,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             var filter = builder.Where(x => ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
             var printerDrives = new List<PrinterDrives>();
             var tempPrinterDrives = _adminDBRepository.GetPrintRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            
+
             printerDrives = await FilterData<PrinterDrives>(tempPrinterDrives, "PrinterDrivesData");
             Logger.WriteLineInfo($"Print totalCount:{printerDrives.Count}");
             var pageIndex = 0;
@@ -934,7 +934,6 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
         }
 
-
         /// <summary>
         /// 迁移基础数据
         /// </summary>
@@ -955,7 +954,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                 var builder = Builders<Patch>.Filter;
                 var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
                 var tempPatchInfos = _adminDBRepository.GetPatches(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-                
+
                 patchInfos = await FilterData<Patch>(tempPatchInfos, "PatchData");
             }
             //patchInfos = patchInfos.Where(x => x.Id == "E9E0A873C7974B2381A3F97C981BAC59")?.ToList() ?? new List<Patch>();
@@ -986,6 +985,56 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
         }
 
+        /// <summary>
+        /// 迁移软件安装包
+        /// </summary>
+        /// <returns></returns>
+        public async Task MigratePackageInfos(SyncDBEnum syncType)
+        {
+            var packageInfos = new List<Package>();
+            if (syncType == SyncDBEnum.Migrate)
+            {
+                var builder = Builders<Package>.Filter;
+                var filter = builder.Where(x => !x.IsDeleted);
+                packageInfos = _adminDBRepository.GetPackages(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            }
+            else
+            {
+                var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
+                var endTime = _migrateRecord.EndTime;
+                var builder = Builders<Package>.Filter;
+                var filter = builder.Where(x => !x.IsDeleted && (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
+                var tempPackageInfos = _adminDBRepository.GetPackages(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+
+                packageInfos = await FilterData(tempPackageInfos, "PackageData");
+            }
+
+            Logger.WriteLineInfo($"package totalCount:{packageInfos.Count}");
+            var pageIndex = 0;
+            var pageSize = 50;
+            var packageCount = packageInfos.Count;
+            while (true)
+            {
+                var pendingRecords = packageInfos.Skip(pageIndex * pageSize).Take(pageSize)?.ToList() ?? new List<Package>();
+                var pendingCount = pendingRecords.Count;
+                if (pendingCount > 0)
+                {
+                    await SendPackageInfos(packageInfos);
+                    pageIndex++;
+                }
+                if (pageIndex * pageSize >= packageCount)
+                {
+                    Logger.WriteLineInfo($"package record processing: 100%");
+                    break;
+                }
+                else
+                {
+                    var tempValue = packageCount == 0 ? 1 : packageCount;
+                    Logger.WriteLineInfo($"package record processing: {(pageIndex * pageSize * 100 / tempValue)}%");
+                }
+            }
+        }
+
         /// <summary>
         /// 保存打印数据
         /// </summary>
@@ -1045,6 +1094,52 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
         }
 
+        /// <summary>
+        /// 保存软件安装包数据
+        /// </summary>
+        /// <param name="userRecords"></param>
+        private async Task SendPackageInfos(IList<Package> packages)
+        {
+            try
+            {
+                Logger.WriteLineInfo($"Package Infos Migrate Starting");
+                foreach (var package in packages)
+                {
+                    var uniquedCode = package.FileName;
+                    if (package.FileName.Contains("_"))
+                    {
+                        var parts = package.FileName.Split("_");
+                        uniquedCode = string.Join("_", parts, 0, parts.Length - 1);
+                    }
+                    var fileUrl = package.FileToken;
+                    var prefix = "1!U$";
+                    if (!string.IsNullOrWhiteSpace(fileUrl) && fileUrl.Contains(prefix))
+                    {
+                        fileUrl = fileUrl.Replace(prefix, "");
+                    }
+                    await _jsonRpcProxy.User.AddOrUpdatePackageAsync(new AddOrUpdatePackageRequest
+                    {
+                        Token = DefaultToken,
+                        PackageInfo = new WingInterfaceLibrary.DTO.Package.PackagesDTO
+                        {
+                            Code = package.Id,
+                            UniquedCode = uniquedCode,
+                            Name = package.FileName,
+                            Description = package.Description,
+                            Version = package.Version,
+                            FileUrl = fileUrl,
+                            FileSize = package.FileSize,
+                            UploadUserCode = package.CreateUser?.Id,
+                            CreateTime = package.CreateTime,
+                        }
+                    });
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"Send Package Infos Error, ex:{ex}");
+            }
+        }
 
         public async Task DiffOrg()
         {
@@ -1094,7 +1189,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             Logger.WriteLineInfo($"Users Infos Migrate Successfully");
         }
 
-        
+
         /// <summary>
         /// 数据转换
         /// </summary>
@@ -1210,7 +1305,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             //var filter = builder.Where(x => x.IsDeleted == false);
             var reportTemplateRecords = new List<ReportTemplates>();
             var tempReportTemplateRecords = _reportTemplateDBRepository.GetReportTemplateRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            
+
             reportTemplateRecords = await FilterData<ReportTemplates>(tempReportTemplateRecords, "ReportTemplateData");
             Logger.WriteLineInfo($"ReportTemplates totalCount:{reportTemplateRecords.Count}");
             var pageIndex = 0;
@@ -1384,7 +1479,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             var filter = builder.Where(x => x.Name.ToLower() != "admin" && ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
             var adminRecords = new List<Admins>();
             var tempAdminRecords = _adminDBRepository.GetAdminsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            
+
             adminRecords = await FilterData<Admins>(tempAdminRecords, "AdminData");
             Logger.WriteLineInfo($"admin totalCount:{adminRecords.Count}");
             var pageIndex = 0;
@@ -1489,7 +1584,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             var filter = builder.Where(x => !string.IsNullOrEmpty(x.Name) && ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
             var organizationRecords = new List<Organizations>();
             var tempOrganizationRecords = _organizationsDBRepository.GetOrganizationsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            
+
             organizationRecords = await FilterData<Organizations>(tempOrganizationRecords, "OrganizationData");
             Logger.WriteLineInfo($"Organizations totalCount:{organizationRecords.Count}");
             var request = new GetRegionsRequest
@@ -1701,7 +1796,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
             var posterConfigsRecords = new List<PosterConfigs>();
             var tempPosterConfigsRecords = _posterConfigsDBRepository.GetPostConfigsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-           
+
             posterConfigsRecords = await FilterData<PosterConfigs>(tempPosterConfigsRecords, "ReportPosterData");
             Logger.WriteLineInfo($"posterConfigs totalCount:{posterConfigsRecords.Count}");
             var pageIndex = 0;
@@ -1800,9 +1895,9 @@ namespace Flyinsono.DBCopy.Tool.Service
             var filter = builder.Where(x => !string.IsNullOrEmpty(x.UniquedId) && ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
             var terminalsRecords = new List<Terminals>();
             var tempTerminalsRecords = _terminalsDBRepository.GetTerminalsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-           
+
             terminalsRecords = await FilterData<Terminals>(tempTerminalsRecords, "ReportTerminalData");
-             
+
             //terminalsRecords = terminalsRecords.Where(x => x.UniquedId == "8LRJL7" || x.UniquedId == "WQ8RKS")?.ToList() ?? new List<Terminals>();
             Logger.WriteLineInfo($"terminalInfos shortCode not null totalCount:{terminalsRecords.Count}");
             var pushList = _terminalsDBRepository.GetAllTerminalPushStream();
@@ -1833,7 +1928,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             terminalsRecords = new List<Terminals>();
             tempTerminalsRecords = _terminalsDBRepository.GetTerminalsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
             //terminalsRecords = terminalsRecords.Where(x => x.UniquedId == "8LRJL7" || x.UniquedId == "WQ8RKS")?.ToList() ?? new List<Terminals>();
-            
+
             terminalsRecords = await FilterData<Terminals>(tempTerminalsRecords, "ReportTerminalData");
             Logger.WriteLineInfo($"terminalInfos shortCode is null totalCount:{terminalsRecords.Count}");
             terminalsCount = terminalsRecords.Count;
@@ -1865,7 +1960,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                 filter = builder.Where(x => termainalCodes.Contains(x.Id));
                 terminalsRecords = new List<Terminals>();
                 tempTerminalsRecords = _terminalsDBRepository.GetTerminalsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-                
+
                 terminalsRecords = await FilterData<Terminals>(tempTerminalsRecords, "ReportTerminalData");
                 //terminalsRecords = terminalsRecords.Where(x => x.UniquedId == "8LRJL7" || x.UniquedId == "WQ8RKS")?.ToList() ?? new List<Terminals>();
                 Logger.WriteLineInfo($"terminalInfos shortCode is null totalCount:{terminalsRecords.Count}");
@@ -2011,7 +2106,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             var userRecords = new List<Users>();
             var tempUserRecords = _usersDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
             //userRecords = userRecords.Where(x => x.Organizations != null && x.Organizations.Count > 0 && x.Organizations.FirstOrDefault().Name.Contains("�谮����ά��"))?.ToList() ?? new List<Users>();
-           
+
             userRecords = await FilterData<Users>(tempUserRecords, "UserData");
             Logger.WriteLineInfo($"user totalCount:{userRecords.Count}");
             var pageIndex = 0;
@@ -2392,7 +2487,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                             }
                         }
                         //再次验证是否包含
-                        foreach (var org in dbOrgIds) 
+                        foreach (var org in dbOrgIds)
                         {
                             if (orgIds.Contains(org))
                             {

+ 1 - 0
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.Upgrade.cs

@@ -124,6 +124,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                 await MigrateBasicInfos(SyncDBEnum.Synchronize);
                 await MigratePrintInfos();
                 await MigratePatchDataInfos(SyncDBEnum.Synchronize);
+                await MigratePackageInfos(SyncDBEnum.Synchronize);
                 await MigrateBasicUserInfos(SyncDBEnum.Synchronize);
                 await MigrateCourseInfos(SyncDBEnum.Synchronize);
                 await MigrateRemedicalAndConsultationToWingServerAsync(_batchExcuteRemedicalDataCount);

+ 11 - 0
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/AdminDBRepository.cs

@@ -46,6 +46,17 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             return entities;
         }
 
+        /// <summary>
+        /// 查询软件安装包
+        /// </summary>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public IList<Package> GetPackages(FilterDefinition<Package> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.Packages, filter)?.ToList() ?? new List<Package>();
+            return entities;
+        }
+
         public IList<Admins> GetAdminByCodes(IList<string> adminIds)
         {
             var builder = Builders<Admins>.Filter;

+ 2 - 0
Tools/Flyinsono.DBCopy.Tool/Utilities/MongoDbClient.cs

@@ -236,6 +236,7 @@ namespace Flyinsono.DBCopy.Tool.Utilities
         public IMongoCollection<TrainingBrowsedRecords> TrainingBrowsedRecords { get; private set; }
         public IMongoCollection<PrinterDrives> PrinterDrives { get; private set; }
         public IMongoCollection<Patch> Patches { get; private set; }
+        public IMongoCollection<Entities.Package> Packages { get; private set; }
         private void RegisterEntities()
         {
             Admins = GetCollection<Admins>("Admins");
@@ -303,6 +304,7 @@ namespace Flyinsono.DBCopy.Tool.Utilities
             TrainingBrowsedRecords = GetCollection<TrainingBrowsedRecords>("TrainingBrowsedRecords");
             PrinterDrives = GetCollection<PrinterDrives>("PrinterDrives");
             Patches = GetCollection<Patch>("Patches");
+            Packages = GetCollection<Entities.Package>("Packages");
         }
 
 

+ 36 - 0
Tools/Flyinsono.DBCopy.Tool/ViewModels/MainWindowViewModel.cs

@@ -46,6 +46,7 @@ namespace Flyinsono.DBCopy.Tool
         private static bool _bussinessData = false;
         private static bool _migratePrintData = false;
         private static bool _migratePatchData = false;
+        private static bool _migratePackageData = false;
         private static bool _migrateVinnoOrgData = false;
         private static bool _validateOrganizationParentData = false;
         private static bool _synUserDeviceOrgData = false;
@@ -344,6 +345,7 @@ namespace Flyinsono.DBCopy.Tool
         public ButtonCommand UpgradeBussinessDataCommand { get; set; }
         public ButtonCommand MigratePrintDataCommand { get; set; }
         public ButtonCommand MigratePatchDataCommand { get; set; }
+        public ButtonCommand MigratePackageDataCommand { get; set; }
         public ButtonCommand MigrateBasicUserDataCommand { get; set; }
         public ButtonCommand DiffOrganizationDataCommand { get; set; }
         public ButtonCommand ClearColdDataCommand { get; set; }
@@ -438,6 +440,7 @@ namespace Flyinsono.DBCopy.Tool
             UpgradeBussinessDataCommand = new ButtonCommand(OnUpgradeBussinessDataCommand);
             MigratePrintDataCommand = new ButtonCommand(OnMigratePrintData);
             MigratePatchDataCommand = new ButtonCommand(OnMigratePatchData);
+            MigratePackageDataCommand = new ButtonCommand(OnMigratePackageData);
             MigrateBasicUserDataCommand = new ButtonCommand(OnMigrateBasicUserData);
             DiffOrganizationDataCommand = new ButtonCommand(OnDiffOrganizationData);
             MigrateCourseVideoCommand = new ButtonCommand(OnMigrateCourseVideo);
@@ -1226,6 +1229,39 @@ namespace Flyinsono.DBCopy.Tool
             }
         }
 
+        private void OnMigratePackageData(object obj)
+        {
+            if (_migratePackageData)
+            {
+                Logger.WriteLineWarn($"Migrate PackageData Processing");
+                return;
+            }
+            try
+            {
+                _migratePackageData = true;
+                Task.Run(async () =>
+                {
+                    try
+                    {
+                        await MigrateServiceReal.MigratePackageInfos(SyncDBEnum.Migrate);
+                    }
+                    catch (Exception ex)
+                    {
+                        Logger.WriteLineWarn($"MigratePackageInfos err, ex:{ex}");
+                    }
+                    finally
+                    {
+                        _migratePackageData = false;
+                    }
+                });
+            }
+            catch (Exception ex)
+            {
+                _migratePackageData = false;
+                Logger.WriteLineWarn($"MigratePackageInfos err, ex:{ex}");
+            }
+        }
+
         private void OnUpgradeBussinessDataCommand(object obj)
         {
             if (_bussinessData)