Files
machartaa_admin_dist/dist/assets/index-678f403e.js
T
2026-06-30 11:30:31 +03:30

2 lines
16 KiB
JavaScript

import{_ as me}from"./BasicMainCard-20121373.js";import{_ as le}from"./BasicModal.vue_vue_type_style_index_0_lang-21dc5108.js";import{u as X,_ as oe}from"./useBaseTable-76d7f07d.js";import{_ as pe,B as _e}from"./button.vue_vue_type_style_index_0_lang-9e790906.js";import{g as fe}from"./member-28294eae.js";import{K as F,d as Z,g as c,h as ie,E as ve,o as h,c as b,a,b as s,j as B,w as o,e as d,t as u,k as A,F as re,n as ge,G as Y,D as $,v as he,ae as be}from"./index-3136f82f.js";import{c as ye}from"./smsUserColumns-c08fe7f1.js";import{M as xe}from"./index-74066b73.js";import{C as ae}from"./index-ddec8b32.js";import{I as se,a as we}from"./index-d53e2890.js";import{I as ke}from"./Icon-da96086d.js";import{t as ee}from"./useDataTime-a308c7ac.js";import{S as Re}from"./index-732915ec.js";import{D as Ce,_ as Ie}from"./index-a51e1b32.js";import{k as $e,S as Te}from"./fa_IR-7ef01f07.js";import{T as Se}from"./shallowequal-18cd9d2d.js";import{_ as Pe,T as Be}from"./index-bdb897ea.js";import"./index-ef7fb5f8.js";import"./index-37f402a1.js";import"./Col-4417123f.js";import"./styleChecker-0439e77f.js";import"./vnode-76a3da37.js";import"./_plugin-vue_export-helper-d984416f.js";import"./isPlainObject-bc4a6351.js";import"./useState-cbfc3923.js";import"./FormItemContext-6cd43783.js";import"./lodash-c712c23b.js";import"./pickAttrs-b6fb3a2a.js";import"./toArray-86b1c6d3.js";import"./useRefs-bc01ea09.js";import"./_flatRest-9b18ad3b.js";const Le=async t=>(await F.post("/admin/sms/preview",t)).data,De=async t=>(await F.post("/admin/sms/test",t)).data,Me=async t=>(await F.post("/admin/sms/campaigns/start",t)).data,Ue=async t=>{var f;const i=await F.get("/admin/sms/campaigns",{params:{page:t.page,limit:t.limit,search:t.search}}),g=t.page||1,x=t.limit||20,T=(g-1)*x;return{rows:(i.data||[]).map((v,w)=>({...v,index:T+w})),total:i.total??((f=i.data)==null?void 0:f.length)??0,query:{...t,total:i.total??0,page:g,limit:x}}},ne=async(t,i)=>(await F.get(`/admin/sms/campaigns/${t}`,{params:i})).data,Ae={class:"grid grid-cols-1 xl:grid-cols-3 gap-4 mb-4"},Ke={class:"xl:col-span-2 space-y-4"},Ne=a("div",{class:"mb-1 text-sm text-gray-600"},"متن پیامک *",-1),qe={class:"flex flex-wrap gap-4 items-center"},Fe={class:"flex flex-wrap gap-2"},Oe={class:"bg-gray-50 rounded-lg p-4 border border-gray-200 space-y-2 text-sm"},Ve=a("div",{class:"font-semibold text-gray-700 mb-2"},"خلاصه ارسال",-1),je={key:0},Ee={key:0,class:"text-amber-600 mt-1"},ze={key:1,class:"text-gray-500"},Ge={key:2,class:"pt-2 border-t border-gray-200"},He=a("div",{class:"font-medium mb-1"},"نمونه گیرندگان:",-1),Je={class:"space-y-1 text-xs text-gray-600"},Qe={key:3,class:"pt-2 border-t border-gray-200"},We=a("div",{class:"font-medium mb-1"},"آخرین کمپین:",-1),Xe={class:"text-blue-600 mt-1"},Ye={class:"border-t border-gray-200 pt-4"},Ze=a("div",{class:"mb-2 text-sm text-gray-600"}," کاربران را فیلتر کنید و گیرندگان مورد نظر را انتخاب کنید. فقط کاربرانی که شماره موبایل دارند نمایش داده می‌شوند. ",-1),et={class:"space-y-3"},tt=a("div",{class:"mb-1 text-sm text-gray-600"},"شماره موبایل",-1),at=a("div",{class:"text-xs text-gray-500"}," متن پیامک از باکس اصلی استفاده می‌شود. ",-1),st=Z({__name:"SendPanel",emits:["campaign-started"],setup(t,{emit:i}){const{TextArea:g}=se,[x,T]=X(),f=c(""),v=c(!0),w=c(!0),l=c(null),k=c(!1),R=c(!1),y=c(null),S=c(!1),C=c(""),K=c(!1),P=c([]),L=c({}),V=ie(()=>({selectedRowKeys:P.value,onChange:m=>{P.value=m.map(String)},preserveSelectedRowKeys:!0})),j=c({columns:ye,api:async m=>{const n={...m,filters:[...m.filters||[],{field:"phone",op:"nn",value:!0,cr:"and",type:"switch",hidden:!0}]};return v.value&&n.filters.push({field:"first_name",op:"nn",value:!0,cr:"and",type:"switch",hidden:!0},{field:"last_name",op:"nn",value:!0,cr:"and",type:"switch",hidden:!0}),!n.sort&&!n.order&&(n.order="-created_at"),L.value=n,fe(n)},defaultPageLimit:20,height:"45vh"});ve(v,()=>{l.value=null,T()});function N(m){var n;return{message:f.value.trim(),appendAppName:w.value,registrationComplete:v.value,search:L.value.search||void 0,filters:(n=L.value.filters)==null?void 0:n.filter(_=>!_.hidden),sort:L.value.sort||void 0,order:L.value.order||void 0,mode:m,userIds:m==="selected"?P.value:void 0}}async function E(){var m,n;if(!f.value.trim()){$.warning("ابتدا متن پیامک را وارد کنید");return}k.value=!0;try{l.value=await Le(N("filtered"))}catch(_){$.error(((n=(m=_==null?void 0:_.response)==null?void 0:m.data)==null?void 0:n.error)||"خطا در پیش‌نمایش")}finally{k.value=!1}}async function z(){var m,n;if(!f.value.trim()){$.warning("متن پیامک الزامی است");return}if(!C.value.trim()){$.warning("شماره موبایل الزامی است");return}K.value=!0;try{await De({...N("filtered"),phone:C.value.trim()}),$.success("پیامک تستی ارسال شد"),S.value=!1}catch(_){$.error(((n=(m=_==null?void 0:_.response)==null?void 0:m.data)==null?void 0:n.error)||"ارسال تستی ناموفق بود")}finally{K.value=!1}}async function O(m){if(!f.value.trim()){$.warning("متن پیامک الزامی است");return}if(m==="selected"&&!P.value.length){$.warning("حداقل یک کاربر انتخاب کنید");return}const n=m==="selected"?`آیا از ارسال پیامک به ${P.value.length} کاربر انتخاب‌شده مطمئن هستید؟`:"آیا از ارسال پیامک به همه کاربران فیلترشده مطمئن هستید؟";return new Promise(_=>{xe.confirm({title:"تأیید ارسال پیامک",content:n,okText:"بله، ارسال کن",cancelText:"انصراف",okType:"danger",centered:!0,onOk:async()=>{var M,U;R.value=!0,y.value=null;try{const e=await Me(N(m));y.value=e,i("campaign-started",e.campaignId),$.success(`کمپین #${e.campaignId} با ${e.totalRecipients} گیرنده در پس‌زمینه ارسال می‌شود`)}catch(e){$.error(((U=(M=e==null?void 0:e.response)==null?void 0:M.data)==null?void 0:U.error)||"شروع کمپین ناموفق بود")}finally{R.value=!1,_()}},onCancel:()=>_()})})}function G(){return O("selected")}function H(){return O("filtered")}return(m,n)=>{var e,p;const _=pe,M=oe,U=le;return h(),b("div",null,[a("div",Ae,[a("div",Ke,[a("div",null,[Ne,s(B(g),{value:f.value,"onUpdate:value":n[0]||(n[0]=r=>f.value=r),placeholder:"متن پیامک را وارد کنید...",rows:6,maxlength:1e3,"show-count":""},null,8,["value"])]),a("div",qe,[s(B(ae),{checked:v.value,"onUpdate:checked":n[1]||(n[1]=r=>v.value=r)},{default:o(()=>[d(" فقط کاربران با ثبت‌نام کامل (نام و نام خانوادگی) ")]),_:1},8,["checked"]),s(B(ae),{checked:w.value,"onUpdate:checked":n[2]||(n[2]=r=>w.value=r)},{default:o(()=>[d(" افزودن نام اپلیکیشن به انتهای پیام ")]),_:1},8,["checked"])]),a("div",Fe,[s(_,{loading:k.value,onClick:E},{default:o(()=>[d(" پیش‌نمایش گیرندگان ")]),_:1},8,["loading"]),s(_,{onClick:n[3]||(n[3]=r=>S.value=!0)},{default:o(()=>[d(" ارسال تست ")]),_:1}),s(_,{type:"primary",loading:R.value,disabled:!f.value.trim(),onClick:G},{default:o(()=>[d(" ارسال به انتخاب‌شده‌ها ("+u(P.value.length)+") ",1)]),_:1},8,["loading","disabled"]),s(_,{type:"primary",ghost:"",loading:R.value,disabled:!f.value.trim(),onClick:H},{default:o(()=>[d(" ارسال به همه فیلترشده‌ها ")]),_:1},8,["loading","disabled"])])]),a("div",Oe,[Ve,l.value?(h(),b("div",je,[a("div",null,[d("تعداد گیرنده: "),a("strong",null,u(l.value.totalRecipients),1)]),a("div",null,[d("شماره یکتا: "),a("strong",null,u(l.value.uniquePhones),1)]),a("div",null,[d("پارت پیامک (هر نفر): "),a("strong",null,u(l.value.smsPartsPerRecipient),1)]),a("div",null,[d("تخمین کل پارت: "),a("strong",null,u(l.value.estimatedTotalParts),1)]),l.value.cappedAt?(h(),b("div",Ee," حداکثر "+u(l.value.cappedAt)+" گیرنده در هر ارسال ",1)):A("",!0)])):(h(),b("div",ze," برای مشاهده تعداد گیرندگان، پیش‌نمایش بگیرید. ")),(p=(e=l.value)==null?void 0:e.samples)!=null&&p.length?(h(),b("div",Ge,[He,a("ul",Je,[(h(!0),b(re,null,ge(l.value.samples,r=>(h(),b("li",{key:r.id},u(r.first_name)+" "+u(r.last_name)+" — "+u(r.phone),1))),128))])])):A("",!0),y.value?(h(),b("div",Qe,[We,a("div",null,[d("کمپین: "),a("strong",null,"#"+u(y.value.campaignId),1)]),a("div",null,[d("گیرندگان: "),a("strong",null,u(y.value.totalRecipients),1)]),a("div",Xe,u(y.value.message),1)])):A("",!0)])]),a("div",Ye,[Ze,s(M,Y(j.value,{"row-selection":V.value,onRegister:B(x)}),null,16,["row-selection","onRegister"])]),s(U,{visible:S.value,"onUpdate:visible":n[5]||(n[5]=r=>S.value=r),title:"ارسال پیامک تست",onOk:z,onCancel:n[6]||(n[6]=r=>S.value=!1),"confirm-loading":K.value},{default:o(()=>[a("div",et,[a("div",null,[tt,s(B(se),{value:C.value,"onUpdate:value":n[4]||(n[4]=r=>C.value=r),placeholder:"مثال: 09123456789"},null,8,["value"])]),at])]),_:1},8,["visible","confirm-loading"])])}}}),nt={pending:"در انتظار",sending:"در حال ارسال",completed:"تکمیل شده",failed:"ناموفق"},lt={selected:"انتخاب‌شده",filtered:"فیلترشده"},ot=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:t=>t.index+1},{title:"شناسه",dataIndex:"id",key:"id",filterable:!1},{title:"متن پیام",dataIndex:"message",key:"message",filterable:!1,customRender:t=>{const i=t.record.message||"";return i.length>60?`${i.slice(0,60)}...`:i}},{title:"گیرندگان",dataIndex:"total_recipients",key:"total_recipients",filterable:!1},{title:"پیشرفت",dataIndex:"sent_count",key:"progress",filterable:!1,customRender:t=>{const i=t.record;if(!i.total_recipients)return"-";const g=(i.sent_count||0)+(i.failed_count||0),x=Math.round(g/i.total_recipients*100);return`${g}/${i.total_recipients} (${x}%)`}},{title:"ناموفق",dataIndex:"failed_count",key:"failed_count",filterable:!1},{title:"نوع ارسال",dataIndex:"send_mode",key:"send_mode",filterable:!1,customRender:t=>lt[t.record.send_mode]||t.record.send_mode},{title:"وضعیت",dataIndex:"status",key:"status",filterable:!1,customRender:t=>nt[t.record.status]||t.record.status},{title:"تاریخ",dataIndex:"created_at",key:"created_at",filterable:!1,customRender:t=>t.record.created_at?ee(t.record.created_at):"-"},{title:"عملیات",dataIndex:"action",key:"action",slot:"action",filterable:!1,align:"center"}],it={pending:"در انتظار",sent:"ارسال شده",failed:"ناموفق"},rt=[{title:"ردیف",dataIndex:"id",key:"row_index",filterable:!1,customRender:t=>t.index+1},{title:"نام",dataIndex:"first_name",key:"first_name",filterable:!1},{title:"نام خانوادگی",dataIndex:"last_name",key:"last_name",filterable:!1},{title:"شماره",dataIndex:"phone",key:"phone",filterable:!1},{title:"وضعیت",dataIndex:"status",key:"status",filterable:!1,customRender:t=>it[t.record.status]||t.record.status},{title:"زمان ارسال",dataIndex:"sent_at",key:"sent_at",filterable:!1,customRender:t=>t.record.sent_at?ee(t.record.sent_at):"-"},{title:"خطا",dataIndex:"error_message",key:"error_message",filterable:!1,customRender:t=>t.record.error_message||"-"}],ct={key:0,class:"mb-3 text-sm text-blue-600 flex items-center gap-2"},dt=a("span",null,"یک یا چند کمپین در حال ارسال است — جدول هر ۵ ثانیه به‌روز می‌شود.",-1),ut={class:"gap-2 flex justify-center"},mt=a("span",null,"جزئیات کمپین",-1),pt={class:"text-green-600"},_t={class:"text-red-600"},ft={key:0,class:"text-gray-500 mr-2"},vt={class:"whitespace-pre-wrap text-sm"},gt={class:"flex flex-wrap gap-2 items-center mb-3"},ht=a("span",{class:"text-sm text-gray-600"},"فیلتر وضعیت گیرندگان:",-1),bt=Z({__name:"CampaignsPanel",setup(t,{expose:i}){const[g,x]=X(),[T,f]=X(),v=c(!1),w=c(!1),l=c(null),k=c(null),R=c(),y=c(""),S=c(!1);let C=null;const K={pending:"در انتظار",sending:"در حال ارسال",completed:"تکمیل شده",failed:"ناموفق"},P={selected:"انتخاب‌شده",filtered:"فیلترشده"},L=c({columns:ot,api:te,defaultPageLimit:20,height:"55vh"}),V=ie(()=>{var p;if(!((p=l.value)!=null&&p.campaign))return 0;const e=l.value.campaign;return Math.max(e.total_recipients-e.sent_count-e.failed_count,0)});async function te(e){const p=await Ue(e);return S.value=p.rows.some(r=>r.status==="sending"),p}const j=c({columns:rt,api:O,defaultPageLimit:20,height:"40vh",showOptionHeader:!1});function N(e){return K[e]||e}function E(e){return P[e]||e}function z(e){return e?ee(e):"-"}async function O(e){if(!k.value)return{rows:[],total:0,query:{...e,total:0}};const p=await ne(k.value,{page:e.page,limit:e.limit,status:R.value,search:y.value||e.search||void 0});l.value=p;const r=e.page||1,q=e.limit||20,J=(r-1)*q;return{rows:p.recipients.rows.map((I,Q)=>({...I,index:J+Q})),total:p.recipients.total,query:{...e,total:p.recipients.total,page:r,limit:q}}}async function G(e){w.value=!0;try{k.value=e,l.value=await ne(e,{page:1,limit:20,status:R.value,search:y.value||void 0}),await f()}finally{w.value=!1}}function H(e){R.value=void 0,y.value="",v.value=!0,G(e.id)}function m(){v.value=!1,l.value=null,k.value=null}function n(){f()}function _(){x()}function M(){C||(C=setInterval(()=>{var e;x(),v.value&&k.value&&((e=l.value)==null?void 0:e.campaign.status)==="sending"&&f()},5e3))}function U(){C&&(clearInterval(C),C=null)}return he(()=>{M()}),be(()=>{U()}),i({reload:_}),(e,p)=>{const r=Re,q=oe,J=_e,I=Ce,Q=Ie,W=$e,ce=Te,de=we,ue=le;return h(),b("div",null,[S.value?(h(),b("div",ct,[s(r,{size:"small"}),dt])):A("",!0),s(q,Y(L.value,{onRegister:B(g)}),{action:o(({record:D})=>[a("div",ut,[s(B(Se),{class:"cursor-pointer"},{title:o(()=>[mt]),default:o(()=>[s(ke,{icon:"vuesax-linear:eye",color:"#1D4ED8",onClick:xt=>H(D)},null,8,["onClick"])]),_:2},1024)])]),_:1},16,["onRegister"]),s(ue,{visible:v.value,"onUpdate:visible":p[2]||(p[2]=D=>v.value=D),title:"جزئیات کمپین پیامکی","custom-footer":"",width:"90%",onClose:m},{footer:o(()=>[s(J,{onClick:m},{default:o(()=>[d("بستن")]),_:1})]),default:o(()=>[s(r,{spinning:w.value},{default:o(()=>[l.value?(h(),b(re,{key:0},[s(Q,{bordered:"",column:2,size:"small",class:"mb-4"},{default:o(()=>[s(I,{label:"شناسه کمپین"},{default:o(()=>[d("#"+u(l.value.campaign.id),1)]),_:1}),s(I,{label:"وضعیت"},{default:o(()=>[d(u(N(l.value.campaign.status)),1)]),_:1}),s(I,{label:"تعداد گیرندگان"},{default:o(()=>[d(u(l.value.campaign.total_recipients),1)]),_:1}),s(I,{label:"موفق / ناموفق"},{default:o(()=>[a("span",pt,u(l.value.campaign.sent_count),1),d(" / "),a("span",_t,u(l.value.campaign.failed_count),1),l.value.campaign.status==="sending"?(h(),b("span",ft," ("+u(V.value)+" در انتظار) ",1)):A("",!0)]),_:1}),s(I,{label:"نوع ارسال"},{default:o(()=>[d(u(E(l.value.campaign.send_mode)),1)]),_:1}),s(I,{label:"تاریخ ایجاد"},{default:o(()=>[d(u(z(l.value.campaign.created_at)),1)]),_:1}),s(I,{label:"ایجادکننده",span:2},{default:o(()=>[d(u(l.value.campaign.created_by_admin_name||"-"),1)]),_:1}),s(I,{label:"متن پیام",span:2},{default:o(()=>[a("div",vt,u(l.value.campaign.message),1)]),_:1})]),_:1}),a("div",gt,[ht,s(ce,{value:R.value,"onUpdate:value":p[0]||(p[0]=D=>R.value=D),"allow-clear":"",placeholder:"همه",style:{width:"160px"},onChange:n},{default:o(()=>[s(W,{value:"sent"},{default:o(()=>[d("ارسال شده")]),_:1}),s(W,{value:"failed"},{default:o(()=>[d("ناموفق")]),_:1}),s(W,{value:"pending"},{default:o(()=>[d("در انتظار")]),_:1})]),_:1},8,["value"]),s(de,{value:y.value,"onUpdate:value":p[1]||(p[1]=D=>y.value=D),placeholder:"جستجو نام یا شماره",style:{width:"220px"},onSearch:n},null,8,["value"])]),s(q,Y(j.value,{onRegister:B(T)}),null,16,["onRegister"])],64)):A("",!0)]),_:1},8,["spinning"])]),_:1},8,["visible"])])}}}),yt=a("div",{class:"flex justify-between items-center mb-4"},[a("h2",null,"پنل پیامکی")],-1),Zt=Z({__name:"index",setup(t){const i=c("send"),g=c(null);function x(){var T;i.value="campaigns",(T=g.value)==null||T.reload()}return(T,f)=>{const v=Pe,w=Be,l=me;return h(),b("div",null,[s(l,null,{default:o(()=>[yt,s(w,{activeKey:i.value,"onUpdate:activeKey":f[0]||(f[0]=k=>i.value=k)},{default:o(()=>[s(v,{key:"send",tab:"ارسال پیامک"},{default:o(()=>[s(st,{onCampaignStarted:x})]),_:1}),s(v,{key:"campaigns",tab:"کمپین‌های ارسالی"},{default:o(()=>[s(bt,{ref_key:"campaignsPanelRef",ref:g},null,512)]),_:1})]),_:1},8,["activeKey"])]),_:1})])}}});export{Zt as default};