You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1 line
9.4 KiB
1 line
9.4 KiB
import{n as e}from"./axios-CiYFffbI.js";import{A as t,I as n,N as r,V as i,Y as a,_ as o,d as s,f as c,i as l,it as u,kt as d,l as f,p,q as m,u as h,ut as g,v as _,y as v,z as y}from"./runtime-core.esm-bundler-CnFWH3R5.js";import{i as b,o as x,r as S}from"./index-DhmwAFpV.js";import{n as C,t as w}from"./datetime-3T8f3S0H.js";import{n as T,t as E}from"./reservationStatus-DNE9Cq6e.js";import{n as D,t as O}from"./h5Http-BaUTUr0i.js";var ee={class:`m-scan`},k={class:`m-scan-head`},te={key:0,class:`m-scan-venue`},ne={class:`m-scan-stats`,"aria-label":`今日预约统计`},re={key:0,class:`m-scan-stats-loading`},ie={class:`m-scan-stat`},ae={class:`m-scan-stat-num`},oe={class:`m-scan-stat m-scan-stat--verified`},se={class:`m-scan-stat-num`},ce={class:`m-scan-main`},le=[`disabled`],ue={class:`cam-wrap`},de={key:0,class:`today-modal-summary`},A={key:1,class:`today-list`},fe={class:`today-row`},pe={class:`today-name`},me={class:`today-act`},he={class:`today-meta`},j=x(v({__name:`VerifyScan`,setup(v){let x=b(),j=S(),M=f(()=>j.path.startsWith(`/m/`)?`/m/verify/login`:`/h5/verify/login`),N=u(!1),P=u(!1),F=u(!1),I=u(null),L=u(null),R=null,z=u(``),B=u(``),V=u(null),H=u(!1),U=u(!1),ge=()=>{let e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`},W=u([]),G=u(!1),K=u(null),q=f(()=>{if(K.value)return K.value;let e=0,t=0;for(let n of W.value)n.status!==`cancelled`&&(e+=1),n.status===`verified`&&(t+=1);return{total_orders:e,verified_orders:t}}),J=u(null),Y=f(()=>{let e=J.value;if(!e)return``;let t=e.venues??[];if(e.role===`super_admin`&&t.length===0)return`全部场馆`;let n=t.map(e=>e.name).filter(Boolean);return n.length?n.join(`、`):`未绑定场馆`});async function _e(){try{let{data:e}=await D.get(`/me`);J.value=e}catch{J.value=null}}function ve(e){let t=e.trim();if(!t)return``;let n=t.match(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i);if(n)return n[0];try{let e=new URL(t,window.location.origin),n=e.searchParams.get(`token`)||e.searchParams.get(`qr_token`)||e.searchParams.get(`t`);if(n)return n.trim()}catch{}return t}async function X(){G.value=!0;try{let e=ge(),[t,n]=await Promise.allSettled([D.get(`/reservations`,{params:{status:`all`,start_date:e,end_date:e,date_field:`activity_day`}}),D.get(`/reservations/today-summary`)]);if(t.status===`rejected`)throw t.reason;let r=t.value.data;W.value=Array.isArray(r)?r:[],n.status===`fulfilled`?K.value=n.value.data:K.value=null}catch(t){e.error(t?.response?.data?.message??`加载今日报名失败`),W.value=[],K.value=null}finally{G.value=!1}}async function Z(t){let n=ve(t);if(!n){e.warning(`未能识别二维码内容`);return}B.value=n,H.value=!0,V.value=null;try{let{data:e}=await D.get(`/reservations/preview`,{params:{qr_token:n}});V.value=e,P.value=!0,$()}catch(t){let n=t?.response?.data?.message??`查询预约失败`;e.error(n)}finally{H.value=!1}}async function ye(){if(B.value){U.value=!0;try{let{data:t}=await D.post(`/reservations/verify`,{qr_token:B.value});e.success(t?.message??`核销成功`),V.value={reservation:t.reservation,can_verify:!1,verify_block_reason:null},await X()}catch(t){let n=t?.response?.data?.message??`核销失败`;e.error(n),B.value&&await Z(B.value)}finally{U.value=!1}}}async function be(){return!V.value||!V.value.can_verify?(Q(),!0):(await ye(),!1)}function Q(){P.value=!1,V.value=null,B.value=``}function $(){N.value=!1,R&&=(window.clearInterval(R),null),L.value&&=(L.value.getTracks().forEach(e=>e.stop()),null)}async function xe(){if(!localStorage.getItem(`szkp_h5_verify_token`)){x.replace(M.value);return}if(!navigator.mediaDevices?.getUserMedia){e.warning(`当前环境不支持摄像头,请使用支持摄像头的手机浏览器`);return}z.value=``,N.value=!0;try{L.value=await navigator.mediaDevices.getUserMedia({video:{facingMode:`environment`},audio:!1}),await new Promise(e=>requestAnimationFrame(e)),I.value&&(I.value.srcObject=L.value,await I.value.play()),Se()}catch{e.error(`无法打开摄像头,请检查权限设置`),$()}}function Se(){let t=window.BarcodeDetector;if(!t){e.warning(`当前浏览器不支持实时识别二维码,请升级系统浏览器或使用其它手机`);return}let n=new t({formats:[`qr_code`]});R&&window.clearInterval(R),R=window.setInterval(async()=>{if(I.value)try{let e=(await n.detect(I.value))?.[0]?.rawValue||``;e&&e!==z.value&&(z.value=e,await Z(e))}catch{}},400)}async function Ce(){$();try{await D.post(`/auth/logout`)}catch{}localStorage.removeItem(O),localStorage.removeItem(`${O}_saved_at`),x.replace(M.value)}return m(F,e=>{e&&X()}),r(()=>{if(!localStorage.getItem(`szkp_h5_verify_token`)){x.replace(M.value);return}_e(),X()}),t(()=>{$()}),(e,t)=>{let r=i(`a-button`),u=i(`a-modal`),f=i(`a-alert`),m=i(`a-descriptions-item`),v=i(`a-tag`),b=i(`a-descriptions`),x=i(`a-spin`),S=i(`a-empty`);return n(),p(`div`,ee,[h(`header`,k,[h(`div`,null,[t[4]||=h(`div`,{class:`m-scan-brand`},`核销`,-1),t[5]||=h(`div`,{class:`m-scan-sub`},`扫码核对信息后核销`,-1),Y.value?(n(),p(`div`,te,`当前场馆:`+d(Y.value),1)):c(``,!0)]),_(r,{size:`small`,onClick:Ce},{default:a(()=>[...t[6]||=[o(`退出`,-1)]]),_:1})]),h(`section`,ne,[G.value?(n(),p(`div`,re,`统计加载中…`)):(n(),p(l,{key:1},[h(`div`,ie,[t[7]||=h(`div`,{class:`m-scan-stat-label`},`今日预约数`,-1),h(`div`,ae,d(q.value.total_orders),1)]),h(`div`,oe,[t[8]||=h(`div`,{class:`m-scan-stat-label`},`已核销数`,-1),h(`div`,se,d(q.value.verified_orders),1)])],64))]),h(`main`,ce,[h(`button`,{type:`button`,class:`m-scan-btn`,disabled:H.value,onClick:xe},[...t[9]||=[h(`span`,{class:`m-scan-btn-icon`,"aria-hidden":`true`},null,-1),h(`span`,null,`扫码核销`,-1)]],8,le),t[11]||=h(`p`,{class:`m-scan-hint`},`将打开手机摄像头,对准用户预约二维码即可识别。`,-1),t[12]||=h(`p`,{class:`m-scan-hint m-scan-hint--sub`},`仅支持核销「活动日为今天」的预约;其它日期将提示原因且无法核销。`,-1),_(r,{long:``,class:`m-scan-secondary`,onClick:t[0]||=e=>F.value=!0},{default:a(()=>[...t[10]||=[o(`查看今日报名(按活动日)`,-1)]]),_:1})]),_(u,{visible:N.value,"onUpdate:visible":t[1]||=e=>N.value=e,title:`扫描预约二维码`,footer:!1,"mask-closable":!0,"unmount-on-close":!0,width:`min(100%, 420px)`,onCancel:$},{default:a(()=>[h(`div`,ue,[h(`video`,{ref_key:`videoRef`,ref:I,class:`cam-video`,muted:``,playsinline:``},null,512),t[14]||=h(`p`,{class:`cam-tip`},`请将二维码置于取景框中央`,-1),_(r,{long:``,onClick:$},{default:a(()=>[...t[13]||=[o(`取消`,-1)]]),_:1})])]),_:1},8,[`visible`]),_(u,{visible:P.value,"onUpdate:visible":t[2]||=e=>P.value=e,title:`预约信息`,"modal-class":`m-verify-res-modal`,"modal-style":{width:`min(calc(100vw - 24px), 440px)`,maxWidth:`100%`},"body-style":{maxHeight:`min(72vh, 520px)`,overflowY:`auto`,padding:`12px 16px 8px`},"ok-loading":U.value||H.value,"ok-text":V.value?.can_verify?`立即核销`:`关闭`,"ok-button-props":{size:`large`,long:!0},"cancel-button-props":{size:`large`},"on-before-ok":be,onCancel:Q},{default:a(()=>[_(x,{loading:H.value,style:{width:`100%`}},{default:a(()=>[V.value?(n(),p(l,{key:0},[!V.value.can_verify&&V.value.verify_block_reason?(n(),s(f,{key:0,type:`warning`,style:{"margin-bottom":`12px`}},{default:a(()=>[o(d(V.value.verify_block_reason),1)]),_:1})):c(``,!0),_(b,{column:1,size:`small`,class:`m-verify-res-desc`},{default:a(()=>[_(m,{label:`场馆`},{default:a(()=>[o(d(V.value.reservation.venue?.name??`-`),1)]),_:1}),_(m,{label:`活动`},{default:a(()=>[o(d(V.value.reservation.activity?.title??`-`),1)]),_:1}),_(m,{label:`预约日期`},{default:a(()=>[o(d(g(C)(V.value.reservation.activity_day?.activity_date??null)),1)]),_:1}),_(m,{label:`报名人`},{default:a(()=>[o(d(V.value.reservation.visitor_name??`-`),1)]),_:1}),_(m,{label:`手机`},{default:a(()=>[o(d(V.value.reservation.visitor_phone??`-`),1)]),_:1}),_(m,{label:`预约类型`},{default:a(()=>[o(d(g(T)(V.value.reservation.booking_type,V.value.reservation.ticket_count)),1)]),_:1}),_(m,{label:`状态`},{default:a(()=>[_(v,{color:V.value.reservation.status===`verified`?`green`:V.value.reservation.status===`pending`?`arcoblue`:`gray`},{default:a(()=>[o(d(g(E)(V.value.reservation.status)),1)]),_:1},8,[`color`])]),_:1}),V.value.reservation.verified_at?(n(),s(m,{key:0,label:`核销时间`},{default:a(()=>[o(d(g(w)(V.value.reservation.verified_at)),1)]),_:1})):c(``,!0)]),_:1})],64)):c(``,!0)]),_:1},8,[`loading`])]),_:1},8,[`visible`,`ok-loading`,`ok-text`]),_(u,{visible:F.value,"onUpdate:visible":t[3]||=e=>F.value=e,title:`今日报名(活动日为今天)`,footer:!1,width:`min(100%, 440px)`,onOpen:X},{default:a(()=>[G.value?c(``,!0):(n(),p(`div`,de,[t[15]||=o(` 今日预约数 `,-1),h(`strong`,null,d(q.value.total_orders),1),t[16]||=o(` · 已核销数 `,-1),h(`strong`,null,d(q.value.verified_orders),1)])),_(x,{loading:G.value,style:{width:`100%`,"min-height":`80px`}},{default:a(()=>[W.value.length?(n(),p(`div`,A,[(n(!0),p(l,null,y(W.value,e=>(n(),p(`div`,{key:e.id,class:`today-item`},[h(`div`,fe,[h(`span`,pe,d(e.visitor_name||`未填写`),1),_(v,{size:`small`,color:e.status===`verified`?`green`:e.status===`pending`?`arcoblue`:`gray`},{default:a(()=>[o(d(g(E)(e.status)),1)]),_:2},1032,[`color`])]),h(`div`,me,d(e.activity?.title??`—`),1),h(`div`,he,d(g(T)(e.booking_type,e.ticket_count))+` · 活动日 `+d(g(C)(e.activity_day?.activity_date??null))+` · 预约时间 `+d(g(w)(e.created_at)),1)]))),128))])):(n(),s(S,{key:0,description:`今日(活动日为今天)暂无预约记录`}))]),_:1},8,[`loading`])]),_:1},8,[`visible`])])}}}),[[`__scopeId`,`data-v-acfc0391`]]);export{j as default}; |