SiteConfigUtility.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Data.Odbc;
  6. using System.Data.SqlClient;
  7. using System.Linq;
  8. using System.Text;
  9. namespace SinochemInternetPlusApp
  10. {
  11. #warning As of Feb 2020, there are limited functions used from this utility, consider refactoring this
  12. internal class SiteConfigUtility
  13. {
  14. private static SiteConfigUtility instance = new SiteConfigUtility();
  15. private object syncObject = new object();
  16. private IEnumerable<DataRow> latestConfig = null;
  17. private SiteConfigUtility()
  18. {
  19. }
  20. public static SiteConfigUtility Default
  21. {
  22. get { return instance; }
  23. }
  24. /// <summary>
  25. /// format:
  26. /// oneRow["jiHao"] oneRow["sideId"] oneRow["HoseLogicalId"] oneRow["siteLevelNozzleId"] oneRow["pumpid"]
  27. /// </summary>
  28. /// <param name="latestConfig"></param>
  29. public void UpdateLatestSiteConfig(IEnumerable<DataRow> config)
  30. {
  31. lock (this.syncObject)
  32. {
  33. this.latestConfig = config;
  34. }
  35. }
  36. public IEnumerable<int> GetAllSiteLevelNozzleIds()
  37. {
  38. lock (this.syncObject)
  39. {
  40. return this.latestConfig.Select(r => int.Parse(r["siteLevelNozzleId"].ToString()));
  41. }
  42. }
  43. /// <summary>
  44. /// query from latest site configuration to get the site level nozzle id by pump and nozzle logical id.
  45. /// </summary>
  46. /// <param name="pumpId">each side of a physical pump contains 2 logical pump which have 2 pump ids.</param>
  47. /// <param name="logicalNozzleId">start from 1, typically a pump have 4 nozzles</param>
  48. /// <returns>-1 indicate query failed.</returns>
  49. public int GetSiteLevelNozzleIdByLogicalNozzleId(int pumpId, int logicalNozzleId)
  50. {
  51. lock (this.syncObject)
  52. {
  53. var targetRow =
  54. latestConfig.FirstOrDefault(
  55. r => r["pumpid"].ToString() == pumpId.ToString() &&
  56. r["HoseLogicalId"].ToString() == logicalNozzleId.ToString());
  57. if (targetRow != null)
  58. {
  59. return int.Parse(targetRow["siteLevelNozzleId"].ToString());
  60. }
  61. return -1;
  62. }
  63. }
  64. /// <summary>
  65. /// all site level nozzle ids for a pump, typically a pump have 4 nozzles.
  66. /// </summary>
  67. /// <param name="pumpId"></param>
  68. /// <returns></returns>
  69. public IEnumerable<int> GetSiteLevelNozzleIdsByPumpId(int pumpId)
  70. {
  71. lock (this.syncObject)
  72. {
  73. var targetRows = latestConfig.Where(r => r["pumpid"].ToString() == pumpId.ToString());
  74. if (targetRows.Any())
  75. {
  76. return targetRows.Select(r => int.Parse(r["siteLevelNozzleId"].ToString()));
  77. }
  78. return null;
  79. }
  80. }
  81. /// <summary>
  82. /// Get the pump totalizer for specific nozzle.
  83. /// The reading is from FC database.
  84. /// </summary>
  85. /// <param name="pumpId">from 1, site unique</param>
  86. /// <param name="logicalNozzleId">nozzle id in a pump, start from 1, typically a pump have 4 nozzles.</param>
  87. /// <returns>first item is VolumeTotalizer, second item is MoneyTotalizer></returns>
  88. [Obsolete("Don't access Global FC database directly, use Global_Pump_Fdc instead!")]
  89. public Tuple<float, float> GetTotalizer(int pumpId, int logicalNozzleId)
  90. {
  91. using (
  92. var fcOdbcConnection =
  93. new SqlConnection(GenericSinochemEpsApp.AppSettings["FCDatabaseConnStr"]))
  94. {
  95. using (var oda = new SqlDataAdapter(
  96. string.Format("select attr_name,attr_value from " +
  97. "ssf_device_data where attr_name in ('VolumeTotalizer', 'MoneyTotalizer') " +
  98. "and device_id='{0}' and subdevice_id='{1}'", pumpId, logicalNozzleId),
  99. fcOdbcConnection))
  100. {
  101. var totalizersInFcDb = new DataTable();
  102. oda.Fill(totalizersInFcDb);
  103. var totalizersDataRowsInFcDb = totalizersInFcDb.Rows.Cast<DataRow>();
  104. if (!totalizersDataRowsInFcDb.Any())
  105. return new Tuple<float, float>(0, 0);
  106. var VolumeTotalizerRow =
  107. totalizersDataRowsInFcDb.FirstOrDefault(r => r["attr_name"].ToString() == "VolumeTotalizer");
  108. var MoneyTotalizerRow =
  109. totalizersDataRowsInFcDb.FirstOrDefault(r => r["attr_name"].ToString() == "MoneyTotalizer");
  110. var result =
  111. new Tuple<float, float>(
  112. VolumeTotalizerRow == null ? 0 : float.Parse(VolumeTotalizerRow["attr_value"].ToString()),
  113. MoneyTotalizerRow == null ? 0 : float.Parse(MoneyTotalizerRow["attr_value"].ToString()));
  114. return result;
  115. }
  116. }
  117. }
  118. /// <summary>
  119. /// Get the pump nozzle totalizer which saved in POS database(table: jy_info, column fzqty and fzamount) for specific nozzle.
  120. /// The reading is from POS database.
  121. /// </summary>
  122. /// <param name="pumpId">from 1, site unique</param>
  123. /// <param name="logicalNozzleId">nozzle id in a pump, start from 1, typically a pump have 4 nozzles.</param>
  124. /// <returns>first item is fzqty(VolumeTotalizer), second item is fzamount(MoneyTotalizer)</returns>
  125. public Tuple<string, float> GetTotalizerFromPos(int pumpId, int logicalNozzleId)
  126. {
  127. int jihao = GetSiteLevelNozzleIdByLogicalNozzleId(pumpId, logicalNozzleId);
  128. using (
  129. var posSqlConnection =
  130. new SqlConnection(GenericSinochemEpsApp.AppSettings["PosDatabaseConnStr"]))
  131. {
  132. using (var sda = new SqlDataAdapter(
  133. string.Format("select fzqty,fzamount from jy_info where jihao={0}", jihao),
  134. posSqlConnection))
  135. {
  136. var totalizersInPosDb = new DataTable();
  137. sda.Fill(totalizersInPosDb);
  138. if (totalizersInPosDb.Rows.Count == 0)
  139. return new Tuple<string, float>("0", 0);
  140. var result =
  141. new Tuple<string, float>((string)(totalizersInPosDb.Rows[0]["fzqty"]),
  142. float.Parse(totalizersInPosDb.Rows[0]["fzamount"].ToString()));
  143. return result;
  144. }
  145. }
  146. }
  147. /// <summary>
  148. /// Get the pump totalizer for specific nozzle.
  149. /// The reading is from FC database.
  150. /// </summary>
  151. /// <param name="siteLevelNozzleId">site level nozzle id, start from 1, site unique</param>
  152. /// <returns>first item is VolumeTotalizer, second item is MoneyTotalizer></returns>
  153. public Tuple<float, float> GetTotalizer(int siteLevelNozzleId)
  154. {
  155. int pumpId = -1;
  156. int hoseLogicalId = -1;
  157. lock (this.syncObject)
  158. {
  159. var targetRow =
  160. this.latestConfig.First(r => r["siteLevelNozzleId"].ToString() == siteLevelNozzleId.ToString());
  161. pumpId = int.Parse(targetRow["pumpid"].ToString());
  162. hoseLogicalId = int.Parse(targetRow["HoseLogicalId"].ToString());
  163. }
  164. return this.GetTotalizer(pumpId, hoseLogicalId);
  165. }
  166. /// <summary>
  167. /// Get the grade name which configurated on a nozzle.
  168. /// </summary>
  169. /// <param name="pumpId">from 1, site unique</param>
  170. /// <param name="logicalNozzleId">nozzle id in a pump, start from 1, typically a pump have 4 nozzles.</param>
  171. /// <returns>SYN 2000, DIESEL and etc.</returns>
  172. [Obsolete("Don't access Global FC database directly, use Global_Pump_Fdc instead!")]
  173. public string GetGradeName(int pumpId, int logicalNozzleId)
  174. {
  175. using (
  176. var fcOdbcConnection =
  177. new SqlConnection(GenericSinochemEpsApp.AppSettings["FCDatabaseConnStr"]))
  178. {
  179. var selectCmd = new SqlCommand(
  180. string.Format("select param_value from " +
  181. "config_values where library='pump' and groupname='subinfo' and id='{0}' and device_id = 'hose{1}' " +
  182. "and parameter='grade' "
  183. , pumpId, logicalNozzleId),
  184. fcOdbcConnection);
  185. fcOdbcConnection.Open();
  186. var gradeName = selectCmd.ExecuteScalar().ToString();
  187. return gradeName;
  188. }
  189. }
  190. public string GetGradeName(int siteLevelNozzleId)
  191. {
  192. int pumpId = -1;
  193. int hoseLogicalId = -1;
  194. lock (this.syncObject)
  195. {
  196. var targetRow =
  197. this.latestConfig.First(r => r["siteLevelNozzleId"].ToString() == siteLevelNozzleId.ToString());
  198. pumpId = int.Parse(targetRow["pumpid"].ToString());
  199. hoseLogicalId = int.Parse(targetRow["HoseLogicalId"].ToString());
  200. }
  201. return this.GetGradeName(pumpId, hoseLogicalId);
  202. }
  203. /// <summary>
  204. /// Get the grade name by its grade id, grade id is like: 2,3,4,7
  205. /// </summary>
  206. /// <param name="gradeId">like: 2,3,4,7</param>
  207. /// <returns>SYN 2000, DIESEL and etc.</returns>
  208. [Obsolete("Don't access Global FC database directly, use Global_Pump_Fdc instead!")]
  209. public string GetGradeNameByGradeId(int gradeId)
  210. {
  211. using (
  212. var fcOdbcConnection =
  213. new SqlConnection(GenericSinochemEpsApp.AppSettings["FCDatabaseConnStr"]))
  214. {
  215. var selectCmd = new SqlCommand(
  216. string.Format("select id from " +
  217. "config_values where library='grade' and groupname='general' and parameter='number' and param_value='{0}' "
  218. , gradeId),
  219. fcOdbcConnection);
  220. fcOdbcConnection.Open();
  221. var gradeName = selectCmd.ExecuteScalar().ToString();
  222. return gradeName;
  223. }
  224. }
  225. }
  226. }