SiteConfigUtility.cs 10 KB

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