邹方成 642b3cf7dd
Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 50s
build: 更新前端构建产物和资源文件
更新了前端构建产物包括JavaScript、CSS和HTML文件,主要涉及以下变更:

1. 新增了多个组件和工具函数,包括异常页面组件、iframe组件等
2. 更新了活动管理、产品管理、优惠券管理等业务模块
3. 优化了构建配置和依赖管理
4. 修复了一些样式和功能问题
5. 更新了测试相关文件

同时更新了部分后端服务接口和测试用例。这些变更主要是为了支持新功能和改进现有功能的用户体验。
2025-11-21 01:24:13 +08:00

2 lines
32 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>&quot;验证&quot;</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};