Browse Source

【用户反馈】【数据同步】线上环境2023-11-19 16:39之后的数据未正常同步至新平台(已知数据有:诺威宠物医院科技六路分院、zyx)

denny 1 year ago
parent
commit
f8b113dc84

+ 3 - 0
Tools/Flyinsono.DBCopy.Tool/Config/cacheSyn.json

@@ -0,0 +1,3 @@
+{
+
+}

+ 1 - 1
Tools/Flyinsono.DBCopy.Tool/Entities/Admins.cs

@@ -8,7 +8,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
 {
     internal class Admins
     {
-        public string _id { get; set; }
+        public string Id { get; set; }
         public DateTime CreateTime { get; set; }
         public DateTime UpdateTime { get; set; }
         public bool IsDeleted { get; set; }

+ 27 - 0
Tools/Flyinsono.DBCopy.Tool/Entities/Config/CacheSynData.cs

@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace Flyinsono.DBCopy.Tool.Entities.Config
+{
+    public class CacheSynData
+    {
+        public ConcurrentDictionary<string, ConcurrentDictionary<string, DateTime>> CacheDic { get; set; } = new();
+}
+
+    //public class CacheBasicInfo
+    //{ 
+    //    /// <summary>
+    //    /// id
+    //    /// </summary>
+    //    public string Id { get; set; }
+
+    //    /// <summary>
+    //    /// 缓存时间
+    //    /// </summary>
+    //    public DateTime CacheTime { get; set; }
+    //}
+}

+ 1 - 1
Tools/Flyinsono.DBCopy.Tool/Entities/CourseStudents.cs

@@ -16,6 +16,6 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
         public bool IsDeleted { get; set; }
 
-        public IList<string> Students { get; private set; }
+        public IList<string> Students { get; set; }
     }
 }

+ 3 - 3
Tools/Flyinsono.DBCopy.Tool/Entities/Courses.cs

@@ -80,7 +80,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
         /// <summary>
         /// channel data infos,which is applied from NE
         /// </summary>
-        public IList<ChannelDataInfo> ChannelDatas { get; private set; }
+        public IList<ChannelDataInfo> ChannelDatas { get; set; }
 
         /// <summary>
         /// Create admin info
@@ -90,7 +90,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
         /// <summary>
         /// admin owner list
         /// </summary>
-        public ICollection<AdminInfo> Owners { get; private set; }
+        public ICollection<AdminInfo> Owners { get; set; }
 
         /// <summary>
         /// teacher state
@@ -167,7 +167,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
         /// <summary>
         /// channel description
         /// </summary>
-        public ChannelDescription Description { get; private set; }
+        public ChannelDescription Description { get; set; }
 
         /// <summary>
         /// channel Http url

+ 1 - 1
Tools/Flyinsono.DBCopy.Tool/Entities/DiagnosisResult.cs

@@ -60,7 +60,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
     internal class PatientInfo
     {
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
         public DateTime CreateTime { get; set; } = DateTime.MinValue;
 

+ 2 - 2
Tools/Flyinsono.DBCopy.Tool/Entities/ExaminationPaper.cs

@@ -116,9 +116,9 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
     internal class ExamTemplates
     {
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
         /// <summary>

+ 6 - 6
Tools/Flyinsono.DBCopy.Tool/Entities/Locations.cs

@@ -15,11 +15,11 @@ namespace Flyinsono.DBCopy.Tool.Entities
         public DateTime UpdateTime { get; set; } = DateTime.MinValue;
 
         public bool IsDeleted { get; set; }
-        public string AccountId { get; private set; }
-        public string IpAddress { get; private set; }
-        public int AccountType { get; private set; }
-        public string CountryCode { get; private set; }
-        public string ProvinceCode { get; private set; }
-        public string CityCode { get; private set; }
+        public string AccountId { get; set; }
+        public string IpAddress { get; set; }
+        public int AccountType { get; set; }
+        public string CountryCode { get; set; }
+        public string ProvinceCode { get; set; }
+        public string CityCode { get; set; }
     }
 }

+ 4 - 4
Tools/Flyinsono.DBCopy.Tool/Entities/ReportInfoResults.cs

@@ -1045,23 +1045,23 @@ namespace Flyinsono.DBCopy.Tool.Entities
         /// <summary>
         /// Gets or sets the input tag id.
         /// </summary>
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// Ges the input tag name.e.g. PatientName, ReportDescription
         /// </summary>
-        public string Name { get; private set; }
+        public string Name { get; set; }
         public string DisplayName { get; set; }
 
         /// <summary>
         /// Gets the value to indicate whether the element tag is default or added by user.
         /// </summary>
-        public bool IsDefault { get; private set; }
+        public bool IsDefault { get; set; }
 
         /// <summary>
         /// Gets the element tag type.
         /// </summary>
-        public ElementTagType ElementTagType { get; private set; }
+        public ElementTagType ElementTagType { get; set; }
 
         /// <summary>
         /// Initialize <see cref="ElementTag"/>

+ 4 - 4
Tools/Flyinsono.DBCopy.Tool/Entities/TerminalDatas.cs

@@ -194,9 +194,9 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
     internal class TerminalDataComment
     {
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
         public AdminInfo User { get; set; }
@@ -208,9 +208,9 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
     internal class TerminalDataFile
     {
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
         /// <summary>

+ 3 - 3
Tools/Flyinsono.DBCopy.Tool/Entities/TerminalRecords.cs

@@ -98,11 +98,11 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
     internal class PatientDocInfo
     {
-        public string IdentityCardId { get; private set; }
+        public string IdentityCardId { get; set; }
 
-        public string FirstName { get; private set; }
+        public string FirstName { get; set; }
 
-        public string LastName { get; private set; }
+        public string LastName { get; set; }
 
         public DateTime? Birthday { get; set; }
 

+ 1 - 1
Tools/Flyinsono.DBCopy.Tool/Entities/UltrasonicClass.cs

@@ -57,7 +57,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
         /// <summary>
         /// admin owner list
         /// </summary>
-        public ICollection<AdminInfo> Owners { get; private set; }
+        public ICollection<AdminInfo> Owners { get; set; }
     }
 
     /// <summary>

+ 2 - 2
Tools/Flyinsono.DBCopy.Tool/Entities/UserGroup.cs

@@ -20,11 +20,11 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
         public string Description { get; set; }
 
-        public ICollection<UserInfo> Users { get; private set; }
+        public IList<UserInfo> Users { get; set; }
 
         public AdminInfo CreateAdmin { get; set; }
 
-        public virtual ICollection<AdminInfo> Owners { get; private set; }
+        public virtual IList<AdminInfo> Owners { get; set; }
     }
 
     internal class UserInfo

+ 2 - 2
Tools/Flyinsono.DBCopy.Tool/Entities/UserLinkVideos.cs

@@ -14,7 +14,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
         public DateTime UpdateTime { get; set; }
         public bool IsDeleted { get; set; }
-        public string UserId { get; private set; }
-        public IList<string> VideoIds { get; private set; }
+        public string UserId { get; set; }
+        public IList<string> VideoIds { get; set; }
     }
 }

+ 9 - 9
Tools/Flyinsono.DBCopy.Tool/Entities/Users.cs

@@ -8,7 +8,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
 {
     internal class Users
     {
-        public string _id { get; set; }
+        public string Id { get; set; }
         public DateTime CreateTime { get; set; }
         public DateTime UpdateTime { get; set; }
         public bool IsDeleted { get; set; }
@@ -33,13 +33,13 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
         public IList<OrganizationInfo> Organizations { get; set; }
 
-        public IList<PushFailedMessage> PushFailedMessages { get; private set; }
+        public IList<PushFailedMessage> PushFailedMessages { get; set; }
 
         public IList<PushFailedSystemMessage> PushFailedSystemMessages { get;  set; }
 
         public ICollection<NoReadMessage> NoReadMessages { get;  set; }
 
-        public IList<AdminInfo> Owners { get; private set; }
+        public IList<AdminInfo> Owners { get; set; }
 
         public byte[] SmallHeadImage { get; set; }
 
@@ -217,9 +217,9 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
     internal class PushFailedSystemMessage
     {
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
         public string Content { get; set; }
@@ -258,9 +258,9 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
         public int SessionSource { get; set; }
 
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
     }
@@ -277,7 +277,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
 
         public string Id { get; private set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
     }
@@ -289,7 +289,7 @@ namespace Flyinsono.DBCopy.Tool.Entities
     {
         public string Id { get; private set; }
 
-        public DateTime CreateTime { get; private set; }
+        public DateTime CreateTime { get; set; }
 
         public DateTime UpdateTime { get; set; }
 

+ 4 - 4
Tools/Flyinsono.DBCopy.Tool/Extensions/ElementValue.cs

@@ -859,23 +859,23 @@ namespace Flyinsono.DBCopy.Tool.Extensions
         /// <summary>
         /// Gets or sets the input tag id.
         /// </summary>
-        public string Id { get; private set; }
+        public string Id { get; set; }
 
         /// <summary>
         /// Ges the input tag name.e.g. PatientName, ReportDescription
         /// </summary>
-        public string Name { get; private set; }
+        public string Name { get; set; }
         public string DisplayName { get; set; }
 
         /// <summary>
         /// Gets the value to indicate whether the element tag is default or added by user.
         /// </summary>
-        public bool IsDefault { get; private set; }
+        public bool IsDefault { get; set; }
 
         /// <summary>
         /// Gets the element tag type.
         /// </summary>
-        public ElementTagType ElementTagType { get; private set; }
+        public ElementTagType ElementTagType { get; set; }
 
         /// <summary>
         /// Initialize <see cref="ElementTag"/>

+ 187 - 37
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.BasicInfo.cs

@@ -28,6 +28,11 @@ using NPOI.HPSF;
 using NPOI.SS.Formula.Functions;
 using System.IO;
 using WingInterfaceLibrary.Request;
+using WingInterfaceLibrary.DTO.ReportTemplate;
+using Newtonsoft.Json.Linq;
+using System.Net.Http.Json;
+using WingInterfaceLibrary.DTO.Measure;
+using System.Collections.Concurrent;
 
 namespace Flyinsono.DBCopy.Tool.Service
 {
@@ -39,7 +44,7 @@ namespace Flyinsono.DBCopy.Tool.Service
         public async Task MigrateBasicInfos(SyncDBEnum syncType)
         {
             Logger.WriteLineInfo($"Basic Infos Migrate Starting");
-            //await MigrateReportTemplateInfos(syncType);
+            await MigrateReportTemplateInfos(syncType);
             var relationList = await MigrateReportPosterInfos(syncType);
             var orgDiagnosisModulesList = await MigrateTerminalsInfos(relationList, syncType);
             await MigrateOrganizationInfos(orgDiagnosisModulesList, syncType);
@@ -446,10 +451,10 @@ namespace Flyinsono.DBCopy.Tool.Service
                     //根据机构找到所有的用户
                     var builder = Builders<Users>.Filter;
                     var filter = builder.Where(x => x.IsDeleted == false && x.HospitalId == organizationItem.Id && x.Organizations != null && x.Organizations.Any(c => c.Id == organizationItem.Id));
-                    var users = _usersDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x._id)?.ToList();
+                    var users = _usersDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id)?.ToList();
                     if (users?.Count > 0)
                     {
-                        model.UserCodes = users.Select(c => c._id).Distinct().ToList();
+                        model.UserCodes = users.Select(c => c.Id).Distinct().ToList();
                     }
                     orgList.Add(model);
                 }
@@ -595,8 +600,8 @@ namespace Flyinsono.DBCopy.Tool.Service
                 {
                     foreach (var item in userInfo)
                     {
-                        var findEntity = vinnoDataList.UserList.FirstOrDefault(c => c._id == item._id);
-                        if (!string.IsNullOrEmpty(findEntity?._id))
+                        var findEntity = vinnoDataList.UserList.FirstOrDefault(c => c.Id == item.Id);
+                        if (!string.IsNullOrEmpty(findEntity?.Id))
                         {
                             if (item.Terminals?.Count > 0)
                             {
@@ -642,11 +647,11 @@ namespace Flyinsono.DBCopy.Tool.Service
                     }
                 }
                 //排除omena
-                vinnoDataList.UserList = vinnoDataList.UserList.Where(c => c._id != "EB3BB78AA2AB4D12A4BDCD81A938D642"
-                 && c._id != "BA571C988B324A33A606EA48EBEC6442" && c._id != "404DC8C49B4C459D8FC15B6F426F6FA4"
-                  && c._id != "FAC3E1EBCB334D05A21D1D6B171AB861" && c._id != "2A634D6B9DEE4158A4370CC525531F02"
-                   && c._id != "D648285F09174AD9A31B8C862DE133C8" && c._id != "591A69C2DC864122943870D1190D29C1"
-                    && c._id != "3B1A112E368147B5800A7B19AAF6E104").ToList();
+                vinnoDataList.UserList = vinnoDataList.UserList.Where(c => c.Id != "EB3BB78AA2AB4D12A4BDCD81A938D642"
+                 && c.Id != "BA571C988B324A33A606EA48EBEC6442" && c.Id != "404DC8C49B4C459D8FC15B6F426F6FA4"
+                  && c.Id != "FAC3E1EBCB334D05A21D1D6B171AB861" && c.Id != "2A634D6B9DEE4158A4370CC525531F02"
+                   && c.Id != "D648285F09174AD9A31B8C862DE133C8" && c.Id != "591A69C2DC864122943870D1190D29C1"
+                    && c.Id != "3B1A112E368147B5800A7B19AAF6E104").ToList();
                 foreach (var item in vinnoDataList.UserList)
                 {
                     if (item.HospitalId == "F5A6731DC8444932BE543DB98604E66A")
@@ -835,18 +840,21 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// <returns></returns>
         private async Task MigratePrintDataInfos()
         {
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<PrinterDrives>.Filter;
             var filter = builder.Where(x => ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
-            var adminRecords = _adminDBRepository.GetPrintRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
-            Logger.WriteLineInfo($"Print totalCount:{adminRecords.Count}");
+            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;
             var pageSize = 100;
-            var adminCount = adminRecords.Count;
+            var adminCount = printerDrives.Count;
             while (true)
             {
-                var pendingRecords = adminRecords.Skip(pageIndex * pageSize).Take(pageSize)?.ToList() ?? new List<PrinterDrives>();
+                var pendingRecords = printerDrives.Skip(pageIndex * pageSize).Take(pageSize)?.ToList() ?? new List<PrinterDrives>();
                 var pendingCount = pendingRecords.Count;
                 if (pendingCount > 0)
                 {
@@ -942,11 +950,13 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
             else
             {
-                var startTime = _migrateRecord.StartTime;
+                var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
                 var endTime = _migrateRecord.EndTime;
                 var builder = Builders<Patch>.Filter;
                 var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-                patchInfos = _adminDBRepository.GetPatches(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+                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>();
 
@@ -1084,6 +1094,101 @@ namespace Flyinsono.DBCopy.Tool.Service
             Logger.WriteLineInfo($"Users Infos Migrate Successfully");
         }
 
+        
+        /// <summary>
+        /// 数据转换
+        /// </summary>
+        /// <typeparam name="T"></typeparam>
+        /// <param name="tempRecords"></param>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        private async Task<List<T>> FilterData<T>(List<T> tempRecords, string key) where T : class, new()
+        {
+            var records = new List<T>();
+
+            if (tempRecords?.Count() > 0)
+            {
+                var tempReportTemplateData = new ConcurrentDictionary<string, DateTime>();
+                foreach (var t in tempRecords)
+                {
+                    if (t != null)
+                    {
+                        var id = "";
+                        var createTime = DateTime.MinValue;
+                        var updateTime = DateTime.MinValue;
+                        foreach (var childItem in t.GetType().GetProperties())
+                        {
+                            if (childItem.Name == "Id")
+                            {
+                                id = childItem.GetValue(t).ToString();
+                            }
+                            else if (childItem.Name == "CreateTime")
+                            {
+                                createTime = Convert.ToDateTime(childItem.GetValue(t));
+                            }
+                            else if (childItem.Name == "UpdateTime")
+                            {
+                                updateTime = Convert.ToDateTime(childItem.GetValue(t));
+                            }
+                        }
+                        if (!tempReportTemplateData.Keys.Contains(id))
+                        {
+                            var cacheTime = createTime > updateTime ? createTime : updateTime;
+                            tempReportTemplateData.TryAdd(id, cacheTime);
+                        }
+                    }
+                }
+                if (CommonConfigManager.CacheSynDataInfo.CacheDic.Keys.Contains(key) && CommonConfigManager.CacheSynDataInfo.CacheDic[key]?.Count > 0)
+                {
+                    foreach (var templateInfo in tempReportTemplateData.Keys)
+                    {
+                        //.Exists(c => c.Id == templateInfo.Id && c.CacheTime == templateInfo.CacheTime)
+                        if (CommonConfigManager.CacheSynDataInfo.CacheDic[key].Keys.Contains(templateInfo) && CommonConfigManager.CacheSynDataInfo.CacheDic[key][templateInfo] == tempReportTemplateData[templateInfo])
+                        {
+                            //存在,表示已经处理过
+                        }
+                        else
+                        {
+                            //不存在,表示没处理过
+                            CommonConfigManager.CacheSynDataInfo.CacheDic[key].TryAdd(templateInfo, tempReportTemplateData[templateInfo]);
+                            foreach (var t in tempRecords)
+                            {
+                                if (t != null)
+                                {
+                                    var curId = "";
+                                    foreach (var childItem in t.GetType().GetProperties())
+                                    {
+                                        if (childItem.Name == "Id")
+                                        {
+                                            curId = childItem.GetValue(t).ToString();
+                                            break;
+                                        }
+                                    }
+                                    if (curId == templateInfo)
+                                    {
+                                        records.Add(t);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                else
+                {
+                    if (CommonConfigManager.CacheSynDataInfo.CacheDic.Keys.Contains(key))
+                    {
+                        CommonConfigManager.CacheSynDataInfo.CacheDic[key] = tempReportTemplateData;
+                    }
+                    else
+                    {
+                        CommonConfigManager.CacheSynDataInfo.CacheDic.TryAdd(key, tempReportTemplateData);
+                    }
+                    records = tempRecords;
+                }
+            }
+            return records;
+        }
+
         /// <summary>
         /// ͬ同步报告模板
         /// </summary>
@@ -1091,11 +1196,15 @@ namespace Flyinsono.DBCopy.Tool.Service
         public async Task MigrateReportTemplateInfos(SyncDBEnum syncType)
         {
             var startTime = _migrateRecord.StartTime;
+            startTime = startTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<ReportTemplates>.Filter;
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
             //var filter = builder.Where(x => x.IsDeleted == false);
-            var reportTemplateRecords = _reportTemplateDBRepository.GetReportTemplateRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            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;
             var pageSize = 100;
@@ -1262,11 +1371,14 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// <returns></returns>
         private async Task MigrateAdminInfos(SyncDBEnum syncType)
         {
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Admins>.Filter;
             var filter = builder.Where(x => x.Name.ToLower() != "admin" && ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
-            var adminRecords = _adminDBRepository.GetAdminsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x._id).ToList();
+            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;
             var pageSize = 100;
@@ -1312,7 +1424,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                     }
                     var model = new AdminMigratoryInfo()
                     {
-                        AdminCode = adminItem._id,
+                        AdminCode = adminItem.Id,
                         CreateTime = adminItem.CreateTime,
                         UpdateTime = adminItem.UpdateTime,
                         FatherCode = "PrimaryAdmin01",
@@ -1364,11 +1476,14 @@ namespace Flyinsono.DBCopy.Tool.Service
                 batchInsertMedicalConsortiumRequest.MedicalConsortiumDetails.Add(medicalConsortiumDetail);
             }
             _jsonRpcProxy.Management.BatchInsertMedicalConsortiumAsync(batchInsertMedicalConsortiumRequest);
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Organizations>.Filter;
             var filter = builder.Where(x => !string.IsNullOrEmpty(x.Name) && ((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();
+            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
             {
@@ -1573,11 +1688,14 @@ namespace Flyinsono.DBCopy.Tool.Service
         private async Task<List<TerminalReportPosterRelation>> MigrateReportPosterInfos(SyncDBEnum syncType)
         {
             var relationList = new List<TerminalReportPosterRelation>();
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             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();
+            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;
             var pageSize = 100;
@@ -1669,11 +1787,15 @@ namespace Flyinsono.DBCopy.Tool.Service
         private async Task<List<OrganizationDiagnosisModulesRelation>> MigrateTerminalsInfos(List<TerminalReportPosterRelation> relationList, SyncDBEnum syncType)
         {
             var orgDiagnosisModulesList = new List<OrganizationDiagnosisModulesRelation>();
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Terminals>.Filter;
             var filter = builder.Where(x => !string.IsNullOrEmpty(x.UniquedId) && ((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();
+            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();
@@ -1701,8 +1823,11 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
 
             filter = builder.Where(x => string.IsNullOrEmpty(x.UniquedId) && ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
-            terminalsRecords = _terminalsDBRepository.GetTerminalsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            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;
             pageIndex = 0;
@@ -1731,7 +1856,10 @@ namespace Flyinsono.DBCopy.Tool.Service
             {
                 var termainalCodes = relationList.Select(c => c.TerminalCode).Distinct().ToList();
                 filter = builder.Where(x => termainalCodes.Contains(x.Id));
-                terminalsRecords = _terminalsDBRepository.GetTerminalsRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+                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}");
                 terminalsCount = terminalsRecords.Count;
@@ -1867,14 +1995,17 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// <returns></returns>
         public async Task MigrateUserInfos(SyncDBEnum syncType)
         {
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Users>.Filter;
             //todo 加  !string.IsNullOrEmpty(x.HospitalId) &&    用于跑有自己医院的用户
             var filter = builder.Where(x => !string.IsNullOrEmpty(x.Name) && ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
-            //var filter = builder.Where(x => !string.IsNullOrEmpty(x.Name) && x._id == "4AFA15BF24094919BD25CD84CBFEC900");
-            var userRecords = _usersDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x._id).ToList();
+            //var filter = builder.Where(x => !string.IsNullOrEmpty(x.Name) && x.Id == "4AFA15BF24094919BD25CD84CBFEC900");
+            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;
             var pageSize = 50;
@@ -1983,6 +2114,25 @@ namespace Flyinsono.DBCopy.Tool.Service
                     Logger.WriteLineInfo($"userGroupRecords record processing: {(pageIndex * pageSize * 100 / tempValue)}%");
                 }
             }
+
+            //处理设备类型
+            try
+            {
+                var request = new TokenRequest
+                {
+                    Token = DefaultToken
+                };
+                var result = await _jsonRpcProxy.Management.InitDeviceModelAsync(request);
+                if (result)
+                {
+                    Logger.WriteLineInfo($"InitDeviceModelAsync Successfully");
+                }
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineError($"InitDeviceModelAsync Infos Error, ex:{ex}");
+                return;
+            }
         }
 
 
@@ -2031,7 +2181,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                     }
                     var model = new UserMigratoryInfo()
                     {
-                        UserCode = userItem._id,
+                        UserCode = userItem.Id,
                         CreateTime = userItem.CreateTime,
                         UpdateTime = userItem.UpdateTime,
                         UserName = userItem.Name,
@@ -2267,7 +2417,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                     }
                     else if (userItem?.Features?.Count > 0 && userItem?.Features?.ToList()?.Exists(c => c.Name == "RemoteDiagnosis") == true)
                     {
-                        var userRoleType = _usersDBRepository.GetLastUserRoleTypeByUserCode(userItem._id);
+                        var userRoleType = _usersDBRepository.GetLastUserRoleTypeByUserCode(userItem.Id);
                         if (userRoleType.ConsultationRoleType == ConsultationRoleType.Doctor)
                         {
                             model.UserRole = UserMigratoryRoleEnum.Role_CertifiedExpert;
@@ -2344,7 +2494,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             if (CommonConfigManager.UserDataDiff?.Count > 0)
             {
                 var builder = Builders<Users>.Filter;
-                var filter = builder.Where(x => x.IsDeleted == false && CommonConfigManager.UserDataDiff.Contains(x._id));
+                var filter = builder.Where(x => x.IsDeleted == false && CommonConfigManager.UserDataDiff.Contains(x.Id));
                 var userRecords = _usersDBRepository.GetUserRecords(filter).ToList();
                 Logger.WriteLineInfo($"DataDiffCommand totalCount:{userRecords.Count}");
                 var pageIndex = 0;
@@ -2384,7 +2534,7 @@ namespace Flyinsono.DBCopy.Tool.Service
             var builder = Builders<Users>.Filter;
 
             var filter = builder.Where(x => !string.IsNullOrEmpty(x.HospitalId) && !string.IsNullOrEmpty(x.Name) && ((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();
+            var userRecords = _usersDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
             Logger.WriteLineInfo($"user totalCount:{userRecords.Count}");
             var pageIndex = 0;
             var pageSize = 50;
@@ -2425,7 +2575,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                 {
                     var model = new UserMigratoryInfo()
                     {
-                        UserCode = userItem._id,
+                        UserCode = userItem.Id,
                         OrganizationCode = userItem.HospitalId,
                         UserRole = UserMigratoryRoleEnum.Role_UnSet,
                         UserName = userItem.Name

+ 42 - 16
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.Course.cs

@@ -1,6 +1,8 @@
 using Flyinsono.DBCopy.Tool.Entities;
 using Flyinsono.DBCopy.Tool.Utilities;
 using MongoDB.Driver;
+using Newtonsoft.Json;
+using NPOI.SS.Formula.Functions;
 using System;
 using System.Collections.Generic;
 using System.IO;
@@ -58,7 +60,10 @@ namespace Flyinsono.DBCopy.Tool.Service
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Courses>.Filter;
             var filter = builder.Where(x => ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
-            var coursesRecords = _coursesDBRepository.GetCourses(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var coursesRecords = new List<Courses>();
+            var tempCoursesRecords = _coursesDBRepository.GetCourses(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            
+            coursesRecords = await FilterData<Courses>(tempCoursesRecords, "CoursesData");
             Logger.WriteLineInfo($"Courses totalCount:{coursesRecords.Count}");
 
             var courseAvailabilityExtensionsFilter = Builders<CourseAvailabilityExtensions>.Filter.Where(x => !string.IsNullOrEmpty(x.Id));
@@ -153,7 +158,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                         string organizationCode = "";
                         if (teacherList?.Count > 0)
                         {
-                            organizationCode = teacherList?.FirstOrDefault(c => c._id == courseItem.Teacher?.Id)?.HospitalId ?? string.Empty;
+                            organizationCode = teacherList?.FirstOrDefault(c => c.Id == courseItem.Teacher?.Id)?.HospitalId ?? string.Empty;
                         }
                         var availability = CourseAudienceTypeEnum.PublicClass;
                         var authorizedUserIds = new List<string>();
@@ -315,11 +320,14 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// </summary>
         private async Task MigrateVideoCourseDatas(SyncDBEnum syncType)
         {
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Video>.Filter;
             var filter = builder.Where(x => ((x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime)));
-            var videoRecords = _videoDBRepository.GetVideos(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var videoRecords = new List<Video>();
+            var tempVideoRecords = _videoDBRepository.GetVideos(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            
+            videoRecords = await FilterData<Video>(tempVideoRecords, "VideoData");
             Logger.WriteLineInfo($"Video totalCount:{videoRecords.Count}");
 
             var pageIndex = 0;
@@ -368,7 +376,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                         string teacherName = "";
                         if (teacherList?.Count > 0)
                         {
-                            var teacherInfo = teacherList?.FirstOrDefault(c => c._id == courseItem.CreatorId) ?? new Users();
+                            var teacherInfo = teacherList?.FirstOrDefault(c => c.Id == courseItem.CreatorId) ?? new Users();
                             organizationCode = teacherInfo.HospitalId ?? string.Empty;
                             if (string.IsNullOrEmpty(teacherInfo.FullName))
                             {
@@ -641,11 +649,14 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// </summary>
         private async Task MigrateCourseLabelDatas(SyncDBEnum syncType)
         {
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues);
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<VideoCategories>.Filter;
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-            var videoCategoriesRecords = _videoDBRepository.GetAllViedoFirstLabels(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var videoCategoriesRecords = new List<VideoCategories>();
+            var tempVideoCategoriesRecords = _videoDBRepository.GetAllViedoFirstLabels(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+           
+            videoCategoriesRecords = await FilterData<VideoCategories>(tempVideoCategoriesRecords, "VideoCategoriesData");
             Logger.WriteLineInfo($"VideoCategories totalCount:{videoCategoriesRecords.Count}");
             var pageIndex = 0;
             var pageSize = 100;
@@ -815,11 +826,14 @@ namespace Flyinsono.DBCopy.Tool.Service
         /// </summary>
         private async Task MigrateUserGroupDatas(SyncDBEnum syncType)
         {
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues); 
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<UserGroup>.Filter;
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-            var userGroupRecords = _userGroupDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var userGroupRecords = new List<UserGroup>();
+            var tempUserGroupRecords = _userGroupDBRepository.GetUserRecords(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+
+            userGroupRecords = await FilterData<UserGroup>(tempUserGroupRecords, "UserGroupData");
             Logger.WriteLineInfo($"userGroupRecords totalCount:{userGroupRecords.Count}");
             var pageIndex = 0;
             var pageSize = 10;
@@ -847,7 +861,10 @@ namespace Flyinsono.DBCopy.Tool.Service
 
             var builderClass = Builders<UltrasonicClass>.Filter;
             var filterClass = builderClass.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-            var ultrasonicClassRecords = _ultrasonicClassDBRepository.GetUltrasonicClassRecords(filterClass).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var ultrasonicClassRecords = new List<UltrasonicClass>();
+            var tempUltrasonicClassRecords = _ultrasonicClassDBRepository.GetUltrasonicClassRecords(filterClass).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            
+            ultrasonicClassRecords = await FilterData<UltrasonicClass>(tempUltrasonicClassRecords, "UltrasonicClassData");
             Logger.WriteLineInfo($"ultrasonicClassRecords totalCount:{ultrasonicClassRecords.Count}");
             pageIndex = 0;
             pageSize = 100;
@@ -1025,11 +1042,14 @@ namespace Flyinsono.DBCopy.Tool.Service
         private async Task MigrateExamDatas(SyncDBEnum syncType)
         {
             //客观题
-            var startTime = _migrateRecord.StartTime;
+            var startTime = _migrateRecord.StartTime.AddMinutes(-CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues); 
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<ExaminationPaper>.Filter;
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-            var examPaperRecords = _examinationPaperDBPepository.GetExaminationPapers(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var examPaperRecords = new List<ExaminationPaper>();
+            var tempExamPaperRecords = _examinationPaperDBPepository.GetExaminationPapers(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            
+            examPaperRecords = await FilterData<ExaminationPaper>(tempExamPaperRecords, "ExaminationPaperData");
             Logger.WriteLineInfo($"ExaminationPaper totalCount:{examPaperRecords.Count}");
 
             var pageIndex = 0;
@@ -1166,7 +1186,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                                     var studentName = "";
                                     if (studentRecords?.Count > 0)
                                     {
-                                        var studentInfo = studentRecords.FirstOrDefault(c => c._id == studentAnswerItem.UserId) ?? new Users();
+                                        var studentInfo = studentRecords.FirstOrDefault(c => c.Id == studentAnswerItem.UserId) ?? new Users();
                                         studentName = !string.IsNullOrEmpty(studentInfo.FullName) ? studentInfo.FullName : studentInfo.Name;
                                     }
                                     var studentAnswers = new List<ExaminationAnswerDTO>();
@@ -1417,7 +1437,10 @@ namespace Flyinsono.DBCopy.Tool.Service
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<Questionnaires>.Filter;
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-            var questionnairesRecords = _examinationPaperDBPepository.GeQuestionnairesDatas(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var questionnairesRecords = new List<Questionnaires>();
+            var tempQuestionnairesRecords = _examinationPaperDBPepository.GeQuestionnairesDatas(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            
+            questionnairesRecords = await FilterData<Questionnaires>(tempQuestionnairesRecords, "QuestionnairesData");
             Logger.WriteLineInfo($"Questionnaires totalCount:{questionnairesRecords.Count}");
 
             var pageIndex = 0;
@@ -1536,7 +1559,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                                         var studentName = "";
                                         if (studentRecords?.Count > 0)
                                         {
-                                            var studentInfo = studentRecords.FirstOrDefault(c => c._id == studentAnswerItem.StudetnId) ?? new Users();
+                                            var studentInfo = studentRecords.FirstOrDefault(c => c.Id == studentAnswerItem.StudetnId) ?? new Users();
                                             studentName = !string.IsNullOrEmpty(studentInfo.FullName) ? studentInfo.FullName : studentInfo.Name;
                                         }
                                         var studentAnswers = new List<ExaminationAnswerDTO>();
@@ -1654,7 +1677,10 @@ namespace Flyinsono.DBCopy.Tool.Service
             var endTime = _migrateRecord.EndTime;
             var builder = Builders<TeachingTerminalDatas>.Filter;
             var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= endTime) || (x.UpdateTime > startTime && x.UpdateTime <= endTime));
-            var teachingTerminalDatasRecords = _examinationPaperDBPepository.GeTeachingTerminalDatas(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+            var teachingTerminalDatasRecords = new List<TeachingTerminalDatas>();
+            var tempTeachingTerminalDatasRecords = _examinationPaperDBPepository.GeTeachingTerminalDatas(filter).OrderByDescending(x => x.CreateTime).ThenBy(x => x.Id).ToList();
+           
+            teachingTerminalDatasRecords = await FilterData<TeachingTerminalDatas>(tempTeachingTerminalDatasRecords, "TeachingTerminalDatasData");
             Logger.WriteLineInfo($"teachingTerminalDatasRecords totalCount:{teachingTerminalDatasRecords.Count}");
 
             var pageIndex = 0;

+ 243 - 34
Tools/Flyinsono.DBCopy.Tool/Service/MigrateService.cs

@@ -49,6 +49,7 @@ using MongoDB.Driver.Core.Operations;
 using Flyinsono.DBCopy.Tool.Utilities;
 using Flyinsono.DBCopy.Tool.Entities.Config;
 using System.Diagnostics;
+using Newtonsoft.Json.Linq;
 
 namespace Flyinsono.DBCopy.Tool.Service
 {
@@ -864,7 +865,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                     var creatorName = MapToUserView(organizations, users, examPaper.CreatorId)?.Name;
                     if (string.IsNullOrWhiteSpace(creatorName))
                     {
-                        var admin = admins.FirstOrDefault(x => x._id == examPaper.CreatorId);
+                        var admin = admins.FirstOrDefault(x => x.Id == examPaper.CreatorId);
                         if (admin != null)
                         {
                             var adminName = !string.IsNullOrWhiteSpace(admin.FullName) ? admin.FullName
@@ -1101,13 +1102,13 @@ namespace Flyinsono.DBCopy.Tool.Service
             await MigrateRemedicalRecords(SyncDBEnum.Synchronize);
             //远程图像 
             MigrateRemedicalDatas(SyncDBEnum.Synchronize, batchExcuteRemedicalDataCount);
-            //AI
+            //AI 
             MigrateRemedicalAIDatas(SyncDBEnum.Synchronize);
             //颈动脉
             MigrateRemedicalCarotidDatas(SyncDBEnum.Synchronize);
             //会诊
             MigrateConsultationResults(SyncDBEnum.Synchronize);
-            //报告
+            //报告 
             MigrateReportInfoResults(SyncDBEnum.Synchronize);
             Logger.WriteLineInfo($"Remote diagnosis infos migrate to wingServer successfully");
         }
@@ -1117,12 +1118,31 @@ namespace Flyinsono.DBCopy.Tool.Service
             Logger.WriteLineInfo($"Remote diagnosis records migrate to wingServer starting");
             //获取上次同步到的时间
             var builder = Builders<TerminalRecords>.Filter;
-            var startTime = GetFactBeginTime(_migrateRecord.StartTime, _migrateRecord.EndTime);
-            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
-            var terminalRecords = _terminalRecordDBRepository.GetTerminalRecords(filter).OrderByDescending(x => x.CreateTime).ToList();
-            OnMigrate("Remote diagnosis records", terminalRecords, SendRemedicalRecordInfos, syncType, 100);
-            terminalRecords.Clear();
-            Logger.WriteLineInfo($"Remote diagnosis records migrate to wingServer successfully");
+            var startTime = GetFactBeginTime(_migrateRecord.StartTime, _migrateRecord.EndTime); 
+            var terminalRecords = new List<TerminalRecords>();
+            try
+            {
+                var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
+                var tempTerminalRecords = _terminalRecordDBRepository.GetTerminalRecords(filter).OrderByDescending(x => x.CreateTime).ToList();
+               
+                terminalRecords = await FilterData<TerminalRecords>(tempTerminalRecords, "TerminalRecordsData");
+
+                OnMigrate("Remote diagnosis records", terminalRecords, SendRemedicalRecordInfos, syncType, 100);
+                terminalRecords.Clear();
+                Logger.WriteLineInfo($"Remote diagnosis records migrate to wingServer successfully");
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineInfo($"Remote diagnosis records migrate migrate to wingServer Error: {ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"Remote diagnosis records migrate migrate to wingServer successfully, result:{terminalRecords?.Count}, startTime: {startTime.ToString("yyyy-MM-dd HH:mm:ss")}--endTime: {_migrateRecord.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}");
+                if (terminalRecords != null)
+                {
+                    terminalRecords.Clear();
+                }
+            }
         }
 
         private void SendRemedicalRecordInfos(IList<TerminalRecords> terminalRecords, SyncDBEnum syncType)
@@ -1234,13 +1254,31 @@ namespace Flyinsono.DBCopy.Tool.Service
             var startTime = GetFactBeginTime(_migrateRecord.StartTime, _migrateRecord.EndTime);
             //startTime = Convert.ToDateTime("2023-06-26");
             //_migrateRecord.EndTime = DateTime.Now;
-            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
-            var terminalDatas = _terminalDatasDBRepository.GetTerminalDatas(filter).OrderByDescending(x => x.CreateTime).ToList();
-            //只保留有预览图的数据,如果生成中会在生成后修改update时间,会再次同步
-            terminalDatas = terminalDatas.Where(x => !string.IsNullOrWhiteSpace(x.PreviewImageFileToken)).ToList();
-            OnMigrate("Remote diagnosis datas", terminalDatas, SendRemedicalDatas, syncType, batchExcuteRemedicalDataCount);
-            terminalDatas.Clear();
-            Logger.WriteLineInfo($"Remote diagnosis datas migrate to wingServer successfully");
+            var terminalDatas = new List<TerminalDatas>();
+            try
+            {
+                var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
+                var tempTerminalDatas = _terminalDatasDBRepository.GetTerminalDatas(filter).OrderByDescending(x => x.CreateTime).ToList();
+                
+                terminalDatas = await FilterData<TerminalDatas>(tempTerminalDatas, "TerminalDatasData");
+                //只保留有预览图的数据,如果生成中会在生成后修改update时间,会再次同步
+                //terminalDatas = terminalDatas.Where(x => !string.IsNullOrWhiteSpace(x.PreviewImageFileToken)).ToList();
+                OnMigrate("Remote diagnosis datas", terminalDatas, SendRemedicalDatas, syncType, batchExcuteRemedicalDataCount);
+                terminalDatas.Clear();
+                Logger.WriteLineInfo($"Remote diagnosis datas migrate to wingServer successfully");
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineInfo($"Remote diagnosis datas migrate migrate to wingServer Error: {ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"Remote diagnosis datas migrate migrate to wingServer successfully, result:{terminalDatas?.Count}, startTime: {startTime.ToString("yyyy-MM-dd HH:mm:ss")}--endTime: {_migrateRecord.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}");
+                if (terminalDatas != null)
+                {
+                    terminalDatas.Clear();
+                }
+            }
         }
 
 
@@ -1360,6 +1398,64 @@ namespace Flyinsono.DBCopy.Tool.Service
             }
         }
 
+        ///// <summary>
+        ///// 数据转换
+        ///// </summary>
+        ///// <typeparam name="T"></typeparam>
+        ///// <param name="tempRecords"></param>
+        ///// <param name="key"></param>
+        ///// <returns></returns>
+        //private async Task<List<TerminalAIDatas>> AIFilterData(List<TerminalAIDatas> list)
+        //{
+        //    var records = new List<TerminalAIDatas>();
+        //    var key = "TerminalAIDatasData";
+        //    if (list?.Count() > 0)
+        //    {
+        //        var tempReportTemplateData = new List<CacheBasicInfo>();
+        //        foreach (var t in list)
+        //        {
+        //            if (t != null)
+        //            {
+        //                var createTime = t.CreateTime;
+        //                var updateTime = t.UpdateTime;
+        //                var item = new CacheBasicInfo()
+        //                {
+        //                    Id = t.Id,
+        //                    CacheTime = createTime > updateTime ? createTime : updateTime,
+        //                };
+        //                tempReportTemplateData.Add(item);
+        //            }
+        //        }
+        //        if (CommonConfigManager.CacheSynDataInfo.CacheDic.Keys.Contains(key) && CommonConfigManager.CacheSynDataInfo.CacheDic[key]?.Count > 0)
+        //        {
+        //            foreach (var templateInfo in tempReportTemplateData)
+        //            {
+        //                if (CommonConfigManager.CacheSynDataInfo.CacheDic[key].Exists(c => c.Id == templateInfo.Id && c.CacheTime == templateInfo.CacheTime))
+        //                {
+        //                    //存在,表示已经处理过
+        //                }
+        //                else
+        //                {
+        //                    //不存在,表示没处理过
+        //                    CommonConfigManager.CacheSynDataInfo.CacheDic[key].Add(templateInfo);
+        //                    var findEntity = list.FirstOrDefault(c => c.Id.ToString() == templateInfo.Id);
+        //                    if (!string.IsNullOrEmpty(findEntity?.Id))
+        //                    {
+        //                        records.Add(findEntity);
+        //                    }
+        //                }
+        //            }
+        //        }
+        //        else
+        //        {
+        //            CommonConfigManager.CacheSynDataInfo.CacheDic.Add(key, tempReportTemplateData);
+        //            records = list;                    
+        //        }
+        //    }
+
+        //    return records;
+        //}
+
         public async Task MigrateRemedicalAIDatas(SyncDBEnum syncType)
         {
             Logger.WriteLineInfo($"Remote diagnosis ai datas migrate to wingServer starting");
@@ -1367,11 +1463,28 @@ namespace Flyinsono.DBCopy.Tool.Service
             //判断热数据
             var builder = Builders<TerminalAIDatas>.Filter;
             var startTime = GetFactBeginTime(_migrateRecord.StartTime, _migrateRecord.EndTime);
-            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
-            var terminalDatas = _terminalAIDatasDBRepository.GetTerminalAIDatas(filter).OrderByDescending(x => x.CreateTime).ToList();
-            OnMigrate("Remote diagnosis ai datas", terminalDatas, SendRemedicalAIDatas, syncType, 1);
-            terminalDatas.Clear();
-            Logger.WriteLineInfo($"Remote diagnosis datas migrate to wingServer successfully");
+            var terminalDatas = new List<TerminalAIDatas>();
+            try
+            {
+                var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
+                var tempTerminalDatas = _terminalAIDatasDBRepository.GetTerminalAIDatas(filter).OrderByDescending(x => x.CreateTime).ToList();
+                terminalDatas = await FilterData<TerminalAIDatas>(tempTerminalDatas, "TerminalAIDatasData");
+                OnMigrate("Remote diagnosis ai datas", terminalDatas, SendRemedicalAIDatas, syncType, 1);
+                terminalDatas.Clear();
+                Logger.WriteLineInfo($"Remote diagnosis datas migrate to wingServer successfully");
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineInfo($"Remote diagnosis datas migrate migrate to wingServer Error: {ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"Remote diagnosis datas migrate migrate to wingServer successfully, result:{terminalDatas?.Count}, startTime: {startTime.ToString("yyyy-MM-dd HH:mm:ss")}--endTime: {_migrateRecord.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}");
+                if (terminalDatas != null)
+                {
+                    terminalDatas.Clear();
+                }
+            }
         }
 
 
@@ -1417,11 +1530,30 @@ namespace Flyinsono.DBCopy.Tool.Service
             //判断热数据
             var builder = Builders<Carotid3dModelData>.Filter;
             var startTime = GetFactBeginTime(_migrateRecord.StartTime, _migrateRecord.EndTime);
-            var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
-            var carotid3dModelDatas = _carotid3dModelDatasDBRepository.GetCarotid3dModelDatas(filter).OrderByDescending(x => x.CreateTime).ToList();
-            OnMigrate("Remote diagnosis carotid datas", carotid3dModelDatas, SendRemedicalCarotidDatas, syncType, 1);
-            carotid3dModelDatas.Clear();
-            Logger.WriteLineInfo($"Remote diagnosis carotid datas migrate to wingServer successfully");
+            var carotid3dModelDatas = new List<Carotid3dModelData>();
+            try
+            {
+                var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
+                var tempCarotid3dModelDatas = _carotid3dModelDatasDBRepository.GetCarotid3dModelDatas(filter).OrderByDescending(x => x.CreateTime).ToList();
+               
+                carotid3dModelDatas = await FilterData<Carotid3dModelData>(tempCarotid3dModelDatas, "Carotid3dModelDataData");
+
+                OnMigrate("Remote diagnosis carotid datas", carotid3dModelDatas, SendRemedicalCarotidDatas, syncType, 1);
+                carotid3dModelDatas.Clear();
+                Logger.WriteLineInfo($"Remote diagnosis carotid datas migrate to wingServer successfully");
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineInfo($"Remote diagnosis carotid datas migrate migrate to wingServer Error: {ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"Remote diagnosis carotid datas migrate migrate to wingServer successfully, result:{carotid3dModelDatas?.Count}, startTime: {startTime.ToString("yyyy-MM-dd HH:mm:ss")}--endTime: {_migrateRecord.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}");
+                if (carotid3dModelDatas != null)
+                {
+                    carotid3dModelDatas.Clear();
+                }
+            }
         }
 
 
@@ -1483,11 +1615,30 @@ namespace Flyinsono.DBCopy.Tool.Service
             //获取上次同步到的时间
             var builder = Builders<ConsultationRecords>.Filter;
             var startTime = GetFactBeginTime(_migrateRecord.StartTime, _migrateRecord.EndTime);
-            var filter = builder.Where(x => x.IsDeleted == false && ((x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime)));
-            var consultations = _consultationRecordDBRepository.GetTerminalRecords(filter).OrderByDescending(x => x.CreateTime).ToList();
-            OnMigrate("consultations", consultations, SendConsultations, syncType, 10);
-            consultations.Clear();
-            Logger.WriteLineInfo($"consultations migrate to wingServer successfully");
+            var consultations = new List<ConsultationRecords>();
+            try
+            {
+                var filter = builder.Where(x => x.IsDeleted == false && ((x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime)));
+                var tempConsultations = _consultationRecordDBRepository.GetTerminalRecords(filter).OrderByDescending(x => x.CreateTime).ToList();
+                
+                consultations = await FilterData<ConsultationRecords>(tempConsultations, "ConsultationRecordsData");
+
+                OnMigrate("consultations", consultations, SendConsultations, syncType, 10);
+                consultations.Clear();
+                Logger.WriteLineInfo($"consultations migrate to wingServer successfully");
+            }
+            catch (Exception ex)
+            {
+                Logger.WriteLineInfo($"consultations migrate migrate to wingServer Error: {ex}");
+            }
+            finally
+            {
+                Logger.WriteLineInfo($"consultations migrate to wingServer successfully, result:{consultations?.Count}, startTime: {startTime.ToString("yyyy-MM-dd HH:mm:ss")}--endTime: {_migrateRecord.EndTime.ToString("yyyy-MM-dd HH:mm:ss")}");
+                if (consultations != null)
+                {
+                    consultations.Clear();
+                }
+            }
         }
 
 
@@ -1826,6 +1977,63 @@ namespace Flyinsono.DBCopy.Tool.Service
             return transactionStatusEnum;
         }
 
+        ///// <summary>
+        ///// 数据转换
+        ///// </summary>
+        ///// <typeparam name="T"></typeparam>
+        ///// <param name="tempRecords"></param>
+        ///// <param name="key"></param>
+        ///// <returns></returns>
+        //private async Task<List<ReportInfoResults>> ReportInfoFilterData(List<ReportInfoResults> list)
+        //{
+        //    var records = new List<ReportInfoResults>();
+        //    var key = "ReportInfoResultsData";
+        //    if (list?.Count() > 0)
+        //    {
+        //        var tempReportTemplateData = new List<CacheBasicInfo>();
+        //        foreach (var t in list)
+        //        {
+        //            if (t != null)
+        //            {
+        //                var createTime = t.CreateTime;
+        //                var updateTime = t.UpdateTime;
+        //                var item = new CacheBasicInfo()
+        //                {
+        //                    Id = t.Id,
+        //                    CacheTime = createTime > updateTime ? createTime : updateTime,
+        //                };
+        //                tempReportTemplateData.Add(item);
+        //            }
+        //        }
+        //        if (CommonConfigManager.CacheSynDataInfo.CacheDic.Keys.Contains(key) && CommonConfigManager.CacheSynDataInfo.CacheDic[key]?.Count > 0)
+        //        {
+        //            foreach (var templateInfo in tempReportTemplateData)
+        //            {
+        //                if (CommonConfigManager.CacheSynDataInfo.CacheDic[key].Exists(c => c.Id == templateInfo.Id && c.CacheTime == templateInfo.CacheTime))
+        //                {
+        //                    //存在,表示已经处理过
+        //                }
+        //                else
+        //                {
+        //                    //不存在,表示没处理过
+        //                    CommonConfigManager.CacheSynDataInfo.CacheDic[key].Add(templateInfo);
+        //                    var findEntity = list.FirstOrDefault(c => c.Id.ToString() == templateInfo.Id);
+        //                    if (!string.IsNullOrEmpty(findEntity?.Id))
+        //                    {
+        //                        records.Add(findEntity);
+        //                    }
+        //                }
+        //            }
+        //        }
+        //        else
+        //        {
+        //            CommonConfigManager.CacheSynDataInfo.CacheDic.Add(key, tempReportTemplateData);
+        //            records = list;
+        //        }
+        //    }
+
+        //    return records;
+        //}
 
         public async Task MigrateReportInfoResults(SyncDBEnum syncType)
         {
@@ -1838,7 +2046,8 @@ namespace Flyinsono.DBCopy.Tool.Service
             {
                 var filter = builder.Where(x => (x.CreateTime > startTime && x.CreateTime <= _migrateRecord.EndTime) || (x.UpdateTime > startTime && x.UpdateTime <= _migrateRecord.EndTime));
                 //var filter = builder.Where(x => x.Id == "DE2642FAFCA64AEAAB285BD38E6DEEC0");
-                reportInfoResults = _reportInfoResultDBRepository.GetReports(filter).OrderByDescending(x => x.CreateTime).ToList();
+                var tempReportInfoResults = _reportInfoResultDBRepository.GetReports(filter).OrderByDescending(x => x.CreateTime).ToList();
+                reportInfoResults = await FilterData(tempReportInfoResults, "ReportInfoResultsData");
                 OnMigrate("reportInfoResults", reportInfoResults, SendRemedicalreportInfoResults, syncType, 1);                
             }
             catch (Exception ex)
@@ -2166,7 +2375,7 @@ namespace Flyinsono.DBCopy.Tool.Service
 
         private UserView MapToUserView(IList<Organizations> organizations, IList<Users> users, string? userId)
         {
-            var user = users.FirstOrDefault(x => x._id == userId);
+            var user = users.FirstOrDefault(x => x.Id == userId);
             if (user != null)
             {
                 var hospital = organizations.FirstOrDefault(x => x.Id == user.HospitalId);
@@ -2177,7 +2386,7 @@ namespace Flyinsono.DBCopy.Tool.Service
                     : user.Name;
                 return new UserView
                 {
-                    Code = user._id,
+                    Code = user.Id,
                     Name = name,
                     OrganizationCode = user.HospitalId,
                     OrganizationName = hospital?.Name,

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

@@ -49,7 +49,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
         public IList<Admins> GetAdminByCodes(IList<string> adminIds)
         {
             var builder = Builders<Admins>.Filter;
-            var filter = builder.Where(x => adminIds.Contains(x._id));
+            var filter = builder.Where(x => adminIds.Contains(x.Id));
             var entities = MongoDbClientSingle.Instance.Admins.Find(filter)?.ToList() ?? new List<Admins>();
             return entities;
         }

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

@@ -24,7 +24,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
         public IList<Users> GetUserByCodes(IList<string> userIds)
         {
             var builder = Builders<Users>.Filter;
-            var filter = builder.Where(x => userIds.Contains(x._id));
+            var filter = builder.Where(x => userIds.Contains(x.Id));
             var entities = MongoDbClientSingle.Instance.Users.Find(filter)?.ToList() ?? new List<Users>();
             return entities;
         }
@@ -32,7 +32,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
         public Users GetUserByCode(string userId)
         {
             var builder = Builders<Users>.Filter;
-            var filter = builder.Where(x => userId == x._id);
+            var filter = builder.Where(x => userId == x.Id);
             var entities = MongoDbClientSingle.Instance.Users.Find(filter)?.ToList() ?? new List<Users>();
             var model = entities?.FirstOrDefault() ?? new Users();
             return model;
@@ -164,7 +164,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
                     }
                     //先更新
                     var update = Builders<Users>.Update.Set(x => x.Terminals, item.Terminals).Set(x => x.Organizations, item.Organizations);
-                    MongoDbClientSingle.Instance.Users.UpdateOne(c => c._id == item._id, update);
+                    MongoDbClientSingle.Instance.Users.UpdateOne(c => c.Id == item.Id, update);
                 }
             }
             Logger.WriteLineInfo($"Completed Clear Terminals Bind Data");
@@ -238,7 +238,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             {
                 foreach (var item in deleteList)
                 {
-                    if (!users.Exists(c => c._id == item._id))
+                    if (!users.Exists(c => c.Id == item.Id))
                     {
                         users.Add(item);
                     }
@@ -249,7 +249,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             {
                 foreach (var item in vistorList)
                 {
-                    if (!users.Exists(c => c._id == item._id))
+                    if (!users.Exists(c => c.Id == item.Id))
                     {
                         users.Add(item);
                     }
@@ -262,7 +262,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             {
                 foreach (var item in dList)
                 {
-                    if (!users.Exists(c => c._id == item._id))
+                    if (!users.Exists(c => c.Id == item.Id))
                     {
                         users.Add(item);
                     }
@@ -359,10 +359,10 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
             if (userList?.Count > 0)
             {
                 Logger.WriteLineInfo($"Starting Clear User Data");
-                var deleteIds = userList.Select(c => c._id).Distinct().ToList();
+                var deleteIds = userList.Select(c => c.Id).Distinct().ToList();
                 ////清理DiagnosisResult
                 //var diagnosisResultBuilder = Builders<DiagnosisResult>.Filter;
-                //var diagnosisResultDelFilter = diagnosisResultBuilder.In(x => x.User._id, deleteIds);
+                //var diagnosisResultDelFilter = diagnosisResultBuilder.In(x => x.User.Id, deleteIds);
                 //var result = MongoDbClientSingle.Instance.DiagnosisResult.DeleteMany(diagnosisResultDelFilter);
 
                 //先删除类似的备份数据在新增
@@ -373,7 +373,7 @@ namespace Flyinsono.DBCopy.Tool.Service.Repositories
                 MongoDbClientSingle.Instance.UsersBak.InsertMany(waitInsertUsers);
                 //删除正式表
                 var builder = Builders<Users>.Filter;
-                var filter = builder.In(x => x._id, deleteIds);
+                var filter = builder.In(x => x.Id, deleteIds);
                 var result = MongoDbClientSingle.Instance.Users.DeleteMany(filter);
                 Logger.WriteLineInfo($"Clear User Data Completed, Clear Count: " + userList.Count);
             }

+ 62 - 0
Tools/Flyinsono.DBCopy.Tool/Utilities/CommonConfigManager.cs

@@ -1,5 +1,6 @@
 using Flyinsono.DBCopy.Tool.Entities.Config;
 using Newtonsoft.Json;
+using NPOI.Util.Collections;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -127,7 +128,63 @@ namespace Flyinsono.DBCopy.Tool.Utilities
                     ThirdPartyServer = appConfig.ThirdPartyServer;
                 }
             }
+
+            var cacheConfig = File.ReadAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"Config", "cacheSyn.json"));
+            var cacheConfigData = JsonConvert.DeserializeObject<CacheSynData>(cacheConfig);
+            if (cacheConfigData != null)
+            {
+                CacheSynDataInfo = cacheConfigData;
+            }
+
+            RemoveExpireCacheConfig();
+        }
+
+        /// <summary>
+        /// 移除过期的缓存
+        /// </summary>
+        private static void RemoveExpireCacheConfig()
+        {
+            Task.Run(async () =>
+            {
+                while (true)
+                {
+                    try
+                    {
+                        var curTime = DateTime.UtcNow;
+                        foreach (var key in CacheSynDataInfo.CacheDic.Keys) {
+                            if (CacheSynDataInfo.CacheDic[key]?.Count > 0)
+                            {
+                                //var expiredData = curData.Where(c => c.CacheTime > curTime)?.ToList() ?? new List<CacheBasicInfo>();
+                                var keys = new List<string>();
+                                foreach (var keyItem in CacheSynDataInfo.CacheDic[key].Keys)
+                                {
+                                    CacheSynDataInfo.CacheDic[key].TryGetValue(keyItem, out DateTime val);
+                                    if (val.AddMinutes(CommonConfigManager.MigrateRuleInfo.StartTimeDiffMintues) < curTime)
+                                    {
+                                        //待移除key
+                                        keys.Add(keyItem);
+                                    }
+                                }
+                                //CacheSynDataInfo.CacheDic[key] = newData;
+                                if (keys?.Count > 0)
+                                {
+                                    foreach (var item in keys)
+                                    {
+                                        CacheSynDataInfo.CacheDic[key].TryRemove(item, out _);
+                                    }
+                                }
+                            }
+                        }
+                        await Task.Delay(2000 * 60);
+                    }
+                    catch (Exception ex)
+                    {
+                        Logger.WriteLineError($"ListenStorageError:{ex}");
+                    }
+                }
+            });
         }
+
         /// <summary>
         /// 过滤用户
         /// </summary>
@@ -253,5 +310,10 @@ namespace Flyinsono.DBCopy.Tool.Utilities
         /// </summary>    
         public static IList<string> UserDataDiff { get; set; } = new List<string>();
 
+        /// <summary>
+        /// 缓存数据
+        /// </summary>
+        public static CacheSynData CacheSynDataInfo { get; set; } = new CacheSynData();
+
     }
 }