message_handler.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  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. # socket消息发送逻辑处理方法
  18. async def handlerSend(
  19. manager: ConnectionManager,
  20. receiveData: str,
  21. websocket: WebSocket,
  22. smart_shooter: SmartShooter,
  23. ):
  24. loop = asyncio.get_event_loop()
  25. receiveData = json.loads(receiveData)
  26. # 处理消息发送逻辑
  27. receiveData = json.loads(receiveData.get("text"))
  28. jsonType = receiveData.get("type")
  29. code = receiveData.get("code")
  30. msg = receiveData.get("msg")
  31. data = receiveData.get("data")
  32. match jsonType:
  33. case "ping":
  34. """发送心跳"""
  35. data = manager.jsonMessage("pong")
  36. await manager.send_personal_message(data, websocket)
  37. case "pong":
  38. """发送心跳"""
  39. pass
  40. case "forward_message":
  41. data = receiveData.get("data")
  42. dictMsg = {"code": code, "msg": msg, "data": data}
  43. await manager.broadcast(dictMsg)
  44. case "connect_mcu":
  45. device_ctrl = DeviceControl(
  46. websocket_manager=manager, smart_shooter=smart_shooter
  47. )
  48. device_ctrl.mcu_exit = False
  49. # if device_ctrl.serial_ins.check_connect():
  50. # print("未连接")
  51. loop.create_task(checkMcuConnection(device_ctrl), name="mcu")
  52. case "connect_bluetooth":
  53. blue_tooth = BlueToothMode(websocket_manager=manager)
  54. blue_tooth.bluetooth_exit = False
  55. # await blue_tooth.main_func()
  56. print("连接蓝牙信息")
  57. loop.create_task(blue_tooth.main_func(), name="blue_tooth")
  58. # loop.close()
  59. case "init_mcu":
  60. device_ctrl = DeviceControl(
  61. websocket_manager=manager, smart_shooter=smart_shooter
  62. )
  63. # 是否强制初始化
  64. is_force_init = data.get("value", False)
  65. loop.create_task(device_ctrl.initDevice(is_force_init), name="init_mcu")
  66. case "control_mcu":
  67. device_name = data.get("device_name")
  68. value = data.get("value")
  69. if (device_name == "" or device_name == None) or (
  70. value == "" or value == None
  71. ):
  72. data = manager.jsonMessage(code=1, msg="参数错误", msg_type="mcu")
  73. await manager.send_personal_message(data, websocket)
  74. return
  75. device_ctrl = DeviceControl(
  76. websocket_manager=manager, smart_shooter=smart_shooter
  77. )
  78. await device_ctrl.controlDevice(device_name, value)
  79. case "stop_action":
  80. device_ctrl = DeviceControl(
  81. websocket_manager=manager, smart_shooter=smart_shooter
  82. )
  83. if device_ctrl.is_runn_action == True:
  84. print("动作执行中,停止")
  85. device_ctrl.is_stop_action = True
  86. else:
  87. print("动作没有执行,略过")
  88. case "run_mcu":
  89. msg_type = "run_mcu"
  90. action_info = data.get("action", "执行左脚程序")
  91. goods_art_no = data.get("goods_art_no", None)
  92. if goods_art_no == None or goods_art_no == "":
  93. # 判断货号是否存在
  94. data = manager.jsonMessage(
  95. code=1, msg="goods_art_no不能为空", msg_type=msg_type
  96. )
  97. await manager.send_personal_message(data, websocket)
  98. return
  99. session = SqlQuery()
  100. sys_configs = CRUD(SysConfigs)
  101. action_configs = sys_configs.read(
  102. session, conditions={"key": "action_configs"}
  103. )
  104. action_configs_json = json.loads(action_configs.value)
  105. action_flag = "left"
  106. if "右" in action_info:
  107. action_flag = "right"
  108. tab_id = action_configs_json.get(action_flag)
  109. photoRecord = CRUD(PhotoRecord)
  110. goods_art_record = photoRecord.read(
  111. session, conditions={"goods_art_no": goods_art_no}
  112. )
  113. if goods_art_record != None:
  114. data = manager.jsonMessage(
  115. code=1,
  116. msg=f"货号[{goods_art_no}]已存在,请勿重复拍摄~",
  117. msg_type=msg_type,
  118. )
  119. await manager.send_personal_message(data, websocket)
  120. return
  121. crud = CRUD(DeviceConfig)
  122. condtions = {"tab_id": tab_id}
  123. all_devices = crud.read_all(
  124. session, conditions=condtions, order_by="action_index", ascending=True
  125. )
  126. if len(all_devices) == 0:
  127. # 判断是否有可用配置
  128. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  129. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  130. return
  131. action_list = [dict(device.__dict__) for device in all_devices]
  132. print("handl send smart_shooter", smart_shooter)
  133. device_ctrl = DeviceControl(
  134. websocket_manager=manager, smart_shooter=smart_shooter
  135. )
  136. loop.create_task(
  137. device_ctrl.run_mcu_config(
  138. action_list, goods_art_no, action_info, smart_shooter
  139. ),
  140. name="run_mcu_config",
  141. )
  142. case "run_mcu_single":
  143. device_ctrl = DeviceControl(
  144. websocket_manager=manager, smart_shooter=smart_shooter
  145. )
  146. loop.create_task(
  147. device_ctrl.run_mcu_config_single(
  148. data, None, "run_mcu_single", -1, smart_shooter
  149. ),
  150. name="run_mcu_single",
  151. )
  152. case "handler_take_picture":
  153. device_ctrl = DeviceControl(
  154. websocket_manager=manager, smart_shooter=smart_shooter
  155. )
  156. await device_ctrl.controlDevice("laser_position", 0)
  157. blue_tooth = BlueToothMode(
  158. websocket_manager=manager, smart_shooter=smart_shooter
  159. )
  160. loop.create_task(
  161. blue_tooth.remote_control_v2.handlerTakePhoto(smart_shooter),
  162. name="run_mcu_config",
  163. )
  164. await asyncio.sleep(2.5)
  165. await device_ctrl.controlDevice("laser_position", 1)
  166. case "re_take_picture": # 重拍
  167. msg_type = "re_take_picture"
  168. record_id = data.get("record_id")
  169. session = SqlQuery()
  170. photoRecord = CRUD(PhotoRecord)
  171. goods_art_record = photoRecord.read(session, conditions={"id": record_id})
  172. if goods_art_record == None:
  173. data = manager.jsonMessage(
  174. code=1,
  175. msg=f"记录不存在,请核实后重新操作~",
  176. msg_type=msg_type,
  177. )
  178. await manager.send_personal_message(data, websocket)
  179. return
  180. action_id = goods_art_record.action_id
  181. goods_art_no = goods_art_record.goods_art_no
  182. image_index = goods_art_record.image_index
  183. crud = CRUD(DeviceConfig)
  184. condtions = {"id": action_id}
  185. device_action = crud.read(session, conditions=condtions)
  186. result_dict = dict(device_action.__dict__)
  187. print("device_action打印输出====>>>", result_dict)
  188. if device_action == None:
  189. # 判断是否有可用配置
  190. data = manager.jsonMessage(code=1, msg="当前没有可用配置")
  191. await manager.send_personal_message(data, websocket, msg_type=msg_type)
  192. return
  193. # 清除图片记录,执行重拍
  194. reset_data = {"image_path": None}
  195. photoRecord.update(session, record_id, **reset_data)
  196. device_ctrl = DeviceControl(
  197. websocket_manager=manager, smart_shooter=smart_shooter
  198. )
  199. loop.create_task(
  200. device_ctrl.run_mcu_config_single(
  201. result_dict,
  202. goods_art_no,
  203. msg_type=msg_type,
  204. image_index=image_index,
  205. smart_shooter=smart_shooter,
  206. action_id=record_id,
  207. ),
  208. name="run_mcu_config_single",
  209. )
  210. case "get_deviation":
  211. device_ctrl = DeviceControl(
  212. websocket_manager=manager, smart_shooter=smart_shooter
  213. )
  214. loop.create_task(
  215. device_ctrl.getDeviationInfo(),
  216. name="get_deviation",
  217. )
  218. case "set_deviation":
  219. device_ctrl = DeviceControl(
  220. websocket_manager=manager, smart_shooter=smart_shooter
  221. )
  222. value = data.get("value", None)
  223. action_name = data.get("action_name", None)
  224. loop.create_task(
  225. device_ctrl.set_deviation_cmd(value, action_name, "set"),
  226. name="set_deviation",
  227. )
  228. case "move_deviation":
  229. device_ctrl = DeviceControl(
  230. websocket_manager=manager, smart_shooter=smart_shooter
  231. )
  232. value = data.get("value", None)
  233. action_name = data.get("action_name", None)
  234. loop.create_task(
  235. device_ctrl.set_deviation_cmd(value, action_name, "move"),
  236. name="move_deviation",
  237. )
  238. case "get_mcu_other_info":
  239. device_ctrl = DeviceControl(
  240. websocket_manager=manager, smart_shooter=smart_shooter
  241. )
  242. loop.create_task(
  243. device_ctrl.getMcuOtherInfo(),
  244. name="mcu_other_set_get",
  245. )
  246. case "set_mcu_other_info":
  247. device_ctrl = DeviceControl(
  248. websocket_manager=manager, smart_shooter=smart_shooter
  249. )
  250. loop.create_task(
  251. device_ctrl.setMcuOtherInfo(data),
  252. name="setMcuOtherInfo",
  253. )
  254. case "send_command":
  255. device_ctrl = DeviceControl(
  256. websocket_manager=manager, smart_shooter=smart_shooter
  257. )
  258. loop.create_task(
  259. device_ctrl.sendCommand(data.get("command", None)),
  260. name="sendCommand",
  261. )
  262. case "smart_shooter_getinfo":
  263. """
  264. 获取相机信息,是否连接
  265. """
  266. loop.create_task(
  267. smart_shooter.GetCameraInfo(msg_type="smart_shooter_getinfo"),
  268. name="smart_shooter_getinfo",
  269. )
  270. case "smart_shooter_enable_preview":
  271. """
  272. 启动相机或关闭实时预览
  273. """
  274. value = data.get("value", True)
  275. loop.create_task(
  276. smart_shooter.EnableCameraPreview(
  277. enable_status=value, msg_type="smart_shooter_enable_preview"
  278. ),
  279. name="smart_shooter_enable_preview",
  280. )
  281. case "smart_shooter_get_camera_property":
  282. """
  283. 启动相机或关闭实时预览
  284. """
  285. msg_type = "smart_shooter_get_camera_property"
  286. code = 0
  287. status, info = await smart_shooter.GetCameraProperty()
  288. code = 1 if status == False else 0
  289. msg = info if status == False else "操作成功"
  290. data = info if status == True else {}
  291. data = manager.jsonMessage(
  292. code=code,
  293. msg=msg,
  294. msg_type=msg_type,
  295. data=data,
  296. )
  297. await manager.send_personal_message(data, websocket)
  298. case "smart_shooter_photo_take":
  299. """
  300. 获取相机信息,是否连接
  301. """
  302. device_ctrl = DeviceControl(
  303. websocket_manager=manager, smart_shooter=smart_shooter
  304. )
  305. await device_ctrl.controlDevice("laser_position", 0)
  306. # 兼容主图测试
  307. id = data.get("id", 0)
  308. goods_art_no = data.get("goods_art_no", "")
  309. is_af = True
  310. loop.create_task(
  311. smart_shooter.CameraShooter(
  312. msg_type="smart_shooter_photo_take",
  313. id=id,
  314. goods_art_no=goods_art_no,
  315. is_af=is_af,
  316. ),
  317. name="smart_shooter_photo_take",
  318. )
  319. await asyncio.sleep(2.5)
  320. await device_ctrl.controlDevice("laser_position", 1)
  321. case "digicam_take_picture":
  322. msg_type = "re_take_picture"
  323. id = data.get("id", 0)
  324. goods_art_no = data.get("goods_art_no", "")
  325. session = SqlQuery()
  326. photoRecord = CRUD(PhotoRecord)
  327. goods_art_record = photoRecord.read(session, conditions={"id": id})
  328. if goods_art_record == None:
  329. data = manager.jsonMessage(
  330. code=1,
  331. msg=f"记录不存在,请核实后重新操作~",
  332. msg_type=msg_type,
  333. )
  334. await manager.send_personal_message(data, websocket)
  335. return
  336. reset_data = {"image_path": None}
  337. photoRecord.update(session, id, **reset_data)
  338. device_ctrl = DeviceControl(websocket_manager=manager)
  339. loop.create_task(
  340. device_ctrl.only_take_photo(
  341. goods_art_no=goods_art_no,
  342. image_index=goods_art_record.image_index,
  343. record_id=id,
  344. ),
  345. name="sendCommand",
  346. )
  347. case "segment_progress":
  348. msg_type = "segment_progress"
  349. obj = None
  350. token = data.get("token", "")
  351. token = "Bearer " + token
  352. uuid = data.get("uuid", "")
  353. run_main = RunMain(obj, token, uuid)
  354. goods_art_no_arrays = data.get("goods_art_no", [])
  355. limit_path = "output/{}".format(
  356. time.strftime("%Y-%m-%d", time.localtime(time.time()))
  357. )
  358. check_path(limit_path)
  359. # 该数组表示是否需要后面的移动文件夹操作,减少重复抠图,提升抠图时间和速度
  360. move_folder_array = check_move_goods_art_no_folder(
  361. "output", goods_art_no_arrays, limit_path
  362. )
  363. for goods_art_no in goods_art_no_arrays:
  364. session = SqlQuery()
  365. pr = CRUD(PhotoRecord)
  366. images = pr.read_all(session, conditions={"goods_art_no": goods_art_no})
  367. if not images:
  368. data = manager.jsonMessage(
  369. code=1,
  370. msg=f"没有可用货号数据",
  371. msg_type=msg_type,
  372. )
  373. await manager.send_personal_message(data, websocket)
  374. return
  375. if move_folder_array.get(goods_art_no) == None:
  376. image_dir = "{}/data/".format(os.getcwd()).replace("\\", "/")
  377. check_path(image_dir)
  378. for idx, itemImg in enumerate(images):
  379. if itemImg.image_path == "" or itemImg.image_path == None:
  380. data = manager.jsonMessage(
  381. code=1,
  382. msg=f"货号【{goods_art_no}】存在没有拍摄完成的图片,请重拍或删除后重试",
  383. msg_type=msg_type,
  384. )
  385. await manager.send_personal_message(data, websocket)
  386. return
  387. new_file_name = (
  388. str(itemImg.goods_art_no) + "_" + str(idx) + ".jpg"
  389. )
  390. if not os.path.exists(
  391. image_dir + "/" + os.path.basename(new_file_name)
  392. ):
  393. shutil.copy(itemImg.image_path, image_dir + new_file_name)
  394. dealImage = DealImage(image_dir)
  395. resFlag, path = dealImage.dealMoveImage(
  396. image_dir=image_dir,
  397. callback_func=None,
  398. goods_art_no=goods_art_no,
  399. )
  400. if not resFlag:
  401. # path
  402. data = manager.jsonMessage(
  403. code=1,
  404. msg=f"抠图操作异常,请检查目录是否存在,或者权限不足",
  405. msg_type=msg_type,
  406. )
  407. await manager.send_personal_message(data, websocket)
  408. return
  409. # try:
  410. cutOutMode = (
  411. "1"
  412. if settings.getSysConfigs("other_configs", "cutout_mode", "普通抠图")
  413. == "普通抠图"
  414. else "2"
  415. )
  416. config_data = {
  417. "image_dir": limit_path,
  418. "image_order": ("俯视,侧视,后跟,鞋底,内里"),
  419. "goods_art_no": "",
  420. "goods_art_nos": goods_art_no_arrays,
  421. "is_check_number": False,
  422. "resize_image_view": "后跟",
  423. "cutout_mode": cutOutMode,
  424. "logo_path": "",
  425. "special_goods_art_no_folder_line": "",
  426. "is_use_excel": False, # 是否使用excel
  427. "excel_path": "", # excel路径
  428. "is_check_color_is_all": False,
  429. "cutout_is_pass": True,
  430. "assigned_page_dict": {},
  431. "detail_is_pass": True,
  432. "upload_is_pass": False,
  433. "upload_is_enable": settings.IS_UPLOAD_HLM, # 是否上传到惠利玛商品库,通过config.ini得is_upload开启
  434. "is_filter": False,
  435. "temp_class": {},
  436. "temp_name": "",
  437. "temp_name_list": [],
  438. "target_error_folder": f"{limit_path}/软件-生成详情错误",
  439. "success_handler": [],
  440. }
  441. return_data = run_main.check_before_cutout(config_data)
  442. loop = asyncio.get_event_loop()
  443. try:
  444. await run_main.check_for_cutout_image_first_call_back(return_data)
  445. except UnicornException as e:
  446. data = manager.jsonMessage(
  447. code=1,
  448. msg=e.msg,
  449. msg_type=msg_type,
  450. )
  451. await manager.send_personal_message(data, websocket)
  452. return
  453. except Exception as e:
  454. data = manager.jsonMessage(
  455. code=1,
  456. msg="抠图异常,请稍后重试~",
  457. msg_type=msg_type,
  458. )
  459. await manager.send_personal_message(data, websocket)
  460. case _:
  461. data = manager.jsonMessage(code=1, msg="未知消息")
  462. await manager.send_personal_message(data, websocket)
  463. return