Browse Source

备份库迁移在线视频和在线培训

Jeremy 1 year ago
parent
commit
162b6c9357

+ 164 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/UltrasonicClass.cs

@@ -0,0 +1,164 @@
+using MongoDB.Bson.Serialization.Attributes;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace Flyinsono.DBCopy.Tool.Entities
+{
+    internal class UltrasonicClass
+    {
+        public string Id { get; private set; }
+
+        public DateTime CreateTime { get; set; } = DateTime.MinValue;
+
+        public DateTime UpdateTime { get; set; } = DateTime.MinValue;
+
+        public bool IsDeleted { get; set; }
+
+        /// <summary>
+        /// 班级名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 班级描述
+        /// </summary>
+        public string Description { get; set; }
+
+        /// <summary>
+        /// 班级开班状态
+        /// </summary>
+        public ClassState State { get; set; }
+
+        /// <summary>
+        /// 老师
+        /// </summary>
+        public UltrasonicTeacher Teacher { get; set; }
+
+        /// <summary>
+        /// 班级包含的课程
+        /// </summary>
+        public ICollection<UltrasonicCourse> Courses { get; set; }
+
+        /// <summary>
+        /// 申请加入班级的学生
+        /// </summary>
+        public ICollection<UltrasonicApplyStudent> ApplyStudents { get; set; }
+
+        /// <summary>
+        /// Create admin info
+        /// </summary>
+        public AdminInfo CreateAdmin { get; set; }
+
+        /// <summary>
+        /// admin owner list
+        /// </summary>
+        public ICollection<AdminInfo> Owners { get; private set; }
+    }
+
+    /// <summary>
+    /// 班级状态
+    /// </summary>
+    public enum ClassState
+    {
+        ClassCreated = 0,
+        ClassStarted,
+        ClassEnded
+    }
+
+    class UltrasonicTeacher
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+        public string NickName { get; set; }
+        [BsonElementAttribute("LastName")]//2020-01-13 R00343 取消了first Name、Last Name 统一使用 FullName
+        public string FullName { get; set; }
+        public DateTime ReceiveTime { get; set; }
+    }
+
+    /// <summary>
+    /// 超声课程
+    /// </summary>
+    class UltrasonicCourse
+    {
+        public string CourseId { get; set; }
+
+        /// <summary>
+        /// 课程名称
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 小组列表
+        /// </summary>
+        public ICollection<UltrasonicGroup> UltrasonicGroups { get; set; }
+    }
+
+    /// <summary>
+    /// 超声小组
+    /// </summary>
+    class UltrasonicGroup
+    {
+        public string GroupId { get; set; }
+
+        /// <summary>
+        /// 助教
+        /// </summary>
+        public UltrasonicAssistant Assistant { get; set; }
+
+        /// <summary>
+        /// 学生列表
+        /// </summary>
+        public List<UltrasonicStudent> Students { get; set; }
+
+        /// <summary>
+        /// 是否是默认,只有一个默认组
+        /// </summary>
+        public bool IsDefault { get; set; }
+    }
+
+    class UltrasonicStudent
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+
+        public string NickName { get; set; }
+        [BsonElementAttribute("LastName")]//2020-01-13 R00343 取消了first Name、Last Name 统一使用 FullName
+        public string FullName { get; set; }
+
+        public DateTime ReceiveTime { get; set; }
+    }
+
+    class UltrasonicAssistant
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+
+        public string NickName { get; set; }
+        [BsonElementAttribute("LastName")]//2020-01-13 R00343 取消了first Name、Last Name 统一使用 FullName
+        public string FullName { get; set; }
+        public DateTime ReceiveTime { get; set; }
+
+        public bool IsDeleted { get; set; }
+    }
+
+    class UltrasonicApplyStudent
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+
+        public string NickName { get; set; }
+        [BsonElementAttribute("LastName")]//2020-01-13 R00343 取消了first Name、Last Name 统一使用 FullName
+        public string FullName { get; set; }
+
+        public DateTime ApplyTime { get; set; }
+    }
+}

+ 36 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/UserGroup.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Xml.Linq;
+
+namespace Flyinsono.DBCopy.Tool.Entities
+{
+    internal class UserGroup
+    {
+        public string Id { get; private set; }
+
+        public DateTime CreateTime { get; set; } = DateTime.MinValue;
+
+        public DateTime UpdateTime { get; set; } = DateTime.MinValue;
+
+        public bool IsDeleted { get; set; }
+        public string Name { get; set; }
+
+        public string Description { get; set; }
+
+        public ICollection<UserInfo> Users { get; private set; }
+
+        public AdminInfo CreateAdmin { get; set; }
+
+        public virtual ICollection<AdminInfo> Owners { get; private set; }
+    }
+
+    internal class UserInfo
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+    }
+}

+ 114 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/Video.cs

@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Flyinsono.DBCopy.Tool.Entities
+{
+    internal class Video
+    {
+        public string Id { get; private set; }
+
+        public DateTime CreateTime { get; set; } = DateTime.MinValue;
+
+        public DateTime UpdateTime { get; set; } = DateTime.MinValue;
+
+        public bool IsDeleted { get; set; }
+        /// <summary>
+        /// gets or set video title info
+        /// </summary>
+        public string Title { get; set; }
+        /// <summary>
+        ///gets or set video display poster Token
+        /// </summary>
+        public string PosterToken { get; set; }
+        /// <summary>
+        /// video player time duration 
+        /// </summary>
+        public int Duration { get; set; }
+        /// <summary>
+        /// gets or set Video size ,(uint :M)
+        /// </summary>
+        public int Size { get; set; }
+
+        public string Description { get; set; }
+        /// <summary>
+        ///  gets or set palye Video 
+        /// </summary>
+        public string Url { get; set; }
+        /// <summary>
+        /// gets or set enum video importance
+        /// </summary>
+        public VideoImportance Importance { get; set; }
+
+        public string CreatorId { get; set; }
+        /// <summary>
+        /// gets or set video permissions (enum:Public, Private, LinkToCourse)
+        /// </summary>
+        public VideoPermissions Permissions { get; set; }
+        /// <summary>
+        /// 可以观看视频用户的id
+        /// </summary>
+        public List<string> UserIds { get; set; }
+        /// <summary>
+        /// 可以观看视频用户组的id
+        /// </summary>
+        public List<string> UserGroupIds { get; set; }
+        /// <summary>
+        /// gets or set  this video link vcloud course info list
+        /// </summary>
+        public List<VideoLinkCourseInfo> Courses { get; set; }
+        /// <summary>
+        /// 可以观看视频 班级id
+        /// </summary>
+        public List<string> ClassIds { get; set; }
+        /// <summary>
+        /// 标签 课程不可录制、课程不可快进、同步教学文档
+        /// </summary>
+        public List<VideoLabels> Labels { get; set; } = new List<VideoLabels>();
+        /// <summary>
+        /// 教学文档名称
+        /// </summary>
+        public string TeachingDocumentName { get; set; } = string.Empty;
+        /// <summary>
+        /// 教学文档
+        /// </summary>
+        public string TeachingDocument { get; set; } = string.Empty;
+
+        public int RealBrowsedCount { get; set; }
+
+        public int BaseBrowsedCount { get; set; }
+        /// <summary>
+        /// 学生已完成学习记录列表
+        /// </summary>
+        public List<string> FinishedUserIds { get; set; }
+    }
+    public enum VideoImportance
+    {
+        Normal,
+        Importance
+    }
+    public enum VideoPermissions
+    {
+        Public,
+        Private,
+        LinkToCourse,
+        Fee,
+        AdminAvailable,
+        Standardized,
+    }
+    public enum VideoLabels
+    {
+        NoRecording,
+        NoFastForward,
+        TeachingDocument,
+    }
+    internal class VideoLinkCourseInfo
+    {
+        public string Id { get; set; }
+
+        public string Name { get; set; }
+
+    }
+}

+ 2 - 0
Tools/Flyinsono.DBCopy.Tool/MainWindow.xaml

@@ -65,6 +65,8 @@
                 <Label VerticalAlignment="Center">Migrate:</Label>
                 <Button Command="{Binding MigrateRemoteDiagnosisCommand}" MinWidth="110">RemoteDiagnoais</Button>
                 <Button Command="{Binding MigrateLiveConsultationCommand}" MinWidth="100">LiveConsultation</Button>
+                <Button Command="{Binding MigrateVideoCommand}" MinWidth="100">Video</Button>
+                <Button Command="{Binding MigrateCourseCommand}" MinWidth="100">Course</Button>
             </StackPanel>
 
         </Grid>

+ 239 - 43
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.cs

@@ -24,6 +24,10 @@ namespace Flyinsono.DBCopy.Tool.Service
         private TerminalsDBRepository _terminalsDBRepository;
         private ConsultationRecordDBRepository _consultationRecordDBRepository;
         private UsersDBRepository _usersDBRepository;
+        private VideoDBRepository _videoDBRepository;
+        private UserGroupDBRepository _userGroupDBRepository;
+        private UltrasonicClassDBRepository _ultrasonicClassDBRepository;
+        private CoursesDBRepository _coursesDBRepository;
 
         public MigrateService(string dcServiceUrl)
         {
@@ -35,6 +39,10 @@ namespace Flyinsono.DBCopy.Tool.Service
             _terminalsDBRepository = new TerminalsDBRepository();
             _consultationRecordDBRepository = new ConsultationRecordDBRepository();
             _usersDBRepository = new UsersDBRepository();
+            _videoDBRepository = new VideoDBRepository();
+            _userGroupDBRepository = new UserGroupDBRepository();
+            _ultrasonicClassDBRepository = new UltrasonicClassDBRepository();
+            _coursesDBRepository = new CoursesDBRepository();
         }
 
         /// <summary>
@@ -45,37 +53,11 @@ namespace Flyinsono.DBCopy.Tool.Service
         {
             Logger.WriteLineInfo($"Remote Diagnosis Infos Migrate Starting");
 
-            var terminalRecords = _terminalRecordDBRepository.GetTerminalRecords(Builders<TerminalRecords>.Filter.Where(x => x.IsDelete == false))
+            var source = _terminalRecordDBRepository.GetTerminalRecords(Builders<TerminalRecords>.Filter.Where(x => x.IsDelete == false))
                 .OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            Logger.WriteLineInfo($"terminal record totalCount:{terminalRecords.Count}");
+            OnMigrate("terminal record", source, SendRemoteDiagnosisInfos);
 
-            var terminalRecordCount = terminalRecords.Count;
-            var processedCount = 0;
-            var processNumber = 100;
-            var minute = DateTime.Now.Minute;
-            while (true)
-            {
-                var pendingRecords = terminalRecords.Skip(processedCount).Take(processNumber)?.ToList() ?? new List<TerminalRecords>();
-                var pendingCount = pendingRecords.Count;
-                if (pendingCount > 0)
-                {
-                    await SendRemoteDiagnosisInfos(pendingRecords);
-                    processedCount += pendingCount;
-                }
-                if (DateTime.Now.Minute != minute)
-                {
-                    minute = DateTime.Now.Minute;
-                    Logger.WriteLineInfo($"terminal record processing: {processedCount * 100 / terminalRecordCount}%");
-                }
-
-                if (pendingCount < processNumber)
-                {
-                    Logger.WriteLineInfo($"terminal record processing: 100%");
-                    break;
-                }
-            }
-
-            terminalRecords.Clear();
+            source.Clear();
             Logger.WriteLineInfo($"Remote Diagnosis Infos Migrate Successfully");
         }
 
@@ -87,41 +69,78 @@ namespace Flyinsono.DBCopy.Tool.Service
         {
             Logger.WriteLineInfo($"Live Consultation Infos Migrate Starting");
 
-            var consultationRecords = _consultationRecordDBRepository.GetTerminalRecords(Builders<ConsultationRecords>.Filter.Where(x => x.IsDeleted == false))
+            var source = _consultationRecordDBRepository.GetTerminalRecords(Builders<ConsultationRecords>.Filter.Where(x => x.IsDeleted == false))
+                .OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            OnMigrate("terminal record", source, SendLiveConsultationInfos);
+
+            source.Clear();
+            Logger.WriteLineInfo($"Live Consultation Infos Migrate Successfully");
+        }
+
+        /// <summary>
+        /// 备份库迁移在线视频数据
+        /// </summary>
+        /// <returns></returns>
+        public async Task MigrateOnlineVideoInfosAsync()
+        {
+            Logger.WriteLineInfo($"Online Video Infos Migrate Starting");
+
+            var videos = _videoDBRepository.GetVideos(Builders<Video>.Filter.Where(x => x.IsDeleted == false))
+                .OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            OnMigrate("video", videos, SendVideoInfos);
+
+            videos.Clear();
+            Logger.WriteLineInfo($"Online Video Infos Migrate Successfully");
+        }
+
+        /// <summary>
+        /// 备份库迁移在线培训数据
+        /// </summary>
+        /// <returns></returns>
+        public async Task MigrateOnlineTrainingInfosAsync()
+        {
+            Logger.WriteLineInfo($"Online Training Infos Migrate Starting");
+
+            var videos = _coursesDBRepository.GetCourses(Builders<Courses>.Filter.Where(x => x.IsDeleted == false))
                 .OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            Logger.WriteLineInfo($"consultation record totalCount:{consultationRecords.Count}");
+            OnMigrate("course", videos, SendCourseInfos);
 
-            var consultationRecordCount = consultationRecords.Count;
+            videos.Clear();
+            Logger.WriteLineInfo($"Online Training Infos Migrate Successfully");
+        }
+
+        private void OnMigrate<IEntity>(string name, IList<IEntity> source, Action<IList<IEntity>> migrateAction)
+        {
+            Logger.WriteLineInfo($"{name} totalCount:{source.Count}");
+
+            var totalCount = source.Count;
             var processedCount = 0;
             var processNumber = 100;
             var minute = DateTime.Now.Minute;
             while (true)
             {
-                var pendingRecords = consultationRecords.Skip(processedCount).Take(processNumber)?.ToList() ?? new List<ConsultationRecords>();
+                var pendingRecords = source.Skip(processedCount).Take(processNumber)?.ToList() ?? new List<IEntity>();
                 var pendingCount = pendingRecords.Count;
                 if (pendingCount > 0)
                 {
-                    await SendLiveConsultationInfos(pendingRecords);
+                    migrateAction.Invoke(pendingRecords);
                     processedCount += pendingCount;
                 }
                 if (DateTime.Now.Minute != minute)
                 {
                     minute = DateTime.Now.Minute;
-                    Logger.WriteLineInfo($"consultation record processing: {processedCount * 100 / consultationRecordCount}%");
+                    Logger.WriteLineInfo($"{name} processing: {processedCount * 100 / totalCount}%");
                 }
 
                 if (pendingCount < processNumber)
                 {
-                    Logger.WriteLineInfo($"consultation record processing: 100%");
+                    Logger.WriteLineInfo($"{name} processing: 100%");
                     break;
                 }
             }
-
-            consultationRecords.Clear();
-            Logger.WriteLineInfo($"Live Consultation Infos Migrate Successfully");
         }
 
-        private async Task SendRemoteDiagnosisInfos(IList<TerminalRecords> terminalRecords)
+        private void SendRemoteDiagnosisInfos(IList<TerminalRecords> terminalRecords)
         {
             try
             {
@@ -242,7 +261,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                 {
                     RemoteDiagnosisInfos = remoteDiagnosisInfos,
                 };
-                await _jsonRpcProxy.DataCenter.ReceiveRemoteDiagnosisAsync(request);
+                var result = _jsonRpcProxy.DataCenter.ReceiveRemoteDiagnosisAsync(request).Result;
             }
             catch (Exception ex)
             {
@@ -250,7 +269,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
         }
 
-        private async Task SendLiveConsultationInfos(IList<ConsultationRecords> consultationRecords)
+        private void SendLiveConsultationInfos(IList<ConsultationRecords> consultationRecords)
         {
             try
             {
@@ -387,7 +406,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                 {
                     LiveConsultationInfos = liveConsultationInfos,
                 };
-                await _jsonRpcProxy.DataCenter.ReceiveLiveConsultationAsync(request);
+                var result = _jsonRpcProxy.DataCenter.ReceiveLiveConsultationAsync(request).Result;
             }
             catch (Exception ex)
             {
@@ -395,6 +414,157 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
         }
 
+        private void SendVideoInfos(IList<Video> videos)
+        {
+            try
+            {
+                var userIds = videos.Select(x => x.CreatorId)
+                    .Union(videos.SelectMany(x => x.UserIds ?? new List<string>()))
+                    .Union(videos.SelectMany(x => x.FinishedUserIds ?? new List<string>()))
+                    .Distinct().ToList();
+                var users = _usersDBRepository.GetUserByCodes(userIds);
+                var orgIds = users.Select(x => x.HospitalId).Distinct().ToList();
+                var organizations = _organizationsDBRepository.GetOrganizationByCodes(orgIds);
+                var userGroupIds = videos.SelectMany(x => x.UserGroupIds??new List<string>()).Distinct().ToList();
+                var userGroups = _userGroupDBRepository.GetUserGroupByCodes(userGroupIds);
+                var classIds = videos.SelectMany(x => x.ClassIds ?? new List<string>()).Distinct().ToList();
+                var classes = _ultrasonicClassDBRepository.GetUltrasonicClassByCodes(classIds);
+                //var courseIds = videos.SelectMany(x => x.Courses ?? new List<VideoLinkCourseInfo>()).Select(x => x.Id).Distinct().ToList();
+                //var courses = _coursesDBRepository.GetCourseByCodes(courseIds);
+
+                var onlineVideoInfos = new List<OnlineVideoDTO>();
+                foreach (var video in videos)
+                {
+                    var creator = MapToUserView(organizations, users, video.CreatorId);
+                    var videoInfo = new OnlineVideoDTO
+                    {
+                        Code = video.Id,
+                        CreateTime = video.CreateTime,
+                        UpdateTime = video.UpdateTime,
+                        Name = video.Title,
+                        Poster = GetFileUrl(video.PosterToken),
+                        Duration = video.Duration,
+                        VideoSize = video.Size,
+                        Description = video.Description,
+                        VideoToken = video.Url,
+                        Importance = (VideoImportanceEnum)video.Importance,
+                        CreatorCode = video.CreatorId,
+                        CreatorName = creator?.Name,
+                        Permissions = (VideoPermissionsEnum)video.Permissions,
+                        Users = new List<UserView>(),
+                        UserGroups = new List<GroupView>(),
+                        Courses = new List<OnlineTrainingDTO>(),
+                        ClassInfos = new List<ClassView>(),
+                        Labels = new List<VideoLabelEnum>(),
+                        TeachingDocumentName = video.TeachingDocumentName,
+                        TeachingDocument = GetFileUrl(video.TeachingDocument),
+                        RealBrowsedCount = video.RealBrowsedCount,
+                        BaseBrowsedCount = video.BaseBrowsedCount,
+                        FinishedUsers = new List<UserView>(),
+                    };
+                    if (video.UserIds != null && video.UserIds.Any())
+                    {
+                        foreach (var item in video.UserIds)
+                        {
+                            var user = MapToUserView(organizations, users, item);
+                            if (user != null)
+                            {
+                                videoInfo.Users.Add(user);
+                            }
+                        }
+                    }
+                    if (video.FinishedUserIds != null && video.FinishedUserIds.Any())
+                    {
+                        foreach (var item in video.FinishedUserIds)
+                        {
+                            var user = MapToUserView(organizations, users, item);
+                            if (user != null)
+                            {
+                                videoInfo.FinishedUsers.Add(user);
+                            }
+                        }
+                    }
+                    if (video.Labels != null && video.Labels.Any())
+                    {
+                        foreach (var item in video.Labels)
+                        {
+                            videoInfo.Labels.Add((VideoLabelEnum)item);
+                        }
+                    }
+                    if (video.Courses != null && video.Courses.Any())
+                    {
+                        foreach (var item in video.Courses)
+                        {
+                            videoInfo.Courses.Add(new OnlineTrainingDTO
+                            {
+                                Code = item.Id,
+                                Name = item.Name,
+                            });
+                        }
+                    }
+                    if (video.UserGroupIds != null && video.UserGroupIds.Any())
+                    {
+                        foreach (var item in video.UserGroupIds)
+                        {
+                            var userGroup = MapToUserGroupView(userGroups, item);
+                            if (userGroup != null)
+                            {
+                                videoInfo.UserGroups.Add(userGroup);
+                            }
+                        }
+                    }
+                    if (video.ClassIds != null && video.ClassIds.Any())
+                    {
+                        foreach (var item in video.ClassIds)
+                        {
+                            var classInfo = MapToClassView(classes, item);
+                            if (classInfo != null)
+                            {
+                                videoInfo.ClassInfos.Add(classInfo);
+                            }
+                        }
+                    }
+                    onlineVideoInfos.Add(videoInfo);
+                }
+                var request = new ReceiveOnlineVideoRequest
+                {
+                    OnlineVideoInfos = onlineVideoInfos,
+                };
+                var result = _jsonRpcProxy.DataCenter.ReceiveOnlineVideoAsync(request).Result;
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"SendVideoInfos err, ex:{ex}");
+            }
+        }
+
+        private void SendCourseInfos(IList<Courses> courses)
+        {
+            try
+            {
+                var onlineTrainingInfos = new List<OnlineTrainingDTO>();
+                foreach (var video in courses)
+                {
+                    var videoInfo = new OnlineTrainingDTO
+                    {
+                        Code = video.Id,
+                        CreateTime = video.CreateTime,
+                        UpdateTime = video.UpdateTime,
+                    };
+                    onlineTrainingInfos.Add(videoInfo);
+                }
+                var request = new ReceiveOnlineTrainingRequest
+                {
+                    OnlineTrainingInfos = onlineTrainingInfos,
+                };
+                var result = _jsonRpcProxy.DataCenter.ReceiveOnlineTrainingAsync(request).Result;
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineWarn($"SendCourseInfos err, ex:{ex}");
+            }
+        }
+
         private string GetFileUrl(string fileUrl)
         {
             var prefix = "1!U$";
@@ -467,6 +637,32 @@ namespace Flyinsono.DBCopy.Tool.Service
             return null;
         }
 
+        private GroupView MapToUserGroupView(IList<UserGroup> userGroups, string? userGroupId)
+        {
+            var userGroup = userGroups.FirstOrDefault(x => x.Id == userGroupId);
+            if (userGroup != null)
+            {
+                return new GroupView
+                {
+                    Code = userGroup.Id,
+                    Name = userGroup.Name,
+                };
+            }
+            return null;
+        }
 
+        private ClassView MapToClassView(IList<UltrasonicClass> classes, string? classId)
+        {
+            var classInfo = classes.FirstOrDefault(x => x.Id == classId);
+            if (classInfo != null)
+            {
+                return new ClassView
+                {
+                    Code = classInfo.Id,
+                    Name = classInfo.Name,
+                };
+            }
+            return null;
+        }
     }
 }

+ 15 - 1
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/CoursesDBRepository.cs

@@ -10,8 +10,22 @@ using System.Threading.Tasks;
 
 namespace Flyinsono.DBCopy.Tool.Service.Repositories
 {
-    internal class CoursesDBRepository
+    internal class CoursesDBRepository : BaseDBRepository
     {
+        public IList<Courses> GetCourses(FilterDefinition<Courses> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.Courses, filter)?.ToList() ?? new List<Courses>();
+            return entities;
+        }
+
+        public IList<Courses> GetCourseByCodes(IList<string> courseIds)
+        {
+            var builder = Builders<Courses>.Filter;
+            var filter = builder.Where(x => courseIds.Contains(x.Id));
+            var entities = MongoDbClientSingle.Instance.Courses.Find(filter)?.ToList() ?? new List<Courses>();
+            return entities;
+        }
+
         /// <summary>
         /// 过滤测试 课程
         /// </summary>

+ 24 - 0
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/UltrasonicClassDBRepository.cs

@@ -0,0 +1,24 @@
+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 UltrasonicClassDBRepository
+    {
+        public IList<UltrasonicClass> GetUltrasonicClassByCodes(IList<string> classIds)
+        {
+            var builder = Builders<UltrasonicClass>.Filter;
+            var filter = builder.Where(x => classIds.Contains(x.Id));
+            var entities = MongoDbClientSingle.Instance.UltrasonicClasses.Find(filter)?.ToList() ?? new List<UltrasonicClass>();
+            return entities;
+        }
+    }
+}

+ 24 - 0
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/UserGroupDBRepository.cs

@@ -0,0 +1,24 @@
+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 UserGroupDBRepository
+    {
+        public IList<UserGroup> GetUserGroupByCodes(IList<string> userGroupCodes)
+        {
+            var builder = Builders<UserGroup>.Filter;
+            var filter = builder.Where(x => userGroupCodes.Contains(x.Id));
+            var entities = MongoDbClientSingle.Instance.UserGroups.Find(filter)?.ToList() ?? new List<UserGroup>();
+            return entities;
+        }
+    }
+}

+ 22 - 0
Tools/Flyinsono.DBCopy.Tool/Service/Repositories/VideoDBRepository.cs

@@ -0,0 +1,22 @@
+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 VideoDBRepository : BaseDBRepository
+    {
+        public IList<Video> GetVideos(FilterDefinition<Video> filter)
+        {
+            var entities = LargerQuery(MongoDbClientSingle.Instance.Videos, filter)?.ToList() ?? new List<Video>();
+            return entities;
+        }
+    }
+}

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

@@ -197,6 +197,9 @@ 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<Video> Videos { get; private set; }
+        public IMongoCollection<UserGroup> UserGroups { get; private set; }
+        public IMongoCollection<UltrasonicClass> UltrasonicClasses { get; private set; }
         private void RegisterEntities()
         {
             Admins = GetCollection<Admins>("Admins");
@@ -241,6 +244,9 @@ namespace Flyinsono.DBCopy.Tool.Utilities
             PatientInfos = GetCollection<PatientInfos>("PatientInfos");
             Patients = GetCollection<Patients>("Patients");
             ReportInfoResultsBak = GetCollection<ReportInfoResultsBak>("ReportInfoResultsBak");
+            Videos = GetCollection<Video>("Videos");
+            UserGroups = GetCollection<UserGroup>("UserGroups");
+            UltrasonicClasses = GetCollection<UltrasonicClass>("UltrasonicClasses");
         }
 
 

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

@@ -19,6 +19,8 @@ namespace Flyinsono.DBCopy.Tool
         private string _dcServiceUrl;
         private static bool _migrateRemoteDisgnosis = false;
         private static bool _migrateLiveConsultation = false;
+        private static bool _migrateVideo = false;
+        private static bool _migrateCourse = false;
 
         private readonly Action<Action> _runOnMainDispatcher;
 
@@ -125,6 +127,10 @@ namespace Flyinsono.DBCopy.Tool
 
         public ButtonCommand MigrateLiveConsultationCommand { get; set; }
 
+        public ButtonCommand MigrateVideoCommand { get; set; }
+
+        public ButtonCommand MigrateCourseCommand { get; set; }
+
 
 
         public MainWindowViewModel(Action<Action> runOnMainDispatcher)
@@ -149,6 +155,8 @@ namespace Flyinsono.DBCopy.Tool
             DCServiceUrl = "http://192.168.6.128:8303/";
             MigrateRemoteDiagnosisCommand = new ButtonCommand(OnMigrateRemoteDiagnosis);
             MigrateLiveConsultationCommand = new ButtonCommand(OnMigrateLiveConsultation);
+            MigrateVideoCommand = new ButtonCommand(OnMigrateVideo);
+            MigrateCourseCommand = new ButtonCommand(OnMigrateCourse);
 
             this._runOnMainDispatcher = runOnMainDispatcher;
         }
@@ -278,6 +286,84 @@ namespace Flyinsono.DBCopy.Tool
                 Logger.WriteLineWarn($"DCService Url Is Empty");
             }
         }
+
+        private void OnMigrateVideo(object obj)
+        {
+            if (_migrateVideo)
+            {
+                Logger.WriteLineWarn($"Migrate Video Processing");
+            }
+            else if (!string.IsNullOrWhiteSpace(DCServiceUrl))
+            {
+                try
+                {
+                    _migrateVideo = true;
+                    Task.Run(async () =>
+                    {
+                        try
+                        {
+                            var service = new MigrateService(DCServiceUrl);
+                            await service.MigrateOnlineVideoInfosAsync();
+                        }
+                        catch (Exception ex)
+                        {
+                            Logger.WriteLineWarn($"MigrateOnlineVideoInfosAsync err, ex:{ex}");
+                        }
+                        finally
+                        {
+                            _migrateVideo = false;
+                        }
+                    });
+                }
+                catch (Exception ex)
+                {
+                    Logger.WriteLineWarn($"MigrateOnlineVideoInfosAsync err, ex:{ex}");
+                }
+            }
+            else
+            {
+                Logger.WriteLineWarn($"DCService Url Is Empty");
+            }
+        }
+
+        private void OnMigrateCourse(object obj)
+        {
+            if (_migrateCourse)
+            {
+                Logger.WriteLineWarn($"Migrate Course Processing");
+            }
+            else if (!string.IsNullOrWhiteSpace(DCServiceUrl))
+            {
+                try
+                {
+                    _migrateCourse = true;
+                    Task.Run(async () =>
+                    {
+                        try
+                        {
+                            var service = new MigrateService(DCServiceUrl);
+                            await service.MigrateOnlineTrainingInfosAsync();
+                        }
+                        catch (Exception ex)
+                        {
+                            Logger.WriteLineWarn($"MigrateOnlineTrainingInfosAsync err, ex:{ex}");
+                        }
+                        finally
+                        {
+                            _migrateCourse = false;
+                        }
+                    });
+                }
+                catch (Exception ex)
+                {
+                    Logger.WriteLineWarn($"MigrateOnlineTrainingInfosAsync err, ex:{ex}");
+                }
+            }
+            else
+            {
+                Logger.WriteLineWarn($"DCService Url Is Empty");
+            }
+        }
     }
 
 }