module_online_data.py 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607
  1. import base64
  2. import requests
  3. import settings
  4. import json, asyncio
  5. import numpy as np
  6. from utils.common import message_queue
  7. class JsonEncoder(json.JSONEncoder):
  8. """Convert numpy classes to JSON serializable objects."""
  9. def default(self, obj):
  10. if isinstance(obj, (np.integer, np.floating, np.bool_)):
  11. return obj.item()
  12. elif isinstance(obj, np.ndarray):
  13. return obj.tolist()
  14. else:
  15. return super(JsonEncoder, self).default(obj)
  16. class OnlineDataRequest(object):
  17. def __init__(self, token):
  18. self.s = requests.session()
  19. self.token = token
  20. self.post_headers = {
  21. "Authorization": token,
  22. # "Origin": settings.Headers["Origin"],
  23. # "Host": settings.Headers["Host"],
  24. "Content-Length": "0",
  25. "Content-Type": "application/json",
  26. "Accept": "application/json",
  27. }
  28. print("28 Authorization:", self.post_headers["Authorization"])
  29. def refresh_headers(self, token):
  30. self.post_headers = {
  31. "Authorization": token,
  32. # "Origin": settings.Headers["Origin"],
  33. # "Host": settings.Headers["Host"],
  34. "Content-Length": "0",
  35. "Content-Type": "application/json",
  36. "Accept": "application/json",
  37. }
  38. def auth_user(self):
  39. # 用户登录
  40. url = "{domain}/api/auth/user".format(domain=settings.DOMAIN)
  41. s = requests.session()
  42. _s = s.get(url=url, headers=settings.Headers)
  43. response_data = _s.json()
  44. return response_data
  45. def logout(self):
  46. url = "{domain}/api/auth/logout".format(domain=settings.DOMAIN)
  47. s = requests.session()
  48. _s = s.post(url=url, headers=settings.Headers)
  49. def get_change_bar_code(self, code):
  50. url = "{domain}/api/hct/open/sting_search_goods?string={code}".format(
  51. domain=settings.DOMAIN, code=code
  52. )
  53. try:
  54. s = requests.get(url)
  55. goods_art_no = s.json()["data"]["goods_art_no"]
  56. return goods_art_no
  57. except BaseException as e:
  58. print(e)
  59. return
  60. def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None, token=None):
  61. # 获取商品基础信息,入参为商品的编号
  62. url = "{domain}/api/backend/produce/goods/info".format(domain=settings.DOMAIN)
  63. print("执行 get_goods_art_no_info ", url)
  64. if numbers_list:
  65. data = {"numbers": numbers_list}
  66. print("请求编码:", numbers_list)
  67. else:
  68. data = {"goods_art_nos": goods_art_list}
  69. print("请求货号:", goods_art_list)
  70. print("请求货号=====>", self.token)
  71. print("执行 get_goods_art_no_info----------------", data)
  72. post_headers = {
  73. "Authorization": token,
  74. # "Origin": settings.Headers["Origin"],
  75. # "Host": settings.Headers["Host"],
  76. "Content-Length": "",
  77. "Content-Type": "application/json",
  78. "Accept": "application/json",
  79. }
  80. data = json.dumps(data)
  81. post_headers["Content-Length"] = str(len(data))
  82. _s = self.s.post(url=url, data=data, headers=post_headers)
  83. # _s = self.s.get(url=url, params=params, headers=settings.Headers)
  84. response_data = _s.json()
  85. # print(response_data)
  86. # print("\n")
  87. goods_number_data = {}
  88. # ["", "", "", "", "", "", "", "", "", "", "", ]
  89. if "data" not in response_data:
  90. return {}
  91. for data in response_data["data"]:
  92. if numbers_list:
  93. number = data["number"]
  94. else:
  95. number = data["goods_art_no"].upper()
  96. goods_number_data[number] = {}
  97. goods_number_data[number]["商品面料"] = data["fabric"]
  98. goods_number_data[number]["商品内里"] = data["lining"]
  99. goods_number_data[number]["商品鞋底"] = data["sole"]
  100. goods_number_data[number]["后帮高"] = data["back_height"]
  101. goods_number_data[number]["前掌宽"] = data["forefoot_width"]
  102. goods_number_data[number]["鞋跟高"] = data["heel_height"]
  103. goods_number_data[number]["FAB介绍"] = data["fab_info"]
  104. goods_number_data[number]["编号"] = data["number"]
  105. goods_number_data[number]["商品货号"] = data["goods_art_no"].upper()
  106. goods_number_data[number]["款号"] = data["goods_number"].upper()
  107. goods_number_data[number]["颜色名称"] = data["color"]
  108. goods_number_data[number]["所属企划"] = data["projects"][0]
  109. goods_number_data[number]["设计方名称"] = data["purchasing_unit"]
  110. goods_number_data[number]["供应商"] = data["supplier_name"]
  111. goods_number_data[number]["供应商编码"] = data["supplier_code"].lstrip("0")
  112. goods_number_data[number]["供应商货号"] = data["supplier_goods_artno"]
  113. goods_number_data[number]["销售工厂"] = data["sales_factory_name"]
  114. goods_number_data[number]["销售组织"] = data["man_org_name"]
  115. goods_number_data[number]["是否SAP"] = data["source"]
  116. goods_number_data[number]["OEM报价"] = data["oem_price"]
  117. goods_number_data[number]["出厂价"] = data["ex_factory_price"]
  118. goods_number_data[number]["首单货期"] = data["earliest_delivery_date"]
  119. goods_number_data[number]["包装"] = data["package_specification"]
  120. goods_number_data[number]["创建日期"] = data["created_at"]
  121. goods_number_data[number]["货号图"] = data["image"]
  122. return goods_number_data
  123. def get_on_goods_all_art(self, number):
  124. # 获取商品基础信息,入参为商品的编号
  125. url = "{domain}/api/backend/produce/goods/query/numbers?number={number}".format(
  126. domain=settings.DOMAIN, number=number
  127. )
  128. _s = self.s.get(url=url, headers=self.post_headers)
  129. response_data = _s.json()
  130. print(number, response_data)
  131. """
  132. 14250230 {'data': {'goods_number': 'AC5200117', 'brother_goods_arts': [{'number': '14250232', 'goods_art_no': 'AC52001173', 'color': '杏色'}, {'number': '14250231', 'goods_art_no': 'AC52001172', 'color': '灰色'}, {'number': '14250230', 'goods_art_no': 'AC52001171', 'color': '黑色'}]}, 'code': 0, 'message': 'success'}
  133. """
  134. return (
  135. response_data["data"]["goods_number"],
  136. response_data["data"]["brother_goods_arts"],
  137. response_data["data"]["goods_art_no"],
  138. )
  139. def get_views(self, image_url):
  140. url = "http://{}/shoes_category".format(settings.VIEW_DEAL_DOMAIN)
  141. data = {
  142. "train_path": "./datasets/Shoes_Dataset/Train/angle",
  143. "model_filename": "./models/0320/output0320.pth",
  144. "validate_path": image_url,
  145. }
  146. _s = requests.post(
  147. url=url,
  148. data=json.dumps(data),
  149. )
  150. response_data = _s.json()
  151. return response_data["classify_result"]
  152. def uploadImage(self, local_path: str) -> str:
  153. post_headers = {"Authorization": self.token}
  154. url = settings.DOMAIN + "/api/upload"
  155. resultData = self.s.post(
  156. url, files={"file": open(local_path, "rb")}, headers=post_headers
  157. ).json()
  158. return resultData["data"]["url"]
  159. def get_current_menu(self):
  160. def get_menu(_menu_dict, _data):
  161. for menu in _data:
  162. _menu_dict[menu["key"]] = {}
  163. for mods in menu["mods_arr"]:
  164. _menu_dict[menu["key"]][mods["key"]] = mods["name"]
  165. if "_child" in menu:
  166. get_menu(_menu_dict, menu["_child"])
  167. return _menu_dict
  168. url = "{domain}/api/backend/basic/get_current_menu".format(
  169. domain=settings.DOMAIN,
  170. )
  171. _s = self.s.get(url=url, headers=settings.Headers)
  172. response_data = _s.json()
  173. try:
  174. menu_data = response_data["data"]["pc_menu"]
  175. menu_dict = {}
  176. menu_dict = get_menu(menu_dict, menu_data)
  177. except:
  178. menu_dict = {}
  179. # print(json.dumps(menu_dict,ensure_ascii=False))
  180. # raise 1
  181. return menu_dict
  182. # 获取所有资源的配置
  183. def get_resource_config(self):
  184. url = "{domain}/api/openai/query_client_addons".format(domain=settings.DOMAIN)
  185. _s = self.s.get(
  186. url=url, headers=self.post_headers, params={"type": "client_camera"}
  187. )
  188. response_data = _s.json()
  189. return response_data
  190. # 拍照日志上报
  191. def add_auto_photo_logs(self, data):
  192. url = "{domain}/api/openai/add_auto_photo_logs".format(domain=settings.DOMAIN)
  193. post_data = {
  194. "goods_no": data["goods_art_no"],
  195. "take_photo_created_at": data["take_photo_created_at"],
  196. "photo_created_at": data["photo_create_time"],
  197. "image_dispose_mode": data["image_deal_mode"],
  198. "photo_serial_number": data["image_index"],
  199. }
  200. post_data = json.dumps(post_data)
  201. _s = self.s.post(url=url, headers=self.post_headers, data=post_data)
  202. response_data = _s.json()
  203. if settings.IS_TEST:
  204. print("209-----拍照日志上报 add_auto_photo_logs")
  205. print(response_data)
  206. return response_data
  207. def upload_pic_list_data(self, data):
  208. url = "{domain}/api/backend/goods/save/images".format(domain=settings.DOMAIN)
  209. data = json.dumps(data)
  210. self.post_headers["Content-Length"] = str(len(data))
  211. _s = self.s.post(url=url, data=data, headers=self.post_headers)
  212. response_data = _s.json()
  213. try:
  214. if response_data["code"] == 0 and response_data["message"] == "success":
  215. return True
  216. else:
  217. print(data)
  218. print(response_data)
  219. return False
  220. except BaseException as e:
  221. print(data)
  222. print(e)
  223. print(response_data)
  224. return False
  225. def upload_pic(self, goods_data):
  226. # 检查货号图是否存在
  227. url = "{domain}/api/backend/upload".format(domain=settings.DOMAIN)
  228. # print(url)
  229. headers = {
  230. "Authorization": settings.Headers["Authorization"],
  231. "User-Agent": settings.Headers["User-Agent"],
  232. "Origin": settings.Headers["Origin"],
  233. "Host": settings.Headers["Host"],
  234. }
  235. files = [
  236. (
  237. "file",
  238. (
  239. goods_data["file_path"],
  240. goods_data["image_io"],
  241. "image/{}".format(goods_data["e"]),
  242. ),
  243. )
  244. ]
  245. _s = requests.post(url=url, headers=headers, files=files)
  246. response_data = _s.json()
  247. return response_data["data"]["url"]
  248. # 查询是否已有详情图
  249. def check_detail_image(self, goods_art_no, token):
  250. url = "{domain}/api/backend/goods/check_detail_image?number={number}".format(
  251. domain=settings.DOMAIN, number=goods_art_no
  252. )
  253. _s = self.s.get(url=url, headers=self.post_headers)
  254. response_data = _s.json()
  255. # print(response_data)
  256. return response_data["data"]["hasDetailImage"]
  257. # 调用API识别是否是拖鞋
  258. def yolo_shoes_category(self, image_url):
  259. url = "{domain}/api/ai_image/main/yolo_shoes_category".format(
  260. domain=settings.DOMAIN
  261. )
  262. post_data = {
  263. "image_url": image_url,
  264. }
  265. post_data = json.dumps(post_data)
  266. _s = self.s.post(url=url, headers=self.post_headers, data=post_data)
  267. response_data = _s.json()
  268. if settings.IS_TEST:
  269. print("278-----yolo_shoes_category")
  270. print(response_data)
  271. r_data = None
  272. try:
  273. r_data = response_data["data"]["category"]
  274. except BaseException as e:
  275. print("285", e)
  276. return r_data
  277. # 图片上传by IO
  278. def upload_image_by_io(self, image_io) -> str:
  279. post_headers = {"Authorization": settings.Authorization}
  280. url = settings.DOMAIN + "/api/upload"
  281. resultData = self.s.post(
  282. url, files={"file": image_io}, headers=post_headers
  283. ).json()
  284. return resultData["data"]["url"]
  285. def upload_goods_api(self, params):
  286. '''上传商品api'''
  287. post_headers = {
  288. "Authorization": self.token,
  289. "Content-Type": "application/json",
  290. }
  291. url = settings.DOMAIN+"/api/ai_image/camera_machine/publish_goods"
  292. postData = json.dumps(params)
  293. print("上传商品api==>url", url)
  294. print("上传第三方数据打印", params)
  295. resultData = self.s.post(url, data=postData, headers=post_headers).json()
  296. print("上传商品api==>resultData", resultData)
  297. return resultData
  298. def sendSocketMessage(self, code=0, msg="", data=None, device_status=2):
  299. data = {
  300. "code": code,
  301. "msg": msg,
  302. "status": device_status,
  303. "data": data,
  304. "msg_type": self.msg_type,
  305. }
  306. loop = asyncio.get_event_loop()
  307. loop.create_task(message_queue.put(data))
  308. def uploadGoods2ThirdParty(self, goods_no_dict=None, online_stores=[]):
  309. params = []
  310. message_type = "upload_goods_progress"
  311. self.sendSocketMessage(
  312. code=0,
  313. msg="开始上传商品数据",
  314. data={"online_stores": online_stores, "status": "进行中"},
  315. message_type=message_type,
  316. )
  317. if goods_no_dict == None:
  318. return
  319. for goods_no in goods_no_dict.keys():
  320. goods_data = goods_no_dict[goods_no]
  321. detail_path = goods_data.get("detail_path", "")
  322. if detail_path == "":
  323. continue
  324. goods_title = goods_data.get("商品标题", "")
  325. if goods_title == "":
  326. continue
  327. goods_price = goods_data.get("商品价格", 0)
  328. if goods_title == 0:
  329. continue
  330. skuList = []
  331. itemImageInfoList = []
  332. itemSkuImageList = []
  333. sku_list_basic = goods_data.get("货号资料", [])
  334. quantity = 9999
  335. skuPropValueList = []
  336. for skuIdx, sku_data in enumerate(sku_list_basic):
  337. sku_goods_art_no = sku_data.get("货号", "")
  338. color_name = sku_data.get("颜色名称", "")
  339. mainImages = sku_data.get("800x800", [])
  340. if not mainImages:
  341. continue
  342. mainImagePath = mainImages[0]
  343. imageUrl = self.uploadImage(local_path=mainImagePath)
  344. skuItemData = {
  345. "skuNo": sku_goods_art_no,
  346. "originalPrice": float(goods_price),
  347. "newSkuWeight": int(1),
  348. "skuMainImageUrl": str(imageUrl),
  349. "skuName": f"颜色:{color_name}",
  350. "sellingPrice": float(goods_price),
  351. "quantity": int(quantity),
  352. "showOrder": int(skuIdx + 1),
  353. }
  354. skuList.append(skuItemData)
  355. itemImage = {
  356. "imageUrl": str(imageUrl),
  357. "imageType": 0,
  358. "imageItem": int(skuIdx),
  359. "imageIndex": 10,
  360. }
  361. itemImageInfoList.append(itemImage)
  362. imageJson = {
  363. "imageUrl": str(imageUrl),
  364. "imageType": 1,
  365. "showOrder": 1,
  366. }
  367. skuPropValueList.append(
  368. {
  369. "imageJson": imageJson,
  370. "propValue": str(color_name),
  371. "showOrder": 1,
  372. }
  373. )
  374. itemSkuImageList.append(
  375. {
  376. "propName": "颜色",
  377. "isImageProp": 1,
  378. "propShowOrder": 1,
  379. "skuPropValueList": skuPropValueList,
  380. }
  381. )
  382. detailImageUrl = self.uploadImage(local_path=detail_path)
  383. category_info = "流行男鞋>>休闲鞋>>时尚休闲鞋"
  384. itemData = {
  385. "catePathName": category_info, # 分类
  386. "itemName": str(goods_title), # 商品标题
  387. "itemNo": str(goods_no),
  388. "brandName": "vali", # 品牌名称
  389. "sellingPrice": float(goods_price), # 售价(未划线价)
  390. "originalPrice": float(goods_price), # 划线价
  391. "quantity": int(quantity), # 库存数量
  392. "propInfoList": [
  393. {"propName": "品牌", "propIndex": 2, "propValue": "Vali"},
  394. {
  395. "propName": "平台类目",
  396. "propIndex": 3,
  397. "propValue": category_info,
  398. },
  399. ],
  400. "skuList": skuList,
  401. "itemImageInfoList": itemImageInfoList,
  402. "itemSkuImageList": itemSkuImageList,
  403. "wapDescription": f'<img src="{detailImageUrl}"/>',
  404. "pcDescription": f'<img src="{detailImageUrl}"/>',
  405. }
  406. params.append(itemData)
  407. json_params = str(params) # 直接转换为字符串表示
  408. # 使用base64编码
  409. encoded = base64.b64encode(json_params.encode("utf-8")).decode("utf-8")
  410. self.upload_goods_api({"bizcontent": encoded, "online_stores": online_stores})
  411. print("商品上传第三方成功")
  412. self.sendSocketMessage(
  413. code=0,
  414. msg="商品上传第三方成功",
  415. data={"online_stores": online_stores, "status": "已完成"},
  416. message_type=message_type,
  417. )
  418. class GetOnlineDataHLM(OnlineDataRequest):
  419. def __init__(self, token):
  420. super().__init__(token)
  421. self.token = token
  422. def upload_pic(self, goods_data, token):
  423. # 检查货号图是否存在
  424. url = "{domain}/api/backend/upload".format(domain=settings.DOMAIN)
  425. # print(url)
  426. headers = {
  427. "Authorization": self.token,
  428. # 'User-Agent': settings.Headers["User-Agent"],
  429. # 'Origin': settings.Headers["Origin"],
  430. # 'Host': settings.Headers["Host"],
  431. }
  432. files = [
  433. (
  434. "file",
  435. (
  436. goods_data["file_path"],
  437. goods_data["image_io"],
  438. "image/{}".format(goods_data["e"]),
  439. ),
  440. )
  441. ]
  442. _s = requests.post(url=url, headers=headers, files=files)
  443. response_data = _s.json()
  444. return response_data["data"]["url"]
  445. def upload_pic_list_data(self, data, token):
  446. url = "{domain}/api/backend/goods/save/images".format(domain=settings.DOMAIN)
  447. data = json.dumps(data)
  448. self.post_headers["Content-Length"] = str(len(data))
  449. _s = self.s.post(url=url, data=data, headers=self.post_headers)
  450. response_data = _s.json()
  451. try:
  452. if response_data["code"] == 0 and response_data["message"] == "success":
  453. return True
  454. else:
  455. print(response_data)
  456. return False
  457. except BaseException as e:
  458. print(e)
  459. print(response_data)
  460. return False
  461. def get_goods_art_no_info(self, numbers_list=None, goods_art_list=None, token=None):
  462. # 获取商品基础信息,入参为商品的编号
  463. url = "{domain}/api/backend/goods_client/goods_query".format(
  464. domain=settings.DOMAIN
  465. )
  466. data = {"goods_art_list": goods_art_list}
  467. print("url:", url)
  468. print("请求货号:", goods_art_list)
  469. post_headers = {
  470. "Authorization": token,
  471. # "Origin": settings.Headers["Origin"],
  472. # "Host": settings.Headers["Host"],
  473. "Content-Length": "",
  474. "Content-Type": "application/json",
  475. "Accept": "application/json",
  476. }
  477. data = json.dumps(data)
  478. print(post_headers)
  479. print(data)
  480. # post_headers["Content-Length"] = str(len(data))
  481. _s = self.s.post(url=url, data=data, headers=post_headers)
  482. # _s = self.s.get(url=url, params=params, headers=settings.Headers)
  483. response_data = _s.json()
  484. print(response_data)
  485. print("\n")
  486. goods_number_data = {}
  487. # ["", "", "", "", "", "", "", "", "", "", "", ]
  488. if "data" not in response_data:
  489. return {}
  490. for data in response_data["data"]:
  491. goods_number_data[data["goods_art_no"]] = {}
  492. goods_number_data[data["goods_art_no"]]["商品货号"] = data[
  493. "goods_art_no"
  494. ].upper()
  495. goods_number_data[data["goods_art_no"]]["款号"] = data[
  496. "goods_number"
  497. ].upper()
  498. goods_number_data[data["goods_art_no"]]["商品面料"] = data["fabric"]
  499. goods_number_data[data["goods_art_no"]]["商品内里"] = data["lining"]
  500. goods_number_data[data["goods_art_no"]]["商品鞋底"] = data["sole"]
  501. goods_number_data[data["goods_art_no"]]["鞋垫"] = data["insole"]
  502. goods_number_data[data["goods_art_no"]]["颜色名称"] = data["color"]
  503. goods_number_data[data["goods_art_no"]]["商品标题"] = data["goods_title"]
  504. goods_number_data[data["goods_art_no"]]["商品价格"] = data["retail_price"]
  505. return goods_number_data
  506. def uploadImage(self, local_path: str) -> str:
  507. post_headers = {"Authorization": settings.Authorization}
  508. url = settings.DOMAIN + "/api/upload"
  509. resultData = self.s.post(
  510. url, files={"file": open(local_path, "rb")}, headers=post_headers
  511. ).json()
  512. return resultData["data"]["url"]
  513. # ============pixian抠图处理==========================
  514. def dispose_point(self, _type):
  515. # 扣分 sub;add为增加分数,每次操作一分
  516. url = "{domain}/api/ai_image/client/dispose_point".format(
  517. domain=settings.DOMAIN
  518. )
  519. data = {"type": _type}
  520. _s = self.s.post(
  521. url=url, headers=self.post_headers, data=json.dumps(data), timeout=10
  522. )
  523. response_data = _s.json()
  524. return response_data
  525. def send_message(self, text):
  526. # 发送钉钉消息
  527. url = "{domain}/api/ai_image/client/send_message".format(domain=settings.DOMAIN)
  528. data = {"message": text}
  529. _s = self.s.post(
  530. url=url, headers=self.post_headers, data=json.dumps(data), timeout=10
  531. )
  532. response_data = _s.json()
  533. return response_data
  534. def get_cutout_image_times(self):
  535. # 获取抠图剩余次数
  536. url = "{domain}/api/ai_image/client/search_company_balance".format(
  537. domain=settings.DOMAIN
  538. )
  539. _s = self.s.post(url=url, headers=self.post_headers, timeout=10)
  540. response_data = _s.json()
  541. if "data" not in response_data:
  542. return False
  543. else:
  544. return response_data["data"]
  545. def get_key_secret(self):
  546. # 获取抠图剩余次数
  547. url = "{domain}/api/ai_image/client/get_key_serect".format(
  548. domain=settings.DOMAIN
  549. )
  550. _s = self.s.post(url=url, headers=self.post_headers, timeout=10)
  551. response_data = _s.json()
  552. return response_data["data"]