demo_match_rules_update_online.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. # -*- codeing = utf-8 -*-
  2. # @Time : 2023/5/9 16:37
  3. # @Author : Clown
  4. # @File : demo_match_rules_update.py
  5. # @Software : PyCharm
  6. import requests
  7. import pymysql
  8. import json
  9. import time
  10. from datetime import datetime, timedelta
  11. from all_key_table import update_key_value_pair_7qiaoPlus
  12. from dateutil.parser import parse
  13. import traceback
  14. def linkTomySql(host, passwd, db_name, port):
  15. '''连接至数据库返回【db】,v2新增local_infile=1 打开文件导入权限'''
  16. try:
  17. # 本地连接为:localhost 服务器连接为:124.222.188.59
  18. db = pymysql.connect (
  19. host=host, user="root",
  20. passwd=passwd,
  21. db=db_name,
  22. port=port,
  23. charset='utf8mb4',
  24. local_infile=1)
  25. print ('\nconnect to mysql server 成功')
  26. print ('---------------------------------------')
  27. except:
  28. print ("\ncould not connect to mysql server")
  29. db = "连接失败"
  30. return db
  31. def read_key_value_pair(db, brand_name, wm_plate, owner):
  32. '''按条件读取,数据库中all_key_table表里的key_value_pair字段中的值,以键值对的形式输出
  33. db:数据库,
  34. brand_name:品牌名,
  35. wm_plate:外卖平台MEITUAN或ELEME,
  36. owner:账号权限all或one
  37. '''
  38. cursor = db.cursor ()
  39. sql = f'SELECT key_value_pair FROM all_key_table WHERE brand_name = "{brand_name}" AND wm_plate = "{wm_plate}" AND owner = "{owner}";'
  40. cursor.execute (sql)
  41. pair = json.loads (cursor.fetchall ()[0][0])
  42. return pair
  43. def sendMsgToRot(url,msg_txt):
  44. params_json = {
  45. "msgtype": "markdown",
  46. "markdown": {
  47. "content": msg_txt,
  48. "mentioned_list":["@all"]
  49. }}
  50. resp = requests.post(url,json=params_json).text
  51. print(resp)
  52. # 按要求长度对列表进行二次分组
  53. def groupList(input_list,group_size):
  54. out_list = []
  55. n = len (input_list)
  56. cnt = group_size
  57. s = n // cnt #整除向下取整
  58. r = n % cnt #除余,余数
  59. if r > 0:
  60. s = s + 1
  61. for i in range (s):
  62. b = input_list[(i) * cnt:(i + 1) * cnt]
  63. out_list.append(b)
  64. return out_list
  65. # 批量新增
  66. def insert_7qiaoPlus_rows(Token, applicationId, formModelId, param_json):
  67. '''
  68. :param Token: str() 密钥
  69. :param applicationId: str() 应用id
  70. :param formModelId: str() 表单id
  71. :param param_json: dir() 表单参数
  72. :return: 执行成功无结果,执行失败返回结果(错误报警)
  73. '''
  74. out_list = groupList (param_json, 100)
  75. groupNum = 1
  76. for param in out_list:
  77. print (f'新增批次:{groupNum}')
  78. groupNum += 1
  79. headers_api = {
  80. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
  81. "Content-type": "application/json",
  82. "X-Auth0-Token": Token}
  83. url_insert = f'https://qiqiao.do1.com.cn/plus/cgi-bin/open/applications/{applicationId}/forms/{formModelId}/batch_save'
  84. n = 0
  85. m = 0
  86. while n == 0 and m <= 5:
  87. try:
  88. resp = requests.post (url_insert, data=json.dumps(param), headers=headers_api).json ()
  89. if resp['code'] != 0:
  90. print ('resp: ',resp)
  91. else:
  92. ...
  93. # print ('Done')
  94. n = 1
  95. except Exception as e:
  96. time.sleep (1)
  97. m += 1
  98. n = 0
  99. print('error: ',e)
  100. # 批量更新
  101. def update_7qiaoPlus_rows(Token, applicationId, formModelId, param_json):
  102. '''
  103. :param Token: str() 密钥
  104. :param applicationId: str() 应用id
  105. :param formModelId: str() 表单id
  106. :param variables: 参数键值对,传入需更新的内容{
  107. //"字段名" : "值"
  108. "fieldName": "fieldValue",
  109. "age": "22",
  110. "单行文本" : "文本内容",
  111. "数字" : 123,
  112. "单项选择" : "1",
  113. "多项选择" : ["1", "2", "3"],
  114. //人员、部门选择控件需要传入对应的id
  115. "人员单选" : "123412341243",
  116. "人员多选" : ["123","345","456"],
  117. "日期" : "2020-10-10",
  118. "日期时间" : "2020-10-10 10:10:00",
  119. "时间" : "10:10:00",
  120. "富文本" : "文本内容",
  121. //图片上传、文件上传、音频、视频可以通过调用文件上传接口,将返回的结果“data”值进行传参
  122. "图片上传" : "data",
  123. //手写签名可以通过调用文件上传接口,将返回的结果“fileUrl”值进行传参
  124. "手写签名" : "fileUrl"
  125. }
  126. :param row_id: 表单实例id
  127. :param version: 更新版本 需要通过函数 select_7qiaoPlus_row 获取
  128. :return:
  129. '''
  130. out_list = groupList (param_json, 100)
  131. groupNum = 1
  132. for param in out_list:
  133. print(f'更新批次:{groupNum}')
  134. groupNum += 1
  135. headers_api = {
  136. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
  137. "Content-type": "application/json",
  138. "X-Auth0-Token": Token}
  139. url_update = f'https://qiqiao.do1.com.cn/plus/cgi-bin/open/applications/{applicationId}/forms/{formModelId}/batch_update'
  140. param_json = param_json
  141. n = 0
  142. m = 0
  143. while n == 0 and m <= 5:
  144. try:
  145. resp = requests.post (url_update, data=json.dumps(param), headers=headers_api).json ()
  146. if resp['code'] != 0:
  147. print ('resp: ',resp)
  148. else:
  149. ...
  150. n = 1
  151. except Exception as e:
  152. time.sleep (1)
  153. m += 1
  154. n = 0
  155. print('error: ',e)
  156. # 按id查询
  157. def select_7qiaoPlus_row(Token, applicationId, formModelId, row_id):
  158. '''
  159. :param Token: str() 密钥
  160. :param applicationId: str() 应用id
  161. :param formModelId: str() 表单id
  162. :param row_id: str() 表单实例id
  163. :return: resp json()格式
  164. '''
  165. headers_api = {
  166. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
  167. "Content-type": "application/json",
  168. "X-Auth0-Token": Token}
  169. url_select = f'https://qiqiao.do1.com.cn/plus/cgi-bin/open/applications/{applicationId}/forms/{formModelId}/{row_id}'
  170. resp = requests.get (url_select, headers=headers_api).json ()
  171. return resp
  172. # 查询更新版本号
  173. def selectRowVersion(Token, applicationId, formModelId, row_id):
  174. n = 0
  175. m = 0
  176. while n == 0 and m <=5:
  177. try:
  178. resp = select_7qiaoPlus_row(Token, applicationId, formModelId, row_id)
  179. n = 1
  180. result = 0
  181. except:
  182. time.sleep(1)
  183. m += 1
  184. n = 0
  185. result = 1
  186. # print(resp)
  187. try:
  188. version = resp['data']['version']
  189. variables = resp['data']['variables']['在售品牌']
  190. newVersion = version+1
  191. except:
  192. newVersion = -1-result
  193. return newVersion
  194. def selectGoodsHashFromMysql(db,keyName,date,Token, applicationId, formModelId):
  195. # data 格式为 '20230202'
  196. cursor = db.cursor ()
  197. sql = f'''SELECT * FROM goods_hash WHERE `平台商品名称` LIKE '%{keyName}%' AND `最近一次活跃时间` > '{date}' ORDER BY `首次记录时间` DESC;'''
  198. cursor.execute (sql)
  199. value_out = cursor.fetchall ()
  200. cursor.close ()
  201. brandNameDict = {'JXB':'1','ZXX':'2','LLS':'3'}
  202. insertList = []
  203. updateList = []
  204. for goodsInfo in value_out:
  205. goodsName = goodsInfo[0]
  206. goodsHashId = goodsInfo[1]
  207. brandNames = goodsInfo[2]
  208. brandNameList = []
  209. for i in ['JXB','ZXX','LLS']:
  210. if i in brandNames:
  211. brandNameNum = brandNameDict[i]
  212. brandNameList.append(brandNameNum)
  213. lastTime_date = goodsInfo[3]
  214. firstTime_date = goodsInfo[4]
  215. insertInfo = {"variables": {
  216. "平台菜单编号": goodsHashId,
  217. "平台菜单名称": goodsName,
  218. "在售品牌": brandNameList,
  219. "首次出现日期": int (parse (firstTime_date).timestamp ()) * 1000,
  220. "最近一次销售日期": int (parse (lastTime_date).timestamp ()) * 1000,
  221. "数据id": goodsHashId
  222. },
  223. "id": goodsHashId,
  224. "version": 0,
  225. "loginUserId": "92874ed35ecb45f51a58adcf18e99b5e"}
  226. if int(firstTime_date) > int(date):
  227. # print(insertInfo)
  228. insertList.append(insertInfo)
  229. else:
  230. newVersion = selectRowVersion (Token, applicationId, formModelId, goodsHashId)
  231. if newVersion == -1:
  232. # print (insertInfo)
  233. insertList.append (insertInfo)
  234. elif newVersion == -2:
  235. print(f'【{goodsHashId}】请求错误')
  236. else:
  237. updateInfo = {"variables": {
  238. "在售品牌": brandNameList,
  239. "最近一次销售日期": int(parse (lastTime_date).timestamp ())*1000},
  240. "id":goodsHashId ,
  241. "version": newVersion,
  242. "loginUserId": "92874ed35ecb45f51a58adcf18e99b5e"}
  243. # print (updateInfo)
  244. updateList.append (updateInfo)
  245. print (f'总计{len(value_out)},插入{len(insertList)},更新{len(updateList)}')
  246. return insertList,updateList
  247. # 按最近一次销售日期/首次记录时间 查询倒序查询列表
  248. def selectLogDate(Token, applicationId, formModelId, orderField):
  249. headers_api = {
  250. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
  251. "Content-type": "application/json",
  252. "X-Auth0-Token": Token}
  253. # orderField = '最近一次销售日期'
  254. url_select = f'https://qiqiao.do1.com.cn/plus/cgi-bin/open/applications/{applicationId}/forms/{formModelId}/query?orderField={orderField}'
  255. data_params = []
  256. resp = requests.post (url_select, headers=headers_api,data=json.dumps(data_params)).json ()
  257. lastTime_date = resp['data']['list'][0]['variables'][orderField]
  258. return lastTime_date
  259. def select_7qiaoPlus_row_by_orderField(Token, applicationId, formModelId, orderField,value):
  260. headers_api = {
  261. 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
  262. "Content-type": "application/json",
  263. "X-Auth0-Token": Token}
  264. url_select = f'https://qiqiao.do1.com.cn/plus/cgi-bin/open/applications/{applicationId}/forms/{formModelId}/query'
  265. data_params = [{"fieldName":orderField, "logic": "eq", "value":value}]
  266. resp = requests.post (url_select, headers=headers_api, data=json.dumps (data_params)).json ()
  267. return resp
  268. def selectResultToList(Token, applicationId, formModelId, orderField,value):
  269. resp = select_7qiaoPlus_row_by_orderField(Token, applicationId, formModelId, orderField,value)
  270. resp_list = resp['data']['list']
  271. list_len = len(resp_list)
  272. dict_out = {}
  273. list_out1 = []
  274. list_out2 = []
  275. for info in resp_list:
  276. standardId = info['prettyValue']['标准菜单编号']
  277. standardName = info['variables']['标准菜单名称']
  278. dict_out[standardId] = {'平台菜单hash编号': info['prettyValue']['平台菜单编号'],
  279. '平台菜单名称': info['variables']['平台菜单名称'],
  280. '标准菜单编号': standardId,
  281. '标准菜单名称': info['variables']['标准菜单名称'],
  282. '标品数量': info['variables']['标品数量']}
  283. list_out1.append(standardId)
  284. list_out2.append(standardName)
  285. return list_len,dict_out,list_out1,list_out2
  286. def select_goods_match_standard(db,goods_hash):
  287. cursor = db.cursor ()
  288. sql = f'''SELECT * FROM goods_match_standard WHERE `平台菜单hash编号` = '{goods_hash}';'''
  289. cursor.execute (sql)
  290. value_out = cursor.fetchall ()
  291. cursor.close ()
  292. value_len = len(value_out)
  293. dict_out = {}
  294. list_out2 = []
  295. for value in value_out:
  296. standardId = value[2]
  297. dict_out[standardId] = {'平台菜单hash编号':value[0],
  298. '平台菜单名称':value[1],
  299. '标准菜单编号':value[2],
  300. '标准菜单名称':value[3],
  301. '标品数量':value[4]}
  302. list_out2.append(standardId)
  303. return value_len,dict_out,list_out2
  304. def insert_goods_match_standard(db,insert_dict):
  305. cursor = db.cursor ()
  306. sql = f'''INSERT INTO goods_match_standard values (%s,%s,%s,%s,%s);'''
  307. insert_value = (insert_dict['平台菜单hash编号'],insert_dict['平台菜单名称'],insert_dict['标准菜单编号'],
  308. insert_dict['标准菜单名称'],insert_dict['标品数量'])
  309. cursor.execute (sql,insert_value)
  310. db.commit ()
  311. cursor.close ()
  312. def delete_goods_match_standard(db,delete_dict):
  313. cursor = db.cursor ()
  314. sql = f'''DELETE FROM goods_match_standard WHERE `平台菜单hash编号` = "{delete_dict['平台菜单hash编号']}" AND `标准菜单编号` = "{delete_dict['标准菜单编号']}";'''
  315. cursor.execute (sql)
  316. db.commit ()
  317. cursor.close ()
  318. def update_goods_match_standard(db,update_dict):
  319. cursor = db.cursor ()
  320. sql = f'''UPDATE goods_match_standard SET `标品数量` = {update_dict['标品数量']} WHERE `平台菜单hash编号` = "{update_dict['平台菜单hash编号']}" AND `标准菜单编号` = "{update_dict['标准菜单编号']}";'''
  321. cursor.execute (sql)
  322. db.commit ()
  323. cursor.close ()
  324. def update_goods_match_standard_by_goodsHash(goods_hash):
  325. if 1==1:
  326. host = '124.222.188.59'
  327. passwd = '111...Clown'
  328. db_name = 'zuzu_data'
  329. port = 63306
  330. if 1==0:
  331. host = 'localhost'
  332. passwd = '111???clown'
  333. db_name = 'hexingxing'
  334. port = 3306
  335. db = linkTomySql (host, passwd, db_name, port)
  336. key_json = read_key_value_pair (db, '道一云', '7qiaoPlus', 'all')
  337. Token = key_json['data']
  338. applicationId = '63fee5abc8584e7ec9cd0bd4'
  339. formModelId_2 = '63fefa6b4871e3647302de2e' # 平台标准菜单对照表
  340. orderField = '平台菜单编号'
  341. resp_len, resp_dict_out, resp_list2, resp_list3 = selectResultToList(Token, applicationId, formModelId_2, orderField, goods_hash)
  342. print(resp_len,resp_dict_out,resp_list2,resp_list3)
  343. sql_len, sql_dict_out, sql_list2 = select_goods_match_standard (db, goods_hash)
  344. print (sql_len, sql_dict_out, sql_list2)
  345. update_list = list (set (resp_list2).intersection (set (sql_list2)))
  346. for update_info in update_list:
  347. update_dict = resp_dict_out[update_info]
  348. update_goods_match_standard(db,update_dict)
  349. insert_list = list (set (resp_list2).difference (set (sql_list2)))
  350. for insert_info in insert_list:
  351. insert_dict = resp_dict_out[insert_info]
  352. insert_goods_match_standard(db,insert_dict)
  353. delete_list = list (set (sql_list2).difference (set (resp_list2)))
  354. for delete_info in delete_list:
  355. delete_dict = resp_dict_out[delete_info]
  356. delete_goods_match_standard(db,delete_dict)
  357. print (update_list, insert_list, delete_list)
  358. db.close ()
  359. memo = ','.join(resp_list3)
  360. return memo
  361. if __name__ == '__main__':
  362. if 1 == 1:
  363. value = 'fffec79c16d27cbbd822d5f6075f42e3'
  364. memo = update_goods_match_standard_by_goodsHash(value)
  365. print(memo)
  366. if 1 == 0:
  367. s_time = time.time()
  368. host = '124.222.188.59'
  369. passwd = '111...Clown'
  370. db_name = 'zuzu_data'
  371. port = 63306
  372. db = linkTomySql (host, passwd, db_name, port)
  373. log_date = datetime.now () + timedelta(days=-1)
  374. key_json = read_key_value_pair (db, '道一云', '7qiaoPlus', 'all')
  375. Token = key_json['data']
  376. applicationId = '63fee5abc8584e7ec9cd0bd4'
  377. formModelId_1 = '63fefa77c74fdb28e2e02f40' #平台销售菜单表
  378. formModelId_2 = '63fefa6b4871e3647302de2e' #平台标准菜单对照表
  379. if 1 == 0:
  380. try:
  381. lastTime_date = selectLogDate (Token, applicationId, formModelId_1,'最近一次销售日期')
  382. lastTime_date_no = parse(lastTime_date).strftime('%Y%m%d')
  383. insertList,updateList =selectGoodsHashFromMysql (db, '肠粉', lastTime_date_no,Token, applicationId, formModelId_1)
  384. insert_7qiaoPlus_rows(Token, applicationId, formModelId_1,insertList)
  385. update_7qiaoPlus_rows(Token, applicationId, formModelId_1,updateList)
  386. except Exception as e:
  387. operation_results = traceback.format_exc ()
  388. # 发送报错信息
  389. url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=cf7139e1-e623-41ca-8541-5dc6e26d43b0'
  390. msg_txt = f'<font color=\"warning\">【7巧客户数据中心-平台菜单】服务端异常终止,请管理员尽快处理!</font>\n>Exception->{e}\nDetail->{operation_results}'
  391. sendMsgToRot (url, msg_txt)
  392. db.close()
  393. spend_time = time.time()-s_time
  394. print(f'总用时{round(spend_time/60,2)}分钟')