parkingFee.js 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666
  1. import plateNumber from '@/components/plate-number/plateNumber.vue';
  2. import { REG_SOURCE } from '@/constants';
  3. import LoginDom from '@/components/Login/Login.vue';
  4. import { mapState } from 'vuex';
  5. import { initWxJsSdkConfig } from '@/utils/login';
  6. import { getPlatform,requestInit } from '@/utils/index';
  7. import { wxToLoginCallback, getUrlParams } from '@/utils';
  8. const app = {
  9. globalData: {
  10. regSource: '',
  11. },
  12. };
  13. import uni from '@/utils/uniHooks';
  14. // import blueCom from '../components/blue/home.vue';
  15. // import greenCom from '../components/green/home.vue';
  16. // import officeBlueCom from '../components/officeBlue/home.vue';
  17. // import purpleCom from '../components/purple/home.vue';
  18. import { parkingLots, qrCodes, unlicensedCarCheckIn } from '@/api/parking';
  19. export default {
  20. props:{
  21. theme:{
  22. type: String,
  23. default: ''
  24. }
  25. },
  26. components: {
  27. plateNumber,
  28. LoginDom,
  29. // blueCom,
  30. // greenCom,
  31. // officeBlueCom,
  32. // purpleCom,
  33. },
  34. data() {
  35. return {
  36. vehicleMgt_content_index: -1, //历史车辆选中
  37. carType: 0, //车辆类型
  38. init_ch: false, // 字体超出隐藏显示
  39. search_price: false, //查询按钮隐藏显示
  40. parkInfoEntity: {},
  41. show_chinese: false, //是否显示汉字键盘
  42. show_allBoard: false, //是否显示英文数字键盘
  43. plate_number: '', //车牌号
  44. description: '', // 车场描述
  45. ind: null,
  46. numArr: ['', '', '', '', '', '', ''],
  47. active: null,
  48. carList: [], // 车辆列表
  49. classifyList: ['燃油车牌', '新能源', '特殊车牌'], // 车牌类型
  50. vehicleNumber: '',
  51. localimgPic: '',
  52. hourMoney: '',
  53. showSq: false,
  54. blueHeadBg: 'parkingFee/fee-head-bg.png',
  55. picUrl: this.$picUrl,
  56. colorAry: ['', '-blue', '-green'],
  57. openId: null,
  58. options: null,
  59. preUrl: '',
  60. tabbarActive: '手动缴费',
  61. // custTypeId: 0,
  62. };
  63. },
  64. computed: {
  65. disabledBtn() {
  66. return this.numArr.filter((val) => !val).length > 0;
  67. },
  68. ...mapState({
  69. groupId: (state) => state.groupId,
  70. openid: (state) => state.openid,
  71. mallId: (state) => state.mallId,
  72. kipUserId: (state) => state.kipUserId,
  73. userInfo: (state) => state.userInfo,
  74. member: (state) => state.member,
  75. mobile: (state) => state.mobile,
  76. custTypeId: (state) => state.custTypeId,
  77. unlicensedCar: (state) => state.order.unlicensedCar,
  78. // 如果是扫码进入的无牌车
  79. unlicensedInfo: (state) => state.unlicensedInfo,
  80. endlessLoop: (state) => state.endlessLoop,
  81. }),
  82. },
  83. beforeRouteLeave(to, from, next) {
  84. this.$store.commit('cachedViews/DEL_CACHED_VIEW', to);
  85. next();
  86. },
  87. watch: {
  88. openid() {
  89. if (this.openid) {
  90. this.getParkInfo();
  91. this.showSq = false;
  92. }
  93. },
  94. unlicensedInfo:{
  95. handler(){
  96. console.log('用户是扫码进来的98', this.unlicensedInfo);
  97. // 不论是否出入场,都使用此函数获取 gateId(闸口机器的ID)
  98. if (this.unlicensedInfo?.type && /unlicensedOut|unlicensedIn/.test(this.unlicensedInfo.type) && this.endlessLoop.length === 0) {
  99. // 此处记录扫码流程执行次数。如果超过一次则不再执行
  100. this.$store.commit('SET_ENDLESS_LOOP', this.unlicensedInfo.type);
  101. this.$nextTick(() => {
  102. this.qrCodesRule(this.unlicensedInfo.code);
  103. })
  104. }
  105. },
  106. immediate:true //true就表示会立即执行
  107. }
  108. },
  109. async mounted() {
  110. setTimeout(() => {
  111. uni.setNavigationBarTitle({
  112. title: '停车缴费',
  113. });
  114. }, 300);
  115. const platform = getPlatform();
  116. if (platform === 'micromessenger') {
  117. await initWxJsSdkConfig(['checkJsApi', 'scanQRCode']);
  118. }
  119. const member = uni.getStorageSync('member');
  120. // 如果用户未登录的话,返回之后,重新获取数据用户的基础数据
  121. if (!member && window?.toWXSendMsg) {
  122. wxToLoginCallback('parkingFee', (options) => {
  123. console.log('用户是扫码进来的125', this.unlicensedInfo);
  124. console.log('用户是扫码进来的126', options);
  125. this.$store.commit('SET_IS_INIT', false);
  126. // 请求 projectId
  127. window.toWXSendMsg({
  128. type: 'getProjectId',
  129. options: {},
  130. });
  131. window.subscribe('projectId', (newOptions) => {
  132. console.log('用户是扫码进来的134', newOptions);
  133. this.$store.dispatch('baseInit', {
  134. options: newOptions,
  135. callback: () => {
  136. this.$nextTick(( ) => {
  137. requestInit();
  138. this.getParkInfo();
  139. this.$store.commit('SET_IS_INIT', true);
  140. this.$nextTick(() => {
  141. console.log(143, newOptions);
  142. // 如果是无牌车的扫码出入场
  143. if(options?.options?.type && /unlicensedIn|unlicensedOut/.test(options.options.type)) {
  144. this.$store.commit('SET_UNLICENSED_INFO', options.options);
  145. }
  146. })
  147. })
  148. },
  149. });
  150. });
  151. });
  152. // return
  153. }
  154. console.log(136, this.openid);
  155. if (this.openid) {
  156. this.getParkInfo();
  157. this.showSq = false;
  158. } else {
  159. const regSource = REG_SOURCE.PARKING;
  160. app.globalData.regSource = regSource;
  161. if (this.options?.regSource) {
  162. app.globalData.regSource = REG_SOURCE[this.options?.regSource];
  163. }
  164. if (this.options?.tpName) {
  165. app.globalData.tpName = this.options?.tpName;
  166. }
  167. this.showSq = true;
  168. }
  169. },
  170. methods: {
  171. toggleType(carType) {
  172. this.ind = 0;
  173. this.active = 0;
  174. this.carType = carType;
  175. if (carType === 1) {
  176. this.numArr = [
  177. this.numArr[0],
  178. this.numArr[1],
  179. this.numArr[2],
  180. this.numArr[3],
  181. this.numArr[4],
  182. this.numArr[5],
  183. this.numArr[6],
  184. this.numArr[7],
  185. ];
  186. } else {
  187. this.numArr = [
  188. this.numArr[0],
  189. this.numArr[1],
  190. this.numArr[2],
  191. this.numArr[3],
  192. this.numArr[4],
  193. this.numArr[5],
  194. this.numArr[6],
  195. ];
  196. }
  197. },
  198. // 获取停车场信息
  199. getParkInfo: async function () {
  200. uni.showLoading({
  201. title: '加载中',
  202. });
  203. try {
  204. console.log('加载车场信息', this.$store.state.lbsId);
  205. // const res = await parkingLots('8aaa82ea804d07cd0180516ff03b0008'); // TODO: 临时写死
  206. const res = await parkingLots(this.$store.state.lbsId); // TODO: 临时写死
  207. console.log(res);
  208. let reg = /[;;]/g;
  209. this.description = res.description.replace(reg, '\r\n').replace(/\r\n/g, '<br/>');
  210. const carList = uni.getStorageSync('carList');
  211. if (carList) {
  212. this.carList = JSON.parse(carList);
  213. }
  214. } catch (e) {
  215. console.log(225225, e);
  216. }
  217. },
  218. //缴费说明隐藏显示
  219. top_display() {
  220. this.init_ch = !this.init_ch;
  221. },
  222. // 唤起键盘
  223. clickShowKeyboard(index) {
  224. this.ind = index;
  225. this.active = index;
  226. if (index === 0) {
  227. this.$refs['plateKeyboard'].openKeyboardCN();
  228. } else {
  229. this.$refs['plateKeyboard'].closeKeyboardCN();
  230. this.$refs['plateKeyboard'].openKeyboardEN();
  231. }
  232. },
  233. // 接收子组件数据
  234. updateCarno(val) {
  235. this.numArr = [...val.numArr];
  236. this.vehicleNumber = this.numArr.join('');
  237. this.active = val.active;
  238. this.ind = val.ind;
  239. },
  240. // 节流函数
  241. throttle(fc, waitTime = 500, imme = true) {
  242. if (imme) {
  243. if (!this.flag) {
  244. this.flag = true;
  245. typeof fc === 'function' && fc();
  246. this.timer = setTimeout(() => {
  247. this.flag = false;
  248. }, waitTime);
  249. }
  250. } else {
  251. if (!this.flag) {
  252. this.flag = true;
  253. this.timer = setTimeout(() => {
  254. this.flag = false;
  255. typeof fc === 'function' && fc();
  256. }, waitTime);
  257. }
  258. }
  259. },
  260. // 校验车牌号
  261. preHandleSearch() {
  262. if (this.disabledBtn) return
  263. uni.setStorageSync('carList', [
  264. ...new Set([this.vehicleNumber, ...this.carList]),
  265. ].slice(0, 6));
  266. this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
  267. name: 'parkingFeeDetail',
  268. });
  269. this.$nextTick(() => {
  270. this.$router.push({
  271. path: 'parkingFeeDetail',
  272. query: {
  273. vehicleNo: this.vehicleNumber,
  274. },
  275. });
  276. })
  277. },
  278. // 历史车牌快速查询
  279. toHandleSearch(vehicleNo) {
  280. uni.setStorageSync('carList', [...new Set([vehicleNo, ...this.carList])].slice(0, 6));
  281. this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
  282. name: 'parkingFeeDetail',
  283. });
  284. this.$nextTick(() => {
  285. this.$router.push({
  286. path: 'parkingFeeDetail',
  287. query: {
  288. vehicleNo,
  289. },
  290. });
  291. });
  292. },
  293. // 查询车费信息
  294. async handleSearch(carno, clickEvent = '$ClickQueryAndPayment') {
  295. this.vehicleNumber = carno;
  296. const params = {
  297. carno,
  298. mallid: this.mallId,
  299. openid: this.openid,
  300. vipcode: this.member?.vipcode,
  301. mobile: this.mobile,
  302. groupId: this.groupId,
  303. createuser: 'sys_miniprogram',
  304. };
  305. // 查询缴费按钮埋点
  306. let [carTypeName, redirectUrl, parkTime] = ['ordinary', '', ''];
  307. switch (this.carType) {
  308. case 0:
  309. carTypeName = 'ordinary';
  310. break;
  311. case 1:
  312. carTypeName = 'newEnergy';
  313. break;
  314. case 2:
  315. carTypeName = 'special';
  316. break;
  317. }
  318. this.$md(params);
  319. this.$request({
  320. // url: this.$baseURL + 'api/1.0/park/checkCarIsInPark',
  321. url: this.$baseURL + 'api/1.0/park/checkCarIsInParkAndCarFee',
  322. // url: 'http://172.21.90.87:8083/xcrm-api/api/1.0/park/checkCarIsInParkAndCarFee',
  323. data: params,
  324. method: 'POST',
  325. header: JSON.parse(uni.getStorageSync('handleUser')),
  326. timeout: 60000 * 2, // 120S
  327. showLoading: {
  328. title: '加载中',
  329. duration: 0,
  330. },
  331. })
  332. .then((res) => {
  333. // console.log(555555, res);
  334. // ToastObj.clear();
  335. // uni.hideLoading();
  336. if (res.data.code === 0) {
  337. // 清理旧数据
  338. this.parkingFeeDetailInit();
  339. uni.setStorageSync('isReload', '3');
  340. // this.$destroy();
  341. this.$router.push({
  342. path: 'parkingFeeDetail',
  343. query: {
  344. vehicleNo: carno,
  345. },
  346. });
  347. parkTime = res.data?.data?.serviceMin;
  348. redirectUrl = '/pages/parkingFee/parkingFeeDetail.vue';
  349. } else if (res.data.code === 1) {
  350. // 当前车辆没有查到账单
  351. this.$router.push({
  352. path: 'parkingFeePayment',
  353. query: {
  354. msg: res.data.msg,
  355. carno,
  356. },
  357. });
  358. redirectUrl = '/pages/parkingFee/parkingFeePayment.vue';
  359. } else if (res.data.code === 2) {
  360. // 月租车
  361. this.$router.push({
  362. path: './parkingFeeHint/parkingFeeHint',
  363. query: {
  364. carno,
  365. },
  366. });
  367. redirectUrl = '/pages/parkingFee/parkingFeeHint/parkingFeeHint.vue';
  368. } else {
  369. uni.showToast({
  370. title: res.data.msg,
  371. duration: 2000,
  372. icon: 'none',
  373. });
  374. }
  375. })
  376. .catch((err) => {
  377. // uni.hideLoading();
  378. uni.showToast({
  379. title: '网络超时请稍后再试',
  380. duration: 2000,
  381. icon: 'none',
  382. });
  383. console.log(err);
  384. });
  385. },
  386. // 页面初始清空缓存
  387. parkingFeeDetailInit() {
  388. console.log('清理数据');
  389. // 优惠减免(首停、会员、消费)
  390. uni.removeStorageSync('checkedList'); // 选中list
  391. uni.removeStorageSync('checkedTotal'); // 选中count数
  392. uni.removeStorageSync('discountTotal'); // 减免信息(时长、费用)
  393. // 停车减免(优惠、积分、停车券)
  394. uni.removeStorageSync('parkFee');
  395. // 电子券优惠信息
  396. uni.removeStorageSync('checkedCouponList'); // 选中list
  397. uni.removeStorageSync('couponInfo'); // 减免信息(时长、费用)
  398. uni.removeStorageSync('list'); // 电子券list
  399. // 总停车优惠信息(时长、费用)
  400. uni.removeStorageSync('parkingTotal');
  401. // 应缴金额
  402. uni.removeStorageSync('servicefee');
  403. // 订单号
  404. uni.removeStorageSync('orderno');
  405. // 纸质优惠券
  406. uni.removeStorageSync('paperCouponInfo');
  407. },
  408. // 缴费记录
  409. doRouter: function () {
  410. this.$store.dispatch('clearUnlicensed');
  411. window?.toWXSendMsg({
  412. type: 'uni_func',
  413. funcName: 'setStorageSync',
  414. options: {
  415. key: 'noLoginParkingFeeWebViewPath',
  416. value: ''
  417. },
  418. });
  419. uni.setStorageSync('loadData', '');
  420. if (this.$store.state.isLogin === '3') {
  421. this.$router.push({ path: 'login' });
  422. return;
  423. }
  424. this.$router.push({ path: 'parkingFeeList' });
  425. },
  426. // 车牌管理
  427. doRouter2: function () {
  428. this.$store.dispatch('clearUnlicensed');
  429. window?.toWXSendMsg({
  430. type: 'uni_func',
  431. funcName: 'setStorageSync',
  432. options: {
  433. key: 'noLoginParkingFeeWebViewPath',
  434. value: ''
  435. },
  436. });
  437. uni.setStorageSync('loadData', '');
  438. if (this.$store.state.isLogin === '3') {
  439. this.$router.push({ path: 'login' });
  440. return;
  441. }
  442. uni.removeStorageSync('passLogin');
  443. this.$router.push({ path: 'vehicleManagement' });
  444. },
  445. //停车发票
  446. doRouter1: function () {
  447. this.$store.dispatch('clearUnlicensed');
  448. window?.toWXSendMsg({
  449. type: 'uni_func',
  450. funcName: 'setStorageSync',
  451. options: {
  452. key: 'noLoginParkingFeeWebViewPath',
  453. value: ''
  454. },
  455. });
  456. uni.setStorageSync('loadData', '');
  457. if (this.$store.state.isLogin === '3') {
  458. this.$router.push({ path: 'login' });
  459. return;
  460. }
  461. // uni.removeStorageSync('passLogin');
  462. // TODO: 北京停车场开票
  463. /* if (this.parkInfoEntity.parkMallCode === 3) {
  464. uni.navigateToMiniProgram({
  465. appId: this.$etcpAppId,
  466. path: this.$etcpAppInvoicePath,
  467. envVersion: 'release',
  468. })
  469. return
  470. }
  471. */
  472. this.$router.push({ path: 'parkingReceipt' });
  473. },
  474. //停车券兑换
  475. doRouter3: function () {
  476. this.$store.dispatch('clearUnlicensed');
  477. window?.toWXSendMsg({
  478. type: 'uni_func',
  479. funcName: 'setStorageSync',
  480. options: {
  481. key: 'noLoginParkingFeeWebViewPath',
  482. value: ''
  483. },
  484. });
  485. uni.setStorageSync('loadData', '');
  486. window.toWXSendMsg({
  487. type: 'toPage',
  488. options: {
  489. fnName: 'navigateTo',
  490. url: '/pages/pointsMall/pointsMall?exchangeTypes=2',
  491. },
  492. });
  493. },
  494. blueComChange(value) {
  495. console.log('blueComChange', value);
  496. },
  497. tabbarActiveEvent(name) {
  498. this.tabbarActive = name
  499. if (name === '无牌缴费') {
  500. this.$store.dispatch('order/unlicensedRule', (code) => {
  501. // CAR_NOT_FOUND 车场扫描道闸入口,发现无车
  502. if (code === 'CAR_NOT_FOUND') {
  503. }
  504. // CAR_HAS_PLATE 车场扫描道闸入口,发现有牌车
  505. if (code === 'CAR_HAS_PLATE') {
  506. }
  507. })
  508. }
  509. },
  510. // 无牌车闸机扫码
  511. async scanCarCode() {
  512. try {
  513. // this.qrCodesRule('e41d4d9dd5534f4aa3de88326a2e6f85')
  514. // return
  515. const runScanFn = (res) => {
  516. console.log(513, res);
  517. if (res.scanType && res.scanType == 'QR_CODE') {
  518. console.log(res.result);
  519. // 获取二维码参数之后,模拟提取参数
  520. const url = res.result;
  521. const {path} = getUrlParams(res.result)
  522. let params = null
  523. if(path) {
  524. params = getUrlParams(decodeURIComponent(path))
  525. }
  526. /*
  527. 微信扫码之后,处理过的参数 {"code": "e41d4d9dd5534f4aa3de88326a2e6f85", "type": "unlicensedIn#wechat-redirect"}
  528. */
  529. if (params?.type.indexOf('wechat-redirect') > -1) {
  530. params.type = params.type.replace('#wechat-redirect', '');
  531. }
  532. console.log('微信扫码之后,处理过的参数', params);
  533. this.$store.commit('SET_UNLICENSED_INFO', params);
  534. this.$nextTick(() => {
  535. this.qrCodesRule(params.code);
  536. })
  537. }
  538. };
  539. // 微信小程序
  540. const platform = getPlatform();
  541. if (platform === 'miniprogram') {
  542. window.toWXSendMsg({
  543. type: 'scanQRCode',
  544. });
  545. window.subscribe('scanQRCodeOver', (options) => {
  546. console.log('微信扫码结束之后的返回参数', options);
  547. runScanFn(options);
  548. });
  549. } else {
  550. this.$wx.scanQRCode({
  551. desc: 'scanQRCode desc',
  552. needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
  553. // scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
  554. success: (res) => {
  555. console.log('H5页面扫码获取到的参数——成功', res);
  556. runScanFn(res);
  557. // this.formMsg.deviceCode = res.resultStr;
  558. },
  559. error: (res) => {
  560. console.log('H5页面扫码获取到的参数——失败', res);
  561. // console.log(242, res);
  562. },
  563. });
  564. }
  565. } catch (err) {
  566. console.log(624, err);
  567. }
  568. },
  569. // 处理扫码结果: 组装参数,剩余流程,在 缴费支付页面 实现
  570. async qrCodesRule(code) {
  571. try {
  572. const qrCodesres = await qrCodes(code); // 无牌车扫码
  573. console.log(584, qrCodesres);
  574. // 记录buildingId,确保 buildingId 是最新的数据
  575. window.localStorage.setItem('buildingId', qrCodesres.buildingId);
  576. // 如果是无牌车扫码:出场
  577. console.log('模拟出场', this.unlicensedInfo.type);
  578. this.$store.commit('cachedViews/DEL_CACHED_VIEW', {
  579. name: 'parkingFeeDetail',
  580. });
  581. // return
  582. if (this.unlicensedInfo?.type === 'unlicensedOut') {
  583. this.$router.push({
  584. path: 'parkingFeeDetail',
  585. query: {
  586. type: 'success',
  587. gateId: qrCodesres.gateId,
  588. vehicleNo: '',
  589. type: this.unlicensedInfo.type
  590. }
  591. })
  592. // const res = await unlicensedCarCheckout({
  593. // gateId: qrCodesres.gateId
  594. // });
  595. // console.log(595, res);
  596. // return
  597. // 查询用户是否存在车牌(出场扫码不查询车牌,直接前往支付页面)
  598. /*this.$store.dispatch('order/unlicensedRule', (vehicleNo) => {
  599. if(vehicleNo === 'error') {
  600. return
  601. }
  602. // 出场前,扫码缴费
  603. this.$router.push({
  604. path: 'parkingFeeDetail',
  605. query: {
  606. type: 'success',
  607. gateId: qrCodesres.gateId,
  608. vehicleNo: vehicleNo,
  609. type: this.unlicensedInfo.type
  610. }
  611. })
  612. });*/
  613. return
  614. }
  615. // 如果是无牌车扫码:入场
  616. const unlicensedCarCheckInres = await unlicensedCarCheckIn({ // 获取无牌车牌
  617. gateId: qrCodesres.gateId
  618. });
  619. // 前往 缴费支付页面
  620. this.$router.push({
  621. path: 'parkingFeeMsg',
  622. query: {
  623. type: 'success',
  624. vehicleNo: unlicensedCarCheckInres.vehicleNo
  625. }
  626. })
  627. } catch (err) {
  628. // 车场扫描道闸入口,发现无车/车场扫描道闸入口,发现有牌车 >>> 停止往下执行,默认提示报错信息
  629. if (/CAR_NOT_FOUND|CAR_HAS_PLATE/.test(err.code)) {
  630. return
  631. }
  632. console.log('模拟出场的报错', err);
  633. return
  634. // 如果是其他错误的话,则继续往下执行
  635. this.$router.push({
  636. path: 'parkingFeeMsg',
  637. query: {
  638. type: 'fail'
  639. }
  640. })
  641. }
  642. },
  643. // 前往支付
  644. unlicensedToPay() {
  645. // 无牌车这边去支付的时候,属于场内缴费,需要调用场内缴费的接口 /parking/check-out
  646. this.$store.commit('SET_ENDLESS_LOOP', '');
  647. this.toHandleSearch(this.unlicensedCar);
  648. }
  649. },
  650. };