check_order.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. __title__ = '每日凌晨空闲时检查本地数据库中的订单数据是否和平台昨天总订单一致'
  5. @Time : 2020/9/26 19:44
  6. @Author : Kenny-PC
  7. @Software: PyCharm
  8. # code is far away from bugs with the god animal protecting
  9. I love animals. They taste delicious.
  10. ┏┓ ┏┓
  11. ┏┛┻━━━┛┻┓
  12. ┃ ☃ ┃
  13. ┃ ┳┛ ┗┳ ┃
  14. ┃ ┻ ┃
  15. ┗━┓ ┏━┛
  16. ┃ ┗━━━┓
  17. ┃ 神兽保佑 ┣┓
  18. ┃ 永无BUG! ┏┛
  19. ┗┓┓┏━┳┓┏┛
  20. ┃┫┫ ┃┫┫
  21. ┗┻┛ ┗┻┛
  22. """
  23. import datetime
  24. import hashlib
  25. import math
  26. import time
  27. from concurrent.futures import ProcessPoolExecutor
  28. from urllib import parse
  29. import requests
  30. import random
  31. from apscheduler.schedulers.blocking import BlockingScheduler
  32. import account_list_zwg as al
  33. from MySQLConnection import MySQLConnection
  34. from util import date_util
  35. from util import platform_util
  36. def md5value(s):
  37. md5 = hashlib.md5()
  38. md5.update(s.encode("utf-8"))
  39. return md5.hexdigest()
  40. ##《1》阅文
  41. def get_yuewen_order(st, et):
  42. start_exec_seconds = date_util.getCurrentSecondTime()
  43. total_order = ()
  44. account_list = al.yuewen_account_list
  45. executor = ProcessPoolExecutor(max_workers=5)
  46. futures = []
  47. for account in account_list:
  48. future = executor.submit(get_yuewen_order_task, st, et, account)
  49. futures.append(future)
  50. executor.shutdown(True)
  51. for future in futures:
  52. if len(future.result()) > 0:
  53. total_order = future.result() + total_order
  54. print('阅文订单数量:', len(total_order), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  55. return total_order
  56. def get_yuewen_order_task(st, et, account):
  57. order_list = ()
  58. url = 'https://open.yuewen.com/cpapi/wxRecharge/querychargelog'
  59. version = 1
  60. start_time = st
  61. email = account[0]
  62. appsecert = account[1]
  63. for i in range(int((et - st) / 86400)):
  64. end_time = min(start_time + 86400, et)
  65. timestamp = int(time.time())
  66. s = ''
  67. page = 1
  68. order_status = 2
  69. data = {
  70. 'email': email,
  71. 'version': version,
  72. 'timestamp': timestamp,
  73. 'start_time': start_time,
  74. 'end_time': end_time,
  75. 'page': page,
  76. 'order_status': order_status
  77. # 'last_min_id':last_min_id,
  78. # 'last_max_id':last_max_id,
  79. # 'total_count':total_count,
  80. # 'last_page':last_page
  81. }
  82. sorted_data = sorted(data.items())
  83. for k, v in sorted_data:
  84. s = s + str(k) + str(v)
  85. sign = md5value(appsecert + s).upper()
  86. data1 = {
  87. 'email': email,
  88. 'version': version,
  89. 'timestamp': timestamp,
  90. 'start_time': start_time,
  91. 'end_time': end_time,
  92. 'page': page,
  93. 'order_status': order_status,
  94. 'sign': sign
  95. }
  96. list1 = requests.get(url=url, params=data1)
  97. ## 此接口有调用频率限制,相同查询条件每分钟仅能请求一次
  98. ## exception: list1.json() {'code': 10408, 'msg': '调用频率超限'}
  99. if list1.json()['code'] != 0:
  100. print('阅文查询充值接口异常:', list1.json())
  101. break
  102. total_count = list1.json()['data']['total_count']
  103. last_min_id = list1.json()['data']['min_id']
  104. last_max_id = list1.json()['data']['max_id']
  105. last_page = list1.json()['data']['page']
  106. if total_count > 0:
  107. for x in list1.json()['data']['list']:
  108. y = {}
  109. dtime = datetime.datetime.strptime(x['order_time'], "%Y-%m-%d %H:%M:%S")
  110. y['date'] = ((int(time.mktime(dtime.timetuple())) + 8 * 3600) // 86400) * 86400 - 8 * 3600
  111. y['platform'] = '阅文'
  112. y['channel'] = x['app_name']
  113. y['from_novel'] = x['book_name']
  114. y['user_id'] = x['openid']
  115. y['stage'] = ''
  116. y['channel_id'] = 0
  117. y['order_time'] = x['order_time']
  118. y['amount'] = x['amount']
  119. y['reg_time'] = x['reg_time']
  120. y['order_id'] = x['order_id']
  121. y = sorted(y.items(), key=lambda item: item[0])
  122. y = dict(y)
  123. y = tuple(y.values())
  124. order_list = order_list + ((y),)
  125. if total_count > 100:
  126. page_while_count = math.ceil(total_count / 100) + 1
  127. if page_while_count > 2:
  128. sleep_seconds = random.randint(60, 70)
  129. print('阅文获取订单数据线程休眠', sleep_seconds,'秒,因为该接口有一分钟的限制')
  130. time.sleep(sleep_seconds)
  131. for page in range(2, page_while_count):
  132. timestamp = int(time.time())
  133. data = {
  134. 'email': email,
  135. 'version': version,
  136. 'timestamp': timestamp,
  137. 'start_time': start_time,
  138. 'end_time': end_time,
  139. 'page': page,
  140. 'last_min_id': last_min_id,
  141. 'last_max_id': last_max_id,
  142. 'total_count': total_count,
  143. 'last_page': last_page,
  144. 'order_status': order_status
  145. }
  146. sorted_data = sorted(data.items())
  147. s1 = ''
  148. for k, v in sorted_data:
  149. s1 = s1 + str(k) + str(v)
  150. sign = md5value(appsecert + s1).upper()
  151. data2 = {
  152. 'email': email,
  153. 'version': version,
  154. 'timestamp': timestamp,
  155. 'start_time': start_time,
  156. 'end_time': end_time,
  157. 'page': page,
  158. 'last_min_id': last_min_id,
  159. 'last_max_id': last_max_id,
  160. 'total_count': total_count,
  161. 'last_page': last_page,
  162. 'order_status': order_status,
  163. 'sign': sign
  164. }
  165. list2 = requests.get(url=url, params=data2)
  166. if list2.json()['code'] != 0:
  167. print('阅文查询充值接口异常:', list2.json(), timestamp, int(time.time()))
  168. break
  169. for x in list2.json()['data']['list']:
  170. y = {}
  171. dtime = datetime.datetime.strptime(x['order_time'], "%Y-%m-%d %H:%M:%S")
  172. y['date'] = ((int(time.mktime(dtime.timetuple())) + 8 * 3600) // 86400) * 86400 - 8 * 3600
  173. y['platform'] = '阅文'
  174. y['channel'] = x['app_name']
  175. y['from_novel'] = x['book_name']
  176. y['user_id'] = x['openid']
  177. y['stage'] = ''
  178. y['channel_id'] = 0
  179. y['order_time'] = x['order_time']
  180. y['amount'] = x['amount']
  181. y['reg_time'] = x['reg_time']
  182. y['order_id'] = x['order_id']
  183. y = sorted(y.items(), key=lambda item: item[0])
  184. y = dict(y)
  185. y = tuple(y.values())
  186. order_list = order_list + ((y),)
  187. total_count = list2.json()['data']['total_count']
  188. last_min_id = list2.json()['data']['min_id']
  189. last_max_id = list2.json()['data']['max_id']
  190. last_page = list2.json()['data']['page']
  191. start_time = start_time + 86400
  192. return order_list
  193. ##《2》掌读
  194. def get_zhangdu_order(st, et):
  195. start_exec_seconds = date_util.getCurrentSecondTime()
  196. total_order = ()
  197. account_list = al.zhangdu_account_list
  198. executor = ProcessPoolExecutor(max_workers=5)
  199. futures = []
  200. for account in account_list:
  201. future = executor.submit(get_zhangdu_order_task, st, et, account)
  202. futures.append(future)
  203. executor.shutdown(True)
  204. for future in futures:
  205. if len(future.result()) > 0:
  206. total_order = future.result() + total_order
  207. print('掌读订单数量:', len(total_order), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  208. return total_order
  209. def get_zhangdu_order_task(st, et, account):
  210. order_list = ()
  211. url = 'https://api.zhangdu520.com/channel/getorder'
  212. uid = account[0]
  213. appsecert = account[1]
  214. channel = account[2]
  215. timestamp = int(time.time())
  216. sign = md5value(str(uid) + '&' + appsecert + '&' + str(timestamp))
  217. starttime = st
  218. timespace = 90 * 3600 * 24
  219. endtime = min(et, st + timespace)
  220. for x in range((et - st) // timespace + 1): # 分时段
  221. if x > 0:
  222. print('掌读跨天数查询:', x)
  223. params = {
  224. 'uid': uid,
  225. 'timestamp': timestamp,
  226. 'sign': sign,
  227. 'starttime': starttime,
  228. 'endtime': endtime
  229. }
  230. list1 = requests.get(url=url, params=params)
  231. pageCount = list1.json()['data']['pageCount']
  232. if pageCount == 0:
  233. continue
  234. for page in range(1, pageCount + 1): # 分页
  235. params = {
  236. 'uid': uid,
  237. 'timestamp': timestamp,
  238. 'sign': sign,
  239. 'starttime': starttime,
  240. 'endtime': endtime,
  241. 'page': page
  242. }
  243. list2 = requests.get(url=url, params=params).json()
  244. if 'data' in list2.keys():
  245. for b in list2['data']['list']:
  246. if b['status'] == '1':
  247. c = {}
  248. c['amount'] = b['amount']
  249. c['channel_id'] = uid
  250. c['order_id'] = str(b['orderno'])
  251. c['order_time'] = b['ctime']
  252. c['user_id'] = b['openid']
  253. c['platform'] = '掌读'
  254. c['channel'] = channel
  255. c['reg_time'] = b['regtime']
  256. c['from_novel'] = ''
  257. c['stage'] = ''
  258. c['date'] = ((int(b['ctime']) + 8 * 3600) // 86400) * 86400 - 8 * 3600
  259. x = sorted(c.items(), key=lambda item: item[0])
  260. x = dict(x)
  261. x = tuple(x.values())
  262. order_list = order_list + ((x),)
  263. starttime = starttime + timespace
  264. endtime = min(et, starttime + timespace)
  265. return order_list
  266. ##《3》花生
  267. def get_huasheng_order(st, et):
  268. start_exec_seconds = date_util.getCurrentSecondTime()
  269. total_order = ()
  270. account_list = al.huasheng_account_list
  271. executor = ProcessPoolExecutor(max_workers=5)
  272. futures = []
  273. for account in account_list:
  274. url = 'https://vip.rlcps.cn/api/getMerchants'
  275. apiKEY = account[0]
  276. apiSecurity = account[1]
  277. timestamp = str(int(time.time()))
  278. sign = md5value(apiKEY + timestamp + apiSecurity).upper()
  279. params = {
  280. 'apiKey': apiKEY,
  281. 'apiSecurity': apiSecurity,
  282. 'timestamp': timestamp,
  283. 'sign': sign
  284. }
  285. merchant_list = requests.post(url, params).json()
  286. for merchant in merchant_list['data']:
  287. future = executor.submit(get_huasheng_order_task, st, et, account, merchant)
  288. futures.append(future)
  289. executor.shutdown(True)
  290. for future in futures:
  291. if len(future.result()) > 0:
  292. total_order = future.result() + total_order
  293. print('花生订单数量:', len(total_order), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  294. return total_order
  295. def get_huasheng_order_task(st, et, account, merchant):
  296. order_list = ()
  297. apiKEY = account[0]
  298. apiSecurity = account[1]
  299. stage = account[2]
  300. timestamp = str(int(time.time()))
  301. merchant_id = merchant['merchant_id']
  302. merchant_name = merchant['merchant_name']
  303. order_url = 'https://vip.rlcps.cn/api/orderList'
  304. start_time = st
  305. for i in range((et - st) // 86400):
  306. print('查询天数', i)
  307. page = 1
  308. date = time.strftime("%Y-%m-%d", time.localtime(start_time))
  309. sign = md5value(apiKEY + date + str(merchant_id) + timestamp + apiSecurity).upper()
  310. order_params = {
  311. 'apiKey': apiKEY,
  312. 'apiSecurity': apiSecurity,
  313. 'timestamp': timestamp,
  314. 'date': date,
  315. 'merchant_id': merchant_id,
  316. 'sign': sign,
  317. 'page': page
  318. }
  319. list1 = requests.post(order_url, order_params).json()
  320. if 'data' in list1.keys() and len(list1['data']) > 0:
  321. for i in range(int(math.ceil(list1['count'] / 500))):
  322. print('查询页面', i)
  323. data2 = {
  324. 'apiKey': apiKEY,
  325. 'apiSecurity': apiSecurity,
  326. 'timestamp': timestamp,
  327. 'date': date,
  328. 'merchant_id': merchant_id,
  329. 'sign': sign,
  330. 'page': page
  331. }
  332. list2 = requests.post(order_url, data2).json()
  333. for x in list2['data']:
  334. if x['order_status'] == 1:
  335. y = {}
  336. ##dtime = datetime.datetime.strptime(x['pay_at'],"%Y-%m-%d")
  337. ##y['date']= ((int(time.mktime(dtime.timetuple()))+8*3600)//86400)*86400-8*3600
  338. y['user_id'] = x['openid']
  339. y['order_id'] = x['trans_id']
  340. y['order_time'] = x['pay_at']
  341. y['reg_time'] = x['join_at']
  342. y['date'] = (start_time + 8 * 3600) // 86400 * 86400 - 8 * 3600
  343. y['channel'] = merchant_name
  344. y['channel_id'] = merchant_id
  345. y['platform'] = '花生'
  346. y['stage'] = stage
  347. y['from_novel'] = x['book_name']
  348. y['amount'] = x['amount']
  349. y = sorted(y.items(), key=lambda item: item[0])
  350. y = dict(y)
  351. y = tuple(y.values())
  352. order_list = order_list + ((y),)
  353. page = page + 1
  354. start_time = start_time + 86400
  355. return order_list
  356. ##《4》掌中云
  357. def get_zzy_order(st, et):
  358. start_exec_seconds = date_util.getCurrentSecondTime()
  359. total_order = ()
  360. account_list = al.zzy_account_list
  361. # account_list = platform_util.get_zhangzhongyun_account_list()
  362. # account_list = [['1108701f1d6','0f9c0f8429d1a16a8a78c2306e7a4db3','清勇7月']]
  363. executor = ProcessPoolExecutor(max_workers=5)
  364. futures = []
  365. for account in account_list:
  366. url = 'https://openapi.818tu.com/partners/channel/channels/list?'
  367. my_key = account[0]
  368. secert = account[1]
  369. my_sign = md5value(secert + 'key=' + my_key)
  370. parameter = 'key=' + my_key + '&sign=' + my_sign
  371. channel_list = requests.get(url + parameter) # 获取子渠道列表
  372. if 'data' in channel_list.json().keys():
  373. items = channel_list.json()['data']['items']
  374. else:
  375. print('掌中云本次请求数据为空', account)
  376. items = []
  377. continue
  378. for item in items:
  379. # 获取channel_id 后逐个拉取历史orders
  380. future = executor.submit(get_zzy_order_task, st, et, account, item)
  381. futures.append(future)
  382. executor.shutdown(True)
  383. for future in futures:
  384. if len(future.result()) > 0:
  385. total_order = future.result() + total_order
  386. print('掌中云订单数量:', len(total_order), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  387. return total_order
  388. def get_zzy_order_task(st, et, account, item):
  389. # 掌中云的时间格式比较特殊,转换下
  390. st = platform_util.get_zhangzhongyun_format_time(st)
  391. et = platform_util.get_zhangzhongyun_format_time(et)
  392. order_list = ()
  393. my_key = account[0]
  394. secert = account[1]
  395. stage = account[2]
  396. channel_id = item['id']
  397. channel = item['nickname']
  398. status = str(1)
  399. per_page = str(1000)
  400. limit_time = et
  401. get_time = st
  402. lt = parse.urlencode({'created_at[lt]': limit_time})
  403. gt = parse.urlencode({'created_at[gt]': get_time})
  404. url_1 = 'https://openapi.818tu.com/partners/channel/orders/list?'
  405. my_sign_1 = md5value(secert + 'channel_id=' + str(
  406. channel_id) + '&created_at[gt]=' + get_time + '&created_at[lt]=' + limit_time + '&key=' + my_key + '&per_page=' + per_page + '&status=' + status)
  407. parameter_1 = 'channel_id=' + str(
  408. channel_id) + '&' + gt + '&' + lt + '&per_page=' + per_page + '&status=' + status + '&key=' + my_key + '&sign=' + my_sign_1
  409. orders = requests.get(url_1 + parameter_1)
  410. t = orders.json()['data']['count'] // int(per_page) + 1
  411. for page in range(1, t + 1):
  412. my_sign_2 = md5value(secert + 'channel_id=' + str(
  413. channel_id) + '&created_at[gt]=' + get_time + '&created_at[lt]=' + limit_time + '&key=' + my_key + '&page=' + str(
  414. page) + '&per_page=' + per_page + '&status=' + status)
  415. parameter_2 = 'channel_id=' + str(channel_id) + '&' + gt + '&' + lt + '&page=' + str(
  416. page) + '&per_page=' + per_page + '&status=' + status + '&key=' + my_key + '&sign=' + my_sign_2
  417. orders_1 = requests.get(url_1 + parameter_2)
  418. # print(orders_1.json())
  419. b = orders_1.json()['data']['items']
  420. for a in b:
  421. c = {}
  422. c['user_id'] = str(a['member']['openid'])
  423. c['channel'] = channel
  424. c['reg_time'] = a['member']['created_at']
  425. c['channel_id'] = channel_id
  426. c['amount'] = round(a['price'] / 100, 2)
  427. c['order_id'] = str(a['id'])
  428. c['order_time'] = a['created_at']
  429. c['platform'] = '掌中云'
  430. c['stage'] = stage
  431. dtime = datetime.datetime.strptime(a['created_at'][0:10], "%Y-%m-%d")
  432. c['date'] = ((int(time.mktime(dtime.timetuple())) + 8 * 3600) // 86400) * 86400 - 8 * 3600
  433. if str(a['from_novel_id']) != 'None':
  434. c['from_novel'] = a['from_novel']['title']
  435. else:
  436. c['from_novel'] = 'None'
  437. x = sorted(c.items(), key=lambda item: item[0])
  438. x = dict(x)
  439. x = tuple(x.values())
  440. order_list = order_list + ((x),)
  441. return order_list
  442. ##《5》 悠书阁
  443. def get_ysg_order(st, et):
  444. start_exec_seconds = date_util.getCurrentSecondTime()
  445. total_order = ()
  446. account_list = al.ysg_account_list
  447. executor = ProcessPoolExecutor(max_workers=5)
  448. futures = []
  449. for account in account_list:
  450. future = executor.submit(get_ysg_order_task, st, et, account)
  451. futures.append(future)
  452. executor.shutdown(True)
  453. for future in futures:
  454. if len(future.result()) > 0:
  455. total_order = future.result() + total_order
  456. print('悠书阁订单数量:', len(total_order), '执行时长(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  457. return total_order
  458. def get_ysg_order_task(st, et, account):
  459. order_list = ()
  460. url = 'https://novel.youshuge.com/v2/open/orders'
  461. # 超过100条就需要分页,别问我为什么知道,看代码看出来的
  462. max_page_size = 100
  463. host_name = account[0]
  464. channel_id = account[1]
  465. secert_key = account[2]
  466. channel = account[3]
  467. stage = account[4]
  468. timestamp = int(time.time())
  469. start_date = time.strftime("%Y-%m-%d", time.localtime(st))
  470. end_date = time.strftime("%Y-%m-%d", time.localtime(et))
  471. page = 1
  472. str1 = 'channel_id=' + str(channel_id) + '&end_date=' + end_date + '&host_name=' + host_name + '&page=' + str(
  473. page) + '&pay_status=1' + '&start_date=' + start_date + '&time=' + str(timestamp) + '&key=' + secert_key
  474. sign = md5value(str1).upper()
  475. data = {
  476. 'sign': sign,
  477. 'host_name': host_name,
  478. 'time': timestamp,
  479. 'channel_id': channel_id,
  480. 'page': page,
  481. 'pay_status': 1,
  482. 'start_date': start_date,
  483. 'end_date': end_date
  484. }
  485. respone = requests.post(url, data)
  486. if respone.status_code == 400:
  487. print('respone', respone)
  488. result_json = respone.json()
  489. first_page_order = build_ysg_order_data(channel, channel_id, result_json, stage)
  490. order_list = order_list + first_page_order
  491. if len(first_page_order) == 0:
  492. return order_list
  493. total_count = result_json['data'][0]['count']
  494. if total_count > max_page_size:
  495. for i in range((total_count - 1) // max_page_size + 1):
  496. timestamp = int(time.time())
  497. str1 = 'channel_id=' + str(
  498. channel_id) + '&end_date=' + end_date + '&host_name=' + host_name + '&page=' + str(
  499. page) + '&pay_status=1' + '&start_date=' + start_date + '&time=' + str(timestamp) + '&key=' + secert_key
  500. sign = md5value(str1).upper()
  501. data2 = {
  502. 'sign': sign,
  503. 'host_name': host_name,
  504. 'time': timestamp,
  505. 'channel_id': channel_id,
  506. 'page': page,
  507. 'pay_status': 1,
  508. 'start_date': start_date,
  509. 'end_date': end_date
  510. }
  511. r2 = requests.post(url, data2).json()
  512. order_list = order_list + build_ysg_order_data(channel, channel_id, r2, stage)
  513. page = page + 1
  514. return order_list
  515. def build_ysg_order_data(channel, channel_id, result_json, stage):
  516. order_list = ()
  517. if 'data' in result_json.keys():
  518. data = result_json['data']
  519. if len(data) > 0:
  520. for x in data:
  521. y = {}
  522. dtime = datetime.datetime.strptime(x['create_time'][0:10], "%Y-%m-%d")
  523. y['date'] = ((int(
  524. time.mktime(dtime.timetuple())) + 8 * 3600) // 86400) * 86400 - 8 * 3600
  525. y['order_id'] = x['order_num']
  526. y['amount'] = round(int(x['price']) / 100, 2)
  527. y['order_time'] = x['create_time']
  528. y['channel'] = channel
  529. y['from_novel'] = x['book_name']
  530. y['stage'] = stage
  531. y['user_id'] = x['openid']
  532. y['channel_id'] = channel_id
  533. y['platform'] = '悠书阁'
  534. y['reg_time'] = x['reg_time']
  535. y = sorted(y.items(), key=lambda item: item[0])
  536. y = dict(y)
  537. y = tuple(y.values())
  538. order_list = order_list + ((y),)
  539. return order_list
  540. # 数据导入表采用replace替换主键orderid的方法
  541. def mysql_insert_order(data):
  542. if data is None or len(data) == 0:
  543. print('数据为空,不执行数据库操作!')
  544. else:
  545. sql = 'replace into quchen_text.`order_zwg` (amount,channel,channel_id,date,from_novel,order_id,order_time,platform,reg_time,stage,user_id) values (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s);'
  546. connect = MySQLConnection()
  547. try:
  548. num = connect.batch(sql, data)
  549. # 提交
  550. connect.commit()
  551. print(num, '条订单数据入库成功')
  552. except Exception as e:
  553. print('订单数据入库失败:', e)
  554. finally:
  555. connect.close()
  556. # 获取各平台的订单数量
  557. def mysql_select_platform_order_count(date):
  558. sql = 'SELECT platform, COUNT(1) AS num FROM quchen_text.`order_zwg` WHERE date = %s GROUP BY platform'
  559. connect = MySQLConnection()
  560. platform_order_count = []
  561. try:
  562. platform_order_count = connect.query(sql, date)
  563. return platform_order_count
  564. except Exception as e:
  565. print('各平台的订单数据查询失败:', e)
  566. finally:
  567. connect.close()
  568. return platform_order_count
  569. def start_all_job():
  570. start_exec_seconds = date_util.getCurrentSecondTime()
  571. st_unix = date_util.getYesterdayStartTime()
  572. et_unix = date_util.getTodayStartTime()
  573. print('查询开始时间:', st_unix, date_util.getSecondsToDatetime(st_unix))
  574. print('查询结束时间:', et_unix, date_util.getSecondsToDatetime(et_unix))
  575. order_list = get_huasheng_order(st_unix, et_unix)
  576. mysql_insert_order(order_list)
  577. platform_order_num_listm_list = mysql_select_platform_order_count(date_util.getYesterdayStartTime())
  578. # if len(platform_order_num_list) == 0:
  579. # print('本地库中没有任何数据,现在全平台补全')
  580. # mysql_insert_order(get_zzy_order(st_unix, et_unix))
  581. # mysql_insert_order(get_yuewen_order(st_unix, et_unix))
  582. # mysql_insert_order(get_huasheng_order(st_unix, et_unix))
  583. # mysql_insert_order(get_ysg_order(st_unix, et_unix))
  584. # mysql_insert_order(get_zhangdu_order(st_unix, et_unix))
  585. # else:
  586. # platform_list = ['阅文','悠书阁','掌读','掌中云','花生']
  587. # for platform_order_num in platform_order_num_list:
  588. # platform = str(platform_order_num['platform'])
  589. # num = int(platform_order_num['num'])
  590. # platform_list.remove(platform)
  591. #
  592. # if platform == '阅文':
  593. # order_list = get_yuewen_order(st_unix, et_unix)
  594. # if len(order_list) != num:
  595. # print('阅文数据实际订单和已经入库数据差异:', len(order_list) - num)
  596. # mysql_insert_order(order_list)
  597. # elif platform == '悠书阁':
  598. # order_list = get_ysg_order(st_unix, et_unix)
  599. # if len(order_list) != num:
  600. # print('悠书阁数据实际订单和已经入库数据差异:', len(order_list) - num)
  601. # mysql_insert_order(order_list)
  602. # elif platform == '掌读':
  603. # order_list = get_zhangdu_order(st_unix, et_unix)
  604. # if len(order_list) != num:
  605. # print('掌读数据实际订单和已经入库数据差异:', len(order_list) - num)
  606. # mysql_insert_order(order_list)
  607. # elif platform == '掌中云':
  608. # order_list = get_zzy_order(st_unix, et_unix)
  609. # if len(order_list) != num:
  610. # print('掌中云数据实际订单和已经入库数据差异:', len(order_list) - num)
  611. # mysql_insert_order(order_list)
  612. # elif platform == '花生':
  613. # order_list = get_huasheng_order(st_unix, et_unix)
  614. # if len(order_list) != num:
  615. # print('花生数据实际订单和已经入库数据差异:', len(order_list) - num)
  616. # mysql_insert_order(order_list)
  617. # else:
  618. # print('发现未知平台数据!', platform_order_num)
  619. #
  620. # for platform in platform_list:
  621. # if platform == '阅文':
  622. # print('阅文没有数据')
  623. # mysql_insert_order(get_yuewen_order(st_unix, et_unix))
  624. # elif platform == '悠书阁':
  625. # print('悠书阁没有数据')
  626. # mysql_insert_order(get_ysg_order(st_unix, et_unix))
  627. # elif platform == '掌读':
  628. # print('掌读没有数据')
  629. # mysql_insert_order(get_zhangdu_order(st_unix, et_unix))
  630. # elif platform == '掌中云':
  631. # print('掌中云没有数据')
  632. # mysql_insert_order(get_zzy_order(st_unix, et_unix))
  633. # elif platform == '花生':
  634. # print('花生没有数据')
  635. # mysql_insert_order(get_huasheng_order(st_unix, et_unix))
  636. # else:
  637. # print('什么鬼平台:', platform)
  638. print('订单检查执行时间(秒):', date_util.getCurrentSecondTime() - start_exec_seconds)
  639. if __name__ == '__main__':
  640. start_all_job()
  641. #
  642. # scheduler = BlockingScheduler()
  643. # #每天凌晨3点到4点的30分钟都执行一次
  644. # scheduler.add_job(start_all_job, 'cron', hour='3-4', minute='35')
  645. # scheduler.start()