SiteConfigUtility.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. using SinochemInternetPlusApp;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Configuration;
  5. using System.Data;
  6. using System.Data.Odbc;
  7. using System.Data.SqlClient;
  8. using System.Linq;
  9. using System.Text;
  10. namespace SinoChemFC2PosProxy
  11. {
  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. public Tuple<float, float> GetTotalizer(int pumpId, int logicalNozzleId)
  89. {
  90. using (
  91. var fcOdbcConnection =
  92. new SqlConnection(App.AppSettings["FCDatabaseConnStr"]))
  93. {
  94. using (var oda = new SqlDataAdapter(
  95. string.Format("select attr_name,attr_value from " +
  96. "ssf_device_data where attr_name in ('VolumeTotalizer', 'MoneyTotalizer') " +
  97. "and device_id='{0}' and subdevice_id='{1}'", pumpId, logicalNozzleId),
  98. fcOdbcConnection))
  99. {
  100. var totalizersInFcDb = new DataTable();
  101. oda.Fill(totalizersInFcDb);
  102. var totalizersDataRowsInFcDb = totalizersInFcDb.Rows.Cast<DataRow>();
  103. if (!totalizersDataRowsInFcDb.Any())
  104. return new Tuple<float, float>(0, 0);
  105. var VolumeTotalizerRow =
  106. totalizersDataRowsInFcDb.FirstOrDefault(r => r["attr_name"].ToString() == "VolumeTotalizer");
  107. var MoneyTotalizerRow =
  108. totalizersDataRowsInFcDb.FirstOrDefault(r => r["attr_name"].ToString() == "MoneyTotalizer");
  109. var result =
  110. new Tuple<float, float>(
  111. VolumeTotalizerRow == null ? 0 : float.Parse(VolumeTotalizerRow["attr_value"].ToString()),
  112. MoneyTotalizerRow == null ? 0 : float.Parse(MoneyTotalizerRow["attr_value"].ToString()));
  113. return result;
  114. }
  115. }
  116. }
  117. /// <summary>
  118. /// Get the pump nozzle totalizer which saved in POS database(table: jy_info, column fzqty and fzamount) for specific nozzle.
  119. /// The reading is from POS database.
  120. /// </summary>
  121. /// <param name="pumpId">from 1, site unique</param>
  122. /// <param name="logicalNozzleId">nozzle id in a pump, start from 1, typically a pump have 4 nozzles.</param>
  123. /// <returns>first item is fzqty(VolumeTotalizer), second item is fzamount(MoneyTotalizer)</returns>
  124. public Tuple<string, float> GetTotalizerFromPos(int pumpId, int logicalNozzleId)
  125. {
  126. int jihao = GetSiteLevelNozzleIdByLogicalNozzleId(pumpId, logicalNozzleId);
  127. using (
  128. var posSqlConnection =
  129. new SqlConnection(App.AppSettings["PosDatabaseConnStr"]))
  130. {
  131. using (var sda = new SqlDataAdapter(
  132. string.Format("select fzqty,fzamount from jy_info where jihao={0}", jihao),
  133. posSqlConnection))
  134. {
  135. var totalizersInPosDb = new DataTable();
  136. sda.Fill(totalizersInPosDb);
  137. if (totalizersInPosDb.Rows.Count == 0)
  138. return new Tuple<string, float>("0", 0);
  139. var result =
  140. new Tuple<string, float>((string)(totalizersInPosDb.Rows[0]["fzqty"]),
  141. float.Parse(totalizersInPosDb.Rows[0]["fzamount"].ToString()));
  142. return result;
  143. }
  144. }
  145. }
  146. /// <summary>
  147. /// Get the pump totalizer for specific nozzle.
  148. /// The reading is from FC database.
  149. /// </summary>
  150. /// <param name="siteLevelNozzleId">site level nozzle id, start from 1, site unique</param>
  151. /// <returns>first item is VolumeTotalizer, second item is MoneyTotalizer></returns>
  152. public Tuple<float, float> GetTotalizer(int siteLevelNozzleId)
  153. {
  154. int pumpId = -1;
  155. int hoseLogicalId = -1;
  156. lock (this.syncObject)
  157. {
  158. var targetRow =
  159. this.latestConfig.First(r => r["siteLevelNozzleId"].ToString() == siteLevelNozzleId.ToString());
  160. pumpId = int.Parse(targetRow["pumpid"].ToString());
  161. hoseLogicalId = int.Parse(targetRow["HoseLogicalId"].ToString());
  162. }
  163. return this.GetTotalizer(pumpId, hoseLogicalId);
  164. }
  165. /// <summary>
  166. /// Get the grade name which configurated on a nozzle.
  167. /// </summary>
  168. /// <param name="pumpId">from 1, site unique</param>
  169. /// <param name="logicalNozzleId">nozzle id in a pump, start from 1, typically a pump have 4 nozzles.</param>
  170. /// <returns>SYN 2000, DIESEL and etc.</returns>
  171. public string GetGradeName(int pumpId, int logicalNozzleId)
  172. {
  173. using (
  174. var fcOdbcConnection =
  175. new SqlConnection(App.AppSettings["FCDatabaseConnStr"]))
  176. {
  177. var selectCmd = new SqlCommand(
  178. string.Format("select param_value from " +
  179. "config_values where library='pump' and groupname='subinfo' and id='{0}' and device_id = 'hose{1}' " +
  180. "and parameter='grade' "
  181. , pumpId, logicalNozzleId),
  182. fcOdbcConnection);
  183. fcOdbcConnection.Open();
  184. var gradeName = selectCmd.ExecuteScalar().ToString();
  185. return gradeName;
  186. }
  187. }
  188. public string GetGradeName(int siteLevelNozzleId)
  189. {
  190. int pumpId = -1;
  191. int hoseLogicalId = -1;
  192. lock (this.syncObject)
  193. {
  194. var targetRow =
  195. this.latestConfig.First(r => r["siteLevelNozzleId"].ToString() == siteLevelNozzleId.ToString());
  196. pumpId = int.Parse(targetRow["pumpid"].ToString());
  197. hoseLogicalId = int.Parse(targetRow["HoseLogicalId"].ToString());
  198. }
  199. return this.GetGradeName(pumpId, hoseLogicalId);
  200. }
  201. /// <summary>
  202. /// Get the grade name by its grade id, grade id is like: 2,3,4,7
  203. /// </summary>
  204. /// <param name="gradeId">like: 2,3,4,7</param>
  205. /// <returns>SYN 2000, DIESEL and etc.</returns>
  206. public string GetGradeNameByGradeId(int gradeId)
  207. {
  208. using (
  209. var fcOdbcConnection =
  210. new SqlConnection(App.AppSettings["FCDatabaseConnStr"]))
  211. {
  212. var selectCmd = new SqlCommand(
  213. string.Format("select id from " +
  214. "config_values where library='grade' and groupname='general' and parameter='number' and param_value='{0}' "
  215. , gradeId),
  216. fcOdbcConnection);
  217. fcOdbcConnection.Open();
  218. var gradeName = selectCmd.ExecuteScalar().ToString();
  219. return gradeName;
  220. }
  221. }
  222. }
  223. }