Browse Source

数据迁移接口 机构结构调整

denny 1 year ago
parent
commit
5d18102811

+ 7 - 7
Tools/Flyinsono.DBCopy.Tool/ClientTestManager.cs

@@ -43,13 +43,13 @@ namespace Flyinsono.DBCopy.Tool
                 //var client = new JsonRpcClient();
                 //client.UseEngine(clientEngine);
                 //var proxy = client.CreateProxy<ILoginService>();
-                JsonRpcProxy jrp = new JsonRpcProxy(remoteUrl);
-                var request = new CommonLoginRequest();
-                request.LoginSource = LoginSource.PC;
-                request.AnyAccount = "fly11";
-                request.Password = "7a9da7f9ffc92a1d9e3b9d87137eb3c1";
-                var result = await jrp.Login.CommonLoginAsync(request);
-                Logger.WriteLineInfo($"result:{result.AccountName}- {result.LoginState} - {result.Token}");
+                //JsonRpcProxy jrp = new JsonRpcProxy(remoteUrl);
+                //var request = new CommonLoginRequest();
+                //request.LoginSource = LoginSource.PC;
+                //request.AnyAccount = "fly11";
+                //request.Password = "7a9da7f9ffc92a1d9e3b9d87137eb3c1";
+                //var result = await jrp.Login.CommonLoginAsync(request);
+                //Logger.WriteLineInfo($"result:{result.AccountName}- {result.LoginState} - {result.Token}");
 
                 var filterTestService = new FilterTestService();
                 if (CommonConfigManager.FilterGeneral.ExcuteUsers)

+ 1 - 0
Tools/Flyinsono.DBCopy.Tool/Config/TestConfig.json

@@ -73,6 +73,7 @@
   "FilterCourses": [ "test", "ceshi", "tst", "测试", "Connie", "Denny", "Loki", "Nancy", "Riley", "Smith", "demo", "hi", "hahha", "直播", "培训", "啊打发打发", "new" ],
   "FilterPatients": [ "test", "ceshi", "tst", "测试", "Connie", "Denny", "Loki", "Nancy", "Riley", "Smith", "张帅" ],
   "FilterReportPosters": [ "test", "ceshi", "tst", "测试", "Connie", "Denny", "Loki", "Nancy", "Riley", "Smith", "张帅" ],
+  "FilterPatientType": [ "动物", "宠物" ],
   "FilterGeneral": {
     "ClearTime": "2023-04-19",
     "ExcuteConversations": true,

+ 6 - 1
Tools/Flyinsono.DBCopy.Tool/Entities/Config/TestUserConfig.cs

@@ -46,7 +46,12 @@ namespace Flyinsono.DBCopy.Tool.Entities.Config
         /// <summary>
         /// 过滤指定的推送报告
         /// </summary>
-        public IList<string> FilterReportPosters { get; set; } = new List<string>(); 
+        public IList<string> FilterReportPosters { get; set; } = new List<string>();
+
+        /// <summary>
+        /// 过滤指定的病人类型
+        /// </summary>
+        public IList<string> FilterPatientType { get; set; } = new List<string>();
 
         /// <summary>
         /// 清理工具基础配置

+ 33 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/TerminalPushLiveConfigs.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Flyinsono.DBCopy.Tool.Entities
+{
+    internal class TerminalPushLiveConfigs
+    {
+        public bool IsDeleted { get; set; }
+
+        public string Id { get; private set; }
+
+        public DateTime CreateTime { get; private set; }
+
+        public DateTime UpdateTime { get; set; }
+
+        public string TerminalName { get; set; }
+        public bool IsMergeMode { get; set; }
+
+        public LiveProtocol LiveProtocol { get; set; }
+
+        public string TerminalId { get; set; }
+    }
+
+    public enum LiveProtocol
+    {
+        Rtmp,
+        RTC,
+        Rtsp
+    }
+}

+ 70 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/UserRoleTypes.cs

@@ -0,0 +1,70 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Flyinsono.DBCopy.Tool.Entities
+{
+    internal class UserRoleTypes
+    {
+        public string Id { get; private set; }
+
+        public DateTime CreateTime { get; private set; }
+
+        public DateTime UpdateTime { get; set; }
+        public bool IsDeleted { get; set; }
+
+        /// <summary>
+        /// 远程考核用户角色
+        /// </summary>
+        public RoleType RoleType { get; set; }
+
+        /// <summary>
+        /// 预约会诊用户角色
+        /// </summary>
+        public ConsultationRoleType ConsultationRoleType { get; set; }
+
+        /// <summary>
+        ///远程培训用户角色
+        /// </summary>
+        public TrainingRoleType TrainingRoleType { get; set; }
+
+        /// <summary>
+        /// 评分能力
+        /// </summary>
+        public double EvaluateAbility { get; set; }
+    }
+
+    /// <summary>
+    /// 远程考核用户角色
+    /// </summary>
+    public enum RoleType
+    {
+        Student,
+        Assistant,
+        Teacher,
+    }
+
+    /// <summary>
+    /// 预约会诊用户角色
+    /// </summary>
+    public enum TrainingRoleType
+    {
+        NormalUser,
+        CertifiedTeacher,
+        CourseRecorder,
+        VideoAdmin
+    }
+
+    /// <summary>
+    /// 会议角色
+    /// </summary>
+    public enum MeetingRoleType
+    {
+        Initiator,
+        Recipient,
+        Expert,//专家
+        Administrator,//系统管理员
+    }
+}

+ 11 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/Users.cs

@@ -160,6 +160,17 @@ namespace Flyinsono.DBCopy.Tool.Entities
         Low
     }
 
+    /// <summary>
+    /// 预约会诊用户角色
+    /// </summary>
+    public enum ConsultationRoleType
+    {
+        Doctor,
+        HospitalAdmin,
+        ReportEditor,
+        Assistant//会诊助理
+    }
+
     /// <summary>
     /// Account all user types
     /// </summary>

+ 2 - 1
Tools/Flyinsono.DBCopy.Tool/RpcService/RpcProxy.cs

@@ -25,7 +25,8 @@ namespace Flyinsono.DBCopy.Tool.RpcService
         }
 
         public ILoginService Login => GetOrCreateCachedProxy<ILoginService>();
-
+        public IManagementService Management => GetOrCreateCachedProxy<IManagementService>();
+        public IRegionService Region => GetOrCreateCachedProxy<IRegionService>(); 
         public IUserService User => GetOrCreateCachedProxy<IUserService>();
         public IVinnoServerService VinnoServer => GetOrCreateCachedProxy<IVinnoServerService>();
         public IDataCenterService DataCenter => GetOrCreateCachedProxy<IDataCenterService>();

+ 1 - 1
Tools/Flyinsono.DBCopy.Tool/Service/FilterTestService.cs

@@ -10,7 +10,7 @@ namespace Flyinsono.DBCopy.Tool.Service
     internal class FilterTestService
     {
         private UsersDBRepository _usersDBRepository = new UsersDBRepository();
-        private TerninalsDBRepository _terninalsDBRepository = new TerninalsDBRepository();
+        private TerminalsDBRepository _terninalsDBRepository = new TerminalsDBRepository();
         private OrganizationsDBRepository _organizationsDBRepository = new OrganizationsDBRepository();
         private ConversationsDBRepository _conversationsDBRepository = new ConversationsDBRepository();
         private CoursesDBRepository _coursesDBRepository = new CoursesDBRepository();

+ 546 - 12
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.BasicInfo.cs

@@ -1,8 +1,23 @@
-using System;
+using Flyinsono.DBCopy.Tool.Entities;
+using Flyinsono.DBCopy.Tool.Service.Repositories;
+using Flyinsono.DBCopy.Tool.Utilities;
+using MongoDB.Driver;
+using Newtonsoft.Json;
+using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Cryptography.Xml;
 using System.Text;
 using System.Threading.Tasks;
+using WingInterfaceLibrary.DTO;
+using WingInterfaceLibrary.DTO.DataCenter;
+using WingInterfaceLibrary.DTO.Management;
+using WingInterfaceLibrary.DTO.Region;
+using WingInterfaceLibrary.Enum;
+using WingInterfaceLibrary.Internal.Request;
+using WingInterfaceLibrary.Request;
+using WingInterfaceLibrary.Request.Management;
+using WingInterfaceLibrary.Request.User;
 
 namespace Flyinsono.DBCopy.Tool.Service
 {
@@ -11,32 +26,424 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// <summary>
         /// 迁移基础数据
         /// </summary>
-        public void MigrateBasicInfos()
+        public async Task MigrateBasicInfos()
         {
             Logger.WriteLineInfo($"Basic Infos Migrate Starting");
+            var relationList = await MigrateReportPosterInfos();
+            var orgDiagnosisModulesList = await MigrateTerminalsInfos(relationList);
+            await MigrateOrganizationInfos(orgDiagnosisModulesList);
+            await MigrateUserInfos();
+            Logger.WriteLineInfo($"Basic Infos Migrate Successfully");
+        }
+
+        /// <summary>
+        /// 同步机构数据
+        /// </summary>
+        /// <param name="orgDiagnosisModulesList"></param>
+        /// <returns></returns>
+        private async Task MigrateOrganizationInfos(List<OrganizationDiagnosisModulesRelation> orgDiagnosisModulesList)
+        {
+            var startTime = _migrateRecord.StartTime;
+            var endTime = _migrateRecord.EndTime;
+            var builder = Builders<Organizations>.Filter;
+            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
+            var organizationRecords = _organizationsDBRepository.GetOrganizationsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            Logger.WriteLineInfo($"Organizations totalCount:{organizationRecords.Count}");
 
+            var request = new GetRegionsRequest
+            {
+                Version = "1.0",
+                LanguageType = "zh-CN"
+            };
+            var zhRegion = await _jsonRpcProxy.Region.GetRegionsAsync(request);
+            var zhList = JsonConvert.DeserializeObject<List<RegionData>>(zhRegion.ReginData);
+            request = new GetRegionsRequest
+            {
+                Version = "1.0",
+                LanguageType = "en-US"
+            };
+            var enRegion = await _jsonRpcProxy.Region.GetRegionsAsync(request);
+            var enList = JsonConvert.DeserializeObject<List<RegionData>>(enRegion.ReginData);
+            var organizationCount = organizationRecords.Count;
+            var processNumbers = 0;
+            var processNumber = 100;
+            while (true)
+            {
+                var pendingRecords = organizationRecords.Skip(processNumbers).Take(processNumber)?.ToList() ?? new List<Organizations>();
+                var pendingCount = organizationRecords.Count;
+                if (pendingCount > 0)
+                {
+                    await SendOrganizationInfos(pendingRecords, orgDiagnosisModulesList, zhList, enList);
+                    processNumbers += pendingCount;
+                }
+                if (processNumbers % (processNumber * 100) == 0)
+                {
+                    Logger.WriteLineInfo($"Organizations record processing: {(processNumbers * 100 / organizationCount)}%");
+                }
+                if (pendingCount < processNumber)
+                {
+                    break;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 发送机构数据
+        /// </summary>
+        /// <param name="organizationRecords"></param>
+        /// <param name="orgDiagnosisModulesList"></param>
+        private async Task SendOrganizationInfos(IList<Organizations> organizationRecords, List<OrganizationDiagnosisModulesRelation> orgDiagnosisModulesList, List<RegionData> zhRegion, List<RegionData> enRegion)
+        {
+            try
+            {
+                Logger.WriteLineInfo($"Organizations Infos Migrate Starting");
+                var deviceList = new List<OrganizationMigratoryInfo>();
+                foreach (var organizationItem in organizationRecords)
+                {
+                    var moduleList = new List<DiagnosisModuleEnum>();
+                    if (orgDiagnosisModulesList?.Count > 0)
+                    {
+                        var tempList = orgDiagnosisModulesList.FindAll(c => c.OrganizationCode == organizationItem.Id) ?? new List<OrganizationDiagnosisModulesRelation>();
+                        foreach (var item in tempList)
+                        {
+                            if (item.DiagnosisModule?.Count > 0)
+                            {
+                                foreach (var moduleItem in item.DiagnosisModule)
+                                {
+                                    if (!moduleList.Contains(moduleItem))
+                                    {
+                                        moduleList.Add(moduleItem);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    bool isAnimals = false;
+                    if (CommonConfigManager.FilterPatientType?.Count > 0)
+                    {
+                        foreach (var item in CommonConfigManager.FilterPatientType)
+                        {
+                            if (organizationItem.Name.Contains(item))
+                            {
+                                isAnimals = true;
+                                break;
+                            }
+                        }
+                    }
+                    var curRegion = "";
+                    var regionCode = "";
+                    if (!string.IsNullOrEmpty(organizationItem?.City?.Id))
+                    {
+                        curRegion = organizationItem.City.Description;
+                    }
+                    else if (!string.IsNullOrEmpty(organizationItem?.Province?.Id))
+                    {
+                        curRegion = organizationItem.Province.Description;
+                    }
+                    else if (!string.IsNullOrEmpty(organizationItem?.Country?.Id))
+                    {
+                        curRegion = organizationItem.Country.Description;
+                    }
+                    if (!string.IsNullOrEmpty(curRegion))
+                    {
+                        var findEntity = zhRegion.Find(c => c.N.Contains(curRegion)) ?? new RegionData();
+                        if (!string.IsNullOrEmpty(findEntity.C))
+                        {
+                            regionCode = findEntity.C;
+                        }
+                        if (string.IsNullOrEmpty(regionCode))
+                        {
+                            findEntity = enRegion.Find(c => c.N.Contains(curRegion)) ?? new RegionData();
+                            if (!string.IsNullOrEmpty(findEntity.C))
+                            {
+                                regionCode = findEntity.C;
+                            }
+                        }
+                    }
+                    var model = new OrganizationMigratoryInfo()
+                    {
+                        OrganizationName = organizationItem.Id,
+                        CreateTime = organizationItem.CreateTime,
+                        UpdateTime = organizationItem.UpdateTime,
+                        OrganizationCode = organizationItem.Name,
+                        Description = organizationItem.Description,
+                        RegionCode = regionCode,
+                        ParentCode = organizationItem.ParentOrganizations?.FirstOrDefault()?.Id,
+                        RootCode = "",
+                        //todo, 老的没有这个分类
+                        OrganizationType = OrganizationTypeEnum.Corporation,
+                        LogoUrl = "",
+                        State = OrganizationStateEnum.Audited,
+                        PatientType = isAnimals ? OrganizationPatientTypeEnum.Animals : OrganizationPatientTypeEnum.Person,
+                        Directors = new List<string>(),
+                        Isinvented = false,
+                        DiagnosisModule = moduleList
+                    };
+                    if (!string.IsNullOrEmpty(organizationItem.CreateAdmin?._id))
+                    {
+                        model.AssignedAdmins = new List<string>() { organizationItem.CreateAdmin._id };
+                    }
+                    deviceList.Add(model);
+                }
+                var request = new BatchInsertOrganizationRequest
+                {
+                    OrganizationMigratorys = deviceList,
+                    Token = DefaultToken
+                };
+                var result = await _jsonRpcProxy.Management.BatchInsertOrganizationDataAsync(request);
+                if (result)
+                {
+                    Logger.WriteLineInfo($"Organizations Infos Migrate Successfully");
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"Send Organizations Infos Error, ex:{ex}");
+            }
+        }
 
-            var builder = Builders<TerminalRecords>.Filter;
-            var filter = builder.Where(x => true);
-            var terminalRecords = _terminalRecordDBRepository.GetTerminalRecords(Builders<TerminalRecords>.Filter.Where(x => true))
-                .OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            Logger.WriteLineInfo($"terminal record totalCount:{terminalRecords.Count}");
+        /// <summary>
+        /// 同步报告推送数据
+        /// </summary>
+        /// <returns></returns>
+        private async Task<List<TerminalReportPosterRelation>> MigrateReportPosterInfos()
+        {
+            var relationList = new List<TerminalReportPosterRelation>();
+            var startTime = _migrateRecord.StartTime;
+            var endTime = _migrateRecord.EndTime;
+            var builder = Builders<PosterConfigs>.Filter;
+            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
+            var posterConfigsRecords = _posterConfigsDBRepository.GetPostConfigsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            Logger.WriteLineInfo($"posterConfigs totalCount:{posterConfigsRecords.Count}");
 
-            var terminalRecordCount = terminalRecords.Count;
+            var posterConfigsCount = posterConfigsRecords.Count;
             var processNumbers = 0;
             var processNumber = 100;
             while (true)
             {
-                var pendingRecords = terminalRecords.Skip(processNumbers).Take(processNumber)?.ToList() ?? new List<TerminalRecords>();
+                var pendingRecords = posterConfigsRecords.Skip(processNumbers).Take(processNumber)?.ToList() ?? new List<PosterConfigs>();
+                var pendingCount = posterConfigsRecords.Count;
+                if (pendingCount > 0)
+                {
+                    await SendPosterConfigsInfos(pendingRecords, relationList);
+                    processNumbers += pendingCount;
+                }
+                if (processNumbers % (processNumber * 100) == 0)
+                {
+                    Logger.WriteLineInfo($"posterConfigs record processing: {(processNumbers * 100 / posterConfigsCount)}%");
+                }
+
+                if (pendingCount < processNumber)
+                {
+                    break;
+                }
+            }
+            return relationList;
+        }
+
+        /// <summary>
+        /// 发送posterConfigs数据
+        /// </summary>
+        /// <param name="userRecords"></param>
+        private async Task SendPosterConfigsInfos(IList<PosterConfigs> posterConfigsRecords, List<TerminalReportPosterRelation> relationList)
+        {
+            try
+            {
+                Logger.WriteLineInfo($"posterConfigs Infos Migrate Starting");
+                var posterConfigList = new List<PosterConfigMigratoryInfo>();
+                foreach (var posterConfigItem in posterConfigsRecords)
+                {
+                    if (posterConfigItem?.Terminals?.Count > 0)
+                    {
+                        var tempList = posterConfigItem.Terminals.Select(c => new TerminalReportPosterRelation()
+                        {
+                            TerminalCode = c,
+                            PostConfigCode = posterConfigItem.Id
+                        }).ToList();
+                        relationList.AddRange(tempList);
+                    }
+                    var model = new PosterConfigMigratoryInfo()
+                    {
+                        Code = posterConfigItem.Id,
+                        CreateTime = posterConfigItem.CreateTime,
+                        UpdateTime = posterConfigItem.UpdateTime,
+                        ReceiverName = posterConfigItem.Name,
+                        Contact = "",
+                        Phone = "",
+                        TargetUrl = posterConfigItem.ServiceUrl,
+                        Template = posterConfigItem.Template,
+                        PosterType = (posterConfigItem.InterfaceType == PosterWebInterfaceType .BJAid ? ReportPosterTypeEnum.BJAid : ReportPosterTypeEnum.Default),
+                        PostTimeout = posterConfigItem.Timeout,
+                        //todo
+                        ReportFormat = ReportFormatEnum.Json
+                    };
+                    posterConfigList.Add(model);
+                }
+                var request = new BatchInsertPosterConfigRequest
+                {
+                    PosterConfigMigratorys = posterConfigList,
+                    Token = DefaultToken
+                };
+                var result = await _jsonRpcProxy.Management.BatchInsertPosterConfigsDataAsync(request);
+                if (result)
+                {
+                    Logger.WriteLineInfo($"posterConfigs Infos Migrate Successfully");
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"Send posterConfigs Infos Error, ex:{ex}");
+            }
+        }
+
+        /// <summary>
+        /// 同步设备数据
+        /// </summary>
+        /// <returns></returns>
+        private async Task<List<OrganizationDiagnosisModulesRelation>> MigrateTerminalsInfos(List<TerminalReportPosterRelation> relationList)
+        {
+            var orgDiagnosisModulesList = new List<OrganizationDiagnosisModulesRelation>();
+            var startTime = _migrateRecord.StartTime;
+            var endTime = _migrateRecord.EndTime;
+            var builder = Builders<Terminals>.Filter;
+            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
+            var terminalsRecords = _terminalsDBRepository.GetTerminalsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            Logger.WriteLineInfo($"terminalsRecords totalCount:{terminalsRecords.Count}");
+            var pushList = _terminalsDBRepository.GetAllTerminalPushStream();
+            var terminalsCount = terminalsRecords.Count;
+            var processNumbers = 0;
+            var processNumber = 100;
+            while (true)
+            {
+                var pendingRecords = terminalsRecords.Skip(processNumbers).Take(processNumber)?.ToList() ?? new List<Terminals>();
+                var pendingCount = terminalsRecords.Count;
+                if (pendingCount > 0)
+                {
+                    await SendTerminalInfos(pendingRecords, relationList, pushList, orgDiagnosisModulesList);
+                    processNumbers += pendingCount;
+                }
+                if (processNumbers % (processNumber * 100) == 0)
+                {
+                    Logger.WriteLineInfo($"terminalsRecords record processing: {(processNumbers * 100 / terminalsCount)}%");
+                }
+                if (pendingCount < processNumber)
+                {
+                    break;
+                }
+            }
+            return orgDiagnosisModulesList;
+        }
+
+        /// <summary>
+        /// 发送设备数据
+        /// </summary>
+        /// <param name="userRecords"></param>
+        private async Task SendTerminalInfos(IList<Terminals> userRecords, List<TerminalReportPosterRelation> relationList, List<TerminalPushLiveConfigs> pushList, List<OrganizationDiagnosisModulesRelation> orgDiagnosisModulesList)
+        {
+            try
+            {
+                Logger.WriteLineInfo($"Terminals Infos Migrate Starting");
+                var deviceList = new List<DeviceMigratoryInfo>();
+                foreach (var deviceItem in userRecords)
+                {
+                    bool isMerge = false;
+                    if (pushList?.Count > 0)
+                    {
+                        var findConfig = pushList.Find(c => c.TerminalId == deviceItem.Id) ?? new TerminalPushLiveConfigs();
+                        if (!string.IsNullOrEmpty(findConfig.Id))
+                        {
+                            isMerge = findConfig.IsMergeMode;
+                        }
+                    }
+                    var model = new DeviceMigratoryInfo()
+                    {
+                        DeviceCode = deviceItem.Id,
+                        CreateTime = deviceItem.CreateTime,
+                        UpdateTime = deviceItem.UpdateTime,
+                        Name = deviceItem.Name,
+                        SerialNumber = deviceItem.SerialNumber,
+                        Password = deviceItem.Password,
+                        Description = deviceItem.Description,
+                        DeviceModel = deviceItem.Model,
+                        DeviceType = deviceItem.IsSonopost ? "sonopost" : "US",
+                        HeadPicUrl = GetFileUrl(deviceItem.FileToken),
+                        DeviceSoftwareVersion = deviceItem.SoftwareVersion,
+                        SDKSoftwareVersion = "",
+                        OrganizationCode = deviceItem.Organization.Id,
+                        DepartmentCode = "",
+                        ShortCode = deviceItem.UniquedId,
+                        SystemVersion = deviceItem.OS,
+                        CPUModel = deviceItem.CPU,
+                        //合图
+                        MergedChannel = isMerge,
+                        DiagnosisModule = new List<DiagnosisModuleEnum>()
+                    };
+                    if (relationList?.Count > 0)
+                    {
+                        model.ReportPosterCodes = relationList.Where(c => c.TerminalCode == deviceItem.Id && !string.IsNullOrEmpty(c.PostConfigCode))?.Select(c => c.PostConfigCode)?.Distinct().ToList();
+                    }
+                    if (deviceItem.IsAIDiagnosis)
+                    {
+                        model.DiagnosisModule.Add(DiagnosisModuleEnum.LiverLesionDetect);
+                        model.DiagnosisModule.Add(DiagnosisModuleEnum.BreastLesionDetectBIRADS);
+                    }
+                    if (deviceItem.IsCarotidDiagnosis)
+                    {
+                        model.DiagnosisModule.Add(DiagnosisModuleEnum.CarotidPlaqueDetect);
+                    }
+                    orgDiagnosisModulesList.Add(new OrganizationDiagnosisModulesRelation()
+                    {
+                        OrganizationCode = model.OrganizationCode,
+                        DiagnosisModule = model.DiagnosisModule
+                    });
+                    deviceList.Add(model);
+                }
+                var request = new BatchInsertDeviceRequest
+                {
+                    DeviceMigratorys = deviceList,
+                    Token = DefaultToken
+                };
+                var result = await _jsonRpcProxy.Management.BatchInsertDeviceDataAsync(request);
+                if (result)
+                {
+                    Logger.WriteLineInfo($"Terminals Infos Migrate Successfully");
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"Send Terminals Infos Error, ex:{ex}");
+            }
+        }
+    
+
+        /// <summary>
+        /// 同步用户数据
+        /// </summary>
+        /// <returns></returns>
+        private async Task MigrateUserInfos()
+        {
+            var startTime = _migrateRecord.StartTime;
+            var endTime = _migrateRecord.EndTime;
+            var builder = Builders<Users>.Filter;
+            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
+            var userRecords = _usersDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x._id).ToList();
+            Logger.WriteLineInfo($"user totalCount:{userRecords.Count}");
+
+            var userCount = userRecords.Count;
+            var processNumbers = 0;
+            var processNumber = 100;
+            while (true)
+            {
+                var pendingRecords = userRecords.Skip(processNumbers).Take(processNumber)?.ToList() ?? new List<Users>();
                 var pendingCount = pendingRecords.Count;
                 if (pendingCount > 0)
                 {
-                    SendRemoteDiagnosisInfos(pendingRecords);
+                    await SendUserInfos(pendingRecords);
                     processNumbers += pendingCount;
                 }
                 if (processNumbers % (processNumber * 100) == 0)
                 {
-                    Logger.WriteLineInfo($"terminal record processing: {(processNumbers * 100 / terminalRecordCount)}%");
+                    Logger.WriteLineInfo($"user record processing: {(processNumbers * 100 / userCount)}%");
                 }
 
                 if (pendingCount < processNumber)
@@ -44,8 +451,135 @@ namespace Flyinsono.DBCopy.Tool.Service
                     break;
                 }
             }
+        }
 
-            Logger.WriteLineInfo($"Remote Diagnosis Infos Migrate Successfully");
+        /// <summary>
+        /// 发送用户数据
+        /// </summary>
+        /// <param name="userRecords"></param>
+        private async Task SendUserInfos(IList<Users> userRecords)
+        {
+            try
+            {
+                Logger.WriteLineInfo($"User Infos Migrate Starting");
+                var userList = new List<UserMigratoryInfo>();
+                foreach (var userItem in userRecords)
+                {
+                    var fullName = string.IsNullOrEmpty(userItem.FullName) ? userItem.LastName : userItem.FullName;
+                    var model = new UserMigratoryInfo()
+                    {
+                        UserCode = userItem._id,
+                        CreateTime = userItem.CreateTime,
+                        UpdateTime = userItem.UpdateTime,
+                        UserName = userItem.Name,
+                        SecretPassword = userItem.Password,
+                        Phone = userItem.Phone,
+                        Email = userItem.Email,
+                        NickName = fullName,
+                        FullName = fullName,
+                        HeadImageUrl = GetFileUrl(userItem.HeadImage),
+                        OrganizationCode = userItem.HospitalId,
+                        BindDevices = new List<string>(),
+                        UserState = userItem.IsActive ? UserInfoStateEnum.Activated : UserInfoStateEnum.Nonactivated,
+                        RoleCodes = new List<string>(),
+                        PasswordUpdateTime = DateTime.UtcNow,
+                        PasswordRecords = new List<string>() { userItem.Password },
+                        Signature = userItem.ElectronSignUrl
+                    };
+                    if (userItem?.Terminals?.Count > 0)
+                    {
+                        var terminalCodes = userItem.Terminals.Select(c => c.Id).Distinct().ToList();
+                        model.BindDevices = terminalCodes;
+                    }
+                    var locationInfo = _usersDBRepository.GetLastLocationByUserCode(userItem._id);
+                    bool isExpireUser = false;
+                    if (string.IsNullOrEmpty(locationInfo?.Id))
+                    {
+                        //没找到,长时间未登录
+                        isExpireUser = true;
+                    }
+                    if (isExpireUser)
+                    {
+                        //如果长期未登录,则默认医师
+                        model.UserRole = UserMigratoryRoleEnum.Role_CertifiedPhysician;
+                    }
+                    else
+                    {
+                        //角色枚举,如果开了远程会诊,则走这一套,如果没开远程会诊,则默认为医师
+                        if (userItem?.Features?.Count > 0 && userItem?.Features?.ToList()?.Exists(c => c.Name == "RemoteDiagnosis") == true)
+                        {
+                            var userRoleType = _usersDBRepository.GetLastUserRoleTypeByUserCode(userItem._id);
+                            if (userRoleType.ConsultationRoleType == ConsultationRoleType.Doctor)
+                            {
+                                model.UserRole = UserMigratoryRoleEnum.Role_CertifiedExpert;
+                            }
+                            else if (userRoleType.ConsultationRoleType == ConsultationRoleType.Assistant)
+                            {
+                                model.UserRole = UserMigratoryRoleEnum.Role_ExpertAssistant;
+                            }
+                            else
+                            {
+                                model.UserRole = UserMigratoryRoleEnum.Role_CertifiedPhysician;
+                            }
+                            if (userRoleType.ConsultationRoleType == ConsultationRoleType.HospitalAdmin)
+                            {
+                                model.IsDirector = true;
+                            }
+                            else
+                            {
+                                model.IsDirector = false;
+                            }
+                        }
+                        else
+                        {
+                            model.UserRole = UserMigratoryRoleEnum.Role_CertifiedPhysician;
+                        }
+                    }
+                    userList.Add(model);
+                }
+                var request = new BatchInsertUserRequest
+                {
+                    UserMigratorys = userList,
+                    Token = DefaultToken
+                };
+                var result = await _jsonRpcProxy.User.BatchInsertUserDataAsync(request);
+                if (result)
+                {
+                    Logger.WriteLineInfo($"User Infos Migrate Successfully");
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"Send User Infos Error, ex:{ex}");
+            }
         }
     }
+
+    /// <summary>
+    /// 设备和postconfig关系映射表
+    /// </summary>
+    internal class TerminalReportPosterRelation
+    { 
+        public string TerminalCode { get; set; }
+
+        public string PostConfigCode { get; set; }
+    }
+
+    internal class OrganizationDiagnosisModulesRelation
+    {
+        public string OrganizationCode { get; set; }
+
+        public IList<DiagnosisModuleEnum> DiagnosisModule { get; set; }
+    }
+
+    internal class RegionData
+    {
+        public string C { get; set; }
+
+        public string G { get; set; }
+
+        public string F { get; set; }
+
+        public string N { get; set; }
+    }
 }

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

@@ -8,7 +8,9 @@ using System.IO;
 using System.Linq;
 using System.Threading.Tasks;
 using WingInterfaceLibrary.DTO.DataCenter;
+using WingInterfaceLibrary.DTO.Management;
 using WingInterfaceLibrary.Internal.Request;
+using WingInterfaceLibrary.Request;
 
 namespace Flyinsono.DBCopy.Tool.Service
 {
@@ -20,6 +22,10 @@ namespace Flyinsono.DBCopy.Tool.Service
         private TerminalRecordReportStatesDBRepository _terminalRecordReportStatesDBRepository;
         private OrganizationsDBRepository _organizationsDBRepository;
         private TerminalsDBRepository _terminalsDBRepository;
+        private UsersDBRepository _usersDBRepository;
+        private PosterConfigsDBRepository _posterConfigsDBRepository;
+        private MigrateRecordDTO _migrateRecord;
+        private readonly string DefaultToken = "637f02a065ad47fbbe01b956919419c2";
 
         public MigrateService(string dcServiceUrl)
         {
@@ -29,6 +35,23 @@ namespace Flyinsono.DBCopy.Tool.Service
             _terminalRecordReportStatesDBRepository = new TerminalRecordReportStatesDBRepository();
             _organizationsDBRepository = new OrganizationsDBRepository();
             _terminalsDBRepository = new TerminalsDBRepository();
+            _usersDBRepository = new UsersDBRepository();
+            _posterConfigsDBRepository = new PosterConfigsDBRepository();
+            _migrateRecord = GetQueryMigrateTimeRange();
+        }
+
+        /// <summary>
+        /// 查询同步数据的时间范围
+        /// </summary>
+        /// <returns></returns>
+        private MigrateRecordDTO GetQueryMigrateTimeRange()
+        {
+            var request = new TokenRequest
+            {
+                Token = DefaultToken
+            };
+            var result = _jsonRpcProxy.User.QueryMigrateTimeAsync(request).Result;
+            return result;
         }
 
         public async Task MigrateRemoteDiagnosisInfosAsync()

+ 12 - 1
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/OrganizationsDBRepository.cs

@@ -11,8 +11,19 @@ using WingServerCommon.Mapper;
 
 namespace Flyinsono.DBCopy.Tool.Service.Repositories
 {
-    internal class OrganizationsDBRepository
+    internal class OrganizationsDBRepository : BaseDBRepository
     {
+        /// <summary>
+        /// 分页查询
+        /// </summary>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public IList<Organizations> GetOrganizationsRecords(FilterDefinition<Organizations> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.Organizations, filter)?.ToList() ?? new List<Organizations>();
+            return entities;
+        }
+
         public IList<Organizations> GetOrganizationByCodes(IList<string> orgCodes)
         {
             var builder = Builders<Organizations>.Filter;

+ 12 - 1
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/PosterConfigsDBRepository.cs

@@ -9,8 +9,19 @@ using System.Threading.Tasks;
 
 namespace Flyinsono.DBCopy.Tool.Service.Repositories
 {
-    internal class PosterConfigsDBRepository
+    internal class PosterConfigsDBRepository : BaseDBRepository
     {
+        /// <summary>
+        /// 分页查询
+        /// </summary>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public IList<PosterConfigs> GetPostConfigsRecords(FilterDefinition<PosterConfigs> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.PosterConfigs, filter)?.ToList() ?? new List<PosterConfigs>();
+            return entities;
+        }
+
         /// <summary>
         /// 过滤测试PosterConfigs
         /// </summary>

+ 94 - 1
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/TerminalsDBRepository.cs

@@ -11,8 +11,19 @@ using WingServerCommon.Mapper;
 
 namespace Flyinsono.DBCopy.Tool.Service.Repositories
 {
-    internal class TerminalsDBRepository
+    internal class TerminalsDBRepository : BaseDBRepository
     {
+        /// <summary>
+        /// 分页查询
+        /// </summary>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public IList<Terminals> GetTerminalsRecords(FilterDefinition<Terminals> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.Terminals, filter)?.ToList() ?? new List<Terminals>();
+            return entities;
+        }
+
         public IList<Terminals> GetTerminalByCodes(IList<string> terminalCodes)
         {
             var builder = Builders<Terminals>.Filter;
@@ -20,5 +31,87 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             var entities = MongoDbClientSingle.Instance.Terminals.Find(filter)?.ToList() ?? new List<Terminals>();
             return entities;
         }
+
+        /// <summary>
+        /// 获取所有设备推流配置
+        /// </summary>
+        /// <returns></returns>
+        public List<TerminalPushLiveConfigs> GetAllTerminalPushStream()
+        {
+            var builder = Builders<TerminalPushLiveConfigs>.Filter;
+            var filter = builder.Where(x => x.IsDeleted == false);
+            var entities = MongoDbClientSingle.Instance.TerminalPushLiveConfigs.Find(filter)?.ToList() ?? new List<TerminalPushLiveConfigs>();
+            return entities;
+        }
+
+        /// <summary>
+        /// 过滤测试设备
+        /// </summary>
+        /// <returns></returns>
+        public IList<Terminals> GetTestTerninalsByCondition()
+        {
+            Logger.WriteLineInfo($"Starting Query Wait Clear Terminals Data");
+            var terminals = new List<Terminals>();
+            var filterTerminals = CommonConfigManager.FilterTerminals;
+            var builder = Builders<Terminals>.Filter;
+            var filter = builder.Where(x => x.IsDeleted == false && x.CreateTime < CommonConfigManager.FilterGeneral.ClearDeadline);
+            FilterDefinition<Terminals> orFilter = builder.Where(c => (c.CreateAdmin != null && c.Organization == null) || c.SerialNumber.ToLower() == "unknown" || c.Model == null || c.Model.Length <= 0 || c.IsVirtualDevice == true);
+            if (filterTerminals?.Count > 0)
+            {
+                foreach (var item in filterTerminals)
+                {
+                    var tempFilter = builder.Where(c => c.UniquedId == item);
+                    orFilter = orFilter | tempFilter;
+                }
+            }
+            filter = filter & orFilter;
+            var terminalList = MongoDbClientSingle.Instance.Terminals.Find(filter)?.ToList();
+            if (terminalList?.Count > 0)
+            {
+                foreach (var item in terminalList)
+                {
+                    terminals.Add(item);
+                }
+            }
+            var deleteList = MongoDbClientSingle.Instance.Terminals.Find(c => c.IsDeleted == true)?.ToList();
+            if (deleteList?.Count > 0)
+            {
+                foreach (var item in deleteList)
+                {
+                    if (!terminals.Exists(c => c.Id == item.Id))
+                    {
+                        terminals.Add(item);
+                    }
+                }
+            }
+            Logger.WriteLineInfo($"End Query Wait Clear Terminals Data, Count: " + terminals.Count);
+            return terminals;
+        }
+
+        /// <summary>
+        /// 保存清理数据
+        /// </summary>
+        /// <param name="terminalList"></param>
+        /// <returns></returns>
+        public bool SaveClearData(IList<Terminals> terminalList)
+        {
+            if (terminalList?.Count > 0)
+            {
+                Logger.WriteLineInfo($"Starting Clear Terminals Data");
+                //先删除类似的备份数据在新增
+                var deleteIds = terminalList.Select(c => c.Id).Distinct().ToList();
+                var bakBuilder = Builders<TerminalsBak>.Filter;
+                var bakFilter = bakBuilder.In(x => x.Id, deleteIds);
+                var res = MongoDbClientSingle.Instance.TerminalsBak.DeleteMany(bakFilter);
+                var waitInsertUsers = terminalList.Where(c => c.IsDeleted == false).MappingTo<List<TerminalsBak>>();
+                MongoDbClientSingle.Instance.TerminalsBak.InsertMany(waitInsertUsers);
+                //删除正式表
+                var builder = Builders<Terminals>.Filter;
+                var filter = builder.In(x => x.Id, deleteIds);
+                var result = MongoDbClientSingle.Instance.Terminals.DeleteMany(filter);
+                Logger.WriteLineInfo($"Clear Terminals Data Completed, Count: " + terminalList.Count);
+            }
+            return true;
+        }
     }
 }

+ 0 - 87
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/TerninalsDBRepository.cs

@@ -1,87 +0,0 @@
-using Flyinsono.DBCopy.Tool.Entities.Config;
-using Flyinsono.DBCopy.Tool.Entities;
-using Flyinsono.DBCopy.Tool.Utilities;
-using MongoDB.Driver;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
-using WingServerCommon.Mapper;
-
-namespace Flyinsono.DBCopy.Tool.Service.Repositories
-{
-    internal class TerninalsDBRepository
-    {
-        /// <summary>
-        /// 过滤测试设备
-        /// </summary>
-        /// <returns></returns>
-        public IList<Terminals> GetTestTerninalsByCondition()
-        {
-            Logger.WriteLineInfo($"Starting Query Wait Clear Terminals Data");
-            var terminals = new List<Terminals>();
-            var filterTerminals = CommonConfigManager.FilterTerminals;
-            var builder = Builders<Terminals>.Filter;
-            var filter = builder.Where(x => x.IsDeleted == false && x.CreateTime < CommonConfigManager.FilterGeneral.ClearDeadline);
-            FilterDefinition<Terminals> orFilter = builder.Where(c => (c.CreateAdmin != null && c.Organization == null) || c.SerialNumber.ToLower() == "unknown" || c.Model == null || c.Model.Length <= 0 || c.IsVirtualDevice == true);
-            if (filterTerminals?.Count > 0)
-            {
-                foreach (var item in filterTerminals)
-                {
-                    var tempFilter = builder.Where(c => c.UniquedId == item);
-                    orFilter = orFilter | tempFilter;
-                }
-            }
-            filter = filter & orFilter;
-            var terminalList = MongoDbClientSingle.Instance.Terminals.Find(filter)?.ToList();
-            if (terminalList?.Count > 0)
-            {
-                foreach (var item in terminalList)
-                {
-                    terminals.Add(item);
-                }
-            }
-            var deleteList = MongoDbClientSingle.Instance.Terminals.Find(c => c.IsDeleted == true)?.ToList();
-            if (deleteList?.Count > 0)
-            {
-                foreach (var item in deleteList)
-                {
-                    if (!terminals.Exists(c => c.Id == item.Id))
-                    {
-                        terminals.Add(item);
-                    }
-                }
-            }
-            Logger.WriteLineInfo($"End Query Wait Clear Terminals Data, Count: " + terminals.Count);
-            return terminals;
-        }
-
-        /// <summary>
-        /// 保存清理数据
-        /// </summary>
-        /// <param name="terminalList"></param>
-        /// <returns></returns>
-        public bool SaveClearData(IList<Terminals> terminalList)
-        {
-            if (terminalList?.Count > 0)
-            {
-                Logger.WriteLineInfo($"Starting Clear Terminals Data");
-                //先删除类似的备份数据在新增
-                var deleteIds = terminalList.Select(c => c.Id).Distinct().ToList();
-                var bakBuilder = Builders<TerminalsBak>.Filter;
-                var bakFilter = bakBuilder.In(x => x.Id, deleteIds);
-                var res = MongoDbClientSingle.Instance.TerminalsBak.DeleteMany(bakFilter);
-                var waitInsertUsers = terminalList.Where(c => c.IsDeleted == false).MappingTo<List<TerminalsBak>>();
-                MongoDbClientSingle.Instance.TerminalsBak.InsertMany(waitInsertUsers);
-                //删除正式表
-                var builder = Builders<Terminals>.Filter;
-                var filter = builder.In(x => x.Id, deleteIds);
-                var result = MongoDbClientSingle.Instance.Terminals.DeleteMany(filter);
-                Logger.WriteLineInfo($"Clear Terminals Data Completed, Count: "+ terminalList.Count);
-            }
-            return true;
-        }
-    }
-}

+ 48 - 1
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/UsersDBRepository.cs

@@ -17,8 +17,19 @@ using System.Threading.Tasks;
 
 namespace Flyinsono.DBCopy.Tool.Service.Repositories
 {
-    internal class UsersDBRepository
+    internal class UsersDBRepository : BaseDBRepository
     {
+        /// <summary>
+        /// 分页查询用户
+        /// </summary>
+        /// <param name="filter"></param>
+        /// <returns></returns>
+        public IList<Users> GetUserRecords(FilterDefinition<Users> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.Users, filter)?.ToList() ?? new List<Users>();
+            return entities;
+        }
+    
         /// <summary>
         /// 过滤测试用户
         /// </summary>
@@ -121,6 +132,42 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             return users;
         }
 
+        /// <summary>
+        /// 获取最后登录记录
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public Locations GetLastLocationByUserCode(string code)
+        {
+            var location = new Locations();
+            var builder = Builders<Locations>.Filter;
+            var filter = builder.Where(x => x.IsDeleted == false && x.AccountId == code);
+            var locationList = MongoDbClientSingle.Instance.Locations.Find(filter)?.ToList();
+            if (locationList?.Count > 0)
+            {
+                location = locationList.OrderByDescending(c => c.CreateTime).FirstOrDefault() ?? new Locations();
+            }
+            return location;
+        }
+
+        /// <summary>
+        /// 获取最后角色操作记录
+        /// </summary>
+        /// <param name="code"></param>
+        /// <returns></returns>
+        public UserRoleTypes GetLastUserRoleTypeByUserCode(string code)
+        {
+            var type = new UserRoleTypes();
+            var builder = Builders<UserRoleTypes>.Filter;
+            var filter = builder.Where(x => x.IsDeleted == false && x.Id == code);
+            var locationList = MongoDbClientSingle.Instance.UserRoleTypes.Find(filter)?.ToList();
+            if (locationList?.Count > 0)
+            {
+                type = locationList.OrderByDescending(c => c.CreateTime).FirstOrDefault() ?? new UserRoleTypes();
+            }
+            return type;
+        }
+
         /// <summary>
         /// 过滤测试用户
         /// </summary>

+ 10 - 1
Tools/Flyinsono.DBCopy.Tool/Utilities/CommonConfigManager.cs

@@ -59,7 +59,10 @@ namespace Flyinsono.DBCopy.Tool.Utilities
                 {
                     FilterReportPosters = testConfig.FilterReportPosters;
                 }
-                
+                if (testConfig.FilterPatientType?.Count > 0)
+                {
+                    FilterPatientType = testConfig.FilterPatientType;
+                }                
             }
         }
 
@@ -107,5 +110,11 @@ namespace Flyinsono.DBCopy.Tool.Utilities
         /// 过滤指定的测试推送报告
         /// </summary>
         public static IList<string> FilterReportPosters { get; set; }
+
+        /// <summary>
+        /// 过滤指定的病人类型
+        /// </summary>
+        public static IList<string> FilterPatientType { get; set; }
+
     }
 }

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

@@ -197,6 +197,8 @@ namespace Flyinsono.DBCopy.Tool.Utilities
         public IMongoCollection<Patients> Patients { get; private set; }
         public IMongoCollection<TerminalRecordReportStates> TerminalRecordReportStates { get; private set; }
         public IMongoCollection<ReportInfoResultsBak> ReportInfoResultsBak { get; private set; }
+        public IMongoCollection<UserRoleTypes> UserRoleTypes { get; private set; }
+        public IMongoCollection<TerminalPushLiveConfigs> TerminalPushLiveConfigs { get; private set; }
         private void RegisterEntities()
         {
             Admins = GetCollection<Admins>("Admins");
@@ -241,6 +243,8 @@ namespace Flyinsono.DBCopy.Tool.Utilities
             PatientInfos = GetCollection<PatientInfos>("PatientInfos");
             Patients = GetCollection<Patients>("Patients");
             ReportInfoResultsBak = GetCollection<ReportInfoResultsBak>("ReportInfoResultsBak");
+            UserRoleTypes = GetCollection<UserRoleTypes>("UserRoleTypes");
+            TerminalPushLiveConfigs = GetCollection<TerminalPushLiveConfigs>("TerminalPushLiveConfigs");
         }
 
 

+ 9 - 8
Tools/Flyinsono.DBCopy.Tool/ViewModels/MainWindowViewModel.cs

@@ -143,7 +143,7 @@ namespace Flyinsono.DBCopy.Tool
 
             ConnectDbCommand = new ButtonCommand(OnConnectDb, "Connect DB");
 
-            DCServiceUrl = "http://192.168.6.128:8303/";
+            DCServiceUrl = "http://127.0.0.1/";
             MigrateCommand = new ButtonCommand(OnMigrate);
 
             this._runOnMainDispatcher = runOnMainDispatcher;
@@ -188,13 +188,13 @@ namespace Flyinsono.DBCopy.Tool
         private void OnConnectDb(object obj) // 新增OnConnectDb方法
         {
             var service = AppManager.Instance.GetManager<IClientTestManager>();
-            //service.ConnectDb("E:\\Arthur\\20230420175958.zip\\20230420175958");
-            if (string.IsNullOrEmpty(DbPath))
-            {
-                Logger.WriteLineWarn($"Mongodb server path is empty.");
-                return;
-            }
-            service.ConnectDb(DbPath);
+            service.ConnectDb("E:\\Arthur\\20230420175958.zip\\20230420175958");
+            //if (string.IsNullOrEmpty(DbPath))
+            //{
+            //    Logger.WriteLineWarn($"Mongodb server path is empty.");
+            //    return;
+            //}
+            //service.ConnectDb(DbPath);
         }
 
         private void OnMigrate(object obj)
@@ -213,6 +213,7 @@ namespace Flyinsono.DBCopy.Tool
                         try
                         {
                             var service = new MigrateService(DCServiceUrl);
+                            await service.MigrateBasicInfos();
                             await service.MigrateRemoteDiagnosisInfosAsync();
                             _processingMigrate = false;
                         }