Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 40s
feat(pay): 添加支付API基础结构 feat(miniapp): 创建支付测试小程序页面与配置 feat(wechatpay): 配置微信支付参数与证书 fix(guild): 修复成员列表查询条件 docs: 更新代码规范文档与需求文档 style: 统一前后端枚举显示与注释格式 refactor(admin): 重构用户奖励发放接口参数处理 test(title): 添加称号效果参数验证测试
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,r as s,a as l,c as a,o as d,w as i,e as r,f as n,h as o,k as c,i as u,m as v,p,z as g,F as x,G as m,y as f,l as y,S as h,u as _,aW as b,O as w}from"./index-DBHnxsy6.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{f as k}from"./activity-0udS8Goz.js";import{g as I,l as j,n as C,p as F,s as z,q,i as V,r as E,t as D,v as R}from"./adminActivities-C7lwI2HP.js";import{f as A}from"./product-njVTTbuM.js";/* empty css */import{a as H,E as S}from"./index-CHZ9Ls9_.js";import{E as M}from"./index-B4jq9Ja2.js";import{E as U}from"./index-r0EsCkBw.js";import{E as $}from"./index-D2YpA_om.js";import{E as L}from"./index-DKaQAdbW.js";import{E as G}from"./index-qSQlj0RO.js";import{_ as K}from"./_plugin-vue_export-helper-BCo6x5W8.js";import"./index-B99ckkYy.js";import"./index-nZra831X.js";import"./index-MOpuiu9Z.js";import"./use-form-item-ByasanrX.js";import"./use-form-common-props-BOfz9xGR.js";import"./index-sqhzrW2O.js";import"./token-DWNpOE8r.js";import"./index-DZO7eApA.js";import"./scroll-Cceui3yC.js";import"./debounce-CkazOn_9.js";import"./_baseIteratee-DRiXPtOg.js";import"./index-BC2pRl3S.js";import"./vnode-CqxKQBn0.js";import"./index-CuWUnlSZ.js";import"./index-DfWQjCuY.js";const O={class:"art-card p-5"},P={class:"mb-6"},B={class:"flex items-center justify-between"},J={class:"flex items-center space-x-4"},W={class:"text-sm text-gray-500"},N={key:0,class:"text-blue-600"},Q={key:1},T={key:0,class:"mt-4 pt-4 border-t border-gray-200"},X={class:"flex items-center justify-between"},Y={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"},oe={class:"flex items-center justify-between mb-3"},ce={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"},me={class:"flex items-center gap-2"},fe=["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"},ze={class:"p-4 bg-green-50 rounded-lg"},qe={class:"text-lg font-semibold text-green-600"},Ve={class:"p-4 bg-purple-50 rounded-lg"},Ee={class:"text-lg font-semibold text-purple-600"},De={key:2,class:"p-4 bg-yellow-50 rounded-lg border border-yellow-200"},Re={key:3,class:"p-4 bg-orange-50 rounded-lg border border-orange-200 mb-4"},Ae={class:"flex items-center gap-3"},He={class:"flex-1"},Se={class:"font-medium text-orange-800"},Me={class:"text-orange-700 text-sm mt-1"},Ue={class:"font-medium"},$e={key:4,class:"grid grid-cols-1 md:grid-cols-3 gap-4"},Le={class:"p-4 bg-orange-50 rounded-lg"},Ge={class:"text-2xl font-bold text-orange-600"},Ke={class:"p-4 bg-cyan-50 rounded-lg"},Oe={class:"text-2xl font-bold text-cyan-600"},Pe={class:"p-4 bg-pink-50 rounded-lg"},Be={class:"text-2xl font-bold text-pink-600"},Je={class:"grid grid-cols-1 md:grid-cols-4 gap-4"},We={class:"p-4 bg-blue-50 rounded-lg"},Ne={class:"text-2xl font-bold text-blue-600"},Qe={class:"p-4 bg-red-50 rounded-lg"},Te={class:"text-2xl font-bold text-red-600"},Xe={class:"p-4 bg-green-50 rounded-lg"},Ye={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"},ot={class:"py-3 px-2 text-right"},ct={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"},mt={key:0,class:"text-sm"},ft={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"},zt={class:"py-3 px-2"},qt={class:"font-medium"},Vt={key:0,class:"text-xs text-gray-500"},Et={class:"py-3 px-2 text-right"},Dt={class:"py-3 px-2"},Rt={key:0,class:"text-green-600"},At={key:1,class:"text-gray-500"},Ht={class:"py-3 px-2 text-center"},St={class:"py-3 px-2 text-center"},Mt={key:1,class:"text-gray-400"},Ut={key:7,class:"art-card"},$t={class:"art-card-header"},Lt={class:"title"},Gt={class:"flex items-center gap-2"},Kt={class:"mb-4 p-3 bg-green-50 rounded-lg border border-green-200"},Ot={class:"flex items-start gap-2"},Pt={class:"text-green-800 text-sm"},Bt={class:"space-y-1"},Jt={class:"mb-4 p-3 bg-blue-50 rounded-lg"},Wt={key:0,class:"mt-2 text-orange-700 text-xs"},Nt={class:"overflow-auto"},Qt={class:"w-full text-sm"},Tt={class:"py-3 px-2"},Xt={class:"font-medium"},Yt={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"},os=K(t({__name:"index",setup(t){const K=s([]),os=s([]),cs=s([]),us=s([]),vs=s({activityId:void 0,issueId:void 0,samples:1e3}),ps=l(!1),gs=l(!1),xs=l(!1),ms=l(0),fs=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}),zs=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}),qs=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=cs.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}),Es=a(()=>cs.filter(e=>!e.product_id||0===Ys(e.id))),Ds=a(()=>Es.value.length>0),Rs=(e,t)=>{const s=Math.abs(e-t);return s<=.001?"text-green-600":s<=.01?"text-yellow-600":"text-red-600"},As=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)}},Ss=e=>{const t=Gs.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}`},Us=()=>e(this,null,function*(){const e=yield k({page:1,page_size:50});K.splice(0,K.length,...e.records.map(e=>({id:e.id,name:e.name,priceDraw:e.priceDraw}))),!vs.activityId&&K.length&&(vs.activityId=K[0].id,yield $s())}),$s=()=>e(this,null,function*(){if(!vs.activityId)return;const e=yield I(vs.activityId);fs.value={id:e.id,name:e.name,priceDraw:e.price_draw||0},ms.value=e.price_draw||0;const t=yield j(vs.activityId,1,50);os.splice(0,os.length,...t.list.map(e=>({id:e.id,issue_number:e.issue_number}))),os.length&&(vs.issueId=os[0].id,yield Ls())}),Ls=()=>e(this,null,function*(){if(!vs.issueId||!vs.activityId)return;const e=yield C(vs.activityId,vs.issueId);cs.splice(0,cs.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 Os(),yield Ps()}),Gs=l([]),Ks=new Map,Os=()=>e(this,null,function*(){try{const e=yield A({page:1,page_size:1e3});Gs.value=e.list.map(e=>({id:e.id,name:e.name})),e.list.forEach(e=>{Ks.set(e.id,e.price)}),cs.forEach(e=>{e.product_id&&Ks.has(e.product_id)?hs[e.id]=Ks.get(e.product_id)||0:hs[e.id]=0});const t=cs.filter(e=>hs[e.id]>0).length;if(t<cs.length){cs.filter(e=>0===hs[e.id])}}catch(e){w.error("加载产品价格失败,将使用默认价格0"),cs.forEach(e=>{hs[e.id]=0})}}),Ps=()=>e(this,null,function*(){xs.value=!0;try{const e=yield F({page:1,page_size:100});us.splice(0,us.length,...e.list)}catch(e){w.error("加载用户列表失败: "+e.message)}finally{xs.value=!1}}),Bs=()=>e(this,null,function*(){var e,t;if(vs.activityId&&vs.issueId)if(vs.samples<100)w.warning("样本数至少为100");else if(0!==cs.length){ps.value=!0;try{const e=yield z(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(),w.success(`模拟完成!共模拟 ${vs.samples} 次抽奖`)}catch(s){20515===(null==(t=null==(e=s.response)?void 0:e.data)?void 0:t.code)?w.error("奖池配置错误:未找到有效的奖品承诺,请检查奖品配置和库存"):w.error("模拟失败: "+s.message)}finally{ps.value=!1}}else w.warning("当前期没有配置奖品,无法进行模拟");else w.warning("请先选择活动和期")}),Js=()=>e(this,null,function*(){var e,t;if(0!==bs.length)if(vs.activityId&&vs.issueId)if(0!==cs.length){gs.value=!0;try{const e=yield q(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}})),w.success(`抽奖完成,共 ${e.draws.length} 次抽奖`)}catch(s){20515===(null==(t=null==(e=s.response)?void 0:e.data)?void 0:t.code)?w.error("奖池配置错误:未找到有效的奖品承诺,请检查奖品配置和库存"):w.error("抽奖失败: "+s.message)}finally{gs.value=!1}}else w.warning("当前期没有配置奖品,无法进行抽奖");else w.warning("请先选择活动和期");else w.warning("请先选择用户")}),Ws=t=>e(this,null,function*(){var e,s,l,a;if(!t.receipt)return void w.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 V(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 E(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 D(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 w.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 R(vs.activityId,vs.issueId,e);t.verified=!0,t.verify_result=s.valid,s.valid?w.success("验证通过"):w.error("验证失败: "+s.message)}catch(n){(null==(a=null==(l=n.response)?void 0:l.data)?void 0:a.message)?w.error("验证失败: "+n.response.data.message):w.error("验证失败: "+n.message)}finally{t.verifying=!1}}),Ns=()=>e(this,null,function*(){const e=Cs.filter(e=>!e.verified&&e.receipt);if(0!==e.length)for(const t of e)yield Ws(t);else w.info("没有需要验证的结果")}),Qs=()=>{bs.splice(0,bs.length),ws.value=!1},Ts=()=>{ws.value?bs.splice(0,bs.length,...zs.value.map(e=>e.id)):bs.splice(0,bs.length)},Xs=()=>{Cs.splice(0,Cs.length)},Ys=e=>hs[e]||0,Zs=()=>{const e=cs.filter(e=>Ys(e.id)>0);return 0===e.length?0:e.reduce((e,t)=>e+Ys(t.id),0)/e.length},el=()=>{const e=ms.value*vs.samples;let t=0;ys.value.forEach(e=>{t+=e.count*Ys(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(()=>{Us()}),i([ks,Is],()=>{ws.value=bs.length===zs.value.length&&zs.value.length>0}),(e,t)=>{const s=H,l=S,a=M,d=U,i=$,w=L,k=G;return n(),r("div",O,[t[61]||(t[61]=o("div",{class:"art-card-header"},[o("div",{class:"title"},[o("h4",null,"抽奖模拟盈亏分析"),o("p",null,"基于期奖池配置与随机承诺,模拟抽奖并计算盈亏")])],-1)),o("div",P,[o("div",B,[o("div",J,[o("div",{class:u(["flex items-center space-x-2",vs.activityId?"text-green-600":"text-gray-400"])},[o("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]=o("span",null,"选择活动",-1))],2),o("div",{class:u(["flex items-center space-x-2",vs.issueId?"text-green-600":"text-gray-400"])},[o("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]=o("span",null,"选择期",-1))],2),o("div",{class:u(["flex items-center space-x-2",vs.activityId&&vs.issueId?"text-blue-600":"text-gray-400"])},[o("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]=o("span",null,"模拟分析",-1))],2)]),o("div",W,[vs.activityId&&vs.issueId?(n(),r("span",N,"✓ 可进行模拟分析")):(n(),r("span",Q,"请先选择活动和期"))])]),vs.activityId&&vs.issueId?(n(),r("div",T,[o("div",X,[o("div",{class:u(["flex items-center space-x-2",bs.length>0?"text-green-600":"text-gray-400"])},[o("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",Y,"✓")):(n(),r("span",Z,"👤"))],2),t[11]||(t[11]=o("span",null,"用户抽奖验证",-1))],2),o("div",ee,[bs.length>0?(n(),r("span",te,"已选择 "+v(bs.length)+" 个用户",1)):(n(),r("span",se,"选择用户进行抽奖验证"))])])])):c("",!0)]),o("div",le,[o("div",ae,[p(l,{modelValue:vs.activityId,"onUpdate:modelValue":t[0]||(t[0]=e=>vs.activityId=e),placeholder:"选择活动",onChange:$s},{default:g(()=>[(n(!0),r(x,null,m(K,e=>(n(),f(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:Ls},{default:g(()=>[(n(!0),r(x,null,m(os,e=>(n(),f(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"]),o("div",de,[p(d,{type:"primary",loading:ps.value,onClick:Bs,disabled:!vs.activityId||!vs.issueId,icon:"DataAnalysis"},{default:g(()=>[...t[12]||(t[12]=[y(" 运行模拟分析 ",-1)])]),_:1},8,["loading","disabled"]),ms.value>0?(n(),f(i,{key:0,type:"success"},{default:g(()=>[y("门票:¥"+v((ms.value/100).toFixed(2)),1)]),_:1})):c("",!0)])]),vs.activityId&&vs.issueId?(n(),r("div",ie,[t[24]||(t[24]=h('<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)),o("div",re,[o("div",ne,[o("div",oe,[t[14]||(t[14]=o("span",{class:"text-sm font-medium text-gray-700"},"选择用户(用于抽奖验证)",-1)),o("div",ce,[p(w,{modelValue:ws.value,"onUpdate:modelValue":t[3]||(t[3]=e=>ws.value=e),onChange:Ts,disabled:xs.value||0===zs.value.length},{default:g(()=>[...t[13]||(t[13]=[y(" 全选 ",-1)])]),_:1},8,["modelValue","disabled"]),o("span",ue,v(bs.length)+"/"+v(zs.value.length),1)])]),o("div",ve,[p(k,{modelValue:ks.value,"onUpdate:modelValue":t[4]||(t[4]=e=>ks.value=e),placeholder:"搜索用户昵称或ID...",clearable:"","prefix-icon":_(b),size:"small"},{suffix:g(()=>[ks.value?(n(),r("span",pe,v(zs.value.length),1)):c("",!0)]),_:1},8,["modelValue","prefix-icon"])]),o("div",ge,[(n(),r(x,null,m(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))]),o("div",xe,[(n(!0),r(x,null,m(zs.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(w,{"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===zs.value.length&&zs.value.length>0})(e.id,t),disabled:xs.value},{default:g(()=>[o("div",me,[o("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,fe),o("div",null,[o("div",ye,v(e.nickname),1),o("div",he,"ID: "+v(e.id),1)])])]),_:2},1032,["model-value","onChange","disabled"])]))),128))]),0===zs.value.length&&ks.value&&!xs.value?(n(),r("div",_e,[t[16]||(t[16]=o("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})])):c("",!0),0!==us.length||xs.value?c("",!0):(n(),r("div",be,[t[18]||(t[18]=o("div",{class:"text-sm"},"暂无用户数据",-1)),p(d,{type:"primary",size:"small",onClick:Ps,class:"mt-2"},{default:g(()=>[...t[17]||(t[17]=[y(" 重新加载 ",-1)])]),_:1})]))])]),o("div",we,[0===bs.length?(n(),r("div",ke,[...t[19]||(t[19]=[o("div",{class:"text-yellow-800 text-sm"},[o("div",{class:"font-medium mb-1"},"💡 请选择用户进行抽奖验证"),o("div",{class:"text-yellow-600 text-xs"}," 从左侧用户列表中选择一个或多个用户,验证抽奖过程的公平性和随机性 ")],-1)])])):c("",!0),p(d,{type:"success",loading:gs.value,onClick:Js,icon:"MagicStick",disabled:0===bs.length,size:"large"},{default:g(()=>[...t[20]||(t[20]=[y(" 开始抽奖验证 ",-1)])]),_:1},8,["loading","disabled"]),t[23]||(t[23]=h('<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)),o("div",Ie,[bs.length>0?(n(),f(d,{key:0,onClick:Qs,icon:"Refresh",size:"small",style:{flex:"1"}},{default:g(()=>[...t[21]||(t[21]=[y(" 清除选择 ",-1)])]),_:1})):c("",!0),Cs.length>0?(n(),f(d,{key:1,onClick:Xs,icon:"Delete",size:"small",style:{flex:"1"}},{default:g(()=>[...t[22]||(t[22]=[y(" 清除结果 ",-1)])]),_:1})):c("",!0)])])])):c("",!0),fs.value?(n(),r("div",je,[o("div",Ce,[t[25]||(t[25]=o("div",{class:"text-sm text-gray-600"},"活动名称",-1)),o("div",Fe,v(fs.value.name),1)]),o("div",ze,[t[26]||(t[26]=o("div",{class:"text-sm text-gray-600"},"门票价格",-1)),o("div",qe,"¥"+v((ms.value/100).toFixed(2)),1)]),o("div",Ve,[t[27]||(t[27]=o("div",{class:"text-sm text-gray-600"},"奖项数量",-1)),o("div",Ee,v(cs.length)+" 个",1)])])):c("",!0),0===cs.length&&vs.issueId?(n(),r("div",De,[...t[28]||(t[28]=[o("div",{class:"flex items-center gap-3"},[o("div",{class:"text-yellow-600 text-xl"},"⚠️"),o("div",null,[o("div",{class:"text-yellow-800 font-medium"},"当前期未配置奖品"),o("div",{class:"text-yellow-600 text-sm mt-1"},' 请先配置奖品后再进行模拟或抽奖验证,否则会出现"未找到承诺"错误 ')])],-1)])])):c("",!0),Ds.value&&cs.length>0?(n(),r("div",Re,[o("div",Ae,[t[31]||(t[31]=o("div",{class:"text-orange-600 text-lg"},"💰",-1)),o("div",He,[o("div",Se,"发现 "+v(Es.value.length)+" 个奖品无定价",1),o("div",Me,[t[29]||(t[29]=y(" 以下奖品未关联商品或商品无价格,盈亏分析中将其视为0元: ",-1)),o("span",Ue,v(Es.value.map(e=>e.name).join("、")),1)]),t[30]||(t[30]=o("div",{class:"text-orange-600 text-xs mt-2"}," 💡 建议:为奖品关联商品并设置价格,以获得准确的盈亏分析结果 ",-1))])])])):c("",!0),cs.length>0?(n(),r("div",$e,[o("div",Le,[t[32]||(t[32]=o("div",{class:"text-sm text-gray-600"},"奖品总价值",-1)),o("div",Ge,"¥"+v((cs.reduce((e,t)=>e+Ys(t.id),0)/100).toFixed(2)),1),t[33]||(t[33]=o("div",{class:"text-xs text-gray-500 mt-1"},"所有奖品价格总和",-1))]),o("div",Ke,[t[34]||(t[34]=o("div",{class:"text-sm text-gray-600"},"平均奖品价值",-1)),o("div",Oe,"¥"+v((Zs()/100).toFixed(2)),1),t[35]||(t[35]=o("div",{class:"text-xs text-gray-500 mt-1"},"有价格奖品的平均值",-1))]),o("div",Pe,[t[36]||(t[36]=o("div",{class:"text-sm text-gray-600"},"高价奖品数量",-1)),o("div",Be,v(cs.filter(e=>Ys(e.id)>=1e4).length),1),t[37]||(t[37]=o("div",{class:"text-xs text-gray-500 mt-1"},"价格 ≥ ¥100的奖品",-1))])])):c("",!0),o("div",Je,[o("div",We,[t[38]||(t[38]=o("div",{class:"text-sm text-gray-600"},"总收入",-1)),o("div",Ne,"¥"+v((Fs.revenue/100).toFixed(2)),1)]),o("div",Qe,[t[39]||(t[39]=o("div",{class:"text-sm text-gray-600"},"总支出(奖品成本)",-1)),o("div",Te,"¥"+v((Fs.payout/100).toFixed(2)),1)]),o("div",Xe,[t[40]||(t[40]=o("div",{class:"text-sm text-gray-600"},"利润",-1)),o("div",Ye,"¥"+v((Fs.profit/100).toFixed(2)),1)]),o("div",Ze,[t[41]||(t[41]=o("div",{class:"text-sm text-gray-600"},"利润率",-1)),o("div",et,v((100*Fs.margin).toFixed(2))+"%",1)])]),cs.length>0?(n(),r("div",tt,[o("div",st,[t[42]||(t[42]=o("div",{class:"title"},[o("h4",null,"奖品详情"),o("p",null,"当前活动期的所有奖品信息和概率统计")],-1)),o("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,[o("table",dt,[t[44]||(t[44]=o("thead",null,[o("tr",{class:"border-b border-gray-200 bg-gray-50"},[o("th",{class:"text-left py-3 px-2"},"奖项"),o("th",{class:"text-right py-3 px-2"},"权重"),o("th",{class:"text-right py-3 px-2"},"库存"),o("th",{class:"text-right py-3 px-2"},"理论概率"),o("th",{class:"text-right py-3 px-2"},"等级"),o("th",{class:"text-left py-3 px-2"},"商品")])],-1)),o("tbody",null,[(n(!0),r(x,null,m(cs,e=>(n(),r("tr",{key:e.id,class:"border-b border-gray-100 hover:bg-gray-50 transition-colors"},[o("td",it,[o("div",rt,v(e.name),1),o("div",nt,"ID: "+v(e.id),1)]),o("td",ot,v(e.weight),1),o("td",ct,[p(i,{type:-1===e.quantity?"info":"primary"},{default:g(()=>[y(v(-1===e.quantity?"不限量":e.quantity),1)]),_:2},1032,["type"])]),o("td",ut,[Vs.value[e.id]?(n(),r("span",vt,v((100*Vs.value[e.id]).toFixed(4))+"% ",1)):(n(),r("span",pt,"-"))]),o("td",gt,[p(i,{type:As(e.level)},{default:g(()=>[y(v(Hs(e.level)),1)]),_:2},1032,["type"])]),o("td",xt,[e.product_id?(n(),r("div",mt,[o("div",null,v(Ss(e.product_id)),1),Ys(e.id)>0?(n(),r("div",ft," ¥"+v((Ys(e.id)/100).toFixed(2)),1)):(n(),r("div",yt," 未定价 "))])):(n(),r("div",ht,[...t[43]||(t[43]=[o("div",null,"无商品",-1),o("div",{class:"text-xs"},"虚拟奖品",-1)])]))])]))),128))])])])):c("",!0)])):c("",!0),Cs.length>0?(n(),r("div",_t,[o("div",bt,[t[46]||(t[46]=o("div",{class:"title"},[o("h4",null,"🎯 抽奖结果与验证"),o("p",null,"抽奖结果的可验证性和公平性检查")],-1)),o("div",wt,[p(d,{type:"success",size:"small",onClick:Ns,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:Xs,icon:"Refresh"},{default:g(()=>[...t[45]||(t[45]=[y(" 清除结果 ",-1)])]),_:1})])]),t[49]||(t[49]=h('<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)),o("div",kt,[o("table",It,[t[48]||(t[48]=o("thead",null,[o("tr",{class:"border-b border-gray-200 bg-gray-50"},[o("th",{class:"text-left py-3 px-2"},"用户"),o("th",{class:"text-left py-3 px-2"},"奖项"),o("th",{class:"text-right py-3 px-2"},"是否中奖"),o("th",{class:"text-left py-3 px-2"},"中奖详情"),o("th",{class:"text-center py-3 px-2"},"验证状态"),o("th",{class:"text-center py-3 px-2"},"操作")])],-1)),o("tbody",null,[(n(!0),r(x,null,m(Cs,(e,s)=>(n(),r("tr",{key:s,class:"border-b border-gray-100"},[o("td",jt,[o("div",Ct,v(Ms(e.user_id)),1),o("div",Ft,"ID: "+v(e.user_id),1)]),o("td",zt,[o("div",qt,v(e.reward_name||"随机抽奖"),1),e.reward_id?(n(),r("div",Vt,"ID: "+v(e.reward_id),1)):c("",!0)]),o("td",Et,[p(i,{type:e.is_winner?"success":"info"},{default:g(()=>[y(v(e.is_winner?"中奖":"未中奖"),1)]),_:2},1032,["type"])]),o("td",Dt,[e.is_winner?(n(),r("div",Rt," 🎉 恭喜获得:"+v(e.reward_name),1)):(n(),r("div",At," 谢谢参与,再接再厉! "))]),o("td",Ht,[e.verified?(n(),f(i,{key:0,type:e.verify_result?"success":"danger"},{default:g(()=>[y(v(e.verify_result?"验证通过":"验证失败"),1)]),_:2},1032,["type"])):(n(),f(i,{key:1,type:"info"},{default:g(()=>[...t[47]||(t[47]=[y("未验证",-1)])]),_:1}))]),o("td",St,[e.receipt?(n(),f(d,{key:0,type:"primary",size:"small",onClick:t=>Ws(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))])])])])):c("",!0),ys.value.length>0?(n(),r("div",Ut,[o("div",$t,[o("div",Lt,[t[50]||(t[50]=o("h4",null,"📊 模拟统计结果",-1)),o("p",null,"基于 "+v(vs.samples)+" 次模拟的统计数据,对比理论概率与实际模拟结果",1)]),o("div",Gt,[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"])])]),o("div",Kt,[o("div",Ot,[t[57]||(t[57]=o("div",{class:"text-green-600 text-lg"},"📈",-1)),o("div",Pt,[t[56]||(t[56]=o("div",{class:"font-medium mb-1"},"模拟分析说明",-1)),o("div",Bt,[t[53]||(t[53]=o("p",null,[y("• "),o("strong",null,"理论概率:"),y("基于奖品权重计算的期望中奖概率")],-1)),o("p",null,[t[51]||(t[51]=y("• ",-1)),t[52]||(t[52]=o("strong",null,"模拟概率:",-1)),y("通过"+v(vs.samples)+"次随机模拟得到的实际中奖频率",1)]),t[54]||(t[54]=o("p",null,[y("• "),o("strong",null,"盈亏分析:"),y("基于门票收入和奖品成本计算的整体盈利情况")],-1)),t[55]||(t[55]=o("p",null,[y("• "),o("strong",null,"数据对比:"),y("绿色表示模拟结果与理论值接近,红色表示偏差较大")],-1))])])])]),o("div",Jt,[t[58]||(t[58]=o("div",{class:"flex items-center gap-2 text-blue-800 text-sm"},[o("span",{class:"font-semibold"},"💡 价格说明:"),o("span",null,"奖品价格来源于商品管理中的实际售价,虚拟奖品或无商品关联的奖项价格为0")],-1)),Ds.value?(n(),r("div",Wt," ⚠️ 当前有 "+v(Es.value.length)+" 个奖品无有效定价,可能影响盈亏分析准确性 ",1)):c("",!0)]),o("div",Nt,[o("table",Qt,[t[60]||(t[60]=o("thead",null,[o("tr",{class:"border-b border-gray-200 bg-gray-50"},[o("th",{class:"text-left py-3 px-2"},"奖项"),o("th",{class:"text-right py-3 px-2"},"权重"),o("th",{class:"text-right py-3 px-2"},"期内库存"),o("th",{class:"text-right py-3 px-2"},"理论概率"),o("th",{class:"text-right py-3 px-2"},"模拟次数"),o("th",{class:"text-right py-3 px-2"},"模拟概率"),o("th",{class:"text-right py-3 px-2"},"商品价格"),o("th",{class:"text-right py-3 px-2"},"模拟支出")])],-1)),o("tbody",null,[(n(!0),r(x,null,m(qs.value,e=>(n(),r("tr",{key:e.rewardId,class:"border-b border-gray-100"},[o("td",Tt,[o("div",Xt,v(e.name),1),o("div",Yt,"ID: "+v(e.rewardId),1)]),o("td",Zt,v(e.weight),1),o("td",es,v(e.quantity),1),o("td",ts,v((100*e.expectedRate).toFixed(4))+"%",1),o("td",ss,v(e.count),1),o("td",{class:u(["py-3 px-2 text-right",Rs(e.observedRate,e.expectedRate)])},v((100*e.observedRate).toFixed(4))+"% ",3),o("td",ls,[Ys(e.rewardId)>0?(n(),r("div",as,[o("div",ds,"¥"+v((Ys(e.rewardId)/100).toFixed(2)),1),o("div",is,v(Ys(e.rewardId))+"分",1)])):(n(),r("div",rs,[...t[59]||(t[59]=[o("div",{class:"text-sm"},"无价",-1),o("div",{class:"text-xs"},"虚拟奖品",-1)])]))]),o("td",ns," ¥"+v((e.count*Ys(e.rewardId)/100).toFixed(2)),1)]))),128))])])])])):c("",!0)])])}}}),[["__scopeId","data-v-1d9f13df"]]);export{os as default};
|