mysql_dao.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. from database import MySqlDatabaseHelper
  2. from sqlalchemy import text, bindparam
  3. import pandas as pd
  4. class MySqlDao:
  5. _instance = None
  6. def __new__(cls):
  7. if not cls._instance:
  8. cls._instance = super(MySqlDao, cls).__new__(cls)
  9. cls._instance._initialized = False
  10. return cls._instance
  11. def __init__(self):
  12. if self._initialized:
  13. return
  14. self.db_helper = MySqlDatabaseHelper()
  15. self._product_tablename = "tads_brandcul_product_info_f"
  16. self._cust_tablename = "tads_brandcul_cust_info_f"
  17. self._order_tablename = "tads_brandcul_consumer_order"
  18. self._eval_order_name = "tads_brandcul_consumer_order_check_week"
  19. self._mock_order_tablename = "yunfu_mock_data"
  20. self._shopping_tablename = "tads_brandcul_cust_info_lbs_f"
  21. # self._shopping_tablename = "yunfu_shopping_mock_data"
  22. self._report_tablename = "tads_brandcul_report"
  23. self._initialized = True
  24. def load_product_data(self, city_uuid):
  25. """从数据库中读取商品信息"""
  26. query = f"SELECT * FROM {self._product_tablename} WHERE city_uuid = :city_uuid"
  27. params = {"city_uuid": city_uuid}
  28. data = self.db_helper.load_data_with_page(query, params)
  29. return data
  30. def load_cust_data(self, city_uuid):
  31. """从数据库中读取商户信息"""
  32. query = f"SELECT * FROM {self._cust_tablename} WHERE BA_CITY_ORG_CODE = :city_uuid"
  33. params = {"city_uuid": city_uuid}
  34. data = self.db_helper.load_data_with_page(query, params)
  35. return data
  36. def load_order_data(self, city_uuid):
  37. """从数据库中读取订单信息"""
  38. query = f"SELECT * FROM {self._order_tablename} WHERE city_uuid = :city_uuid"
  39. params = {"city_uuid": city_uuid}
  40. data = self.db_helper.load_data_with_page(query, params)
  41. data.drop('stat_month', axis=1, inplace=True)
  42. data.drop('city_uuid', axis=1, inplace=True)
  43. cust_list = self.get_cust_list(city_uuid)
  44. cust_index = cust_list.set_index("BB_RETAIL_CUSTOMER_CODE")
  45. data = data.join(cust_index, on="cust_code", how="inner")
  46. return data
  47. def load_delivery_order_data(self, city_uuid, start_time, end_time):
  48. """从数据库中读取订单信息"""
  49. query = f"SELECT * FROM {self._eval_order_name} WHERE city_uuid = :city_uuid AND cycle_begin_date = :start_time AND cycle_end_date = :end_time"
  50. params = {
  51. "city_uuid": city_uuid,
  52. "start_time": start_time,
  53. "end_time": end_time
  54. }
  55. data = self.db_helper.load_data_with_page(query, params)
  56. return data
  57. def load_mock_order_data(self):
  58. """从数据库中读取mock的订单信息"""
  59. query = f"SELECT * FROM {self._mock_order_tablename}"
  60. data = self.db_helper.load_data_with_page(query, {})
  61. return data
  62. def load_shopping_data(self, city_uuid):
  63. """从数据库中读取商圈数据"""
  64. query = f"SELECT * FROM {self._shopping_tablename} WHERE city_uuid = :city_uuid"
  65. params = {"city_uuid": city_uuid}
  66. data = self.db_helper.load_data_with_page(query, params)
  67. return data
  68. def get_product_by_id(self, city_uuid, product_id):
  69. """根据city_uuid 和 product_id 从表中获取拼柜信息"""
  70. query = f"""
  71. SELECT *
  72. FROM {self._product_tablename}
  73. WHERE city_uuid = :city_uuid
  74. AND product_code = :product_id
  75. """
  76. params = {"city_uuid": city_uuid, "product_id": product_id}
  77. data = self.db_helper.load_data_with_page(query, params)
  78. return data
  79. def get_cust_by_ids(self, city_uuid, cust_id_list):
  80. """根据零售户列表查询其信息"""
  81. if not cust_id_list:
  82. return None
  83. query = text(f"""
  84. SELECT *
  85. FROM {self._cust_tablename}
  86. WHERE BA_CITY_ORG_CODE = :city_uuid
  87. AND BB_RETAIL_CUSTOMER_CODE IN :ids
  88. """).bindparams(bindparam("ids", expanding=True))
  89. params = {"city_uuid": city_uuid, "ids": list(cust_id_list)}
  90. data = pd.DataFrame(self.db_helper.fetch_all(query, params))
  91. return data
  92. def get_shop_by_ids(self, city_uuid, cust_id_list):
  93. """根据零售户列表查询其信息"""
  94. if not cust_id_list:
  95. return None
  96. query = text(f"""
  97. SELECT *
  98. FROM {self._shopping_tablename}
  99. WHERE city_uuid = :city_uuid
  100. AND cust_code IN :ids
  101. """).bindparams(bindparam("ids", expanding=True))
  102. params = {"city_uuid": city_uuid, "ids": list(cust_id_list)}
  103. data = pd.DataFrame(self.db_helper.fetch_all(query, params))
  104. return data
  105. def get_product_by_ids(self, city_uuid, product_id_list):
  106. """根据product_code列表查询其信息"""
  107. if not product_id_list:
  108. return None
  109. query = text(f"""
  110. SELECT *
  111. FROM {self._product_tablename}
  112. WHERE city_uuid = :city_uuid
  113. AND product_code IN :ids
  114. """).bindparams(bindparam("ids", expanding=True))
  115. params = {"city_uuid": city_uuid, "ids": list(product_id_list)}
  116. data = pd.DataFrame(self.db_helper.fetch_all(query, params))
  117. return data
  118. def get_order_by_product_ids(self, city_uuid, product_ids):
  119. """获取指定香烟列表的所有售卖记录"""
  120. if not product_ids:
  121. return None
  122. query = text(f"""
  123. SELECT *
  124. FROM {self._order_tablename}
  125. WHERE city_uuid = :city_uuid
  126. AND product_code IN :ids
  127. """).bindparams(bindparam("ids", expanding=True))
  128. params = {"city_uuid": city_uuid, "ids": list(product_ids)}
  129. data = pd.DataFrame(self.db_helper.fetch_all(query, params))
  130. cust_list = self.get_cust_list(city_uuid)
  131. cust_index = cust_list.set_index("BB_RETAIL_CUSTOMER_CODE")
  132. data = data.join(cust_index, on="cust_code", how="inner")
  133. return data
  134. def get_order_by_product(self, city_uuid, product_id):
  135. query = f"""
  136. SELECT *
  137. FROM {self._order_tablename}
  138. WHERE city_uuid = :city_uuid
  139. AND product_code = :product_id
  140. """
  141. params = {"city_uuid": city_uuid, "product_id": product_id}
  142. data = self.db_helper.load_data_with_page(query, params)
  143. cust_list = self.get_cust_list(city_uuid)
  144. cust_index = cust_list.set_index("BB_RETAIL_CUSTOMER_CODE")
  145. data = data.join(cust_index, on="cust_code", how="inner")
  146. return data
  147. def get_eval_order_by_product(self, city_uuid, product_id):
  148. query = f"""
  149. SELECT *
  150. FROM {self._eval_order_name}
  151. WHERE city_uuid = :city_uuid
  152. AND product_code = :product_id
  153. """
  154. params = {"city_uuid": city_uuid, "product_id": product_id}
  155. data = self.db_helper.load_data_with_page(query, params)
  156. return data
  157. def get_delivery_data_by_product(self, city_uuid, product_id, start_time, end_time):
  158. """通过品规获取验证数据"""
  159. query = f"""
  160. SELECT *
  161. FROM {self._eval_order_name}
  162. WHERE city_uuid = :city_uuid
  163. AND goods_code = :product_id
  164. AND cycle_begin_date = :start_time
  165. AND cycle_end_date = :end_time
  166. """
  167. params = {
  168. "city_uuid": city_uuid,
  169. "product_id": product_id,
  170. "start_time": start_time,
  171. "end_time": end_time,
  172. }
  173. data = self.db_helper.load_data_with_page(query, params)
  174. return data
  175. def get_order_by_cust(self, city_uuid, cust_id):
  176. query = f"""
  177. SELECT *
  178. FROM {self._order_tablename}
  179. WHERE city_uuid = :city_uuid
  180. AND cust_code = :cust_id
  181. """
  182. params = {"city_uuid": city_uuid, "cust_id": cust_id}
  183. data = self.db_helper.load_data_with_page(query, params)
  184. return data
  185. def get_order_by_cust_and_product(self, city_uuid, cust_id, product_id):
  186. query = f"""
  187. SELECT *
  188. FROM {self._order_tablename}
  189. WHERE city_uuid = :city_uuid
  190. AND cust_code = :cust_id
  191. AND product_code =:product_id
  192. """
  193. params = {"city_uuid": city_uuid, "cust_id": cust_id, "product_id": product_id}
  194. data = self.db_helper.load_data_with_page(query, params)
  195. return data
  196. def get_product_from_order(self, city_uuid):
  197. query = f"SELECT DISTINCT product_code FROM {self._order_tablename} WHERE city_uuid = :city_uuid"
  198. params = {"city_uuid": city_uuid}
  199. data = self.db_helper.load_data_with_page(query, params)
  200. return data
  201. def get_cust_list(self, city_uuid):
  202. query = f"SELECT DISTINCT BB_RETAIL_CUSTOMER_CODE FROM {self._cust_tablename} WHERE BA_CITY_ORG_CODE = :city_uuid"
  203. params = {"city_uuid": city_uuid}
  204. data = self.db_helper.load_data_with_page(query, params)
  205. return data
  206. def data_preprocess(self, data: pd.DataFrame):
  207. """数据预处理"""
  208. data.drop(["cust_uuid", "longitude", "latitude", "range_radius"], axis=1, inplace=True)
  209. remaining_cols = data.columns.drop(["city_uuid", "cust_code"])
  210. col_with_missing = remaining_cols[data[remaining_cols].isnull().any()].tolist() # 判断有缺失的字段
  211. col_all_missing = remaining_cols[data[remaining_cols].isnull().all()].to_list() # 全部缺失的字段
  212. col_partial_missing = list(set(col_with_missing) - set(col_all_missing)) # 部分缺失的字段
  213. for col in col_partial_missing:
  214. data[col] = data[col].fillna(data[col].mean())
  215. for col in col_all_missing:
  216. data[col] = data[col].fillna(0).infer_objects(copy=False)
  217. def insert_report(self, data_dict):
  218. """向report中插入数据"""
  219. return self.db_helper.insert_data(self._report_tablename, data_dict)
  220. def update_eval_report_data(self, cultivacation_id, eval_fileid):
  221. """更新投放记录中的验证报告fileid"""
  222. update_data = {"val_table": eval_fileid}
  223. conditions = [
  224. "cultivacation_id = :cultivacation_id",
  225. ]
  226. condition_params = {
  227. 'cultivacation_id': cultivacation_id,
  228. }
  229. self.db_helper.update_data(self._report_tablename, update_data, conditions, condition_params)
  230. def get_report_file_id(self, cultivacation_id):
  231. """从report中根据cultivacation_id获取对应文件的fileid"""
  232. query = f"SELECT product_info_table, relation_table, similarity_product_table, recommend_table, val_table FROM {self._report_tablename} WHERE cultivacation_id = :cultivacation_id"
  233. params = {"cultivacation_id": cultivacation_id}
  234. result = self.db_helper.fetch_one(text(query), params)
  235. data = pd.DataFrame([dict(result._mapping)] if result else None)
  236. return data
  237. if __name__ == "__main__":
  238. dao = MySqlDao()
  239. cultivacation_id = '10000001'
  240. data = dao.get_report_file_id(cultivacation_id)
  241. print(data)