CNAS取数仪器端升级
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

215 lines
9.5KB

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