ForecourtTrxManager.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. using Edge.Core.Database;
  2. using Edge.Core.IndustryStandardInterface.Pump;
  3. using Edge.Core.Processor;using Edge.Core.IndustryStandardInterface.Pump;
  4. using SinoChemFC2PosProxy;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Data;
  8. using System.Data.SqlClient;
  9. using System.Linq;
  10. using System.Threading;
  11. using System.Threading.Tasks;
  12. using Wayne.FDCPOSLibrary;
  13. using Edge.Core.Configuration;
  14. namespace SinochemInternetPlusApp
  15. {
  16. /// <summary>
  17. /// Manages pump transactions, inserting the transactions to POS database (table: Xiaofei2).
  18. /// </summary>
  19. public class ForecourtTrxManager
  20. {
  21. #region Logger
  22. static NLog.Logger logger = NLog.LogManager.LoadConfiguration("nlog.config").GetLogger("Application");
  23. #endregion
  24. #region Fields
  25. private IEnumerable<NozzleExtraInfo> nozzleProductConfig = Configurator.Default.NozzleExtraInfoConfiguration.Mapping;
  26. /// <summary>
  27. /// fdc pump handler is the entry for manage pumps.
  28. /// </summary>
  29. private IEnumerable<IFdcPumpController> fdcPumpControllers;
  30. /// <summary>
  31. /// PumpIdAsSideA:PumpIdAsSideB:JiHao
  32. /// </summary>
  33. private readonly IEnumerable<Tuple<int, int, int>> pumpSidePairs = null;
  34. /// <summary>
  35. /// pumpId:RealHoseLogicalId:HuiTianSiteLevelHoseId
  36. /// </summary>
  37. public static IEnumerable<Tuple<int, int, int>> nozzleRemappingPairs = null;
  38. /// <summary>
  39. /// rawName:FriendlyName
  40. /// </summary>
  41. private Dictionary<string, string> rawProductNameToPosProductNameMapping = new Dictionary<string, string>();
  42. private string sqlServerConnStr;
  43. /// <summary>
  44. /// mapping between PumpId, nozzleId, site level nozzle...
  45. /// </summary>
  46. private IOrderedEnumerable<DataRow> sortedSiteNozzlesDataRows;
  47. private bool initialized = false;
  48. #endregion
  49. #region Constructor
  50. /// <summary>
  51. ///
  52. /// </summary>
  53. /// <param name="pumpSideMappingStr">PumpIdAsSideA:PumpIdAsSideB:JiHao, like 1:2:1; 3:4:2; 5:6:3; </param>
  54. /// <param name="forceMappingFusionHoseToHuiTianHoseStr">pumpId:RealHoseLogicalId:HuiTianSiteLevelHoseId, like 14:2:16;14:1:17</param>
  55. /// <param name="gradeNameRemapping">rawGradeName:HuiTianPosGradeName, like 93gas:93#;98gas:98#;</param>
  56. public ForecourtTrxManager(IEnumerable<IFdcPumpController> pumpControllers, string pumpSideMappingStr,
  57. string forceMappingFusionHoseToHuiTianHoseStr, string sqlServerConnStr, string rawProductNameToPosProductNameStr)
  58. {
  59. fdcPumpControllers = pumpControllers;
  60. var pumpSideMappingRawString = pumpSideMappingStr.Trim().Replace(" ", "");
  61. if (pumpSideMappingRawString.Substring(pumpSideMappingRawString.Length - 1) == ";")
  62. pumpSideMappingRawString = pumpSideMappingRawString.Substring(0, pumpSideMappingRawString.Length - 1);
  63. pumpSidePairs = pumpSideMappingRawString.Split(';')
  64. .Select(p => new Tuple<int, int, int>(int.Parse(p.Split(':')[0]), int.Parse(p.Split(':')[1]), int.Parse(p.Split(':')[2])));
  65. if (!string.IsNullOrEmpty(forceMappingFusionHoseToHuiTianHoseStr))
  66. {
  67. var nozzleRemappingRawString = forceMappingFusionHoseToHuiTianHoseStr.Trim().Replace(" ", "");
  68. if (nozzleRemappingRawString.Substring(nozzleRemappingRawString.Length - 1) == ";")
  69. nozzleRemappingRawString = nozzleRemappingRawString.Substring(0, nozzleRemappingRawString.Length - 1);
  70. logger.Info("will parse forceMappingFusionHoseToHuiTianHose, raw string in config is: " + nozzleRemappingRawString);
  71. nozzleRemappingPairs = nozzleRemappingRawString.Split(';').Select(p =>
  72. new Tuple<int, int, int>(int.Parse(p.Split(':')[0]), int.Parse(p.Split(':')[1]),
  73. int.Parse(p.Split(':')[2])));
  74. }
  75. this.sqlServerConnStr = sqlServerConnStr;
  76. if (!string.IsNullOrEmpty(rawProductNameToPosProductNameStr))
  77. {
  78. rawProductNameToPosProductNameStr.Split(';')
  79. .Where(w => !string.IsNullOrEmpty(w))
  80. .Select(p => new KeyValuePair<string, string>(p.Split(':')[0], p.Split(':')[1])).ToList()
  81. .ForEach(v => rawProductNameToPosProductNameMapping.Add(v.Key, v.Value));
  82. }
  83. }
  84. #endregion
  85. public void Init()
  86. {
  87. if (initialized)
  88. return;
  89. foreach (var fdcPumpController in fdcPumpControllers)
  90. {
  91. fdcPumpController.OnStateChange += (s, a) =>
  92. {
  93. var pump = s as IFdcPumpController;
  94. try
  95. {
  96. if (a.NewPumpState == LogicalDeviceState.FDC_READY)
  97. {
  98. /* indicate for nozzle if replaced back */
  99. var sizeLevelNozzleIdsOnPump = SiteConfigUtility.Default.GetSiteLevelNozzleIdsByPumpId(pump.PumpId);
  100. if (!sizeLevelNozzleIdsOnPump.Any())
  101. {
  102. logger.Info("Could not found any site level nozzle ids for pump: " + pump.PumpId);
  103. return;
  104. }
  105. using (var posSqlConnection = new SqlConnection(this.sqlServerConnStr))
  106. {
  107. try
  108. {
  109. /* idle would not carry nozzle id, so here reset all nozzles on target pump.*/
  110. var setPumpOnIdleCommand
  111. = new SqlCommand(sizeLevelNozzleIdsOnPump.Select(siteLevelNozzleId =>
  112. {
  113. SqliteDbContext dbContext = new SqliteDbContext();
  114. //var lastTrx = dbContext.PumpTransactionModels.OrderByDescending(f => f.SaleEndTime)
  115. // .FirstOrDefault(f => f.PumpId == pump.PumpId && f.LogicalNozzleId == SiteConfigUtility.Default.GetNozzleLogicalIdBySiteLevelNozzleId(siteLevelNozzleId));
  116. //var totalizer =
  117. // new Tuple<float, float>((float)((lastTrx?.VolumeTotalizer ?? 0) * Math.Pow(10, 2)),
  118. // (float)((lastTrx?.AmountTotalizer ?? 0) * Math.Pow(10, 2)));
  119. //return
  120. // string.Format(
  121. // "Update jy_info set [status] = '{1}', qty=0, amount=0, fzqty='{2}', fzamount={3}" +
  122. // " where jihao = {0}", siteLevelNozzleId, 'F',
  123. // totalizer.Item1, totalizer.Item2);
  124. return
  125. string.Format(
  126. "Update jy_info set [status] = '{1}', qty=0, amount=0" +
  127. " where jihao = {0}", siteLevelNozzleId, 'F');
  128. }).Aggregate((acc, n) => acc + " " + n), posSqlConnection);
  129. logger.Debug("setPumpOnIdleCommand(via Fdc): " + setPumpOnIdleCommand.CommandText);
  130. posSqlConnection.Open();
  131. setPumpOnIdleCommand.ExecuteNonQuery();
  132. }
  133. catch (Exception ex)
  134. {
  135. logger.Error("executing setPumpOnIdleCommand(via Fdc) failed, exception detail: " + ex);
  136. }
  137. }
  138. }
  139. else if (a.NewPumpState == LogicalDeviceState.FDC_CALLING)
  140. {
  141. using (var posSqlConnection = new SqlConnection(this.sqlServerConnStr))
  142. {
  143. try
  144. {
  145. var operatingNozzleLogicalId = a?.StateChangedNozzles?.FirstOrDefault()?.LogicalId ?? (byte)0;
  146. var rawProductNo = nozzleProductConfig.First(f => f.PumpId == pump.PumpId
  147. && f.NozzleLogicalId == operatingNozzleLogicalId).ProductBarcode;
  148. var gradeFriendlyName = rawProductNameToPosProductNameMapping[rawProductNo.ToString()];
  149. //var updatePumpOnFuelingCommand =
  150. // new SqlCommand(string.Format("Update jy_info set [status] = '{1}', youpin = N'{2}', qty= {3}, amount= {4} where jihao = '{0}'"
  151. // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(pump.PumpId, a?.Transaction?.Nozzle?.LogicalId ?? 0),
  152. // 'B',
  153. // gradeFriendlyName,
  154. // a.Transaction.Volumn,
  155. // a.Transaction.Amount),
  156. // posSqlConnection);
  157. var updatePumpOnFuelingCommand =
  158. new SqlCommand(string.Format("Update jy_info set [status] = '{1}' where jihao = '{0}'"
  159. , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(pump.PumpId, operatingNozzleLogicalId),
  160. 'B',
  161. gradeFriendlyName),
  162. posSqlConnection);
  163. logger.Debug("updatePumpOnFuelingCommand: " + updatePumpOnFuelingCommand.CommandText);
  164. posSqlConnection.Open();
  165. updatePumpOnFuelingCommand.ExecuteNonQuery();
  166. }
  167. catch (Exception ex)
  168. {
  169. logger.Error("executing updatePumpOnFuelingCommand failed, exception detail: " + ex);
  170. }
  171. }
  172. }
  173. }
  174. catch (Exception exx)
  175. { }
  176. };
  177. fdcPumpController.OnCurrentFuellingStatusChange += async (s, a) =>
  178. {
  179. try
  180. {
  181. var pump = s as IFdcPumpController;
  182. if (!a.Transaction.Finished)
  183. {
  184. //logger.Info("Start to query accumulator");
  185. //var acc = await pump.QueryTotalizerAsync(a.Transaction.Nozzle.LogicalId);
  186. //logger.Info($"Amount accumulator: {acc.Item1}, Volume accumulator: {acc.Item2}");
  187. using (var posSqlConnection = new SqlConnection(this.sqlServerConnStr))
  188. {
  189. try
  190. {
  191. var rawProductNo = nozzleProductConfig.First(f => f.PumpId == pump.PumpId && f.NozzleLogicalId == a.Transaction.Nozzle.LogicalId).ProductBarcode;
  192. var gradeFriendlyName = rawProductNameToPosProductNameMapping[rawProductNo.ToString()];
  193. //var updatePumpOnFuelingCommand =
  194. // new SqlCommand(string.Format("Update jy_info set [status] = '{1}', youpin = N'{2}', qty= {3}, amount= {4} where jihao = '{0}'"
  195. // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(pump.PumpId, a?.Transaction?.Nozzle?.LogicalId ?? 0),
  196. // 'B',
  197. // gradeFriendlyName,
  198. // a.Transaction.Volumn,
  199. // a.Transaction.Amount),
  200. // posSqlConnection);
  201. var updatePumpOnFuelingCommand =
  202. new SqlCommand(string.Format("Update jy_info set youpin = N'{2}', qty= {3}, amount= {4}, fzqty= {5}, fzamount= {6} where jihao = '{0}'"
  203. , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(pump.PumpId, a?.Transaction?.Nozzle?.LogicalId ?? 0),
  204. "",
  205. gradeFriendlyName,
  206. a.Transaction.Volumn / Math.Pow(10, pump.VolumeDecimalDigits),
  207. a.Transaction.Amount / Math.Pow(10, pump.AmountDecimalDigits),
  208. 0,//acc.Item2 / Math.Pow(10, pump.VolumeDecimalDigits),
  209. 0),//acc.Item1 / Math.Pow(10, pump.AmountDecimalDigits)),
  210. posSqlConnection);
  211. logger.Debug("updatePumpOnFuelingCommand: " + updatePumpOnFuelingCommand.CommandText);
  212. posSqlConnection.Open();
  213. updatePumpOnFuelingCommand.ExecuteNonQuery();
  214. }
  215. catch (Exception ex)
  216. {
  217. logger.Error("executing updatePumpOnFuelingCommand failed, exception detail: " + ex);
  218. }
  219. }
  220. }
  221. else
  222. {
  223. logger.Info("Filling done, start to query accumulator");
  224. var acc = await pump.QueryTotalizerAsync(a.Transaction.Nozzle.LogicalId);
  225. logger.Info($"Amount accumulator: {acc.Item1}, Volume accumulator: {acc.Item2}");
  226. var posSqlConnection = new SqlConnection(this.sqlServerConnStr);
  227. using (posSqlConnection)
  228. {
  229. try
  230. {
  231. var rawProductNo = nozzleProductConfig.First(f => f.PumpId == pump.PumpId && f.NozzleLogicalId == a.Transaction.Nozzle.LogicalId).ProductBarcode;
  232. var gradeFriendlyName = rawProductNameToPosProductNameMapping[rawProductNo.ToString()];
  233. //var totalizer = SiteConfigUtility.Default.GetTotalizer(e.Fuelling.Pump.Id, e.Fuelling.Nozzle.Id);
  234. var updateFuelingTrxDoneCommand =
  235. new SqlCommand(
  236. string.Format(
  237. "insert xiaofei2 (jihao, youpin, qty, danjia, amount, xf_date, xf_time, liushuino, fzqty, fzamount)" +
  238. " values({0}, N'{1}', {2}, {3}, {4}, '{5}', '{6}', {7}, {8}, {9})",
  239. SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(pump.PumpId, a.Transaction.Nozzle.LogicalId),
  240. gradeFriendlyName,
  241. a.Transaction.Volumn / Math.Pow(10, pump.VolumeDecimalDigits),
  242. a.Transaction.Price / Math.Pow(10, pump.PriceDecimalDigits),
  243. a.Transaction.Amount / Math.Pow(10, pump.AmountDecimalDigits),
  244. DateTime.Now.Date.ToString("yyyy-MM-dd"),
  245. DateTime.Now.ToString("HH:mm:ss"),
  246. a.Transaction.SequenceNumberGeneratedOnPhysicalPump,
  247. acc.Item2 / Math.Pow(10, pump.VolumeDecimalDigits),
  248. acc.Item1 / Math.Pow(10, pump.AmountDecimalDigits)),
  249. posSqlConnection);
  250. logger.Info("updateFuelingTrxDoneCommand: " + updateFuelingTrxDoneCommand.CommandText);
  251. posSqlConnection.Open();
  252. updateFuelingTrxDoneCommand.ExecuteNonQuery();
  253. }
  254. catch (Exception ex)
  255. {
  256. logger.Error("executing updateFuelingTrxDoneCommand failed, exception detail: " + ex);
  257. }
  258. }
  259. using (var sqlConnection = new SqlConnection(this.sqlServerConnStr))
  260. {
  261. try
  262. {
  263. //var rawProductNo = nozzleProductConfig.First(f => f.PumpId == pump.PumpId
  264. // && f.NozzleLogicalId == operatingNozzleLogicalId).ProductBarcode;
  265. //var gradeFriendlyName = rawProductNameToPosProductNameMapping[rawProductNo.ToString()];
  266. //var updatePumpOnFuelingCommand =
  267. // new SqlCommand(string.Format("Update jy_info set [status] = '{1}', youpin = N'{2}', qty= {3}, amount= {4} where jihao = '{0}'"
  268. // , SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(pump.PumpId, a?.Transaction?.Nozzle?.LogicalId ?? 0),
  269. // 'B',
  270. // gradeFriendlyName,
  271. // a.Transaction.Volumn,
  272. // a.Transaction.Amount),
  273. // posSqlConnection);
  274. var updatePumpOnFuelingCommand =
  275. new SqlCommand(string.Format("Update jy_info set fzqty = '{1}', fzamount={2} where jihao = '{0}'"
  276. ,
  277. SiteConfigUtility.Default.GetSiteLevelNozzleIdByLogicalNozzleId(
  278. pump.PumpId, a.Transaction.Nozzle.LogicalId),
  279. acc.Item2 / Math.Pow(10, pump.VolumeDecimalDigits),
  280. acc.Item1 / Math.Pow(10, pump.AmountDecimalDigits)),
  281. sqlConnection);
  282. logger.Debug("updatePumpOnFuelingCommand: " + updatePumpOnFuelingCommand.CommandText);
  283. sqlConnection.Open();
  284. updatePumpOnFuelingCommand.ExecuteNonQuery();
  285. }
  286. catch (Exception ex)
  287. {
  288. logger.Error("executing updatePumpOnFuelingCommand failed, exception detail: " + ex);
  289. }
  290. }
  291. }
  292. }
  293. catch (Exception exxx)
  294. { }
  295. };
  296. }
  297. #region table [jyjpz]
  298. try
  299. {
  300. var siteNozzlesDataTableInFcDb = new DataTable();
  301. siteNozzlesDataTableInFcDb.Columns.Add("pumpid");
  302. siteNozzlesDataTableInFcDb.Columns.Add("HoseLogicalId");
  303. siteNozzlesDataTableInFcDb.Columns.Add("productNo");
  304. foreach (var fdcPumpController in this.fdcPumpControllers)
  305. {
  306. foreach (var nozzle in fdcPumpController.Nozzles)
  307. {
  308. var bindProduct = nozzleProductConfig.FirstOrDefault(n =>
  309. n.PumpId == fdcPumpController.PumpId
  310. && n.NozzleLogicalId == nozzle.LogicalId);
  311. var fuelPrice = nozzle.RealPriceOnPhysicalPump == null ? 0 :
  312. (nozzle.RealPriceOnPhysicalPump.Value / Math.Pow(10, fdcPumpController.PriceDecimalDigits));
  313. var newRow = siteNozzlesDataTableInFcDb.NewRow();//.Rows.Add( new DataRow)
  314. newRow["pumpid"] = fdcPumpController.PumpId;
  315. newRow["HoseLogicalId"] = nozzle.LogicalId;
  316. newRow["productNo"] = bindProduct.ProductBarcode;
  317. siteNozzlesDataTableInFcDb.Rows.Add(newRow);
  318. }
  319. }
  320. // SinoChem defined a id of: 'jiHao' which stands for a physical pump(2 sides).
  321. siteNozzlesDataTableInFcDb.Columns.Add(new DataColumn("jiHao"));
  322. // SinoChem need another id of site overall id for a nozzle, start from 1.
  323. // we cacualte this based on jiHao and HostLogicalId
  324. siteNozzlesDataTableInFcDb.Columns.Add(new DataColumn("siteLevelNozzleId"));
  325. // as doc defined, side A is 0, side B is 1.
  326. siteNozzlesDataTableInFcDb.Columns.Add(new DataColumn("sideId"));
  327. var siteNozzlesDataRowsInFcDb = siteNozzlesDataTableInFcDb.Rows.Cast<DataRow>();
  328. foreach (var row in siteNozzlesDataRowsInFcDb)
  329. {
  330. var pumpId = int.Parse(row["pumpid"].ToString());
  331. var possibleSideA = this.pumpSidePairs.FirstOrDefault(p => p.Item1 == pumpId);
  332. Tuple<int, int, int> possibleSideB = null;
  333. if (possibleSideA != null)
  334. {
  335. row["sideId"] = "0";
  336. row["jiHao"] = possibleSideA.Item3;
  337. }
  338. else if ((possibleSideB = this.pumpSidePairs.FirstOrDefault(p => p.Item2 == pumpId)) != null)
  339. {
  340. row["sideId"] = "1";
  341. row["jiHao"] = possibleSideB.Item3;
  342. }
  343. else
  344. {
  345. throw new ArgumentException("Pump with pumpId: " + pumpId +
  346. " is neither side A nor side B, pls check Side definition config file.");
  347. }
  348. }
  349. this.sortedSiteNozzlesDataRows =
  350. siteNozzlesDataRowsInFcDb.OrderBy(r => int.Parse(r["jiHao"].ToString()))
  351. .ThenBy(r => r["sideId"])
  352. .ThenBy(r => r["HoseLogicalId"]);
  353. SiteConfigUtility.Default.UpdateLatestSiteConfig(this.sortedSiteNozzlesDataRows);
  354. logger.Debug("sortedSiteNozzlesDataRows: \r\n");
  355. // finally we get the ordered sequence, now give them sitelevel nozzle id.
  356. for (var i = 0; i < sortedSiteNozzlesDataRows.Count(); i++)
  357. {
  358. var oneRow = sortedSiteNozzlesDataRows.ElementAt(i);
  359. oneRow["siteLevelNozzleId"] = i + 1;
  360. logger.Debug(" JiHao: " + oneRow["jiHao"] + ", sideId: " + oneRow["sideId"] +
  361. ", nozzleLogicalId: " + oneRow["HoseLogicalId"] +
  362. ", siteLevelNozzleId: " + oneRow["siteLevelNozzleId"]
  363. + ", pumpId: " + oneRow["pumpid"]
  364. + ", productNo: " + oneRow["productNo"]
  365. //+ ", hoseName: " + oneRow["hosename"]
  366. );
  367. if (nozzleRemappingPairs != null)
  368. {
  369. var pumpId = int.Parse(oneRow["pumpid"].ToString());
  370. var fusionHoseLogicalId = int.Parse(oneRow["HoseLogicalId"].ToString());
  371. var matched = nozzleRemappingPairs.FirstOrDefault(m => m.Item1 == pumpId && m.Item2 == fusionHoseLogicalId);
  372. if (matched != null)
  373. {
  374. logger.Debug("Found nozzleRemappingPairs for pumpId: " + pumpId + " with HoseLogicalId: " + fusionHoseLogicalId + ", " +
  375. "will remapping the bound siteLevelNozzleId from: " + oneRow["siteLevelNozzleId"] + " to: " + matched.Item3);
  376. oneRow["siteLevelNozzleId"] = matched.Item3;
  377. }
  378. }
  379. }
  380. // for now, always overwrite the whole table in POS database without further check for rows or columns level.
  381. using (var posConn = new SqlConnection(this.sqlServerConnStr))
  382. {
  383. /* configInFcDb structure like below */
  384. //" JiHao: " + oneRow["jiHao"] + ", sideId: " + oneRow["sideId"] +
  385. //", nozzleLogicalId: " + oneRow["HoseLogicalId"] +
  386. //", siteLevelNozzleId: " + oneRow["siteLevelNozzleId"]
  387. string bulkInsertCmd = sortedSiteNozzlesDataRows.Select(
  388. r => string.Format("Select {0}, '{1}', {2}, {3}",
  389. r["jiHao"],
  390. r["sideId"],
  391. r["HoseLogicalId"],
  392. r["siteLevelNozzleId"])).Aggregate((acc, n) => acc + " Union all " + n);
  393. var truncateAndInsertCmd =
  394. new SqlCommand(
  395. "TRUNCATE table jyjpz; INSERT jyjpz (jihao, abtype, qianghao, luojiqh) " + bulkInsertCmd,
  396. posConn);
  397. logger.Info("truncateAndInsertSiteConfigCmd: " + truncateAndInsertCmd.CommandText);
  398. posConn.Open();
  399. truncateAndInsertCmd.ExecuteNonQuery();
  400. //return true;
  401. }
  402. }
  403. catch (Exception ex)
  404. {
  405. logger.Error("PerformCompareAndUpdate exceptioned, detail: " + ex);
  406. }
  407. #endregion
  408. #region table jy_info
  409. foreach (var nozzle in sortedSiteNozzlesDataRows)//.Select(n => n["siteLevelNozzleId"]))
  410. {
  411. var siteLevelNozzleId = nozzle["siteLevelNozzleId"];
  412. var pumpId = int.Parse(nozzle["pumpid"].ToString());
  413. var pump = this.fdcPumpControllers.First(f => f.PumpId == pumpId);
  414. var nozzleLogicalId = int.Parse(nozzle["HoseLogicalId"].ToString());
  415. var productNo = nozzle["productNo"].ToString();
  416. using (
  417. var posSqlConnection = new SqlConnection(this.sqlServerConnStr))
  418. {
  419. try
  420. {
  421. var gradeFriendlyName = rawProductNameToPosProductNameMapping[productNo];// Translator.GetFriendlyGradeName(SiteConfigUtility.Default.GetGradeName(siteLevelNozzleId));
  422. SqliteDbContext dbContext = new SqliteDbContext();
  423. var lastTrx = dbContext.PumpTransactionModels.OrderByDescending(f => f.SaleEndTime)
  424. .FirstOrDefault(f => f.PumpId == pumpId && f.LogicalNozzleId == nozzleLogicalId);
  425. var totalizer =
  426. new Tuple<float, float>((float)((lastTrx?.VolumeTotalizer / Math.Pow(10, pump.VolumeDecimalDigits) ?? 0)),
  427. (float)((lastTrx?.AmountTotalizer / Math.Pow(10, pump.AmountDecimalDigits) ?? 0) * Math.Pow(10, 2)));
  428. var setPumpOnStartingCommand =
  429. new SqlCommand(string.Format("if not exists(select * from jy_info where jihao={0})" +
  430. " BEGIN" +
  431. " insert jy_info (jihao, [status], youpin, qty, amount, fzqty, fzamount) values({0}, '{1}', N'{2}', 0, 0, '{3}', {4})" +
  432. " END", siteLevelNozzleId, 'F', gradeFriendlyName,
  433. totalizer.Item1, totalizer.Item2), posSqlConnection);
  434. logger.Debug("initTable_jy_info_Command: " + setPumpOnStartingCommand.CommandText);
  435. posSqlConnection.Open();
  436. setPumpOnStartingCommand.ExecuteNonQuery();
  437. }
  438. catch (Exception ex)
  439. {
  440. logger.Error("executing initTable_jy_info_Command failed for siteLevelNozzleId: " + siteLevelNozzleId + ", exception detail: " + ex);
  441. throw;
  442. }
  443. }
  444. }
  445. #endregion
  446. initialized = true;
  447. }
  448. private void PrepareInsertTransToXiaofei2()
  449. {
  450. }
  451. private Tuple<int, int> GetAccumulator(IFdcPumpController pumpController, byte logicalNozzleId)
  452. {
  453. return pumpController.QueryTotalizerAsync(logicalNozzleId).Result;
  454. }
  455. }
  456. }