CNAS取数仪器端升级
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

SyncServiceOperation.cs 9.5KB

5 년 전
5 년 전
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. 
  2. using CnasSynchronousCommon;
  3. using CnasSynchronusClient;
  4. using CnasSynchrousModel;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data;
  8. using System.IO;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Timers;
  12. using System.Xml.Serialization;
  13. namespace CNAS_SyncService
  14. {
  15. public class SyncServiceOperation
  16. {
  17. System.Timers.Timer timerSync;
  18. ServiceConfig config = new ServiceConfig();
  19. bool bRunComplete = true;
  20. public void Start()
  21. {
  22. AppLog.ServiceInfo("SyncSerivce:服务启动");
  23. config = ReadServiceConfigData();
  24. if (config.Minutes != 0)
  25. {
  26. // 启动定时器
  27. timerSync = new System.Timers.Timer();
  28. timerSync.Interval = config.Minutes * 60 * 1000; //设置计时器事件间隔执行时间
  29. timerSync.Elapsed += new System.Timers.ElapsedEventHandler(timerSync_Elapsed);
  30. timerSync.Enabled = true;
  31. }
  32. else
  33. {
  34. //写入日志
  35. AppLog.ServiceInfo("SyncSerivce:未能成功读取定时器时间,本次同步失败。");
  36. }
  37. }
  38. private void timerSync_Elapsed(object sender, ElapsedEventArgs e)
  39. {
  40. AppLog.ServiceInfo("定时器启动");
  41. if (bRunComplete)
  42. {
  43. bRunComplete = false;
  44. //执行同步程序
  45. //1.读取配置信息
  46. List<SyncInstrumentItemInfo> lstSyncInstrument = ReadSyncInstruments();
  47. //2 遍历仪器列表,逐个列表进行同步
  48. foreach (var instrumentItem in lstSyncInstrument)
  49. {
  50. RunSyncByInstrument(instrumentItem);
  51. }
  52. bRunComplete = true;
  53. //回收垃圾
  54. GC.Collect();
  55. }
  56. }
  57. private List<SyncInstrumentItemInfo> ReadSyncInstruments()
  58. {
  59. List<SyncInstrumentItemInfo> lstSyncInstrument = new List<SyncInstrumentItemInfo>();
  60. lstSyncInstrument = FileOperation.GetLocalSyncInStrumentData();
  61. AppLog.ServiceInfo($"读取到本地配置信息行数{lstSyncInstrument.Count}");
  62. return lstSyncInstrument;
  63. }
  64. private void RunSyncByInstrument(SyncInstrumentItemInfo syncInstrumentItem)
  65. {
  66. //0.读取目标库表数据的最大时间 1.读取来源的数据 2.对读取到的数据进行逻辑处理,整理格式 3.执行同步
  67. AppLog.ServiceInfo("准备根据日期字段查询筛选");
  68. var query = syncInstrumentItem.LstSyncPramas.Where(s => s.IfDateField == true).ToList<SyncParamasInfo>();
  69. if (query.Count == 1)
  70. {
  71. string strCompareTime = "";
  72. string strDateTime = CnasDataOperationFact.CnasDataOperation().GetMaxTimeByTableName(syncInstrumentItem.SyncTargetDBInfo, syncInstrumentItem.LstSyncPramas[0].TargetTable, query[0].TargetField, syncInstrumentItem.CnasInstrumentColumn,syncInstrumentItem.GUID);
  73. //strDateTime = "2016-07-01 00:00:00";
  74. if (strDateTime == "1899-1-1")
  75. {
  76. AppLog.ServiceInfo($"读取上次最晚执行时间数据库连接失败。");
  77. return;
  78. }
  79. else if (strDateTime == "")
  80. {
  81. strCompareTime = Convert.ToDateTime(config.InitalDT.ToString()).ToString("yyyy-MM-dd HH:mm:ss");
  82. }
  83. else
  84. strCompareTime = Convert.ToDateTime(strDateTime).AddDays(-3).ToString("yyyy-MM-dd HH:mm:ss");
  85. AppLog.ServiceInfo($"读取上次最晚执行时间为{strCompareTime}");
  86. object[] obj = new object[]
  87. {
  88. syncInstrumentItem.LstSyncPramas[0].SourceTable,
  89. query[0].SourceField,
  90. strCompareTime
  91. };
  92. AppLog.ServiceInfo($"准备构建数据源读取工厂");
  93. InstrumentData instrumentData = InstrumentDataFact.CreateInstrumentDataSource(syncInstrumentItem.SyncInstrumentDSInfo, obj);
  94. AppLog.ServiceInfo($"构建数据源读取工厂完成,准备读取数据源");
  95. DataTable dtReadySource = instrumentData.GetInstrumentDataByDate();
  96. AppLog.ServiceInfo($"根据日期读取准备插入的来源数据,共{dtReadySource.Rows.Count}条数据");
  97. string strMsg = "";
  98. RunUpLoad(syncInstrumentItem, dtReadySource, ref strMsg);
  99. if (strMsg != "")
  100. {
  101. //写入日志
  102. AppLog.ServiceInfo(strMsg);
  103. }
  104. }
  105. else
  106. {
  107. AppLog.ServiceInfo("SyncSerivce:未能成功读取日期字段,可能不存在或存在多个日期字段,本次同步失败。");
  108. }
  109. }
  110. private void RunUpLoad(SyncInstrumentItemInfo syncInstrumentItem,DataTable dtReadySource,ref string strMsg)
  111. {
  112. //根据映射字段获取准备上传的所有数据
  113. if (dtReadySource == null || dtReadySource.Rows.Count <= 0) return;
  114. //构建准备插入的数据
  115. DataTable dtTarget = CnasDataOperationFact.CnasDataOperation().GetCNASTablesStruct(syncInstrumentItem.LstSyncPramas[0].TargetTable, syncInstrumentItem.SyncTargetDBInfo);
  116. AppLog.ServiceInfo("读取目标数据的数据结构");
  117. if (dtTarget.Columns.Count <= 0)
  118. {
  119. strMsg="未能成功读取CNAS数据库列,请检查数据库配置。";
  120. return;
  121. }
  122. CnasInsertOperation insertOperation = new CnasInsertOperation()
  123. {
  124. syncInstrumentItem = syncInstrumentItem
  125. };
  126. AppLog.ServiceInfo("遍历所有来源数据,构造准备插入的数据");
  127. strMsg=insertOperation.CreateInputData(dtReadySource, ref dtTarget);
  128. if (strMsg != "") return;
  129. if (dtTarget.Rows.Count <= 0)
  130. {
  131. strMsg = "创建准备插入的数据行为空。";
  132. return;
  133. }
  134. AppLog.ServiceInfo("检查准备插入的数据是否合法");
  135. insertOperation.CheckInsertDataFormat(dtTarget, ref strMsg);
  136. if (strMsg != "") return;
  137. //逐行执行插入
  138. List<DataRow> lstError = new List<DataRow>();
  139. int ErrorCount = 0;
  140. int SuccessCount = 0;
  141. int OtherCount = 0;
  142. AppLog.ServiceInfo($"逐行插入目标数据,最终准备插入(更新)数据行{dtTarget.Rows.Count}");
  143. foreach (DataRow dr in dtTarget.Rows)
  144. {
  145. dr.AcceptChanges();
  146. int iReturn = CnasDataOperationFact.CnasDataOperation().InsertDataToCNASTable(GlobalCommonOperation.ConvertDataRowToTable(dr), syncInstrumentItem.SyncTargetDBInfo, syncInstrumentItem.LstSyncPramas, syncInstrumentItem.CnasInstrumentColumn, syncInstrumentItem.lstFixedValue);
  147. if (iReturn <= 0) //此时出现问题
  148. {
  149. if (iReturn == -1)
  150. {
  151. AppLog.ServiceInfo("数据库连接中断,终止本次上传。");
  152. break; //此时数据库连接中断,直接跳出循环,结束本次数据同步传输
  153. }
  154. else if (iReturn == -2) //等于-2表示插入准备更新时发现数据一致,不再执行
  155. {
  156. OtherCount++;
  157. }
  158. else
  159. {
  160. ErrorCount++;
  161. //lstError.Add(GlobalCommonOperation.ConvertDataRowToTable(dr).Rows[0]);
  162. }
  163. }
  164. else
  165. {
  166. SuccessCount++;
  167. AppLog.Info("成功插入(更新)1条数据。");
  168. }
  169. }
  170. //if (lstError.Count <= 0)
  171. //{
  172. // strMsg = "上传完成!...................................................................................................................................";
  173. //}
  174. //else
  175. //{
  176. // //log.ErrorFormat("未成功上传的数据如下:{0}", ListToString(lstError));
  177. // strMsg = "上传过程中发生异常,存在部分数据未成功上传,请联系管理员!";
  178. //}
  179. strMsg= $"上传操作完成!其中成功{SuccessCount}条,失败{ErrorCount}条,其他{OtherCount}条。............................................................................................................";
  180. }
  181. private ServiceConfig ReadServiceConfigData()
  182. {
  183. ServiceConfig config = new ServiceConfig();
  184. try
  185. {
  186. //读取本地文件中存储的配置信息
  187. XmlSerializer serializer = new XmlSerializer(config.GetType());
  188. FileStream stream = new FileStream(FileHelper.getBasePath() + "/Data/SyncServiceData.xml", FileMode.Open);
  189. config = (ServiceConfig)serializer.Deserialize(stream);
  190. stream.Close();
  191. }
  192. catch (Exception ex)
  193. {
  194. AppLog.ServiceInfo(ex.Message);
  195. }
  196. return config;
  197. }
  198. }
  199. }