usePhotography.ts 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881
  1. import { ref, onMounted, onBeforeUnmount, watchEffect, computed } from 'vue'
  2. import icpList from '@/utils/ipc'
  3. import client from "@/stores/modules/client";
  4. import socket from "@/stores/modules/socket";
  5. import { ElMessage, ElMessageBox } from 'element-plus'
  6. import { getFilePath, getRouterUrl } from '@/utils/appfun'
  7. import { useRouter, useRoute } from "vue-router";
  8. import checkInfo from "@/stores/modules/check";
  9. import generate from '@/utils/menus/generate'
  10. import { clickLog, setLogInfo } from '@/utils/log'
  11. import { useUuidStore } from '@/stores/modules/uuid'
  12. import useUserInfo from "@/stores/modules/user";
  13. import configInfo from '@/stores/modules/config';
  14. import tokenInfo from "@/stores/modules/token";
  15. export default function usePhotography() {
  16. const loading = ref(false)
  17. const runLoading = ref(false)
  18. const takePictureLoading = ref(false)
  19. // pagination
  20. const pageSize = ref(1)
  21. const currentPage = ref(1)
  22. const totalPages = ref(1)
  23. const goodsList = ref([])
  24. const goods_art_no_tpl = ref('')
  25. const goods_art_no = ref('')
  26. const runAction = ref({
  27. "action": "",
  28. "goods_art_no": ""
  29. })
  30. const lastPhoto = ref({})
  31. const showlastPhoto = ref(false)
  32. const isDelGoodsGetList = ref(false)
  33. const reNosObj = ref({
  34. goods_art_no: null,
  35. action: null,
  36. })
  37. const goodsArtNo = ref()
  38. let smartShooterTimeout: ReturnType<typeof setTimeout> | null = null
  39. // 初始化 WebSocket 状态管理
  40. const socketStore = socket()
  41. const uuidStore = useUuidStore();
  42. const clientStore = client();
  43. const Router = useRouter()
  44. const route = useRoute();
  45. const useUserInfoStore = useUserInfo();
  46. const configInfoStore = configInfo();
  47. const tokenInfoStore = tokenInfo();
  48. const checkInfoStore = checkInfo()
  49. // 抠图请求去重与延迟队列(key: goods_art_no, value: timeoutId)
  50. const segmentQueue = new Map<string, ReturnType<typeof setTimeout>>()
  51. function isGoodsStillInList(goodsArtNo: string): boolean {
  52. return goodsList.value?.some((g: any) => g.goods_art_no === goodsArtNo) || false
  53. }
  54. function scheduleSegment(goodsArtNo: string) {
  55. if (!goodsArtNo) return
  56. // 若已存在,则重置计时(重新插入)
  57. if (segmentQueue.has(goodsArtNo)) {
  58. const t = segmentQueue.get(goodsArtNo)
  59. if (t) clearTimeout(t)
  60. segmentQueue.delete(goodsArtNo)
  61. }
  62. const timeoutId = setTimeout(async () => {
  63. segmentQueue.delete(goodsArtNo)
  64. if (!isGoodsStillInList(goodsArtNo)) return
  65. try {
  66. await socketStore.connectSocket();
  67. socketStore.sendMessage({
  68. type: 'segment_progress',
  69. data: {
  70. token: tokenInfoStore.getToken,
  71. uuid: uuidStore?.getUuid || '',
  72. goods_art_no: [goodsArtNo],
  73. }
  74. })
  75. } catch (e) {
  76. // 忽略发送异常,避免打断主流程
  77. }
  78. }, 20000)
  79. segmentQueue.set(goodsArtNo, timeoutId)
  80. }
  81. /**
  82. * 保存货号模板到货号变量中。
  83. */
  84. function saveGoodsArtNo() {
  85. if (goods_art_no_tpl.value) {
  86. goods_art_no.value = goods_art_no_tpl.value
  87. ElMessage.success('商品货号' + goods_art_no.value + '获取成功,请在遥控器上按下左或右脚按键,启动拍摄')
  88. }
  89. }
  90. /**
  91. * 获取拍照记录。
  92. * @param params - 可选参数,用于分页或其他筛选条件。
  93. */
  94. async function getPhotoRecords(params?: { page?: number; size?: number } ) {
  95. if (loading.value) return;
  96. loading.value = true;
  97. const page = params?.page ?? currentPage.value ?? 1
  98. const size = params?.size ?? pageSize.value ?? 5
  99. console.log('params' , {
  100. ...params,
  101. page,
  102. size,
  103. })
  104. clientStore.ipc.send(icpList.takePhoto.getPhotoRecords, {
  105. ...params,
  106. page,
  107. size,
  108. });
  109. clientStore.ipc.on(icpList.takePhoto.getPhotoRecords, (event, result) => {
  110. loading.value = false;
  111. if (result.code === 0) {
  112. clientStore.ipc.removeAllListeners(icpList.takePhoto.getPhotoRecords);
  113. //console.log('getPhotoRecords print_time:' + new Date().toLocaleString())
  114. // console.log('getPhotoRecords print_time:' + JSON.stringify(result.data.list))
  115. console.log(result.data)
  116. goodsList.value = result.data.list
  117. // update pagination info if provided by API
  118. if (result.data) {
  119. currentPage.value = result.data.current_page || page
  120. totalPages.value = result.data.total_pages || 1
  121. }
  122. if (isDelGoodsGetList.value) {
  123. isDelGoodsGetList.value = false;
  124. return;
  125. }
  126. getLastPhotoRecord()
  127. } else if (result.msg) {
  128. ElMessage.error(result.msg)
  129. }
  130. });
  131. }
  132. /**
  133. * 执行拍照操作。
  134. * @param data - 包含拍摄所需的数据对象。
  135. */
  136. async function runGoods(data) {
  137. if (runLoading.value || takePictureLoading.value) {
  138. ElMessage.error('拍摄程序正在运行,请稍候')
  139. return
  140. }
  141. await socketStore.connectSocket();
  142. socketStore.sendMessage({
  143. type: 'run_mcu',
  144. data,
  145. })
  146. runLoading.value = true;
  147. runAction.value.action = data.action
  148. runAction.value.goods_art_no = data.goods_art_no
  149. // goods_art_no.value = ''
  150. goods_art_no_tpl.value = ''
  151. reNosObj.value.goods_art_no = null;
  152. reNosObj.value.action = null;
  153. clientStore.ipc.on(icpList.socket.message + '_run_mcu', (event, result) => {
  154. clientStore.ipc.removeAllListeners(icpList.socket.message + '_run_mcu');
  155. console.log('_run_mcu');
  156. console.log(result);
  157. if (result.code !== 0 && result.msg) {
  158. ElMessage.error(result.msg)
  159. runLoading.value = false
  160. return;
  161. } else {
  162. ElMessage.success('开始拍摄,请稍后')
  163. }
  164. })
  165. }
  166. /**
  167. * 格式化时间字符串。
  168. * @param time - 原始时间字符串。
  169. * @returns 格式化后的时间字符串,若输入为空则返回 null。
  170. */
  171. const getTime = function (time) {
  172. if (!time) return null
  173. return time.replace('T', ' ').substr(5, 11)
  174. }
  175. /**
  176. * 删除所有商品货号的历史记录。
  177. */
  178. async function delAll() {
  179. let params = goodsList.value.map(item => item.goods_art_no)
  180. try {
  181. await ElMessageBox.confirm('确定要删除当下的历史记录吗?', '提示', {
  182. confirmButtonText: '确定',
  183. cancelButtonText: '取消',
  184. })
  185. await clickLog({ describe: { action: '点击确认一键删除', goods_art_nos: params } }, route)
  186. del({ goods_art_nos: params })
  187. } catch (e) {
  188. await clickLog({ describe: { action: '点击取消一键删除' } }, route)
  189. }
  190. }
  191. /**
  192. * 删除指定的商品货号。
  193. * @param params - 包含需要删除的货号列表的对象。
  194. */
  195. const delGoods = async function (params) {
  196. try {
  197. await ElMessageBox.confirm('确定要删除货号:' + params.goods_art_nos[0] + '的拍摄数据吗?', '提示', {
  198. confirmButtonText: '确定',
  199. cancelButtonText: '取消',
  200. })
  201. await clickLog({ describe: { action: '点击确认删除货号', goods_art_no: params.goods_art_nos?.[0] } }, route)
  202. del(params)
  203. } catch (e) {
  204. await clickLog({ describe: { action: '点击取消删除货号', goods_art_no: params.goods_art_nos?.[0] } }, route)
  205. }
  206. }
  207. /**
  208. * 删除指定的商品货号。
  209. * @param params - 包含需要删除的货号列表的对象。
  210. */
  211. const del = async function (params) {
  212. console.log(icpList.takePhoto.delectGoodsArts, params);
  213. clientStore.ipc.removeAllListeners(icpList.takePhoto.delectGoodsArts);
  214. clientStore.ipc.send(icpList.takePhoto.delectGoodsArts, params);
  215. clientStore.ipc.on(icpList.takePhoto.delectGoodsArts, (event, result) => {
  216. clientStore.ipc.removeAllListeners(icpList.takePhoto.delectGoodsArts);
  217. console.log("icpList.takePhoto.delectGoodsArts", params);
  218. if (result.code === 0) {
  219. isDelGoodsGetList.value = true
  220. ElMessage.info('货号删除成功')
  221. getPhotoRecords()
  222. if (reNosObj.value.goods_art_no) {
  223. runGoods(
  224. {
  225. "action": reNosObj.value.action,
  226. "goods_art_no": reNosObj.value.goods_art_no
  227. })
  228. }
  229. } else if (result.msg) {
  230. ElMessage.error(result.msg)
  231. }
  232. });
  233. }
  234. //单个重拍
  235. const reTakePicture = async (img) => {
  236. if (!img.id) return;
  237. if (img.image_path) {
  238. try {
  239. await ElMessageBox.confirm('此操作会先删除此数据,需要继续吗?', '提示', {
  240. confirmButtonText: '确定',
  241. cancelButtonText: '取消',
  242. })
  243. await clickLog({ describe: { action: '点击确认单张重拍', goods_art_no: img.goods_art_no, action_name: img.action_name } }, route)
  244. } catch (e) {
  245. await clickLog({ describe: { action: '点击取消单张重拍', goods_art_no: img.goods_art_no, action_name: img.action_name } }, route)
  246. return
  247. }
  248. }
  249. runLoading.value = true;
  250. reNosObj.value.goods_art_no = img.goods_art_no
  251. reNosObj.value.action = 're_take_picture'
  252. let params = {
  253. id: img.action_id
  254. }
  255. clientStore.ipc.removeAllListeners(icpList.setting.getDeviceConfigDetail);
  256. clientStore.ipc.send(icpList.setting.getDeviceConfigDetail, params);
  257. clientStore.ipc.on(icpList.setting.getDeviceConfigDetail, (event, result) => {
  258. console.log('getDeviceConfigDetail')
  259. console.log(result)
  260. if (result.code == 0 && result.data) {
  261. clientStore.ipc.removeAllListeners(icpList.setting.getDeviceConfigDetail);
  262. this_run_mcu_single(result.data)
  263. } else if (result.msg) {
  264. runLoading.value = false;
  265. reNosObj.value.goods_art_no = ''
  266. reNosObj.value.action = ''
  267. ElMessage.error(result.msg)
  268. }
  269. });
  270. function this_run_mcu_single(data) {
  271. clientStore.ipc.removeAllListeners(icpList.socket.message + '_run_mcu_single');
  272. socketStore.sendMessage({
  273. type: 'run_mcu_single',
  274. data: {
  275. camera_height: Number(data.camera_height),
  276. camera_angle: Number(data.camera_angle),
  277. led_switch: data.led_switch,
  278. id: 0,
  279. mode_type: data.mode_type,
  280. turntable_position: Number(data.turntable_position),
  281. action_name: data.action_name || '测试',
  282. turntable_angle: Number(data.turntable_angle),
  283. shoe_upturn: Number(data.shoe_upturn),
  284. action_index: 1,
  285. number_focus: 0,
  286. take_picture: false,
  287. pre_delay: 0,
  288. after_delay: 0,
  289. }
  290. });
  291. clientStore.ipc.on(icpList.socket.message + '_run_mcu_single', async (event, result) => {
  292. console.log('_run_mcu_single_row')
  293. clientStore.ipc.removeAllListeners(icpList.socket.message + '_run_mcu_single');
  294. this_re_take_picture()
  295. })
  296. }
  297. async function this_re_take_picture() {
  298. await ElMessageBox.alert('已复位到该视图下,请把鞋子摆放完毕之后,点击按钮开始重拍', '提示', {
  299. confirmButtonText: "开始重拍",
  300. showClose: false,
  301. closeOnClickModal: false,
  302. closeOnPressEscape: false
  303. })
  304. await clickLog({ describe: { action: '点击开始重拍', goods_art_no: img.goods_art_no } }, route)
  305. socketStore.sendMessage({
  306. type: 'smart_shooter_photo_take',
  307. "data": { "id": img.id, "goods_art_no": img.goods_art_no },
  308. })
  309. }
  310. }
  311. const resetStatus = () => {
  312. runLoading.value = false;
  313. reNosObj.value.goods_art_no = ''
  314. reNosObj.value.action = ''
  315. runAction.value.goods_art_no = '';
  316. runAction.value.action = '';
  317. }
  318. //货号重拍
  319. const reTakePictureNos = async (goods_art_no, item) => {
  320. try {
  321. await ElMessageBox.confirm('此操作会先删除删除货号:' + goods_art_no + '的拍摄数据吗,需要继续吗?', '提示', {
  322. confirmButtonText: '确定',
  323. cancelButtonText: '取消',
  324. })
  325. await clickLog({ describe: { action: '点击确认重拍货号', goods_art_no } }, route)
  326. } catch (e) {
  327. await clickLog({ describe: { action: '点击取消重拍货号', goods_art_no } }, route)
  328. return
  329. }
  330. reNosObj.value.goods_art_no = goods_art_no
  331. reNosObj.value.action = '执行左脚程序'
  332. console.log(item);
  333. if (item.items && typeof item.items === 'object' && item.items[0].PhotoRecord.image_deal_mode) {
  334. reNosObj.value.action = '执行右脚程序'
  335. }
  336. del({ goods_art_nos: [goods_art_no] })
  337. }
  338. /**
  339. * 检查是否可以进入下一步操作。
  340. */
  341. const next = async function () {
  342. if (runLoading.value) {
  343. ElMessage.error('正在拍摄中,请稍候')
  344. return;
  345. }
  346. if (goodsList.length) {
  347. ElMessage.error('请先拍摄商品。')
  348. return;
  349. }
  350. }
  351. const oneClickStop = () => {
  352. if (!(runLoading.value || takePictureLoading.value)) {
  353. ElMessage.error('拍摄程序已结束,不需要单独停止!')
  354. return
  355. } else {
  356. socketStore.sendMessage({
  357. type: 'stop_action',
  358. })
  359. }
  360. }
  361. /**
  362. * 打开最近一张拍摄图
  363. */
  364. const getLastPhotoRecord = async () => {
  365. return;
  366. if (goodsList.value && goodsList.value.length === 0) return;
  367. clientStore.ipc.removeAllListeners(icpList.takePhoto.getLastPhotoRecord);
  368. clientStore.ipc.send(icpList.takePhoto.getLastPhotoRecord,);
  369. clientStore.ipc.on(icpList.takePhoto.getLastPhotoRecord, (event, result) => {
  370. console.log('getLastPhotoRecord');
  371. console.log(result.data?.goods_art_no);
  372. clientStore.ipc.removeAllListeners(icpList.takePhoto.getLastPhotoRecord);
  373. if (result.code === 0) {
  374. if (lastPhoto.value?.photo_file_name) {
  375. // if( lastPhoto.value?.image_path == result.data?.image_path) return;
  376. if (runAction.value.goods_art_no === result.data?.goods_art_no) {
  377. showlastPhoto.value = true
  378. }
  379. }
  380. lastPhoto.value = result.data
  381. } else if (result.msg) {
  382. ElMessage.error(result.msg)
  383. }
  384. });
  385. }
  386. /**
  387. * 打开主图详情页面。
  388. */
  389. function openPhotographyDetail() {
  390. // 埋点:开始生成
  391. clickLog({ describe: { action: '开始生成', goods_count: goodsList.value.length, goods_art_nos: goodsList.value.map(item => item.goods_art_no) } }, route);
  392. if (runLoading.value || takePictureLoading.value) {
  393. ElMessage.error('正在拍摄中,请稍候')
  394. return;
  395. }
  396. const { href } = Router.resolve({
  397. name: 'PhotographyDetail',
  398. query: {
  399. goods_art_nos: goodsList.value.map(item => item.goods_art_no),
  400. }
  401. })
  402. clientStore.ipc.removeAllListeners(icpList.utils.openMain);
  403. let params = {
  404. title: '主图与详情生成',
  405. width: 3840,
  406. height: 2160,
  407. frame: true,
  408. id: "PhotographyDetail",
  409. url: getRouterUrl(href)
  410. }
  411. clientStore.ipc.send(icpList.utils.openMain, params);
  412. }
  413. /*高级生成*/
  414. const onGenerateCLick = (menu, item) => {
  415. if (menu.name === '历史记录') {
  416. menu.click()
  417. return
  418. }
  419. const firstWithImagePath = item.items.find(
  420. (image) => image.PhotoRecord.image_path
  421. );
  422. if (firstWithImagePath) {
  423. menu.click({
  424. query: {
  425. image_path: firstWithImagePath.PhotoRecord.image_path
  426. }
  427. })
  428. } else {
  429. menu.click()
  430. }
  431. }
  432. // 打开输出目录:appConfig.appPath + '/build/extraResources/py/output'
  433. const openOutputDir = () => {
  434. try {
  435. const appPath = configInfoStore?.appConfig?.appPath || ''
  436. if (!appPath) {
  437. ElMessage.error('未获取到应用目录 appPath')
  438. return
  439. }
  440. const fullPath = `${appPath}\\output`
  441. clientStore.ipc.removeAllListeners(icpList.utils.shellFun);
  442. clientStore.ipc.send(icpList.utils.shellFun, {
  443. action: 'openMkPath',
  444. params: fullPath.replace(/\//g, '\\')
  445. });
  446. } catch (e) {
  447. console.error(e)
  448. ElMessage.error('打开目录失败')
  449. }
  450. }
  451. const menu = computed(() => {
  452. if (configInfoStore.appModel === 2) {
  453. return [
  454. {
  455. type: 'setting'
  456. },
  457. {
  458. name: '切换模式',
  459. click() {
  460. configInfoStore.updateAppModel(1)
  461. Router.push({
  462. name: 'PhotographyCheck'
  463. })
  464. }
  465. },
  466. {
  467. name: '生成图目录',
  468. click() {
  469. openOutputDir()
  470. }
  471. },
  472. {
  473. ...generate
  474. }
  475. ]
  476. }
  477. if (useUserInfoStore.userInfo.brand_company_code === '1300' || configInfoStore.appConfig.debug) {
  478. return [
  479. {
  480. type: 'setting'
  481. },
  482. {
  483. type: 'developer'
  484. },
  485. {
  486. name: '生成图目录',
  487. click() {
  488. openOutputDir()
  489. }
  490. },
  491. {
  492. ...generate,
  493. }
  494. ]
  495. }
  496. return [
  497. {
  498. type: 'setting'
  499. },
  500. {
  501. name: '生成图目录',
  502. click() {
  503. openOutputDir()
  504. }
  505. },
  506. {
  507. ...generate
  508. }
  509. ]
  510. })
  511. const onRemoteControl = (type) => {
  512. if (type == 'take_picture') {
  513. // 埋点:手动拍照
  514. clickLog({ describe: { action: '点击遥控器拍照按钮' } }, route);
  515. if (runLoading.value || takePictureLoading.value) {
  516. ElMessage.error('拍摄程序正在运行,请稍候')
  517. return
  518. }
  519. ElMessage.success('正在拍摄中,请稍候')
  520. socketStore.sendMessage({
  521. type: 'handler_take_picture',
  522. })
  523. return;
  524. }
  525. if (!goods_art_no.value) {
  526. ElMessage.error('请在左侧第一步中,先扫描货号或者手动输入货号!')
  527. goodsArtNo.value?.focus() // 聚焦输入框
  528. return;
  529. }
  530. let action = '执行左脚程序'
  531. if (type === 'right') action = '执行右脚程序'
  532. // 埋点:遥控器启动拍摄
  533. clickLog({ describe: { action: `点击遥控器${type === 'left' ? '左脚' : '右脚'}按钮`, goods_art_no: goods_art_no.value } }, route);
  534. runGoods({
  535. "action": action,
  536. "goods_art_no": goods_art_no.value,
  537. })
  538. }
  539. // 初始化事件监听
  540. const initEventListeners = () => {
  541. // 监听蓝牙扫描事件
  542. clientStore.ipc.on(icpList.socket.message + '_blue_tooth_scan', (event, result) => {
  543. console.log('_blue_tooth_scan')
  544. if (result.code === 0 && result.data?.data) {
  545. console.log(goods_art_no.value);
  546. if (!goods_art_no.value) {
  547. ElMessage.error('请在左侧第一步中,先扫描货号或者手动输入货号!')
  548. goodsArtNo.value?.focus() // 聚焦输入框
  549. return;
  550. }
  551. runGoods({
  552. ...result.data?.data,
  553. goods_art_no: goods_art_no.value
  554. })
  555. }
  556. });
  557. // 监听图片处理完成事件
  558. clientStore.ipc.on(icpList.socket.message + '_image_process', (event, result) => {
  559. console.log('_image_process')
  560. console.log(result)
  561. getPhotoRecords()
  562. // 延迟两秒再获取一遍数据
  563. setTimeout(() => {
  564. getPhotoRecords()
  565. }, 3000)
  566. })
  567. // 监听拍照完成事件
  568. clientStore.ipc.on(icpList.socket.message + '_photo_take', (event, result) => {
  569. console.log('_photo_take')
  570. console.log(result)
  571. if (result.status === 2 && result.msg.includes('执行完成')) {
  572. getPhotoRecords()
  573. // 延迟两秒再获取一遍数据
  574. setTimeout(() => {
  575. getPhotoRecords()
  576. }, 3000)
  577. takePictureLoading.value = false;
  578. return;
  579. }
  580. if (result.code !== 0 && result.msg) {
  581. ElMessage.error(result.msg)
  582. takePictureLoading.value = false;
  583. }
  584. })
  585. // 监听一键停止
  586. clientStore.ipc.on(icpList.socket.message + '_stop_action', (event, result) => {
  587. console.log('_stop_action')
  588. console.log(result)
  589. oneClickStop()
  590. })
  591. // 监听一键停止结束
  592. clientStore.ipc.on(icpList.socket.message + '_run_mcu_stop', (event, result) => {
  593. console.log('_run_mcu_stop')
  594. resetStatus()
  595. })
  596. // 监听拍照完成后的最终状态事件
  597. clientStore.ipc.on(icpList.socket.message + '_photo_take_finish', (event, result) => {
  598. console.log('_photo_take_finish')
  599. console.log(result)
  600. if (result.code === 0) {
  601. setLogInfo(route, { action: '全部拍摄完成', goods_art_no: runAction.value.goods_art_no });
  602. // 全部拍摄完成后,触发抠图队列
  603. if (runAction.value.goods_art_no) {
  604. scheduleSegment(runAction.value.goods_art_no)
  605. }
  606. runLoading.value = false;
  607. runAction.value.goods_art_no = '';
  608. runAction.value.action = '';
  609. setTimeout(() => {
  610. showlastPhoto.value = false
  611. }, 3000)
  612. }
  613. })
  614. // 监听手动触发拍照事件
  615. clientStore.ipc.on(icpList.socket.message + '_handler_take_picture', async (event, result) => {
  616. console.log('_handler_take_picture')
  617. console.log(result)
  618. if (result.code === 0) {
  619. if (runLoading.value || takePictureLoading.value) {
  620. ElMessage.error('拍摄程序正在运行,请稍候')
  621. return
  622. }
  623. ElMessage.success('正在拍摄中,请稍候')
  624. takePictureLoading.value = true;
  625. await socketStore.connectSocket();
  626. socketStore.sendMessage(result.data)
  627. getPhotoRecords()
  628. // 延迟两秒再获取一遍数据
  629. setTimeout(() => {
  630. getPhotoRecords()
  631. }, 3000)
  632. } else if (result.msg) {
  633. ElMessage.error(result.msg)
  634. }
  635. })
  636. //拍照成功 SmartShooter
  637. clientStore.ipc.on(icpList.socket.message + '_smart_shooter_photo_take', async (event, result) => {
  638. console.log('_smart_shooter_photo_take');
  639. console.log(result);
  640. if (result.code === 0) {
  641. if (!result.data.goods_art_no) return;
  642. setLogInfo(route, { action: '单张拍摄完成', goods_art_no: result.data.goods_art_no });
  643. if (reNosObj.value?.goods_art_no === result.data.goods_art_no) {
  644. runLoading.value = false;
  645. }
  646. // 单张重拍完成且存在重拍货号时,触发抠图队列
  647. scheduleSegment(result.data.goods_art_no)
  648. if (smartShooterTimeout) {
  649. clearTimeout(smartShooterTimeout);
  650. }
  651. setTimeout(() => {
  652. showlastPhoto.value = true;
  653. lastPhoto.value = {
  654. file_path: result.data.photo_file_name
  655. };
  656. setTimeout(() => {
  657. if (!runAction.value.goods_art_no) {
  658. showlastPhoto.value = false;
  659. }
  660. }, 3000)
  661. }, 100);
  662. smartShooterTimeout = setTimeout(() => {
  663. getPhotoRecords();
  664. if (!runAction.value.goods_art_no) {
  665. showlastPhoto.value = false;
  666. }
  667. }, 2000);
  668. } else if (result.msg) {
  669. runLoading.value = false;
  670. reNosObj.value.goods_art_no = ''
  671. reNosObj.value.action = ''
  672. ElMessage.error(result.msg)
  673. }
  674. })
  675. // 监听拍照完成后的最终状态事件
  676. clientStore.ipc.on(icpList.socket.message + '_run_mcu_update', (event, result) => {
  677. console.log('run_mcu_updat print_time:' + new Date().toLocaleString())
  678. console.log('run_mcu_update print_time:' + JSON.stringify(result))
  679. if (result.code === 0) {
  680. if (result.data?.file_path) {
  681. if (lastPhoto.value?.file_path == result.data?.file_path) return;
  682. let goods_art_no = runAction.value.goods_art_no || reNosObj.value.goods_art_no
  683. if (goods_art_no === result.data?.goods_art_no) {
  684. showlastPhoto.value = true
  685. goodsList.value.map(item => {
  686. if (item.goods_art_no === result.data?.goods_art_no) {
  687. item.items[result.data.image_index].PhotoRecord.image_path = result.data?.file_path
  688. result.data.action_name = item.items[result.data.image_index].action_name
  689. setTimeout(() => {
  690. item.items[result.data.image_index].PhotoRecord.image_path = result.data?.file_path
  691. }, 1000)
  692. setTimeout(() => {
  693. showlastPhoto.value = false
  694. }, 3000)
  695. }
  696. })
  697. setTimeout(() => {
  698. getPhotoRecords()
  699. }, 2000)
  700. }
  701. lastPhoto.value = result.data
  702. }
  703. } else if (result.msg) {
  704. ElMessage.error(result.msg)
  705. }
  706. if (reNosObj.value.goods_art_no) {
  707. resetStatus()
  708. }
  709. })
  710. }
  711. // 清理事件监听
  712. const cleanupEventListeners = () => {
  713. clientStore.ipc.removeAllListeners(icpList.socket.message + '_blue_tooth_scan');
  714. clientStore.ipc.removeAllListeners(icpList.socket.message + '_image_process');
  715. clientStore.ipc.removeAllListeners(icpList.socket.message + '_run_mcu');
  716. clientStore.ipc.removeAllListeners(icpList.socket.message + '_photo_take');
  717. clientStore.ipc.removeAllListeners(icpList.socket.message + '_photo_take_finish');
  718. clientStore.ipc.removeAllListeners(icpList.socket.message + '_run_mcu_update');
  719. clientStore.ipc.removeAllListeners(icpList.socket.message + '_stop_action');
  720. clientStore.ipc.removeAllListeners(icpList.socket.message + '_smart_shooter_photo_take');
  721. clientStore.ipc.removeAllListeners(icpList.socket.message + '_run_mcu_stop');
  722. clientStore.ipc.removeAllListeners(icpList.socket.message + '_digicam_take_picture');
  723. clientStore.ipc.removeAllListeners(icpList.socket.message + '_segment_progress');
  724. // 清理抠图队列的定时器
  725. try {
  726. segmentQueue.forEach((t) => { if (t) clearTimeout(t) })
  727. segmentQueue.clear()
  728. } catch (e) { }
  729. }
  730. // 监听蓝牙扫描
  731. checkInfoStore.set_blue_tooth_scan_NO('')
  732. watchEffect(async () => {
  733. if (checkInfoStore.blue_tooth_scan_NO) {
  734. ElMessage.success('商品货号' + checkInfoStore.blue_tooth_scan_NO + '获取成功,请在遥控器上按下左或右脚按键,启动拍摄')
  735. goods_art_no.value = checkInfoStore.blue_tooth_scan_NO
  736. checkInfoStore.set_blue_tooth_scan_NO('')
  737. }
  738. })
  739. return {
  740. loading,
  741. runLoading,
  742. takePictureLoading,
  743. goodsList,
  744. pageSize,
  745. currentPage,
  746. totalPages,
  747. goods_art_no_tpl,
  748. goods_art_no,
  749. runAction,
  750. lastPhoto,
  751. showlastPhoto,
  752. goodsArtNo,
  753. menu,
  754. configInfoStore,
  755. getTime,
  756. getFilePath,
  757. getPhotoRecords,
  758. delAll,
  759. delGoods,
  760. del,
  761. reTakePicture,
  762. reTakePictureNos,
  763. oneClickStop,
  764. onRemoteControl,
  765. openPhotographyDetail,
  766. onGenerateCLick,
  767. initEventListeners,
  768. cleanupEventListeners,
  769. }
  770. }