2 lines
13 KiB
JavaScript
2 lines
13 KiB
JavaScript
var e=(e,a,t)=>new Promise((l,s)=>{var r=e=>{try{o(t.next(e))}catch(a){s(a)}},i=e=>{try{o(t.throw(e))}catch(a){s(a)}},o=e=>e.done?l(e.value):Promise.resolve(e.value).then(r,i);o((t=t.apply(e,a)).next())});import{d as a,k as t,c as l,r as s,o as r,b as i,e as o,f as n,i as d,g as u,w as c,I as p,J as m,h as v,E as _,j as f,v as x,ai as y,p as w,e6 as b,q as h,eq as g,aV as j,T as k}from"./index-BoIUJTA2.js";/* empty css *//* empty css */import"./el-tooltip-l0sNRNKZ.js";/* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css *//* empty css */import{f as F}from"./activity-CMsiETfu.js";import{s as V,l as I}from"./adminActivities-Dgt25iR5.js";import{t as U}from"./operations-Cr4YfoRu.js";import{E as q,a as E}from"./index-BcfO0-fK.js";import{E as P,a as $}from"./index-D2gD5Tn5.js";import{E as C}from"./index-C_S0YbqD.js";import{E as M}from"./index-dBzz0k3i.js";import{E as z}from"./index-CXD7B41Z.js";import{E as D}from"./index-BaD29Izp.js";import{E as A}from"./index-CZJaGuxf.js";import{E as T}from"./index-C_sVHlWz.js";import{E as B,a as O}from"./index-BjuMygln.js";import{E as H}from"./index-BMeOzN3u.js";import{_ as J}from"./_plugin-vue_export-helper-BCo6x5W8.js";import"./castArray-nM8ho4U3.js";import"./_baseClone-Ct7RL6h5.js";import"./_initCloneObject-DRmC-q3t.js";import"./index-Cp4NEpJ7.js";import"./index-ZsMdSUVI.js";import"./token-DWNpOE8r.js";import"./debounce-DQl5eUwG.js";import"./_baseIteratee-CtIat01j.js";import"./index-CXORCV4U.js";import"./index-BnK4BbY2.js";import"./index-Bq8lawOo.js";import"./dropdown-Dk_wSiK6.js";import"./isArrayLikeObject-CFQi-X2M.js";import"./raf-DsHSIRfX.js";import"./index-D8nVJoNy.js";import"./index-COyGylbk.js";const L={class:"page-content"},Q={class:"query-bar"},S={key:0,class:"result-section"},Y={key:0,class:"mt-2"},G={class:"flex items-center justify-between"},K={class:"flex items-center justify-center"},N={key:0,class:"text-center mt-2 text-sm text-gray-500"},R={class:"text-primary font-bold"},W={class:"stat-value text-primary"},X={class:"stat-value text-danger"},Z={class:"card-header"},ee={key:0,class:"text-warning text-sm"},ae={class:"flex flex-col items-center"},te={key:0,class:"text-xs text-gray-400"},le={class:"text-warning"},se={key:1},re={key:1},ie={key:0,class:"mt-4"},oe={class:"flex items-center space-x-8 text-sm"},ne={class:"ml-2 font-bold"},de={class:"ml-1 text-danger"},ue={class:"ml-2 font-bold"},ce={class:"ml-2 text-primary"},pe=J(a({__name:"index",setup(a){const J=t({activityId:void 0,issueId:void 0,numUsers:1e3,drawsPerUser:1,priceDraw:0}),pe=l({get:()=>J.priceDraw/100,set:e=>{J.priceDraw=Math.round(100*e)}}),me=s([]),ve=s([]),_e=s(!1),fe=s(!1),xe=s(!1),ye=s(null),we=l(()=>!!ye.value&&ye.value.rewards.some(e=>e.effective_prob<e.theoretical_prob)),be=l(()=>!!ye.value&&ye.value.rewards.some(e=>Math.abs(e.actual_prob-e.effective_prob)>.05)),he=s(30),ge=s(0),je=()=>{if(!ye.value)return;const e=ye.value.total_simulation_cost,a=he.value/100;if(a>=1)return;const t=e/(1-a)/ye.value.total_draws;ge.value=Math.ceil(t/100*100)/100},ke=()=>{pe.value=ge.value,qe()},Fe=e=>e&&0!==e.length?e.reduce((e,a)=>e.cost>a.cost?e:a):{name:"-",cost:0},Ve=()=>e(this,null,function*(){if(!ye.value||!J.activityId||!J.issueId)return;const e=ye.value.rewards.map(e=>({reward_id:e.reward_id,weight:e.original_qty}));try{const a=ye.value.rewards.reduce((e,a)=>e+a.original_qty,0);yield j.confirm("此操作将自动调整该期所有奖品的权重配置,使其与初始库存数量成正比(权重 = 初始库存)。\n这将消除理论概率与库存占比之间的偏差。\n\n权重与库存对比预览:\n"+ye.value.rewards.map(e=>{const t=Math.round(e.theoretical_prob*a);return`${e.name}: 权重 ${t} -> ${e.original_qty} (占比 ${(e.original_qty/a*100).toFixed(2)}%)`}).join("\n"),"一键优化权重",{confirmButtonText:"确认调整",cancelButtonText:"取消",type:"warning",customClass:"optimization-confirm-box"}),yield V(J.activityId,J.issueId,e),k.success("权重配置已更新,请重新模拟验证"),qe()}catch(a){}}),Ie=a=>e(this,null,function*(){_e.value=!0;try{const e=yield F({name:a,page:1,page_size:20});me.value=e.records}finally{_e.value=!1}}),Ue=a=>e(this,null,function*(){if(J.issueId=void 0,ve.value=[],a){fe.value=!0;try{const e=yield I(a,1,100);ve.value=e.list,ve.value.length>0&&(J.issueId=ve.value[0].id)}finally{fe.value=!1}}}),qe=()=>e(this,null,function*(){if(J.issueId){xe.value=!0;try{const e=yield U(J.issueId,{num_users:J.numUsers,draws_per_user:J.drawsPerUser,price_draw:J.priceDraw});ye.value=e,je(),k.success("模拟完成")}catch(e){}finally{xe.value=!1}}else k.warning("请先选择活动和期号")}),Ee=(e,a)=>{const t=Math.abs(e-a);return t>.05?"text-danger":t>.01?"text-warning":"text-success"};return r(()=>{Ie("")}),(e,a)=>{const t=$,l=P,s=q,r=C,j=_,k=E,F=M,V=y,I=A,U=D,Pe=z,$e=T,Ce=O,Me=H,ze=B;return o(),i("div",L,[n("div",Q,[u(k,{inline:!0,model:J,class:"demo-form-inline"},{default:c(()=>[u(s,{label:"活动"},{default:c(()=>[u(l,{modelValue:J.activityId,"onUpdate:modelValue":a[0]||(a[0]=e=>J.activityId=e),placeholder:"选择活动",filterable:"",remote:"","remote-method":Ie,loading:_e.value,onChange:Ue,style:{width:"240px"}},{default:c(()=>[(o(!0),i(p,null,m(me.value,e=>(o(),v(t,{key:e.id,label:e.name,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","loading"])]),_:1}),u(s,{label:"期号"},{default:c(()=>[u(l,{modelValue:J.issueId,"onUpdate:modelValue":a[1]||(a[1]=e=>J.issueId=e),placeholder:"选择期号",disabled:!J.activityId,loading:fe.value,style:{width:"180px"}},{default:c(()=>[(o(!0),i(p,null,m(ve.value,e=>(o(),v(t,{key:e.id,label:`第 ${e.issue_number} 期`,value:e.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue","disabled","loading"])]),_:1}),u(s,{label:"模拟人数"},{default:c(()=>[u(r,{modelValue:J.numUsers,"onUpdate:modelValue":a[2]||(a[2]=e=>J.numUsers=e),min:1,max:1e5},null,8,["modelValue"])]),_:1}),u(s,{label:"单人抽奖次数"},{default:c(()=>[u(r,{modelValue:J.drawsPerUser,"onUpdate:modelValue":a[3]||(a[3]=e=>J.drawsPerUser=e),min:1,max:100},null,8,["modelValue"])]),_:1}),u(s,{label:"单次抽奖价格(元)"},{default:c(()=>[u(r,{modelValue:pe.value,"onUpdate:modelValue":a[4]||(a[4]=e=>pe.value=e),min:0,step:.01,precision:2},null,8,["modelValue"])]),_:1}),u(s,null,{default:c(()=>[u(j,{type:"primary",onClick:qe,loading:xe.value},{default:c(()=>[...a[6]||(a[6]=[f("开始模拟",-1)])]),_:1},8,["loading"])]),_:1})]),_:1},8,["model"])]),ye.value?(o(),i("div",S,[we.value?(o(),v(F,{key:0,title:"注意:部分奖品库存不足,实际中奖率受库存限制将低于理论概率。",type:"warning","show-icon":"",class:"mb-4"},{default:c(()=>[be.value?(o(),i("div",Y,[u(j,{type:"primary",link:"",onClick:Ve},{default:c(()=>[...a[7]||(a[7]=[f(" 检测到权重与库存占比严重不符,点击一键优化权重配置 ",-1)])]),_:1})])):d("",!0)]),_:1})):d("",!0),u($e,{gutter:20,class:"mb-4"},{default:c(()=>[u(Pe,{span:6},{default:c(()=>[u(U,{shadow:"hover"},{header:c(()=>[n("div",G,[a[9]||(a[9]=n("span",null,"预期毛利率",-1)),u(I,{placement:"top",width:"300",trigger:"hover"},{reference:c(()=>[u(V,{class:"cursor-pointer"},{default:c(()=>[u(w(b))]),_:1})]),default:c(()=>[a[8]||(a[8]=n("div",null,[n("p",null,"设置预期毛利率,自动计算建议单次抽奖价格。"),n("p",null,"公式:建议单价 = 预计总成本 / (1 - 毛利率) / 总抽奖次数")],-1))]),_:1})])]),default:c(()=>[n("div",K,[u(r,{modelValue:he.value,"onUpdate:modelValue":a[5]||(a[5]=e=>he.value=e),min:0,max:99,precision:2,step:5,size:"large",style:{width:"140px"},onChange:je},null,8,["modelValue"]),a[10]||(a[10]=n("span",{class:"ml-2"},"%",-1))]),ge.value>0?(o(),i("div",N,[a[12]||(a[12]=f(" 建议单价: ",-1)),n("span",R,"¥"+x(ge.value),1),u(j,{link:"",type:"primary",size:"small",onClick:ke,class:"ml-1"},{default:c(()=>[...a[11]||(a[11]=[f("应用",-1)])]),_:1})])):d("",!0)]),_:1})]),_:1})]),_:1}),u($e,{gutter:20,class:"mb-4"},{default:c(()=>[u(Pe,{span:6},{default:c(()=>[u(U,{shadow:"hover"},{header:c(()=>[...a[13]||(a[13]=[f("预计总收入",-1)])]),default:c(()=>[n("div",W,x((ye.value.total_simulation_revenue/100).toFixed(2)),1)]),_:1})]),_:1}),u(Pe,{span:6},{default:c(()=>[u(U,{shadow:"hover"},{header:c(()=>[...a[14]||(a[14]=[f("预计总成本",-1)])]),default:c(()=>[n("div",X,x((ye.value.total_simulation_cost/100).toFixed(2)),1)]),_:1})]),_:1}),u(Pe,{span:6},{default:c(()=>[u(U,{shadow:"hover"},{header:c(()=>[...a[15]||(a[15]=[f("预计毛利润",-1)])]),default:c(()=>[n("div",{class:h(["stat-value",ye.value.gross_profit>=0?"text-success":"text-danger"])},x((ye.value.gross_profit/100).toFixed(2)),3)]),_:1})]),_:1}),u(Pe,{span:6},{default:c(()=>[u(U,{shadow:"hover"},{header:c(()=>[...a[16]||(a[16]=[f("毛利率",-1)])]),default:c(()=>[n("div",{class:h(["stat-value",ye.value.gross_profit_rate>=0?"text-success":"text-danger"])},x((100*ye.value.gross_profit_rate).toFixed(2))+"% ",3)]),_:1})]),_:1})]),_:1}),u(U,{class:"box-card"},{header:c(()=>[n("div",Z,[n("span",null,[f("模拟结果 (总抽奖次数: "+x(ye.value.total_draws)+" ",1),ye.value.total_draws<J.numUsers*J.drawsPerUser?(o(),i("span",ee,"(库存耗尽,提前结束)")):d("",!0),a[17]||(a[17]=f(")",-1))])])]),default:c(()=>[u(ze,{data:ye.value.rewards,style:{width:"100%"},border:"",stripe:""},{default:c(()=>[u(Ce,{prop:"level",label:"奖级",width:"80",align:"center"}),u(Ce,{prop:"name",label:"奖品名称","min-width":"150"}),u(Ce,{label:"单价成本",width:"100",align:"right"},{default:c(({row:e})=>[f(x((e.cost/100).toFixed(2)),1)]),_:1}),u(Ce,{prop:"original_qty",label:"初始库存",width:"100",align:"center"},{default:c(({row:e})=>[n("div",ae,[n("span",null,x(e.original_qty),1),ye.value?(o(),i("span",te," ("+x((e.original_qty/ye.value.rewards.reduce((e,a)=>e+a.original_qty,0)*100).toFixed(2))+"%) ",1)):d("",!0)])]),_:1}),u(Ce,{prop:"remaining_qty",label:"剩余库存",width:"100",align:"center"},{default:c(({row:e})=>[n("span",{class:h({"text-danger":0===e.remaining_qty})},x(e.remaining_qty),3)]),_:1}),u(Ce,{prop:"won_count",label:"中奖数",width:"100",align:"center"}),u(Ce,{label:"总发放成本",width:"120",align:"right"},{default:c(({row:e})=>[f(x((e.total_cost/100).toFixed(2)),1)]),_:1}),u(Ce,{label:"理论概率",width:"120",align:"center"},{default:c(({row:e})=>[e.effective_prob<e.theoretical_prob?(o(),v(Me,{key:0,content:`库存不足限制:理论概率 ${(100*e.theoretical_prob).toFixed(2)}%,但因库存仅 ${e.original_qty} 个,实际最大概率为 ${(100*e.effective_prob).toFixed(2)}%`,placement:"top"},{default:c(()=>[n("span",le,[f(x((100*e.effective_prob).toFixed(2))+"% ",1),u(V,null,{default:c(()=>[u(w(g))]),_:1})])]),_:2},1032,["content"])):(o(),i("span",se,x((100*e.theoretical_prob).toFixed(2))+"%",1))]),_:1}),u(Ce,{label:"实际中奖率",width:"100",align:"center"},{default:c(({row:e})=>[n("span",{class:h(Ee(e.actual_prob,e.effective_prob))},x((100*e.actual_prob).toFixed(2))+"% ",3)]),_:1}),u(Ce,{label:"偏差",width:"100",align:"center"},{default:c(({row:e})=>[Math.abs(e.actual_prob-e.effective_prob)>.05?(o(),v(Me,{key:0,content:"偏差较大原因:库存耗尽导致概率被动拉升。当部分高权重奖品抽完后,剩余奖品的中奖率会强制变为100%,从而高于初始设定权重。",placement:"top"},{default:c(()=>[n("span",{class:h(Ee(e.actual_prob,e.effective_prob))},[f(x((100*(e.actual_prob-e.effective_prob)).toFixed(2))+"% ",1),u(V,{class:"ml-1"},{default:c(()=>[u(w(b))]),_:1})],2)]),_:2},1024)):(o(),i("span",re,x((100*(e.actual_prob-e.effective_prob)).toFixed(2))+"% ",1))]),_:1})]),_:1},8,["data"]),ye.value?(o(),i("div",ie,[u(U,{shadow:"hover"},{header:c(()=>[...a[18]||(a[18]=[f("价格趋势分析",-1)])]),default:c(()=>[n("div",oe,[n("div",null,[a[19]||(a[19]=n("span",{class:"text-gray-500"},"最高单价奖品:",-1)),n("span",ne,x(Fe(ye.value.rewards).name),1),n("span",de,"¥"+x((Fe(ye.value.rewards).cost/100).toFixed(2)),1)]),n("div",null,[a[20]||(a[20]=n("span",{class:"text-gray-500"},"平均奖品成本:",-1)),n("span",ue,"¥"+x((ye.value.total_simulation_cost/ye.value.total_draws/100).toFixed(2)),1)]),n("div",null,[a[21]||(a[21]=n("span",{class:"text-gray-500"},"建议定价区间:",-1)),n("span",ce,"¥"+x((ye.value.total_simulation_cost/ye.value.total_draws/100*1.2).toFixed(2))+" - ¥"+x((ye.value.total_simulation_cost/ye.value.total_draws/100*1.5).toFixed(2)),1),a[22]||(a[22]=n("span",{class:"text-xs text-gray-400 ml-1"},"(20%-50%毛利)",-1))])])]),_:1})])):d("",!0)]),_:1})])):d("",!0)])}}}),[["__scopeId","data-v-ea7e9753"]]);export{pe as default};
|