message_handler.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. from .connect_manager import ConnectionManager
  2. from models import WebSocket
  3. import json, asyncio
  4. from mcu.DeviceControl import DeviceControl, checkMcuConnection
  5. from mcu.BlueToothMode import BlueToothMode
  6. from databases import DeviceConfig, SqlQuery, CRUD, PhotoRecord, SysConfigs
  7. from mcu.capture.module_digicam import DigiCam
  8. from mcu.capture.smart_shooter_class import SmartShooter
  9. from models import RecordUpdate
  10. from service.run_main import RunMain
  11. from utils.utils_func import check_path
  12. import time, shutil, os
  13. from service.base import check_move_goods_art_no_folder
  14. from service.deal_image import DealImage
  15. import settings
  16. from middleware import UnicornException
  17. from concurrent.futures import ThreadPoolExecutor
  18. from functools import partial
  19. from logger import logger
  20. import stat
  21. # 创建全局线程池
  22. executor = ThreadPoolExecutor(max_workers=4)
  23. async def handlerCutOut(
  24. manager=None, run_main=None, config_data={}, websocket=None, msg_type=""
  25. ):
  26. try:
  27. # return_data = run_main.check_before_cutout(config_data)
  28. # await run_main.check_for_cutout_image_first_call_back(return_data)
  29. # 将阻塞操作放到线程池中执行
  30. loop = asyncio.get_event_loop()
  31. return_data = await loop.run_in_executor(
  32. executor, partial(run_main.check_before_cutout, config_data)
  33. )
  34. # await run_main.check_for_cutout_image_first_call_back(return_data)
  35. await loop.run_in_executor(
  36. executor,
  37. partial(run_main.check_for_cutout_image_first_call_back, return_data),
  38. )
  39. except UnicornException as e:
  40. data = manager.jsonMessage(
  41. code=1,
  42. msg=e.msg,
  43. msg_type=msg_type,
  44. )
  45. await manager.send_personal_message(data, websocket)
  46. return
  47. except Exception as e:
  48. print("error",e)
  49. data = manager.jsonMessage(
  50. code=1,
  51. msg="抠图异常,请稍后重试~",
  52. msg_type=msg_type,
  53. )
  54. await manager.send_personal_message(data, websocket)
  55. def handlerFolderDelete(limit_path, goods_art_no_arrays, is_write_txt_log):
  56. check_path(limit_path)
  57. move_folder_array = check_move_goods_art_no_folder(
  58. "output", goods_art_no_arrays, limit_path
  59. )
  60. for goods_art_revice in goods_art_no_arrays:
  61. cutout_goods = f"{limit_path}/{goods_art_revice}"
  62. if os.path.exists(cutout_goods):
  63. for root, dirs, files in os.walk(cutout_goods):
  64. for file in files:
  65. filepath = os.path.join(root, file)
  66. os.chmod(filepath, stat.S_IWRITE)
  67. logger.info(f"解除占用并开始删除目录:{cutout_goods}")
  68. # 尝试多次删除,增加成功率
  69. retry_count = 3
  70. while retry_count > 0:
  71. try:
  72. shutil.rmtree(cutout_goods, onerror=settings.handle_remove_readonly)
  73. del move_folder_array[goods_art_revice]
  74. break
  75. except OSError as e:
  76. logger.info(f"目录已经被删除-OSError:{str(e)}")
  77. break
  78. except (PermissionError) as e:
  79. retry_count -= 1
  80. if retry_count == 0:
  81. logger.info(f"抠图前目录删除出现问题-PermissionError:{str(e)};{goods_art_revice};{cutout_goods}")
  82. if is_write_txt_log:
  83. error_file_path = f"{cutout_goods}/异常说明-出现目录丢失或缺少图片请点开查看原因.txt"
  84. with open(error_file_path, 'w', encoding='utf-8') as f:
  85. f.write("目录删除失败\n")
  86. f.write(f"原因: 文件被占用或没有删除权限\n")
  87. f.write(f"错误信息: {str(e)}\n")
  88. f.write(f"时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
  89. f.write(f"请关闭可能正在使用此目录的程序后,为当前货号点击重拍后重试\n")
  90. else:
  91. raise UnicornException(f"目录检查出现问题:{str(e)},请关闭错误提示中的被占用文件")
  92. else:
  93. logger.info(f"抠图前目录删除出现问题--PermissionError:{str(e)};{retry_count}")
  94. time.sleep(0.5) # 等待0.5秒后重试
  95. except Exception as e:
  96. retry_count -= 1
  97. if retry_count == 0:
  98. logger.info(f"抠图前目录删除出现问题--Exception:{str(e)};{goods_art_revice};{cutout_goods}")
  99. if is_write_txt_log:
  100. error_file_path = f"{cutout_goods}/异常说明-出现目录丢失或缺少图片请点开查看原因.txt"
  101. with open(error_file_path, 'w', encoding='utf-8') as f:
  102. f.write("目录删除失败\n")
  103. f.write(f"原因: {str(e)}\n")
  104. f.write(f"时间: {time.strftime('%Y-%m-%d %H:%M:%S')}\n")
  105. f.write(f"请检查目录状态后,为当前货号点击重拍后重试\n")
  106. else:
  107. raise UnicornException(f"目录检查出现问题:{str(e)},请关闭错误提示中的被占用文件")
  108. else:
  109. logger.info(f"抠图前目录删除出现问题--Exception:{str(e)};{retry_count}")
  110. time.sleep(0.5) # 等待0.5秒后重试
  111. return move_folder_array
  112. def validate_goods_art_no(goods_art_no):
  113. """
  114. 验证货号输入是否包含特殊字符
  115. """
  116. import re
  117. # 定义不允许的特殊字符,主要是文件系统中可能导致路径问题的字符
  118. invalid_chars = r'[<>:"/\\|?*]'
  119. if re.search(invalid_chars, goods_art_no):
  120. # 找出所有非法字符
  121. invalid_found = re.findall(invalid_chars, goods_art_no)
  122. invalid_str = ', '.join(set(invalid_found))
  123. return False,f"货号包含非法字符: {invalid_str},请修改后再提交"
  124. return True,""
  125. # socket消息发送逻辑处理方法
  126. async def handlerSend(
  127. manager: ConnectionManager,
  128. receiveData: str,
  129. websocket: WebSocket,
  130. smart_shooter: SmartShooter,
  131. ):
  132. loop = asyncio.get_event_loop()
  133. receiveData = json.loads(receiveData)
  134. # 处理消息发送逻辑
  135. receiveData = json.loads(receiveData.get("text"))
  136. print("receiveData", receiveData)
  137. jsonType = receiveData.get("type")
  138. code = receiveData.get("code")
  139. msg = receiveData.get("msg")
  140. data = receiveData.get("data")
  141. match jsonType:
  142. case "ping":
  143. """发送心跳"""
  144. data = manager.jsonMessage("pong")
  145. await manager.send_personal_message(data, websocket)
  146. case "pong":
  147. """发送心跳"""
  148. pass
  149. case "forward_message":
  150. data = receiveData.get("data")
  151. dictMsg = {"code": code, "msg": msg, "data": data}
  152. await manager.broadcast(dictMsg)
  153. case "connect_mcu":
  154. device_ctrl = DeviceControl(
  155. websocket_manager=manager, smart_shooter=smart_shooter
  156. )
  157. device_ctrl.mcu_exit = False
  158. # if device_ctrl.serial_ins.check_connect():
  159. # print("未连接")
  160. loop.create_task(checkMcuConnection(device_ctrl), name="mcu")
  161. case "connect_bluetooth":
  162. blue_tooth = BlueToothMode(websocket_manager=manager)
  163. blue_tooth.bluetooth_exit = False
  164. # await blue_tooth.main_func()
  165. print("连接蓝牙信息")
  166. loop.create_task(blue_tooth.main_func(), name="blue_tooth")
  167. # loop.close()
  168. case "init_mcu":
  169. device_ctrl = DeviceControl(
  170. websocket_manager=manager, smart_shooter=smart_shooter
  171. )
  172. # 是否强制初始化
  173. is_force_init = False
  174. loop.create_task(device_ctrl.initDevice(is_force_init), name="init_mcu")
  175. case "get_mcu_info":
  176. device_ctrl = DeviceControl(
  177. websocket_manager=manager, smart_shooter=smart_shooter
  178. )
  179. if not device_ctrl.is_running:
  180. device_ctrl.sendSocketMessage(
  181. code=1, msg="mcu设备未连接,请先连接设备", device_status=0
  182. )
  183. device_ctrl.send_get_all_info_to_mcu()
  184. case "control_mcu":
  185. device_name = data.get("device_name")
  186. value = data.get("value")
  187. if (device_name == "" or device_name == None) or (
  188. value == "" or value == None
  189. ):
  190. data = manager.jsonMessage(code=1, msg="参数错误", msg_type="mcu")
  191. await manager.send_personal_message(data, websocket)
  192. return
  193. device_ctrl = DeviceControl(
  194. websocket_manager=manager, smart_shooter=smart_shooter
  195. )
  196. await device_ctrl.controlDevice(device_name, value)
  197. case "stop_action":
  198. device_ctrl = DeviceControl(
  199. websocket_manager=manager, smart_shooter=smart_shooter
  200. )
  201. if device_ctrl.is_runn_action == True:
  202. print("动作执行中,停止")
  203. device_ctrl.is_stop_action = True
  204. else:
  205. print("动作没有执行,略过")
  206. data = manager.jsonMessage(code=0, msg="执行终止", msg_type="run_mcu_stop")
  207. await manager.send_personal_message(data, websocket)
  208. return
  209. case "run_mcu":
  210. msg_type = "run_mcu"
  211. action_info = data.get("action", "执行左脚程序")
  212. goods_art_no = data.get("goods_art_no", None)
  213. if goods_art_no == None or goods_art_no == "":
  214. # 判断货号是否存在
  215. data = manager.jsonMessage(
  216. code=1, msg="goods_art_no不能为空", msg_type=msg_type
  217. )
  218. await manager.send_personal_message(data, websocket)
  219. return
  220. is_ok, msg = validate_goods_art_no(goods_art_no)
  221. if not is_ok:
  222. data = manager.jsonMessage(
  223. code=1, msg=msg, msg_type=msg_type
  224. )
  225. await manager.send_personal_message(data, websocket)
  226. return
  227. session = SqlQuery()
  228. sys_configs = CRUD(SysConfigs)
  229. action_configs = sys_configs.read(
  230. session, conditions={"key": "action_configs"}
  231. )
  232. action_configs_json = json.loads(action_configs.value)
  233. action_flag = "left"
  234. if "右" in action_info:
  235. action_flag = "right"
  236. tab_id = action_configs_json.get(action_flag)
  237. photoRecord = CRUD(PhotoRecord)
  238. goods_art_record = photoRecord.read(
  239. session, conditions={"goods_art_no": goods_art_no,"delete_time": None}
  240. )
  241. if goods_art_record != None:
  242. data = manager.jsonMessage(
  243. code=1,
  244. msg=f"货号[{goods_art_no}]已存在,请勿重复拍摄~",
  245. msg_type=msg_type,
  246. )
  247. await manager.send_personal_message(data, websocket)
  248. return
  249. crud = CRUD(DeviceConfig)
  250. condtions = {"tab_id": tab_id}
  251. all_devices = crud.read_all(
  252. session, conditions=condtions, order_by="action_index", ascending=True
  253. )
  254. if len(all_devices) == 0:
  255. # 判断是否有可用配置
  256. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  257. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  258. return
  259. action_list = [dict(device.__dict__) for device in all_devices]
  260. print("执行拍摄 打印动作列表", condtions)
  261. # logger.info("执行拍摄 打印动作列表", json.dumps(action_list))
  262. device_ctrl = DeviceControl(
  263. websocket_manager=manager, smart_shooter=smart_shooter
  264. )
  265. loop.create_task(
  266. device_ctrl.run_mcu_config(
  267. action_list, goods_art_no, action_info, smart_shooter
  268. ),
  269. name="run_mcu_config",
  270. )
  271. session.close()
  272. case "run_mcu_single":
  273. device_ctrl = DeviceControl(
  274. websocket_manager=manager, smart_shooter=smart_shooter
  275. )
  276. loop.create_task(
  277. device_ctrl.run_mcu_config_single(
  278. data, None, "run_mcu_single", -1, smart_shooter
  279. ),
  280. name="run_mcu_single",
  281. )
  282. case "handler_take_picture":
  283. device_ctrl = DeviceControl(
  284. websocket_manager=manager, smart_shooter=smart_shooter
  285. )
  286. await device_ctrl.controlDevice("laser_position", 0)
  287. blue_tooth = BlueToothMode(
  288. websocket_manager=manager, smart_shooter=smart_shooter
  289. )
  290. session = SqlQuery()
  291. crud = CRUD(PhotoRecord)
  292. record = crud.read(session=session, order_by="id", ascending=False,conditions={"delete_time": None})
  293. if record == None:
  294. # 发送失败消息
  295. data = manager.jsonMessage(
  296. code=1,
  297. msg="单拍失败,请先输入货号或扫码进行组合拍摄",
  298. msg_type="handler_take_picture",
  299. )
  300. await manager.send_personal_message(data, websocket)
  301. return
  302. try:
  303. limit_path = "{}/{}".format(settings.OUTPUT_DIR,
  304. time.strftime("%Y-%m-%d", time.localtime(time.time()))
  305. )
  306. move_folder_array = handlerFolderDelete(limit_path,[record.goods_art_no],False)
  307. except UnicornException as e:
  308. data = manager.jsonMessage(
  309. code=1,
  310. msg=e.msg,
  311. msg_type="handler_take_picture",
  312. )
  313. await manager.send_personal_message(data, websocket)
  314. return
  315. loop.create_task(
  316. blue_tooth.remote_control_v2.handlerTakePhoto(smart_shooter,session,record),
  317. name="run_mcu_config",
  318. )
  319. await asyncio.sleep(2.5)
  320. await device_ctrl.controlDevice("laser_position", 1)
  321. case "re_take_picture": # 重拍
  322. msg_type = "re_take_picture"
  323. record_id = data.get("record_id")
  324. session = SqlQuery()
  325. photoRecord = CRUD(PhotoRecord)
  326. goods_art_record = photoRecord.read(session, conditions={"id": record_id,"delete_time": None})
  327. if goods_art_record == None:
  328. data = manager.jsonMessage(
  329. code=1,
  330. msg=f"记录不存在,请核实后重新操作~",
  331. msg_type=msg_type,
  332. )
  333. await manager.send_personal_message(data, websocket)
  334. return
  335. action_id = goods_art_record.action_id
  336. goods_art_no = goods_art_record.goods_art_no
  337. image_index = goods_art_record.image_index
  338. crud = CRUD(DeviceConfig)
  339. condtions = {"id": action_id}
  340. device_action = crud.read(session, conditions=condtions)
  341. result_dict = dict(device_action.__dict__)
  342. print("device_action打印输出====>>>", result_dict)
  343. if device_action == None:
  344. # 判断是否有可用配置
  345. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  346. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  347. return
  348. # 清除图片记录,执行重拍
  349. reset_data = {"image_path": None}
  350. photoRecord.update(session, record_id, **reset_data)
  351. device_ctrl = DeviceControl(
  352. websocket_manager=manager, smart_shooter=smart_shooter
  353. )
  354. loop.create_task(
  355. device_ctrl.run_mcu_config_single(
  356. result_dict,
  357. goods_art_no,
  358. msg_type=msg_type,
  359. image_index=image_index,
  360. smart_shooter=smart_shooter,
  361. action_id=record_id,
  362. ),
  363. name="run_mcu_config_single",
  364. )
  365. session.close()
  366. case "get_deviation":
  367. device_ctrl = DeviceControl(
  368. websocket_manager=manager, smart_shooter=smart_shooter
  369. )
  370. loop.create_task(
  371. device_ctrl.getDeviationInfo(),
  372. name="get_deviation",
  373. )
  374. case "set_deviation":
  375. device_ctrl = DeviceControl(
  376. websocket_manager=manager, smart_shooter=smart_shooter
  377. )
  378. value = data.get("value", None)
  379. action_name = data.get("action_name", None)
  380. loop.create_task(
  381. device_ctrl.set_deviation_cmd(value, action_name, "set"),
  382. name="set_deviation",
  383. )
  384. case "move_deviation":
  385. device_ctrl = DeviceControl(
  386. websocket_manager=manager, smart_shooter=smart_shooter
  387. )
  388. value = data.get("value", None)
  389. action_name = data.get("action_name", None)
  390. loop.create_task(
  391. device_ctrl.set_deviation_cmd(value, action_name, "move"),
  392. name="move_deviation",
  393. )
  394. case "get_mcu_other_info":
  395. device_ctrl = DeviceControl(
  396. websocket_manager=manager, smart_shooter=smart_shooter
  397. )
  398. loop.create_task(
  399. device_ctrl.getMcuOtherInfo(),
  400. name="mcu_other_set_get",
  401. )
  402. case "set_mcu_other_info":
  403. device_ctrl = DeviceControl(
  404. websocket_manager=manager, smart_shooter=smart_shooter
  405. )
  406. loop.create_task(
  407. device_ctrl.setMcuOtherInfo(data),
  408. name="setMcuOtherInfo",
  409. )
  410. case "send_command":
  411. device_ctrl = DeviceControl(
  412. websocket_manager=manager, smart_shooter=smart_shooter
  413. )
  414. loop.create_task(
  415. device_ctrl.sendCommand(data.get("command", None)),
  416. name="sendCommand",
  417. )
  418. case "smart_shooter_getinfo":
  419. """
  420. 获取相机信息,是否连接
  421. """
  422. loop.create_task(
  423. smart_shooter.GetCameraInfo(msg_type="smart_shooter_getinfo"),
  424. name="smart_shooter_getinfo",
  425. )
  426. case "smart_shooter_enable_preview":
  427. """
  428. 启动相机或关闭实时预览
  429. """
  430. value = data.get("value", True)
  431. loop.create_task(
  432. smart_shooter.EnableCameraPreview(
  433. enable_status=value, msg_type="smart_shooter_enable_preview"
  434. ),
  435. name="smart_shooter_enable_preview",
  436. )
  437. case "smart_shooter_get_camera_property":
  438. """
  439. 启动相机或关闭实时预览
  440. """
  441. msg_type = "smart_shooter_get_camera_property"
  442. code = 0
  443. status, info = await smart_shooter.GetCameraProperty()
  444. code = 1 if status == False else 0
  445. msg = info if status == False else "操作成功"
  446. data = info if status == True else {}
  447. data = manager.jsonMessage(
  448. code=code,
  449. msg=msg,
  450. msg_type=msg_type,
  451. data=data,
  452. )
  453. await manager.send_personal_message(data, websocket)
  454. case "work_path":
  455. """
  456. 启动相机或关闭实时预览
  457. """
  458. msg_type = "work_path"
  459. code = 0
  460. project_root = os.getcwd()
  461. work_path = f"{project_root}\\output"
  462. check_path(work_path)
  463. params = {"work_path": work_path}
  464. data = manager.jsonMessage(
  465. code=code,
  466. msg=msg,
  467. msg_type=msg_type,
  468. data=params,
  469. )
  470. await manager.send_personal_message(data, websocket)
  471. case "smart_shooter_photo_take":
  472. """
  473. 获取相机信息,是否连接
  474. """
  475. device_ctrl = DeviceControl(
  476. websocket_manager=manager, smart_shooter=smart_shooter
  477. )
  478. await device_ctrl.controlDevice("laser_position", 0)
  479. # 兼容主图测试
  480. id = data.get("id", 0)
  481. goods_art_no = data.get("goods_art_no", "")
  482. if goods_art_no:
  483. try:
  484. limit_path = "{}/{}".format(settings.OUTPUT_DIR,
  485. time.strftime("%Y-%m-%d", time.localtime(time.time()))
  486. )
  487. move_folder_array = handlerFolderDelete(limit_path,[goods_art_no],False)
  488. except UnicornException as e:
  489. data = manager.jsonMessage(
  490. code=1,
  491. msg=e.msg,
  492. msg_type="smart_shooter_photo_take",
  493. )
  494. await manager.send_personal_message(data, websocket)
  495. return
  496. is_af = True
  497. loop.create_task(
  498. smart_shooter.CameraShooter(
  499. msg_type="smart_shooter_photo_take",
  500. id=id,
  501. goods_art_no=goods_art_no,
  502. is_af=is_af,
  503. ),
  504. name="smart_shooter_photo_take",
  505. )
  506. await asyncio.sleep(2.5)
  507. await device_ctrl.controlDevice("laser_position", 1)
  508. case "digicam_take_picture":
  509. msg_type = "re_take_picture"
  510. id = data.get("id", 0)
  511. goods_art_no = data.get("goods_art_no", "")
  512. session = SqlQuery()
  513. photoRecord = CRUD(PhotoRecord)
  514. goods_art_record = photoRecord.read(session, conditions={"id": id,"delete_time": None})
  515. if goods_art_record == None:
  516. data = manager.jsonMessage(
  517. code=1,
  518. msg=f"记录不存在,请核实后重新操作~",
  519. msg_type=msg_type,
  520. )
  521. await manager.send_personal_message(data, websocket)
  522. return
  523. reset_data = {"image_path": None}
  524. photoRecord.update(session, id, **reset_data)
  525. device_ctrl = DeviceControl(websocket_manager=manager)#
  526. loop.create_task(
  527. device_ctrl.only_take_photo(
  528. goods_art_no=goods_art_no,
  529. image_index=goods_art_record.image_index,
  530. record_id=id,
  531. ),
  532. name="sendCommand",
  533. )
  534. session.close()
  535. case "segment_progress":
  536. msg_type = "segment_progress"
  537. obj = None
  538. token = data.get("token", "")
  539. token = "Bearer " + token
  540. uuid = data.get("uuid", "")
  541. run_main = RunMain(obj, token, uuid)
  542. goods_art_no_arrays = data.get("goods_art_no", [])
  543. limit_path = "{}/{}".format(settings.OUTPUT_DIR,
  544. time.strftime("%Y-%m-%d", time.localtime(time.time()))
  545. )
  546. try:
  547. move_folder_array = handlerFolderDelete(limit_path,goods_art_no_arrays,True)
  548. except UnicornException as e:
  549. data = manager.jsonMessage(
  550. code=1,
  551. msg=e.msg,
  552. msg_type=msg_type,
  553. )
  554. await manager.send_personal_message(data, websocket)
  555. return
  556. # 该数组表示是否需要后面的移动文件夹操作,减少重复抠图,提升抠图时间和速度
  557. session = SqlQuery()
  558. for goods_art_no in goods_art_no_arrays:
  559. pr = CRUD(PhotoRecord)
  560. images = pr.read_all(session, conditions={"goods_art_no": goods_art_no,"delete_time": None})
  561. if not images:
  562. data = manager.jsonMessage(
  563. code=1,
  564. msg=f"商品货号【{goods_art_no}】在商品档案资料中不存在,请检查货号是否正确",
  565. msg_type=msg_type,
  566. )
  567. await manager.send_personal_message(data, websocket)
  568. return
  569. if move_folder_array.get(goods_art_no) == None:
  570. image_dir = "{}/data/".format(os.getcwd()).replace("\\", "/")
  571. check_path(image_dir)
  572. for idx, itemImg in enumerate(images):
  573. if itemImg.image_path == "" or itemImg.image_path == None:
  574. data = manager.jsonMessage(
  575. code=1,
  576. msg=f"货号【{goods_art_no}】存在没有拍摄完成的图片,请重拍或删除后重试",
  577. msg_type=msg_type,
  578. )
  579. await manager.send_personal_message(data, websocket)
  580. return
  581. new_file_name = (
  582. str(idx)+"_"+str(itemImg.goods_art_no) + "_" + str(idx) + ".jpg"
  583. )
  584. if not os.path.exists(
  585. image_dir + "/" + os.path.basename(new_file_name)
  586. ):
  587. shutil.copy(itemImg.image_path, image_dir + new_file_name)
  588. dealImage = DealImage(image_dir)
  589. resFlag, path = dealImage.dealMoveImage(
  590. image_dir=image_dir,
  591. callback_func=None,
  592. goods_art_no=goods_art_no,
  593. )
  594. if not resFlag:
  595. # path
  596. data = manager.jsonMessage(
  597. code=1,
  598. msg=f"抠图操作异常,请检查目录是否存在,或者权限不足",
  599. msg_type=msg_type,
  600. )
  601. await manager.send_personal_message(data, websocket)
  602. return
  603. session.close()
  604. # try:
  605. cutOutMode = (
  606. "1"
  607. if settings.getSysConfigs("other_configs", "cutout_mode", "普通抠图")
  608. == "普通抠图"
  609. else "2"
  610. )
  611. config_data = {
  612. "image_dir": limit_path,
  613. "image_order": ("正面,侧视,背面,背侧,组合,组合2,组合3,组合4,组合5"),
  614. "goods_art_no": "",
  615. "goods_art_nos": goods_art_no_arrays,
  616. "is_check_number": False,
  617. "resize_image_view": "后跟",
  618. "cutout_mode": cutOutMode,
  619. "logo_path": "",
  620. "special_goods_art_no_folder_line": "",
  621. "is_use_excel": False, # 是否使用excel
  622. "excel_path": "", # excel路径
  623. "is_check_color_is_all": False,
  624. "cutout_is_pass": True,
  625. "assigned_page_dict": {},
  626. "detail_is_pass": True,
  627. "upload_is_pass": False,
  628. "upload_is_enable": settings.IS_UPLOAD_HLM, # 是否上传到惠利玛商品库,通过config.ini得is_upload开启
  629. "is_filter": False,
  630. "temp_class": {},
  631. "temp_name": "",
  632. "temp_name_list": [],
  633. "target_error_folder": f"{limit_path}/软件-生成详情错误",
  634. "success_handler": [],
  635. }
  636. loop.create_task(
  637. handlerCutOut(
  638. manager=manager,
  639. run_main=run_main,
  640. config_data=config_data,
  641. websocket=websocket,
  642. msg_type=msg_type,
  643. ),
  644. name="handlerCutOut",
  645. )
  646. case _:
  647. data = manager.jsonMessage(code=1, msg="未知消息")
  648. await manager.send_personal_message(data, websocket)
  649. return