Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 50s
更新了前端构建产物包括JavaScript、CSS和HTML文件,主要涉及以下变更: 1. 新增了多个组件和工具函数,包括异常页面组件、iframe组件等 2. 更新了活动管理、产品管理、优惠券管理等业务模块 3. 优化了构建配置和依赖管理 4. 修复了一些样式和功能问题 5. 更新了测试相关文件 同时更新了部分后端服务接口和测试用例。这些变更主要是为了支持新功能和改进现有功能的用户体验。
2 lines
32 KiB
JavaScript
2 lines
32 KiB
JavaScript
var e=(e,t,s)=>new Promise((l,a)=>{var d=e=>{try{r(s.next(e))}catch(t){a(t)}},i=e=>{try{r(s.throw(e))}catch(t){a(t)}},r=e=>e.done?l(e.value):Promise.resolve(e.value).then(d,i);r((s=s.apply(e,t)).next())});import{d as t,e as s,r as l,c as a,f as d,y as i,a as r,o as n,j as c,m as o,k as u,q as v,b as p,w as g,H as x,I as f,G as m,p as y,N as h,X as _,i as b,bb as w,J as k,T as I}from"./index-BeZn6wgH.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{f as j}from"./activity-CHlmgh7M.js";import{g as C,l as F,n as q,p as z,s as V,q as D,i as E,r as A,t as R,v as H}from"./adminActivities-Dndna7OD.js";import{f as $}from"./product-BgjZetTQ.js";import{a as M,E as S}from"./index-B43cMk6T.js";import{E as U}from"./index-BXzCnZ_d.js";import{E as B}from"./index-rM5MDBEe.js";import{E as L}from"./index-BtwYQklV.js";import{_ as P}from"./_plugin-vue_export-helper-BCo6x5W8.js";import"./index-CnhjG_Ys.js";import"./index-A3hG-0VQ.js";import"./index-DC47MImW.js";import"./index-s8Fl0Qzt.js";import"./token-DWNpOE8r.js";import"./castArray-BakW2F2h.js";import"./debounce-C7sIggI-.js";import"./_baseIteratee-sVeOpCU9.js";import"./index-DZdoPtEQ.js";import"./index-DdvpTWQd.js";const G={class:"art-card p-5"},J={class:"mb-6"},O={class:"flex items-center justify-between"},K={class:"flex items-center space-x-4"},N={class:"text-sm text-gray-500"},T={key:0,class:"text-blue-600"},X={key:1},Y={key:0,class:"mt-4 pt-4 border-t border-gray-200"},Q={class:"flex items-center justify-between"},W={key:0},Z={key:1},ee={class:"text-sm text-gray-500"},te={key:0,class:"text-green-600"},se={key:1},le={class:"space-y-6"},ae={class:"grid grid-cols-1 md:grid-cols-4 gap-4"},de={class:"flex items-center gap-3"},ie={key:0,class:"grid grid-cols-1 md:grid-cols-3 gap-4"},re={class:"col-span-2"},ne={class:"border border-gray-200 rounded-lg p-3 bg-white"},ce={class:"flex items-center justify-between mb-3"},oe={class:"flex items-center gap-2"},ue={class:"text-xs text-gray-500"},ve={class:"mb-3"},pe={key:0,class:"text-xs text-gray-500"},ge={class:"mb-3 flex flex-wrap gap-2"},xe={class:"max-h-40 overflow-y-auto space-y-2"},fe={class:"flex items-center gap-2"},me=["src"],ye={class:"text-sm font-medium"},he={class:"text-xs text-gray-500"},_e={key:0,class:"text-center py-4 text-gray-500"},be={key:1,class:"text-center py-4 text-gray-500"},we={class:"flex flex-col gap-3"},ke={key:0,class:"p-3 bg-yellow-50 rounded-lg border border-yellow-200"},Ie={class:"flex gap-2"},je={key:1,class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Ce={class:"p-4 bg-blue-50 rounded-lg"},Fe={class:"text-lg font-semibold text-blue-600"},qe={class:"p-4 bg-green-50 rounded-lg"},ze={class:"text-lg font-semibold text-green-600"},Ve={class:"p-4 bg-purple-50 rounded-lg"},De={class:"text-lg font-semibold text-purple-600"},Ee={key:2,class:"p-4 bg-yellow-50 rounded-lg border border-yellow-200"},Ae={key:3,class:"p-4 bg-orange-50 rounded-lg border border-orange-200 mb-4"},Re={class:"flex items-center gap-3"},He={class:"flex-1"},$e={class:"font-medium text-orange-800"},Me={class:"text-orange-700 text-sm mt-1"},Se={class:"font-medium"},Ue={key:4,class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Be={class:"p-4 bg-orange-50 rounded-lg"},Le={class:"text-2xl font-bold text-orange-600"},Pe={class:"p-4 bg-cyan-50 rounded-lg"},Ge={class:"text-2xl font-bold text-cyan-600"},Je={class:"p-4 bg-pink-50 rounded-lg"},Oe={class:"text-2xl font-bold text-pink-600"},Ke={class:"grid grid-cols-1 md:grid-cols-4 gap-4"},Ne={class:"p-4 bg-blue-50 rounded-lg"},Te={class:"text-2xl font-bold text-blue-600"},Xe={class:"p-4 bg-red-50 rounded-lg"},Ye={class:"text-2xl font-bold text-red-600"},Qe={class:"p-4 bg-green-50 rounded-lg"},We={class:"text-2xl font-bold text-green-600"},Ze={class:"p-4 bg-purple-50 rounded-lg"},et={class:"text-2xl font-bold text-purple-600"},tt={key:5,class:"art-card"},st={class:"art-card-header"},lt={class:"flex items-center gap-2"},at={key:0,class:"overflow-auto"},dt={class:"w-full text-sm"},it={class:"py-3 px-2"},rt={class:"font-medium"},nt={class:"text-xs text-gray-500"},ct={class:"py-3 px-2 text-right"},ot={class:"py-3 px-2 text-right"},ut={class:"py-3 px-2 text-right"},vt={key:0,class:"font-mono"},pt={key:1},gt={class:"py-3 px-2 text-right"},xt={class:"py-3 px-2"},ft={key:0,class:"text-sm"},mt={key:0,class:"text-xs text-green-600"},yt={key:1,class:"text-xs text-orange-500",title:"该商品暂无定价,盈亏分析中视为0元"},ht={key:1,class:"text-gray-400 text-sm",title:"虚拟奖品无成本,盈亏分析中视为0元"},_t={key:6,class:"art-card"},bt={class:"art-card-header"},wt={class:"flex items-center gap-2"},kt={class:"overflow-auto"},It={class:"w-full text-sm"},jt={class:"py-3 px-2"},Ct={class:"font-medium"},Ft={class:"text-xs text-gray-500"},qt={class:"py-3 px-2"},zt={class:"font-medium"},Vt={key:0,class:"text-xs text-gray-500"},Dt={class:"py-3 px-2 text-right"},Et={class:"py-3 px-2"},At={key:0,class:"text-green-600"},Rt={key:1,class:"text-gray-500"},Ht={class:"py-3 px-2 text-center"},$t={class:"py-3 px-2 text-center"},Mt={key:1,class:"text-gray-400"},St={key:7,class:"art-card"},Ut={class:"art-card-header"},Bt={class:"title"},Lt={class:"flex items-center gap-2"},Pt={class:"mb-4 p-3 bg-green-50 rounded-lg border border-green-200"},Gt={class:"flex items-start gap-2"},Jt={class:"text-green-800 text-sm"},Ot={class:"space-y-1"},Kt={class:"mb-4 p-3 bg-blue-50 rounded-lg"},Nt={key:0,class:"mt-2 text-orange-700 text-xs"},Tt={class:"overflow-auto"},Xt={class:"w-full text-sm"},Yt={class:"py-3 px-2"},Qt={class:"font-medium"},Wt={class:"text-xs text-gray-500"},Zt={class:"py-3 px-2 text-right"},es={class:"py-3 px-2 text-right"},ts={class:"py-3 px-2 text-right"},ss={class:"py-3 px-2 text-right"},ls={class:"py-3 px-2 text-right"},as={key:0,class:"text-green-600"},ds={class:"font-semibold"},is={class:"text-xs text-gray-500"},rs={key:1,class:"text-gray-400"},ns={class:"py-3 px-2 text-right font-semibold"},cs=P(t({__name:"index",setup(t){const P=s([]),cs=s([]),os=s([]),us=s([]),vs=s({activityId:void 0,issueId:void 0,samples:1e3}),ps=l(!1),gs=l(!1),xs=l(!1),fs=l(0),ms=l(null),ys=l([]),hs=s({}),_s=l(!0),bs=s([]),ws=l(!1),ks=l(""),Is=l("all"),js=[{key:"all",label:"全部用户"},{key:"selected",label:"已选择"},{key:"unselected",label:"未选择"}],Cs=s([]),Fs=s({revenue:0,payout:0,profit:0,margin:0}),qs=a(()=>{let e=us;if(ks.value){const t=ks.value.toLowerCase();e=e.filter(e=>e.nickname.toLowerCase().includes(t)||e.id.toString().includes(t))}return"selected"===Is.value?e=e.filter(e=>bs.includes(e.id)):"unselected"===Is.value&&(e=e.filter(e=>!bs.includes(e.id))),e}),zs=a(()=>ys.value.map(e=>({rewardId:e.reward_id,name:e.name,weight:e.weight,quantity:e.quantity,expectedRate:e.expected_rate,count:e.count,observedRate:e.observed_rate}))),Vs=a(()=>{const e={},t=os.filter(e=>e.weight>0&&0!==e.quantity),s=t.reduce((e,t)=>e+t.weight,0);return t.forEach(t=>{e[t.id]=t.weight/s}),e}),Ds=a(()=>os.filter(e=>!e.product_id||0===Ws(e.id))),Es=a(()=>Ds.value.length>0),As=(e,t)=>{const s=Math.abs(e-t);return s<=.001?"text-green-600":s<=.01?"text-yellow-600":"text-red-600"},Rs=e=>{const t=["info","success","warning","danger","primary"];return t[e%t.length]||"info"},Hs=e=>{switch(e){case 1:return"A";case 2:return"B";case 3:return"C";case 4:return"D";default:return String(e)}},$s=e=>{const t=Ls.value.find(t=>t.id===e);return t?t.name:`商品${e}`},Ms=e=>{const t=us.find(t=>t.id===e);return t?t.nickname:`用户${e}`},Ss=()=>e(this,null,function*(){const e=yield j({page:1,page_size:50});P.splice(0,P.length,...e.records.map(e=>({id:e.id,name:e.name,priceDraw:e.priceDraw}))),!vs.activityId&&P.length&&(vs.activityId=P[0].id,yield Us())}),Us=()=>e(this,null,function*(){if(!vs.activityId)return;const e=yield C(vs.activityId);ms.value={id:e.id,name:e.name,priceDraw:e.price_draw||0},fs.value=e.price_draw||0;const t=yield F(vs.activityId,1,50);cs.splice(0,cs.length,...t.list.map(e=>({id:e.id,issue_number:e.issue_number}))),cs.length&&(vs.issueId=cs[0].id,yield Bs())}),Bs=()=>e(this,null,function*(){if(!vs.issueId||!vs.activityId)return;const e=yield q(vs.activityId,vs.issueId);os.splice(0,os.length,...e.list.map(e=>({id:e.id,product_id:e.product_id,name:e.name,weight:e.weight,quantity:e.quantity,level:e.level,sort:e.sort,is_boss:e.is_boss}))),yield Gs(),yield Js()}),Ls=l([]),Ps=new Map,Gs=()=>e(this,null,function*(){try{const e=yield $({page:1,page_size:1e3});Ls.value=e.list.map(e=>({id:e.id,name:e.name})),e.list.forEach(e=>{Ps.set(e.id,e.price)}),os.forEach(e=>{e.product_id&&Ps.has(e.product_id)?hs[e.id]=Ps.get(e.product_id)||0:hs[e.id]=0});const t=os.filter(e=>hs[e.id]>0).length;if(t<os.length){os.filter(e=>0===hs[e.id])}}catch(e){I.error("加载产品价格失败,将使用默认价格0"),os.forEach(e=>{hs[e.id]=0})}}),Js=()=>e(this,null,function*(){xs.value=!0;try{const e=yield z({page:1,page_size:100});us.splice(0,us.length,...e.list)}catch(e){I.error("加载用户列表失败: "+e.message)}finally{xs.value=!1}}),Os=()=>e(this,null,function*(){var e,t;if(vs.activityId&&vs.issueId)if(vs.samples<100)I.warning("样本数至少为100");else if(0!==os.length){ps.value=!0;try{const e=yield V(vs.activityId,vs.issueId,{samples:vs.samples});ys.value=e.stats.map(e=>({reward_id:e.reward_id,name:e.name,weight:e.weight,quantity:e.quantity,expected_rate:e.expected_rate,count:e.count,observed_rate:e.observed_rate})),el(),I.success(`模拟完成!共模拟 ${vs.samples} 次抽奖`)}catch(s){20515===(null==(t=null==(e=s.response)?void 0:e.data)?void 0:t.code)?I.error("奖池配置错误:未找到有效的奖品承诺,请检查奖品配置和库存"):I.error("模拟失败: "+s.message)}finally{ps.value=!1}}else I.warning("当前期没有配置奖品,无法进行模拟");else I.warning("请先选择活动和期")}),Ks=()=>e(this,null,function*(){var e,t;if(0!==bs.length)if(vs.activityId&&vs.issueId)if(0!==os.length){gs.value=!0;try{const e=yield D(vs.activityId,vs.issueId,{user_ids:bs});Cs.splice(0,Cs.length,...e.draws.map(e=>{if(e.receipt){["algo_version","issue_id","draw_id","client_seed","server_seed_hash","items_root","weights_total","selected_index","rand_proof"].filter(t=>!e.receipt[t]).length}return{user_id:e.user_id,draw_id:e.draw_id,reward_id:e.reward_id,reward_name:e.reward_name,is_winner:e.is_winner,receipt:e.receipt}})),I.success(`抽奖完成,共 ${e.draws.length} 次抽奖`)}catch(s){20515===(null==(t=null==(e=s.response)?void 0:e.data)?void 0:t.code)?I.error("奖池配置错误:未找到有效的奖品承诺,请检查奖品配置和库存"):I.error("抽奖失败: "+s.message)}finally{gs.value=!1}}else I.warning("当前期没有配置奖品,无法进行抽奖");else I.warning("请先选择活动和期");else I.warning("请先选择用户")}),Ns=t=>e(this,null,function*(){var e,s,l,a;if(!t.receipt)return void I.warning("该抽奖结果没有验证凭据");const d=["algo_version","issue_id","draw_id","client_seed","server_seed_hash","items_root","weights_total","selected_index","rand_proof"];let i=t.receipt;if(d.filter(e=>void 0===i[e]||null===i[e]).length>0){try{if(!i.issue_id&&vs.issueId&&(i.issue_id=vs.issueId),!i.server_seed_hash||!i.items_root||!i.weights_total){const e=yield E(vs.activityId,vs.issueId);e&&(i.algo_version=i.algo_version||e.algo_version,i.issue_id=i.issue_id||e.issue_id,i.server_seed_hash=i.server_seed_hash||e.server_seed_hash,i.items_root=i.items_root||e.items_root,i.weights_total=i.weights_total||e.weights_total)}if(["client_seed","selected_index","rand_proof"].some(e=>void 0===i[e]||null===i[e])){const l=i.draw_id||t.draw_id;if(l){const t=yield A(l);t&&(i.draw_id=null!=(e=i.draw_id)?e:t.draw_id,i.client_seed=i.client_seed||t.client_seed,i.selected_index=i.selected_index||t.selected_index,i.rand_proof=i.rand_proof||t.rand_proof,i.items_root=i.items_root||t.items_root,i.weights_total=i.weights_total||t.weights_total,i.server_seed_hash=i.server_seed_hash||t.server_seed_hash)}else if(i.draw_log_id){const e=yield R(i.draw_log_id);e&&(i.draw_id=null!=(s=i.draw_id)?s:e.draw_id,i.client_seed=i.client_seed||e.client_seed,i.selected_index=i.selected_index||e.selected_index,i.rand_proof=i.rand_proof||e.rand_proof,i.items_root=i.items_root||e.items_root,i.weights_total=i.weights_total||e.weights_total,i.server_seed_hash=i.server_seed_hash||e.server_seed_hash)}t.receipt=i}}catch(r){}const l=d.filter(e=>void 0===i[e]||null===i[e]);if(l.length>0)return void I.error(`验证失败:缺少必填字段 ${l.join(", ")}`)}t.verifying=!0;try{const e={algo_version:i.algo_version,issue_id:i.issue_id,draw_id:i.draw_id,client_seed:i.client_seed,server_seed_hash:i.server_seed_hash,items_root:i.items_root,weights_total:i.weights_total,selected_index:i.selected_index,rand_proof:i.rand_proof},s=yield H(vs.activityId,vs.issueId,e);t.verified=!0,t.verify_result=s.valid,s.valid?I.success("验证通过"):I.error("验证失败: "+s.message)}catch(n){(null==(a=null==(l=n.response)?void 0:l.data)?void 0:a.message)?I.error("验证失败: "+n.response.data.message):I.error("验证失败: "+n.message)}finally{t.verifying=!1}}),Ts=()=>e(this,null,function*(){const e=Cs.filter(e=>!e.verified&&e.receipt);if(0!==e.length)for(const t of e)yield Ns(t);else I.info("没有需要验证的结果")}),Xs=()=>{bs.splice(0,bs.length),ws.value=!1},Ys=()=>{ws.value?bs.splice(0,bs.length,...qs.value.map(e=>e.id)):bs.splice(0,bs.length)},Qs=()=>{Cs.splice(0,Cs.length)},Ws=e=>hs[e]||0,Zs=()=>{const e=os.filter(e=>Ws(e.id)>0);return 0===e.length?0:e.reduce((e,t)=>e+Ws(t.id),0)/e.length},el=()=>{const e=fs.value*vs.samples;let t=0;ys.value.forEach(e=>{t+=e.count*Ws(e.reward_id)});const s=e-t,l=e>0?s/e:0;Fs.revenue=e,Fs.payout=t,Fs.profit=s,Fs.margin=l};return d(()=>{Ss()}),i([ks,Is],()=>{ws.value=bs.length===qs.value.length&&qs.value.length>0}),(e,t)=>{const s=M,l=S,a=U,d=h,i=B,I=L,j=k;return n(),r("div",G,[t[61]||(t[61]=c("div",{class:"art-card-header"},[c("div",{class:"title"},[c("h4",null,"抽奖模拟盈亏分析"),c("p",null,"基于期奖池配置与随机承诺,模拟抽奖并计算盈亏")])],-1)),c("div",J,[c("div",O,[c("div",K,[c("div",{class:u(["flex items-center space-x-2",vs.activityId?"text-green-600":"text-gray-400"])},[c("div",{class:u(["w-6 h-6 rounded-full border-2 flex items-center justify-center text-sm font-bold",vs.activityId?"border-green-600 bg-green-50":"border-gray-300"])}," 1 ",2),t[8]||(t[8]=c("span",null,"选择活动",-1))],2),c("div",{class:u(["flex items-center space-x-2",vs.issueId?"text-green-600":"text-gray-400"])},[c("div",{class:u(["w-6 h-6 rounded-full border-2 flex items-center justify-center text-sm font-bold",vs.issueId?"border-green-600 bg-green-50":"border-gray-300"])}," 2 ",2),t[9]||(t[9]=c("span",null,"选择期",-1))],2),c("div",{class:u(["flex items-center space-x-2",vs.activityId&&vs.issueId?"text-blue-600":"text-gray-400"])},[c("div",{class:u(["w-6 h-6 rounded-full border-2 flex items-center justify-center text-sm font-bold",vs.activityId&&vs.issueId?"border-blue-600 bg-blue-50":"border-gray-300"])}," 3 ",2),t[10]||(t[10]=c("span",null,"模拟分析",-1))],2)]),c("div",N,[vs.activityId&&vs.issueId?(n(),r("span",T,"✓ 可进行模拟分析")):(n(),r("span",X,"请先选择活动和期"))])]),vs.activityId&&vs.issueId?(n(),r("div",Y,[c("div",Q,[c("div",{class:u(["flex items-center space-x-2",bs.length>0?"text-green-600":"text-gray-400"])},[c("div",{class:u(["w-6 h-6 rounded-full border-2 flex items-center justify-center text-sm font-bold",bs.length>0?"border-green-600 bg-green-50":"border-gray-300"])},[bs.length>0?(n(),r("span",W,"✓")):(n(),r("span",Z,"👤"))],2),t[11]||(t[11]=c("span",null,"用户抽奖验证",-1))],2),c("div",ee,[bs.length>0?(n(),r("span",te,"已选择 "+v(bs.length)+" 个用户",1)):(n(),r("span",se,"选择用户进行抽奖验证"))])])])):o("",!0)]),c("div",le,[c("div",ae,[p(l,{modelValue:vs.activityId,"onUpdate:modelValue":t[0]||(t[0]=e=>vs.activityId=e),placeholder:"选择活动",onChange:Us},{default:g(()=>[(n(!0),r(x,null,f(P,e=>(n(),m(s,{key:e.id,label:e.name,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),p(l,{modelValue:vs.issueId,"onUpdate:modelValue":t[1]||(t[1]=e=>vs.issueId=e),placeholder:"选择期",onChange:Bs},{default:g(()=>[(n(!0),r(x,null,f(cs,e=>(n(),m(s,{key:e.id,label:e.issue_number,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),p(a,{modelValue:vs.samples,"onUpdate:modelValue":t[2]||(t[2]=e=>vs.samples=e),min:100,max:2e5,step:100,placeholder:"样本数"},null,8,["modelValue"]),c("div",de,[p(d,{type:"primary",loading:ps.value,onClick:Os,disabled:!vs.activityId||!vs.issueId,icon:"DataAnalysis"},{default:g(()=>[...t[12]||(t[12]=[y(" 运行模拟分析 ",-1)])]),_:1},8,["loading","disabled"]),fs.value>0?(n(),m(i,{key:0,type:"success"},{default:g(()=>[y("门票:¥"+v((fs.value/100).toFixed(2)),1)]),_:1})):o("",!0)])]),vs.activityId&&vs.issueId?(n(),r("div",ie,[t[24]||(t[24]=_('<div class="col-span-3" data-v-1d9f13df><div class="bg-green-50 p-3 rounded-lg border border-green-200 mb-3" data-v-1d9f13df><div class="flex items-center gap-2 text-green-800" data-v-1d9f13df><span class="text-lg" data-v-1d9f13df>✓</span><span class="text-sm font-medium" data-v-1d9f13df>活动与期已选择,现在可以选择用户进行抽奖验证</span></div></div></div>',1)),c("div",re,[c("div",ne,[c("div",ce,[t[14]||(t[14]=c("span",{class:"text-sm font-medium text-gray-700"},"选择用户(用于抽奖验证)",-1)),c("div",oe,[p(I,{modelValue:ws.value,"onUpdate:modelValue":t[3]||(t[3]=e=>ws.value=e),onChange:Ys,disabled:xs.value||0===qs.value.length},{default:g(()=>[...t[13]||(t[13]=[y(" 全选 ",-1)])]),_:1},8,["modelValue","disabled"]),c("span",ue,v(bs.length)+"/"+v(qs.value.length),1)])]),c("div",ve,[p(j,{modelValue:ks.value,"onUpdate:modelValue":t[4]||(t[4]=e=>ks.value=e),placeholder:"搜索用户昵称或ID...",clearable:"","prefix-icon":b(w),size:"small"},{suffix:g(()=>[ks.value?(n(),r("span",pe,v(qs.value.length),1)):o("",!0)]),_:1},8,["modelValue","prefix-icon"])]),c("div",ge,[(n(),r(x,null,f(js,e=>p(i,{key:e.key,type:Is.value===e.key?"primary":"info",size:"small",style:{cursor:"pointer"},onClick:t=>{return s=e.key,void(Is.value=s);var s}},{default:g(()=>[y(v(e.label),1)]),_:2},1032,["type","onClick"])),64))]),c("div",xe,[(n(!0),r(x,null,f(qs.value,e=>(n(),r("div",{key:e.id,class:"flex items-center p-2 rounded hover:bg-gray-50 border border-transparent hover:border-gray-200 transition-all"},[p(I,{"model-value":bs.includes(e.id),onChange:t=>((e,t)=>{if(t)bs.includes(e)||bs.push(e);else{const t=bs.indexOf(e);t>-1&&bs.splice(t,1)}ws.value=bs.length===qs.value.length&&qs.value.length>0})(e.id,t),disabled:xs.value},{default:g(()=>[c("div",fe,[c("img",{src:e.avatar||"https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png",class:"w-6 h-6 rounded-full",onError:t[5]||(t[5]=e=>{e.target.src="https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png"})},null,40,me),c("div",null,[c("div",ye,v(e.nickname),1),c("div",he,"ID: "+v(e.id),1)])])]),_:2},1032,["model-value","onChange","disabled"])]))),128))]),0===qs.value.length&&ks.value&&!xs.value?(n(),r("div",_e,[t[16]||(t[16]=c("div",{class:"text-sm"},"未找到匹配的用户",-1)),p(d,{type:"primary",size:"small",onClick:t[6]||(t[6]=e=>ks.value=""),class:"mt-2"},{default:g(()=>[...t[15]||(t[15]=[y(" 清除搜索 ",-1)])]),_:1})])):o("",!0),0!==us.length||xs.value?o("",!0):(n(),r("div",be,[t[18]||(t[18]=c("div",{class:"text-sm"},"暂无用户数据",-1)),p(d,{type:"primary",size:"small",onClick:Js,class:"mt-2"},{default:g(()=>[...t[17]||(t[17]=[y(" 重新加载 ",-1)])]),_:1})]))])]),c("div",we,[0===bs.length?(n(),r("div",ke,[...t[19]||(t[19]=[c("div",{class:"text-yellow-800 text-sm"},[c("div",{class:"font-medium mb-1"},"💡 请选择用户进行抽奖验证"),c("div",{class:"text-yellow-600 text-xs"}," 从左侧用户列表中选择一个或多个用户,验证抽奖过程的公平性和随机性 ")],-1)])])):o("",!0),p(d,{type:"success",loading:gs.value,onClick:Ks,icon:"MagicStick",disabled:0===bs.length,size:"large"},{default:g(()=>[...t[20]||(t[20]=[y(" 开始抽奖验证 ",-1)])]),_:1},8,["loading","disabled"]),t[23]||(t[23]=_('<div class="p-3 bg-blue-50 rounded-lg border border-blue-200 shadow-sm" data-v-1d9f13df><div class="flex items-start gap-2" data-v-1d9f13df><div class="text-blue-600 text-lg mt-0.5" data-v-1d9f13df>🎯</div><div class="flex-1" data-v-1d9f13df><div class="text-blue-800 font-medium mb-2" data-v-1d9f13df>抽奖验证功能说明</div><div class="text-blue-700 text-sm space-y-1.5" data-v-1d9f13df><p data-v-1d9f13df>• <strong data-v-1d9f13df>验证抽奖公平性:</strong>使用密码学算法验证抽奖结果是否公平、不可篡改</p><p data-v-1d9f13df>• <strong data-v-1d9f13df>HMAC-SHA256验证:</strong>基于服务器种子、客户端种子和奖池状态的加密验证</p><p data-v-1d9f13df>• <strong data-v-1d9f13df>透明可审计:</strong>每个抽奖结果都有唯一的验证凭据,确保过程透明</p></div><div class="mt-2 p-2 bg-white rounded border border-blue-100" data-v-1d9f13df><div class="text-blue-800 text-xs font-medium" data-v-1d9f13df>操作流程:</div><div class="text-blue-600 text-xs mt-1" data-v-1d9f13df>选择用户 → 执行抽奖 → 查看结果 → 验证凭据</div></div></div></div></div>',1)),c("div",Ie,[bs.length>0?(n(),m(d,{key:0,onClick:Xs,icon:"Refresh",size:"small",style:{flex:"1"}},{default:g(()=>[...t[21]||(t[21]=[y(" 清除选择 ",-1)])]),_:1})):o("",!0),Cs.length>0?(n(),m(d,{key:1,onClick:Qs,icon:"Delete",size:"small",style:{flex:"1"}},{default:g(()=>[...t[22]||(t[22]=[y(" 清除结果 ",-1)])]),_:1})):o("",!0)])])])):o("",!0),ms.value?(n(),r("div",je,[c("div",Ce,[t[25]||(t[25]=c("div",{class:"text-sm text-gray-600"},"活动名称",-1)),c("div",Fe,v(ms.value.name),1)]),c("div",qe,[t[26]||(t[26]=c("div",{class:"text-sm text-gray-600"},"门票价格",-1)),c("div",ze,"¥"+v((fs.value/100).toFixed(2)),1)]),c("div",Ve,[t[27]||(t[27]=c("div",{class:"text-sm text-gray-600"},"奖项数量",-1)),c("div",De,v(os.length)+" 个",1)])])):o("",!0),0===os.length&&vs.issueId?(n(),r("div",Ee,[...t[28]||(t[28]=[c("div",{class:"flex items-center gap-3"},[c("div",{class:"text-yellow-600 text-xl"},"⚠️"),c("div",null,[c("div",{class:"text-yellow-800 font-medium"},"当前期未配置奖品"),c("div",{class:"text-yellow-600 text-sm mt-1"},' 请先配置奖品后再进行模拟或抽奖验证,否则会出现"未找到承诺"错误 ')])],-1)])])):o("",!0),Es.value&&os.length>0?(n(),r("div",Ae,[c("div",Re,[t[31]||(t[31]=c("div",{class:"text-orange-600 text-lg"},"💰",-1)),c("div",He,[c("div",$e,"发现 "+v(Ds.value.length)+" 个奖品无定价",1),c("div",Me,[t[29]||(t[29]=y(" 以下奖品未关联商品或商品无价格,盈亏分析中将其视为0元: ",-1)),c("span",Se,v(Ds.value.map(e=>e.name).join("、")),1)]),t[30]||(t[30]=c("div",{class:"text-orange-600 text-xs mt-2"}," 💡 建议:为奖品关联商品并设置价格,以获得准确的盈亏分析结果 ",-1))])])])):o("",!0),os.length>0?(n(),r("div",Ue,[c("div",Be,[t[32]||(t[32]=c("div",{class:"text-sm text-gray-600"},"奖品总价值",-1)),c("div",Le,"¥"+v((os.reduce((e,t)=>e+Ws(t.id),0)/100).toFixed(2)),1),t[33]||(t[33]=c("div",{class:"text-xs text-gray-500 mt-1"},"所有奖品价格总和",-1))]),c("div",Pe,[t[34]||(t[34]=c("div",{class:"text-sm text-gray-600"},"平均奖品价值",-1)),c("div",Ge,"¥"+v((Zs()/100).toFixed(2)),1),t[35]||(t[35]=c("div",{class:"text-xs text-gray-500 mt-1"},"有价格奖品的平均值",-1))]),c("div",Je,[t[36]||(t[36]=c("div",{class:"text-sm text-gray-600"},"高价奖品数量",-1)),c("div",Oe,v(os.filter(e=>Ws(e.id)>=1e4).length),1),t[37]||(t[37]=c("div",{class:"text-xs text-gray-500 mt-1"},"价格 ≥ ¥100的奖品",-1))])])):o("",!0),c("div",Ke,[c("div",Ne,[t[38]||(t[38]=c("div",{class:"text-sm text-gray-600"},"总收入",-1)),c("div",Te,"¥"+v((Fs.revenue/100).toFixed(2)),1)]),c("div",Xe,[t[39]||(t[39]=c("div",{class:"text-sm text-gray-600"},"总支出(奖品成本)",-1)),c("div",Ye,"¥"+v((Fs.payout/100).toFixed(2)),1)]),c("div",Qe,[t[40]||(t[40]=c("div",{class:"text-sm text-gray-600"},"利润",-1)),c("div",We,"¥"+v((Fs.profit/100).toFixed(2)),1)]),c("div",Ze,[t[41]||(t[41]=c("div",{class:"text-sm text-gray-600"},"利润率",-1)),c("div",et,v((100*Fs.margin).toFixed(2))+"%",1)])]),os.length>0?(n(),r("div",tt,[c("div",st,[t[42]||(t[42]=c("div",{class:"title"},[c("h4",null,"奖品详情"),c("p",null,"当前活动期的所有奖品信息和概率统计")],-1)),c("div",lt,[p(d,{type:"primary",size:"small",onClick:t[7]||(t[7]=e=>_s.value=!_s.value)},{default:g(()=>[y(v(_s.value?"隐藏详情":"显示详情"),1)]),_:1})])]),_s.value?(n(),r("div",at,[c("table",dt,[t[44]||(t[44]=c("thead",null,[c("tr",{class:"border-b border-gray-200 bg-gray-50"},[c("th",{class:"text-left py-3 px-2"},"奖项"),c("th",{class:"text-right py-3 px-2"},"权重"),c("th",{class:"text-right py-3 px-2"},"库存"),c("th",{class:"text-right py-3 px-2"},"理论概率"),c("th",{class:"text-right py-3 px-2"},"等级"),c("th",{class:"text-left py-3 px-2"},"商品")])],-1)),c("tbody",null,[(n(!0),r(x,null,f(os,e=>(n(),r("tr",{key:e.id,class:"border-b border-gray-100 hover:bg-gray-50 transition-colors"},[c("td",it,[c("div",rt,v(e.name),1),c("div",nt,"ID: "+v(e.id),1)]),c("td",ct,v(e.weight),1),c("td",ot,[p(i,{type:-1===e.quantity?"info":"primary"},{default:g(()=>[y(v(-1===e.quantity?"不限量":e.quantity),1)]),_:2},1032,["type"])]),c("td",ut,[Vs.value[e.id]?(n(),r("span",vt,v((100*Vs.value[e.id]).toFixed(4))+"% ",1)):(n(),r("span",pt,"-"))]),c("td",gt,[p(i,{type:Rs(e.level)},{default:g(()=>[y(v(Hs(e.level)),1)]),_:2},1032,["type"])]),c("td",xt,[e.product_id?(n(),r("div",ft,[c("div",null,v($s(e.product_id)),1),Ws(e.id)>0?(n(),r("div",mt," ¥"+v((Ws(e.id)/100).toFixed(2)),1)):(n(),r("div",yt," 未定价 "))])):(n(),r("div",ht,[...t[43]||(t[43]=[c("div",null,"无商品",-1),c("div",{class:"text-xs"},"虚拟奖品",-1)])]))])]))),128))])])])):o("",!0)])):o("",!0),Cs.length>0?(n(),r("div",_t,[c("div",bt,[t[46]||(t[46]=c("div",{class:"title"},[c("h4",null,"🎯 抽奖结果与验证"),c("p",null,"抽奖结果的可验证性和公平性检查")],-1)),c("div",wt,[p(d,{type:"success",size:"small",onClick:Ts,icon:"Check",disabled:0===Cs.filter(e=>!e.verified&&e.receipt).length},{default:g(()=>[y(" 验证所有 ("+v(Cs.filter(e=>!e.verified&&e.receipt).length)+") ",1)]),_:1},8,["disabled"]),p(d,{type:"info",size:"small",onClick:Qs,icon:"Refresh"},{default:g(()=>[...t[45]||(t[45]=[y(" 清除结果 ",-1)])]),_:1})])]),t[49]||(t[49]=_('<div class="mb-4 p-3 bg-amber-50 rounded-lg border border-amber-200" data-v-1d9f13df><div class="flex items-start gap-2" data-v-1d9f13df><div class="text-amber-600 text-lg" data-v-1d9f13df>🔍</div><div class="text-amber-800 text-sm" data-v-1d9f13df><div class="font-medium mb-1" data-v-1d9f13df>如何验证抽奖公平性?</div><div class="space-y-1" data-v-1d9f13df><p data-v-1d9f13df>• 每个抽奖结果都包含加密的<strong data-v-1d9f13df>验证凭据</strong>(receipt)</p><p data-v-1d9f13df>• 点击<strong data-v-1d9f13df>"验证"</strong>按钮可验证该结果是否由公平的随机算法产生</p><p data-v-1d9f13df>• 绿色✓表示验证通过,红色✗表示可能存在异常</p><p data-v-1d9f13df>• 使用HMAC-SHA256算法确保结果不可预测且不可篡改</p></div></div></div></div>',1)),c("div",kt,[c("table",It,[t[48]||(t[48]=c("thead",null,[c("tr",{class:"border-b border-gray-200 bg-gray-50"},[c("th",{class:"text-left py-3 px-2"},"用户"),c("th",{class:"text-left py-3 px-2"},"奖项"),c("th",{class:"text-right py-3 px-2"},"是否中奖"),c("th",{class:"text-left py-3 px-2"},"中奖详情"),c("th",{class:"text-center py-3 px-2"},"验证状态"),c("th",{class:"text-center py-3 px-2"},"操作")])],-1)),c("tbody",null,[(n(!0),r(x,null,f(Cs,(e,s)=>(n(),r("tr",{key:s,class:"border-b border-gray-100"},[c("td",jt,[c("div",Ct,v(Ms(e.user_id)),1),c("div",Ft,"ID: "+v(e.user_id),1)]),c("td",qt,[c("div",zt,v(e.reward_name||"随机抽奖"),1),e.reward_id?(n(),r("div",Vt,"ID: "+v(e.reward_id),1)):o("",!0)]),c("td",Dt,[p(i,{type:e.is_winner?"success":"info"},{default:g(()=>[y(v(e.is_winner?"中奖":"未中奖"),1)]),_:2},1032,["type"])]),c("td",Et,[e.is_winner?(n(),r("div",At," 🎉 恭喜获得:"+v(e.reward_name),1)):(n(),r("div",Rt," 谢谢参与,再接再厉! "))]),c("td",Ht,[e.verified?(n(),m(i,{key:0,type:e.verify_result?"success":"danger"},{default:g(()=>[y(v(e.verify_result?"验证通过":"验证失败"),1)]),_:2},1032,["type"])):(n(),m(i,{key:1,type:"info"},{default:g(()=>[...t[47]||(t[47]=[y("未验证",-1)])]),_:1}))]),c("td",$t,[e.receipt?(n(),m(d,{key:0,type:"primary",size:"small",onClick:t=>Ns(e),loading:e.verifying,icon:e.verified?e.verify_result?"Check":"Close":"Key"},{default:g(()=>[y(v(e.verifying?"验证中":e.verified?e.verify_result?"已验证":"验证失败":"验证"),1)]),_:2},1032,["onClick","loading","icon"])):(n(),r("span",Mt,"-"))])]))),128))])])])])):o("",!0),ys.value.length>0?(n(),r("div",St,[c("div",Ut,[c("div",Bt,[t[50]||(t[50]=c("h4",null,"📊 模拟统计结果",-1)),c("p",null,"基于 "+v(vs.samples)+" 次模拟的统计数据,对比理论概率与实际模拟结果",1)]),c("div",Lt,[p(i,{type:"info"},{default:g(()=>[y("样本数: "+v(vs.samples),1)]),_:1}),p(i,{type:Fs.margin>0?"success":"danger"},{default:g(()=>[y(" 利润率: "+v((100*Fs.margin).toFixed(2))+"% ",1)]),_:1},8,["type"])])]),c("div",Pt,[c("div",Gt,[t[57]||(t[57]=c("div",{class:"text-green-600 text-lg"},"📈",-1)),c("div",Jt,[t[56]||(t[56]=c("div",{class:"font-medium mb-1"},"模拟分析说明",-1)),c("div",Ot,[t[53]||(t[53]=c("p",null,[y("• "),c("strong",null,"理论概率:"),y("基于奖品权重计算的期望中奖概率")],-1)),c("p",null,[t[51]||(t[51]=y("• ",-1)),t[52]||(t[52]=c("strong",null,"模拟概率:",-1)),y("通过"+v(vs.samples)+"次随机模拟得到的实际中奖频率",1)]),t[54]||(t[54]=c("p",null,[y("• "),c("strong",null,"盈亏分析:"),y("基于门票收入和奖品成本计算的整体盈利情况")],-1)),t[55]||(t[55]=c("p",null,[y("• "),c("strong",null,"数据对比:"),y("绿色表示模拟结果与理论值接近,红色表示偏差较大")],-1))])])])]),c("div",Kt,[t[58]||(t[58]=c("div",{class:"flex items-center gap-2 text-blue-800 text-sm"},[c("span",{class:"font-semibold"},"💡 价格说明:"),c("span",null,"奖品价格来源于商品管理中的实际售价,虚拟奖品或无商品关联的奖项价格为0")],-1)),Es.value?(n(),r("div",Nt," ⚠️ 当前有 "+v(Ds.value.length)+" 个奖品无有效定价,可能影响盈亏分析准确性 ",1)):o("",!0)]),c("div",Tt,[c("table",Xt,[t[60]||(t[60]=c("thead",null,[c("tr",{class:"border-b border-gray-200 bg-gray-50"},[c("th",{class:"text-left py-3 px-2"},"奖项"),c("th",{class:"text-right py-3 px-2"},"权重"),c("th",{class:"text-right py-3 px-2"},"期内库存"),c("th",{class:"text-right py-3 px-2"},"理论概率"),c("th",{class:"text-right py-3 px-2"},"模拟次数"),c("th",{class:"text-right py-3 px-2"},"模拟概率"),c("th",{class:"text-right py-3 px-2"},"商品价格"),c("th",{class:"text-right py-3 px-2"},"模拟支出")])],-1)),c("tbody",null,[(n(!0),r(x,null,f(zs.value,e=>(n(),r("tr",{key:e.rewardId,class:"border-b border-gray-100"},[c("td",Yt,[c("div",Qt,v(e.name),1),c("div",Wt,"ID: "+v(e.rewardId),1)]),c("td",Zt,v(e.weight),1),c("td",es,v(e.quantity),1),c("td",ts,v((100*e.expectedRate).toFixed(4))+"%",1),c("td",ss,v(e.count),1),c("td",{class:u(["py-3 px-2 text-right",As(e.observedRate,e.expectedRate)])},v((100*e.observedRate).toFixed(4))+"% ",3),c("td",ls,[Ws(e.rewardId)>0?(n(),r("div",as,[c("div",ds,"¥"+v((Ws(e.rewardId)/100).toFixed(2)),1),c("div",is,v(Ws(e.rewardId))+"分",1)])):(n(),r("div",rs,[...t[59]||(t[59]=[c("div",{class:"text-sm"},"无价",-1),c("div",{class:"text-xs"},"虚拟奖品",-1)])]))]),c("td",ns," ¥"+v((e.count*Ws(e.rewardId)/100).toFixed(2)),1)]))),128))])])])])):o("",!0)])])}}}),[["__scopeId","data-v-1d9f13df"]]);export{cs as default};
|