demo_bi看板数据.py 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. # -*- codeing = utf-8 -*-
  2. # @Time : 2022/12/29 14:13
  3. # @Author : Clown
  4. # @File : demo_bi看板数据.py
  5. # @Software : PyCharm
  6. import pymysql
  7. from datetime import timedelta, datetime
  8. from dateutil.parser import parse
  9. import time
  10. import os
  11. import pandas as pd
  12. import json
  13. import hashlib
  14. import traceback
  15. #连接数据库
  16. def linkTomySql(host,port,passwd,db_name):
  17. '''连接至数据库返回【db】,v2新增local_infile=1 打开文件导入权限'''
  18. try:
  19. #本地连接为:localhost 服务器连接为:124.222.188.59
  20. db = pymysql.connect(
  21. host=host, user="root",
  22. passwd=passwd,
  23. db=db_name,
  24. charset='utf8mb4',
  25. local_infile=1,
  26. port=port)
  27. print('\nconnect to mysql server 成功')
  28. print('------------------------------------')
  29. except:
  30. print("\ncould not connect to mysql server")
  31. db = "连接失败"
  32. return db
  33. def selectShopDailyOperationFormHeadELM(db,uploadFiles,n):
  34. headers_dict_list = []
  35. headers_list = []
  36. for uploadFile in uploadFiles:
  37. for a, b, files in os.walk (uploadFile, topdown=False):
  38. for file in files:
  39. try:
  40. path = str (uploadFile) + '/' + str (file)
  41. # print(path)
  42. df_in = pd.read_excel(path,dtype=str,na_filter=False)
  43. #获取表头
  44. headers = []
  45. for row in df_in.keys ():
  46. headers.append (row)
  47. headers.sort ()
  48. md5 = hashlib.md5 ()
  49. md5.update (str (headers).encode ('utf-8'))
  50. id = md5.hexdigest ()
  51. #提取日期字段
  52. try:
  53. date_list = list(set(df_in['日期']))
  54. except:
  55. print(headers)
  56. date_col_name = input('请输入日期字段名')
  57. date_list = list (set (df_in[date_col_name]))
  58. date_list_o = []
  59. for date_vule in date_list:
  60. ordersDate = parse (str (date_vule)).date ()
  61. date_list_o.append(ordersDate)
  62. min_date = min(date_list_o)
  63. max_date = max(date_list_o)
  64. # print(min_date,max_date)
  65. headers_dict = {'id':id,'min_date':min_date,'max_date':max_date,'header_list':headers}
  66. headers_dict_list.append(headers_dict)
  67. except Exception as e:
  68. print(file,e)
  69. df_compute = pd.DataFrame(headers_dict_list)
  70. headers_only = list(set(df_compute['id']))
  71. print(headers_only)
  72. for i in headers_only:
  73. date_info = df_compute[df_compute['id']==i]
  74. header_list = list(date_info['header_list'])[0]
  75. date_info_min = min(list(set(date_info['min_date'])))
  76. date_info_max = max(list(set(date_info['max_date'])))
  77. headers_dict_o = {'id':i,'min_date':date_info_min,'max_date':date_info_max,'header_list':header_list,'pingtai':'饿了么'}
  78. # md5 = hashlib.md5 ()
  79. # md5.update (str (header_list).encode ('utf-8'))
  80. # if i == md5.hexdigest ():
  81. # print('匹配')
  82. #
  83. # print(headers_dict_o)
  84. headers_list.append(headers_dict_o)
  85. df_out = pd.DataFrame(headers_list)
  86. df_out.to_excel (r'C:\Users\ClownHe\Desktop\导出\selectShopDailyOperationFormHeadELM.xlsx')
  87. def selectShopDailyOperationFormHeadMT(db,uploadFiles,n):
  88. headers_dict_list = []
  89. headers_list = []
  90. for uploadFile in uploadFiles:
  91. for a, b, files in os.walk (uploadFile, topdown=False):
  92. for file in files:
  93. try:
  94. path = str (uploadFile) + '/' + str (file)
  95. try:
  96. df_in = pd.read_csv(path, header=0, dtype='str', encoding='ansi', na_filter=False)
  97. except:
  98. df_in = pd.read_excel (path, dtype=str, na_filter=False)
  99. #获取表头
  100. headers = []
  101. for row in df_in.keys ():
  102. headers.append (row)
  103. headers.sort ()
  104. md5 = hashlib.md5 ()
  105. md5.update (str (headers).encode ('utf-8'))
  106. id = md5.hexdigest ()
  107. # 提取日期字段
  108. try:
  109. date_list = list (set (df_in['日期']))
  110. except:
  111. print (headers)
  112. date_col_name = input ('请输入日期字段名')
  113. date_list = list (set (df_in[date_col_name]))
  114. date_list_o = []
  115. for date_vule in date_list:
  116. ordersDate = parse (str (date_vule)).date ()
  117. date_list_o.append(ordersDate)
  118. min_date = min(date_list_o)
  119. max_date = max(date_list_o)
  120. # print(min_date,max_date)
  121. headers_dict = {'id':id,'min_date':min_date,'max_date':max_date,'header_list':headers}
  122. headers_dict_list.append(headers_dict)
  123. except Exception as e:
  124. print(file,e)
  125. df_compute = pd.DataFrame(headers_dict_list)
  126. headers_only = list(set(df_compute['id']))
  127. print(headers_only)
  128. for i in headers_only:
  129. date_info = df_compute[df_compute['id']==i]
  130. header_list = list(date_info['header_list'])[0]
  131. date_info_min = min(list(set(date_info['min_date'])))
  132. date_info_max = max(list(set(date_info['max_date'])))
  133. headers_dict_o = {'id':i,'min_date':date_info_min,'max_date':date_info_max,'header_list':header_list,'pingtai':'美团'}
  134. # md5 = hashlib.md5 ()
  135. # md5.update (str (header_list).encode ('utf-8'))
  136. # if i == md5.hexdigest ():
  137. # print('匹配')
  138. #
  139. # print(headers_dict_o)
  140. headers_list.append(headers_dict_o)
  141. df_out = pd.DataFrame(headers_list)
  142. df_out.to_excel (r'C:\Users\ClownHe\Desktop\导出\selectShopDailyOperationFormHeadMT.xlsx')
  143. def insertUsefulTitleName(db,uploadFiles):
  144. cursor = db.cursor ()
  145. for uploadFile in uploadFiles:
  146. df_in = pd.read_excel (uploadFile)
  147. rows = df_in.shape[0]
  148. df_in_dict = df_in.loc
  149. for i in range (rows):
  150. rowinfo = dict (df_in_dict[i])
  151. id = rowinfo['id']
  152. start_date = rowinfo['min_date']
  153. end_date = rowinfo['max_date']
  154. title_list = rowinfo['header_list']
  155. json_col = json.loads (rowinfo['json'])
  156. json_col[rowinfo['id']]['平台'] = rowinfo['pingtai']
  157. useful_title_name = json.dumps(json_col,ensure_ascii=False)
  158. wm_plate = rowinfo['pingtai']
  159. sql = '''INSERT INTO shop_daily_operation_data_title_log VALUES (%s,%s,%s,%s,%s,%s);'''
  160. sql_value = (id,start_date,end_date,title_list,useful_title_name,wm_plate)
  161. cursor.execute(sql,sql_value)
  162. db.commit()
  163. def insertSupplyChainsOrders(db,uploadFiles):
  164. for a, b, files in os.walk (uploadFiles, topdown=False):
  165. for file in files:
  166. path = str (uploadFiles) + '/' + str (file)
  167. print(path)
  168. df_in = pd.read_excel(path,dtype=str,na_filter=False)
  169. df_rows = df_in.shape[0]
  170. df_rows_info = df_in.loc
  171. n = 0
  172. m = 0
  173. m_list = []
  174. cursor = db.cursor ()
  175. for i in range(df_rows):
  176. row_dict = dict(df_rows_info[i])
  177. # print(row_dict)
  178. row_json = json.dumps(row_dict,ensure_ascii=False)
  179. try:
  180. customersId = row_dict['客户编码']
  181. customersName = row_dict['客户名称']
  182. ordersId = row_dict['订单编号']
  183. ordersState = row_dict['订单状态']
  184. ordersDateTime = row_dict['下单时间']
  185. ordersDate = parse(str(ordersDateTime)).date()
  186. skuId = row_dict['商品编码']
  187. skuName = row_dict['商品名称']
  188. skuOrdNum = row_dict['订购量']
  189. skuPcs = row_dict['单位']
  190. except:
  191. try:
  192. customersId = row_dict['订货门店编号']
  193. customersName = row_dict['订货门店']
  194. ordersId = row_dict['订货单号']
  195. ordersState = row_dict['订货单状态']
  196. ordersDateTime = row_dict['下单时间']
  197. ordersDate = parse (str (ordersDateTime)).date ()
  198. skuId = row_dict['商品编号']
  199. skuName = row_dict['商品名称']
  200. skuOrdNum = row_dict['最小单位数量']
  201. skuPcs = row_dict['最小单位']
  202. except:
  203. ...
  204. md5 = hashlib.md5 ()
  205. md5.update (str(row_json).encode ('utf-8'))
  206. id = md5.hexdigest()
  207. row_save = (ordersDate, customersId, customersName, row_json, id)
  208. row_app = (customersId,customersName,ordersId,ordersState,ordersDateTime,ordersDate,skuId,skuName,skuOrdNum,skuPcs,id)
  209. sql_save = 'INSERT INTO supply_chains_orders_storage VALUES (%s,%s,%s,%s,%s);'
  210. sql_app = 'INSERT INTO supply_chains_orders_app VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
  211. try:
  212. cursor.execute(sql_save,row_save)
  213. cursor.execute (sql_app, row_app)
  214. db.commit ()
  215. n += 1
  216. except Exception as e:
  217. print(e)
  218. db.rollback()
  219. m += 1
  220. m_list.append(id)
  221. print (f'【{file}】完成上传,共计{n}条数据,重复{m}条,id【{m_list}】')
  222. #重新整合titleLog中参数,并去匹配表头,看关键参数是否一直,如一致则自动更新,不一致则需要手动更新
  223. def selectTitleLogToDict(cursor,id,headers,wm_plate):
  224. sql_all = f'''SELECT * FROM shop_daily_operation_data_title_log ;'''
  225. cursor.execute (sql_all)
  226. results_all = cursor.fetchall ()
  227. results_list = []
  228. results_all_dict = {}
  229. try:
  230. for result in results_all:
  231. id_1 = result[0]
  232. json_1 = json.loads (result[4])[id_1]
  233. results_list.append (json_1)
  234. df_result = pd.DataFrame (results_list)
  235. df_result_titles = df_result.keys ()
  236. for df_result_title in df_result_titles:
  237. keys = list (set (df_result[df_result_title]))
  238. for key in keys:
  239. if key == '':
  240. ...
  241. else:
  242. dict_a = {key: df_result_title}
  243. results_all_dict.update (dict_a)
  244. out_dict = {id:{}}
  245. for header in headers:
  246. try:
  247. out_dict[id][results_all_dict[header]] = header
  248. except:
  249. ...
  250. out_dict[id]['品牌'] = ''
  251. out_dict[id]['平台'] = wm_plate
  252. out_dict[id]['其他参数集合'] = ''
  253. id = id
  254. start_date = datetime.now ().strftime ("%Y-%m-%d")
  255. end_date = datetime.now ().strftime ("%Y-%m-%d")
  256. title_list = str(headers)
  257. useful_title_name = json.dumps (out_dict, ensure_ascii=False)
  258. sql = '''INSERT INTO shop_daily_operation_data_title_log VALUES (%s,%s,%s,%s,%s,%s);'''
  259. sql_value = (id, start_date, end_date, title_list, useful_title_name, wm_plate)
  260. cursor.execute (sql, sql_value)
  261. db.commit ()
  262. print('有新增')
  263. except Exception as e1:
  264. print ('selectTitleLogToDict错误',e1)
  265. def insertShopDailyOperationDate(db,uploadFiles):
  266. cursor = db.cursor()
  267. for uploadFile_d in uploadFiles:
  268. uploadFile = uploadFile_d['path']
  269. wm_plate = uploadFile_d['wm_plate']
  270. brand_name = uploadFile_d['brand_name']
  271. print(wm_plate,brand_name)
  272. log_date = datetime.now ().strftime ("%Y-%m-%d") # 日志记录日期
  273. log_time = datetime.now ().strftime ('%H:%M:%S') # 日志记录时间
  274. for a, b, files in os.walk (uploadFile, topdown=False):
  275. for file in files:
  276. try:
  277. path = str (uploadFile) + '/' + str (file)
  278. try:
  279. df_in = pd.read_csv (path, header=0, dtype='str', encoding='ansi', na_filter=False)
  280. except:
  281. df_in = pd.read_excel (path, dtype=str, na_filter=False)
  282. if 1 == 1:
  283. # 获取表头
  284. headers = []
  285. for row in df_in.keys ():
  286. headers.append (row)
  287. headers.sort ()
  288. md5 = hashlib.md5 ()
  289. md5.update (str (headers).encode ('utf-8'))
  290. # 生成id
  291. id = md5.hexdigest ()
  292. # 发起id查询,匹配title名称
  293. try:
  294. sql = f'''SELECT * FROM shop_daily_operation_data_title_log WHERE `id` = '{id}';'''
  295. cursor.execute (sql)
  296. results = cursor.fetchall ()
  297. row_value = results[0]
  298. useful_title_name = json.loads (row_value[4])[id]
  299. end_date_inform = row_value[2]
  300. except:
  301. # 重新整合titleLog中参数,并去匹配表头,看关键参数是否一直,如一致则自动更新,不一致则需要手动更新
  302. selectTitleLogToDict (cursor,id,headers,wm_plate)
  303. sql = f'''SELECT * FROM shop_daily_operation_data_title_log WHERE `id` = '{id}';'''
  304. cursor.execute (sql)
  305. results = cursor.fetchall ()
  306. row_value = results[0]
  307. useful_title_name = json.loads (row_value[4])[id]
  308. end_date_inform = row_value[2]
  309. # print('1.完成title_log表头处理')
  310. end_date = parse (str (max(list(set(df_in['日期']))))).date ()
  311. if end_date > end_date_inform:
  312. end_date_out = end_date
  313. else:
  314. end_date_out = end_date_inform
  315. sql_update = f'''UPDATE shop_daily_operation_data_title_log SET `end_date` = '{end_date_out}' WHERE `id` = '{id}';'''
  316. cursor.execute(sql_update)
  317. db.commit()
  318. # print('2.完成title_log结束时间更新')
  319. # print(useful_title_name)
  320. rows = df_in.loc
  321. rows_cnt = df_in.shape[0]
  322. # print(rows_cnt)
  323. for i in range(rows_cnt):
  324. row_info = rows[i]
  325. row_dict = json.dumps (dict (row_info), ensure_ascii=False)
  326. l0 = parse(row_info[useful_title_name['日期']]).date()
  327. l1 = wm_plate
  328. l2 = brand_name
  329. l3 = row_info[useful_title_name['门店id']]
  330. l4 = row_info[useful_title_name['门店名称']]
  331. l5 = row_info[useful_title_name['城市']]
  332. l6_0 = row_info[useful_title_name['GMV']]
  333. if l6_0 == '':
  334. l6 = 0
  335. else:
  336. l6 = l6_0
  337. l7_0 = row_info[useful_title_name['收入']]
  338. if l7_0 == '':
  339. l7 = 0
  340. else:
  341. l7 = l7_0
  342. l8_0 = row_info[useful_title_name['有效单量']]
  343. if l8_0 == '':
  344. l8 = 0
  345. else:
  346. l8 = l8_0
  347. try:
  348. l9_0 = row_info[useful_title_name['无效单量']]
  349. except:
  350. l9_0 = ''
  351. if l9_0 == '':
  352. l9 = 0
  353. else:
  354. l9 = l9_0
  355. ln = {'date':''}
  356. l10 = json.dumps(ln,ensure_ascii=False)
  357. l11 = str(int(parse(row_info[useful_title_name['日期']]).strftime('%Y%m%d')))+str(l3)
  358. l_row = (l0,l1,l2,l3,l4,l5,l6,l7,l8,l9,l10,l11)
  359. s_row = (brand_name,wm_plate,log_date,log_time,row_dict,l11,id)
  360. # print(s_row)
  361. l_sql = '''REPLACE INTO shop_daily_operation_data_app VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'''
  362. s_sql = '''REPLACE INTO shop_daily_operation_data_apps VALUES (%s,%s,%s,%s,%s,%s,%s);'''
  363. cursor.execute (l_sql, l_row)
  364. cursor.execute (s_sql, s_row)
  365. db.commit ()
  366. # print(f'3.【{file}】完成表格数据上载至app')
  367. except Exception as e:
  368. print (file, e)
  369. if __name__ == '__main__':
  370. starttime = time.time ()
  371. if 1 == 1:
  372. host = 'localhost'
  373. port = 3306
  374. passwd = '111???clown'
  375. db_name = 'hexingxing'
  376. db = linkTomySql (host, port, passwd, db_name)
  377. if 1==1:
  378. uploadFiles = r'C:\Users\ClownHe\Desktop\门店外购监测\供应链订单 - 上传'
  379. try:
  380. insertSupplyChainsOrders (db, uploadFiles)
  381. except Exception as e:
  382. print('错误')
  383. traceback.print_exc()
  384. db.close ()
  385. n = 0
  386. if 1==0:
  387. uploadFiles = [r'F:\Aa数据库数据导入\每日营业数据历史\jxb_elm',r'F:\Aa数据库数据导入\每日营业数据历史\zxx_elm']
  388. selectShopDailyOperationFormHeadELM (db, uploadFiles,n)
  389. if 1==0:
  390. uploadFiles1 = [r'F:\Aa数据库数据导入\每日营业数据历史\jxb_mt',r'F:\Aa数据库数据导入\每日营业数据历史\zxx_mt']
  391. selectShopDailyOperationFormHeadMT (db, uploadFiles1,n)
  392. if 1==0:
  393. uploadFiles = [r'C:\Users\ClownHe\Desktop\导出\selectShopDailyOperationFormHeadELM.xlsx',r'C:\Users\ClownHe\Desktop\导出\selectShopDailyOperationFormHeadMT.xlsx']
  394. insertUsefulTitleName (db, uploadFiles)
  395. if 1 == 0:
  396. beginTime = 20230812
  397. endTime = 20230812
  398. os.system(f'python F:/cppc/cppc_python脚本/服务器脚本/daily_script_python_yun/shop_daily_operation_data_E.py {beginTime} {endTime}')
  399. os.system (f'python F:/cppc/cppc_python脚本/服务器脚本/daily_script_python_yun/shop_daily_operation_data_M.py {beginTime} {endTime}')
  400. uploadFiles = [{'path':r'C:\Users\ClownHe\Desktop\导出\uploads\美团j','wm_plate':'美团','brand_name':'浆小白'},
  401. {'path':r'C:\Users\ClownHe\Desktop\导出\uploads\饿了么j','wm_plate':'饿了么','brand_name':'浆小白'},
  402. {'path': r'C:\Users\ClownHe\Desktop\导出\uploads\美团z', 'wm_plate': '美团', 'brand_name': '粥小鲜'},
  403. {'path': r'C:\Users\ClownHe\Desktop\导出\uploads\饿了么z', 'wm_plate': '饿了么', 'brand_name': '粥小鲜'},
  404. {'path': r'C:\Users\ClownHe\Desktop\导出\uploads\美团l', 'wm_plate': '美团', 'brand_name': '楼兰说'},
  405. {'path': r'C:\Users\ClownHe\Desktop\导出\uploads\饿了么l', 'wm_plate': '饿了么', 'brand_name': '楼兰说'}]
  406. # uploadFiles = [{'path': r'C:\Users\ClownHe\Desktop\导出\uploads\新建文件夹', 'wm_plate': '美团', 'brand_name': '浆小白'}]
  407. insertShopDailyOperationDate (db, uploadFiles)
  408. db.close ()