SiteConfigUtility.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. using Dfs.WayneChina.SinochemEps;
  2. using SinochemInternetPlusApp;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Configuration;
  6. using System.Data;
  7. using System.Data.Odbc;
  8. using System.Data.SqlClient;
  9. using System.Linq;
  10. using System.Text;
  11. namespace SinoChemFC2PosProxy
  12. {
  13. internal class SiteConfigUtility
  14. {
  15. private static SiteConfigUtility instance = new SiteConfigUtility();
  16. private object syncObject = new object();
  17. private IEnumerable<DataRow> latestConfig = null;
  18. private SiteConfigUtility()
  19. {
  20. }
  21. public static SiteConfigUtility Default
  22. {
  23. get { return instance; }
  24. }
  25. /// <summary>
  26. /// format:
  27. /// oneRow["jiHao"] oneRow["sideId"] oneRow["HoseLogicalId"] oneRow["siteLevelNozzleId"] oneRow["pumpid"]
  28. /// </summary>
  29. /// <param name="latestConfig"></param>
  30. public void UpdateLatestSiteConfig(IEnumerable<DataRow> config)
  31. {
  32. lock (this.syncObject)
  33. {
  34. this.latestConfig = config;
  35. }
  36. }
  37. public IEnumerable<int> GetAllSiteLevelNozzleIds()
  38. {
  39. lock (this.syncObject)
  40. {
  41. return this.latestConfig.Select(r => int.Parse(r["siteLevelNozzleId"].ToString()));
  42. }
  43. }
  44. /// <summary>
  45. /// query from latest site configuration to get the site level nozzle id by pump and nozzle logical id.
  46. /// </summary>
  47. /// <param name="pumpId">each side of a physical pump contains 2 logical pump which have 2 pump ids.</param>
  48. /// <param name="logicalNozzleId">start from 1, typically a pump have 4 nozzles</param>
  49. /// <returns>-1 indicate query failed.</returns>
  50. public int GetSiteLevelNozzleIdByLogicalNozzleId(int pumpId, int logicalNozzleId)
  51. {
  52. lock (this.syncObject)
  53. {
  54. var targetRow =
  55. latestConfig.FirstOrDefault(
  56. r => r["pumpid"].ToString() == pumpId.ToString() &&
  57. r["HoseLogicalId"].ToString() == logicalNozzleId.ToString());
  58. if (targetRow != null)
  59. {
  60. return int.Parse(targetRow["siteLevelNozzleId"].ToString());
  61. }
  62. return -1;
  63. }
  64. }
  65. /// <summary>
  66. /// all site level nozzle ids for a pump, typically a pump have 4 nozzles.
  67. /// </summary>
  68. /// <param name="pumpId"></param>
  69. /// <returns></returns>
  70. public IEnumerable<int> GetSiteLevelNozzleIdsByPumpId(int pumpId)
  71. {
  72. lock (this.syncObject)
  73. {
  74. var targetRows = latestConfig.Where(r => r["pumpid"].ToString() == pumpId.ToString());
  75. if (targetRows.Any())
  76. {
  77. return targetRows.Select(r => int.Parse(r["siteLevelNozzleId"].ToString()));
  78. }
  79. return null;
  80. }
  81. }
  82. /// <summary>
  83. /// Get the pump totalizer for specific nozzle.
  84. /// The reading is from FC database.
  85. /// </summary>
  86. /// <param name="pumpId">from 1, site unique</param>
  87. /// <param name="logicalNozzleId">nozzle id in a pump, start from 1, typically a pump have 4 nozzles.</param>
  88. /// <returns>first item is VolumeTotalizer, second item is MoneyTotalizer></returns>
  89. public Tuple<float, float> GetTotalizer(int pumpId, int logicalNozzleId)
  90. {
  91. using (
  92. var fcOdbcConnection =
  93. new SqlConnection(SinochemEpsApp.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(SinochemEpsApp.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. public string GetGradeName(int pumpId, int logicalNozzleId)
  173. {
  174. using (
  175. var fcOdbcConnection =
  176. new SqlConnection(SinochemEpsApp.AppSettings["FCDatabaseConnStr"]))
  177. {
  178. var selectCmd = new SqlCommand(
  179. string.Format("select param_value from " +
  180. "config_values where library='pump' and groupname='subinfo' and id='{0}' and device_id = 'hose{1}' " +
  181. "and parameter='grade' "
  182. , pumpId, logicalNozzleId),
  183. fcOdbcConnection);
  184. fcOdbcConnection.Open();
  185. var gradeName = selectCmd.ExecuteScalar().ToString();
  186. return gradeName;
  187. }
  188. }
  189. public string GetGradeName(int siteLevelNozzleId)
  190. {
  191. int pumpId = -1;
  192. int hoseLogicalId = -1;
  193. lock (this.syncObject)
  194. {
  195. var targetRow =
  196. this.latestConfig.First(r => r["siteLevelNozzleId"].ToString() == siteLevelNozzleId.ToString());
  197. pumpId = int.Parse(targetRow["pumpid"].ToString());
  198. hoseLogicalId = int.Parse(targetRow["HoseLogicalId"].ToString());
  199. }
  200. return this.GetGradeName(pumpId, hoseLogicalId);
  201. }
  202. /// <summary>
  203. /// Get the grade name by its grade id, grade id is like: 2,3,4,7
  204. /// </summary>
  205. /// <param name="gradeId">like: 2,3,4,7</param>
  206. /// <returns>SYN 2000, DIESEL and etc.</returns>
  207. public string GetGradeNameByGradeId(int gradeId)
  208. {
  209. using (
  210. var fcOdbcConnection =
  211. new SqlConnection(SinochemEpsApp.AppSettings["FCDatabaseConnStr"]))
  212. {
  213. var selectCmd = new SqlCommand(
  214. string.Format("select id from " +
  215. "config_values where library='grade' and groupname='general' and parameter='number' and param_value='{0}' "
  216. , gradeId),
  217. fcOdbcConnection);
  218. fcOdbcConnection.Open();
  219. var gradeName = selectCmd.ExecuteScalar().ToString();
  220. return gradeName;
  221. }
  222. }
  223. }
  224. }