import{_ as it,p as ze,q as ut,s as ct,h as m,f as I,E as ee,c as f,a,b as d,w as p,v as pe,r as k,j as G,x as pt,o as u,e as v,y as Z,k as S,t as h,F as U,i as A,n as Te,z as me}from"./index-CYgyy2lw.js";import{b as x}from"./index-B5S4JoyK.js";import{i as Ge,L as mt}from"./index-Bn9PLWWT.js";const _t={class:"dashboard-page"},vt={class:"page-header",style:{display:"flex","justify-content":"space-between","align-items":"flex-end"}},ft={style:{display:"flex",gap:"12px","align-items":"center"}},ht={class:"filter-bar"},gt={class:"two-col-layout"},yt={class:"table-col"},bt={style:{padding:"10px 40px",background:"rgba(0,0,0,0.2)"}},wt={style:{"margin-bottom":"8px","font-weight":"bold",color:"var(--text-secondary)"}},kt={class:"chart-col"},xt={class:"chart-card"},Dt={class:"chart-card",style:{"margin-top":"16px"}},Rt={class:"filter-bar"},St={class:"two-col-layout"},Mt={class:"table-col"},$t={class:"chart-col"},Vt={class:"chart-card"},jt={class:"chart-card",style:{"margin-top":"16px"}},Ct={class:"filter-bar"},zt={class:"two-col-layout"},Lt={class:"table-col"},Yt={style:{padding:"10px 40px",background:"rgba(0,0,0,0.2)"}},Et={style:{"margin-bottom":"8px","font-weight":"bold",color:"var(--text-secondary)"}},Ut={class:"chart-col"},At={class:"chart-card"},Ot={class:"chart-card",style:{"margin-top":"16px"}},Ft={class:"filter-bar"},Nt={class:"content-card",style:{"margin-top":"16px","overflow-x":"auto"}},Pt={key:0,class:"matrix-table"},Wt={class:"row-header"},Bt={class:"total-col"},Ht={class:"filter-bar"},Tt={key:0,class:"content-card",style:{"margin-top":"16px","overflow-x":"auto"}},Gt={class:"card-title"},Zt={key:0,class:"grid-table"},qt={class:"day-weekday"},Kt=["onClick"],Xt=["title"],Jt={class:"cell-hours"},Qt={class:"total-cell"},It={key:1,class:"two-col-layout",style:{"margin-top":"16px"}},ea={class:"table-col",style:{flex:"1.5"}},ta={class:"content-card",style:{"margin-bottom":"0"}},aa={class:"card-title"},la=["onClick"],sa={class:"day-header"},oa={class:"day-num"},na={key:0,class:"weekend-tag"},da={class:"day-body"},ra={key:0,class:"status-badge filled"},ia={key:1,class:"status-badge partial"},ua={key:2,class:"status-badge unfilled"},ca={class:"chart-col",style:{flex:"1","min-width":"320px"}},pa={class:"content-card"},ma={class:"mini-stats-grid"},_a={class:"mini-stat-item green-glow"},va={class:"value green-text"},fa={class:"mini-stat-item yellow-glow"},ha={class:"value yellow-text"},ga={class:"mini-stat-item red-glow"},ya={class:"value red-text"},ba={class:"mini-stat-item purple-glow"},wa={class:"value purple-text"},ka={class:"content-card",style:{"margin-top":"16px"}},xa={class:"card-title"},Da={__name:"Dashboard",setup(Ra){const _e=m("sales"),Le=m([]),D=m([]),ve=m(null),fe=m(null),he=m(null),ge=m(null),ye=m(null),be=m(null);let M=null,$=null,V=null,j=null,C=null,z=null;const te=m(!1),q=(()=>{const t=new Date,e=new Date;e.setMonth(e.getMonth()-1);const l=s=>String(s).padStart(2,"0"),n=s=>`${s.getFullYear()}-${l(s.getMonth()+1)}-${l(s.getDate())}`;return[n(e),n(t)]})(),F=m(q),L=I({dateRange:q}),Ye=m([]),Ee=m([]),we=m(!1),ae=G(()=>{const t={};return Ee.value.forEach(e=>{t[e.sales_id]||(t[e.sales_id]={sales_id:e.sales_id,sales_name:e.sales_name,projects:new Set,rdMap:{},total_hours:0});const l=t[e.sales_id];l.rdMap[e.rd_id]||(l.rdMap[e.rd_id]={rd_name:e.rd_name,total_hours:0,work_days:0}),l.rdMap[e.rd_id].total_hours+=e.total_hours,l.rdMap[e.rd_id].work_days+=e.work_days}),Ye.value.forEach(e=>{t[e.sales_id]||(t[e.sales_id]={sales_id:e.sales_id,sales_name:e.sales_name,projects:new Set,rdMap:{},total_hours:0}),t[e.sales_id].projects.add(e.client_id),t[e.sales_id].total_hours+=e.total_hours}),Object.values(t).map(e=>({sales_name:e.sales_name,project_count:e.projects.size,rd_count:Object.keys(e.rdMap).length,total_hours:Math.round(e.total_hours*10)/10,rdList:Object.values(e.rdMap).sort((l,n)=>n.total_hours-l.total_hours)}))});async function Ue(){we.value=!0;try{const t={};L.dateRange&&(t.start_date=L.dateRange[0],t.end_date=L.dateRange[1]);const[e,l]=await Promise.all([x.getSalesStats(t),x.getSalesDetail(t)]);Ye.value=e.data,Ee.value=l.data,await pe();const n=ae.value.filter(i=>i.total_hours>0).map(i=>({name:i.sales_name,value:i.total_hours}));P(ve,M,"sales",n);const s=ae.value.filter(i=>i.total_hours>0);W(ge,j,"sales",s.map(i=>i.sales_name),s.map(i=>i.total_hours))}finally{we.value=!1}}const w=I({dateRange:q,user_id:""}),ke=m([]),xe=m(!1),N=G(()=>{const t={};return ke.value.forEach(e=>{t[e.user_id]||(t[e.user_id]={name:e.user_name,value:0}),t[e.user_id].value+=e.hours}),Object.values(t).filter(e=>e.value>0)});async function Ae(){xe.value=!0;try{const t={};w.dateRange&&(t.start_date=w.dateRange[0],t.end_date=w.dateRange[1]),w.user_id&&(t.user_id=w.user_id);const e=await x.getRdStats(t);ke.value=e.data,await pe(),P(fe,$,"rd",N.value),W(ye,C,"rd",N.value.map(l=>l.name),N.value.map(l=>l.value))}finally{xe.value=!1}}const y=I({dateRange:q,sales_id:""}),K=m([]),De=m(!1);async function Oe(){De.value=!0;try{const t={};y.dateRange&&(t.start_date=y.dateRange[0],t.end_date=y.dateRange[1]),y.sales_id&&(t.sales_id=y.sales_id);const[e,l]=await Promise.all([x.getProjectStats(t),x.getProjectDetail(t)]),n={};l.data.forEach(r=>{n[r.client_id]||(n[r.client_id]=[]),n[r.client_id].push(r)}),K.value=e.data.map(r=>(r.rdList=n[r.client_id]||[],r)),await pe();const s=K.value.filter(r=>r.total_hours>0).map(r=>({name:r.client_name,value:r.total_hours}));P(he,V,"project",s);const i=K.value.filter(r=>r.total_hours>0);W(be,z,"project",i.map(r=>r.client_name),i.map(r=>r.total_hours))}finally{De.value=!1}}function P(t,e,l,n){if(!t.value||t.value.clientWidth===0)return;e&&e.dispose();let s=Ge(t.value,"dark");l==="sales"&&(M=s),l==="rd"&&($=s),l==="project"&&(V=s),s.setOption({backgroundColor:"transparent",tooltip:{trigger:"item",formatter:"{b}: {c}h ({d}%)",confine:!0},legend:{type:"scroll",bottom:10,textStyle:{color:"#94a3b8"}},series:[{type:"pie",radius:["35%","65%"],center:["50%","45%"],avoidLabelOverlap:!0,itemStyle:{borderRadius:8,borderColor:"#1e293b",borderWidth:2},label:{color:"#f1f5f9",fontSize:13},emphasis:{label:{show:!0,fontSize:16,fontWeight:"bold"},itemStyle:{shadowBlur:10,shadowOffsetX:0,shadowColor:"rgba(0,0,0,0.5)"}},data:n}]})}function W(t,e,l,n,s){if(!t.value||t.value.clientWidth===0)return;e&&e.dispose();let i=Ge(t.value,"dark");l==="sales"&&(j=i),l==="rd"&&(C=i),l==="project"&&(z=i),i.setOption({backgroundColor:"transparent",tooltip:{trigger:"axis",formatter:r=>`${r[0].name}: ${r[0].value}h`,confine:!0},grid:{left:"3%",right:"4%",bottom:"15%",containLabel:!0},xAxis:{type:"category",data:n,axisLabel:{color:"#94a3b8",interval:0,rotate:n.length>5?30:0,fontSize:12}},yAxis:{type:"value",name:"工时(h)",axisLabel:{color:"#94a3b8"}},series:[{type:"bar",barMaxWidth:50,data:s,itemStyle:{color:new mt(0,0,0,1,[{offset:0,color:"#818cf8"},{offset:1,color:"#4f46e5"}]),borderRadius:[4,4,0,0]},label:{show:!0,position:"top",color:"#f1f5f9",fontSize:12,formatter:"{c}h"},markLine:l==="rd"&&s.length>0?{data:[{type:"average",name:"平均值"}],lineStyle:{type:"dashed",color:"#f59e0b",width:2},label:{formatter:"平均: {c}h",position:"end",color:"#f59e0b",fontWeight:"bold"}}:void 0}]})}function Fe(){M==null||M.resize(),$==null||$.resize(),V==null||V.resize(),j==null||j.resize(),C==null||C.resize(),z==null||z.resize()}async function le(t){try{if(t==="all"){te.value=!0;let r={},b="开始",c="至今";F.value&&F.value.length===2&&(r.start_date=F.value[0],r.end_date=F.value[1],b=r.start_date,c=r.end_date);const g=await x.exportAllExcel(r);Re(g.data,`总报表_${b}至${c}.xlsx`),ee.success("全导成功"),te.value=!1;return}let e={},l="开始",n="至今",s="";t==="sales"?(s="销售视角",L.dateRange&&L.dateRange.length===2&&(e.start_date=L.dateRange[0],e.end_date=L.dateRange[1],l=e.start_date,n=e.end_date)):t==="rd"?(s="研发视角",w.dateRange&&w.dateRange.length===2&&(e.start_date=w.dateRange[0],e.end_date=w.dateRange[1],l=e.start_date,n=e.end_date)):t==="project"&&(s="项目视角",y.dateRange&&y.dateRange.length===2&&(e.start_date=y.dateRange[0],e.end_date=y.dateRange[1],l=e.start_date,n=e.end_date),y.sales_id&&(e.sales_id=y.sales_id));const i=await x.exportExcel(t,e);Re(i.data,`${s}_${l}至${n}.xlsx`),ee.success("导出成功")}catch{te.value=!1,ee.error("导出失败")}}function Re(t,e){const l=URL.createObjectURL(new Blob([t])),n=document.createElement("a");n.href=l,n.download=e,n.click(),URL.revokeObjectURL(l)}ze(_e,t=>{pe(()=>{if(t==="sales"){const e=ae.value.filter(l=>l.total_hours>0);P(ve,M,"sales",e.map(l=>({name:l.sales_name,value:l.total_hours}))),W(ge,j,"sales",e.map(l=>l.sales_name),e.map(l=>l.total_hours))}else if(t==="rd")P(fe,$,"rd",N.value),W(ye,C,"rd",N.value.map(e=>e.name),N.value.map(e=>e.value));else if(t==="project"){const e=K.value.filter(l=>l.total_hours>0);P(he,V,"project",e.map(l=>({name:l.client_name,value:l.total_hours}))),W(be,z,"project",e.map(l=>l.client_name),e.map(l=>l.total_hours))}else t==="matrix"?je():t==="calendar"&&(D.value.length&&!_.user_id&&(_.user_id=D.value[0].id),de().then(()=>{Y.value==="individual"&&H()}))})}),ut(async()=>{window.addEventListener("resize",Fe);try{const[t,e]=await Promise.all([x.getSalesUsers(),x.getRdUsers()]);Le.value=t.data,D.value=e.data,D.value.length&&!_.user_id&&(_.user_id=D.value[0].id)}catch{}Ue(),Ae(),Oe(),je(),de().then(()=>{Y.value==="individual"&&H()})}),ct(()=>{window.removeEventListener("resize",Fe),M==null||M.dispose(),$==null||$.dispose(),V==null||V.dispose(),j==null||j.dispose(),C==null||C.dispose(),z==null||z.dispose()});const Y=m("grid"),se=m(!1),oe=m(new Date().toLocaleDateString("sv-SE",{timeZone:"Asia/Shanghai"})),_=I({month:new Date().toLocaleDateString("sv-SE",{timeZone:"Asia/Shanghai"}).substring(0,7),user_id:""}),X=m(new Date),J=m(new Date().toLocaleDateString("sv-SE",{timeZone:"Asia/Shanghai"})),Se=m([]),Me=m([]),$e=m({}),Ze=G(()=>{const t=D.value.find(e=>e.id===_.user_id);return t?t.realname:""}),Ne=G(()=>{const[t,e]=_.month.split("-").map(Number),l=new Date(t,e,0).getDate();return Array.from({length:l},(n,s)=>s+1)}),qe=t=>{const[e,l]=_.month.split("-").map(Number),n=new Date(e,l-1,t);return["日","一","二","三","四","五","六"][n.getDay()]},Ke=(t,e)=>{var s;const l=`${_.month}-${String(e).padStart(2,"0")}`,n=((s=t.dates[l])==null?void 0:s.hours)||0;return n>0?n:""},ne=m({}),Pe=m(null);async function Xe(t){try{const e=await x.getHolidays(t);ne.value=e.data||{}}catch(e){console.error("Failed to load holidays:",e)}}const Je=(t,e)=>{var s;const l=`${_.month}-${String(e).padStart(2,"0")}`,n=((s=t.dates[l])==null?void 0:s.hours)||0;return n>=8?"cell-filled":n>0?"cell-partial":l{var s;const l=`${_.month}-${String(e).padStart(2,"0")}`,n=((s=t.dates[l])==null?void 0:s.hours)||0;return n>0?`${t.user_name} 在 ${l} 已填报 ${n}h`:lnew Date(t+"T00:00:00").getDay(),et=t=>{const e=t.substring(5);if(ne.value&&ne.value[e])return!ne.value[e].holiday;const l=Ie(t);return l!==0&&l!==6},Q=t=>!et(t),B=t=>{var e;return((e=$e.value[t])==null?void 0:e.hours)||0},tt=t=>t>=oe.value||Q(t)?!1:B(t)===0,We=G(()=>{var t;return((t=$e.value[J.value])==null?void 0:t.list)||[]});async function de(){se.value=!0;try{const[t,e]=_.month.split("-"),l=parseInt(t),n=parseInt(e),s=new Date(l,n,0).getDate(),i=`${_.month}-01`,r=`${_.month}-${String(s).padStart(2,"0")}`;Pe.value!==l&&(Pe.value=l,await Xe(l));const b=await x.getRdStats({start_date:i,end_date:r});Se.value=b.data||[],Be()}catch{ee.error("获取填报日历数据失败")}finally{se.value=!1}}function Be(){const t={};D.value.forEach(e=>{t[e.id]={user_id:e.id,user_name:e.realname,dates:{},total_hours:0}}),Se.value.forEach(e=>{const l=e.user_id;t[l]||(t[l]={user_id:l,user_name:e.user_name||"未知研发",dates:{},total_hours:0});const n=e.work_date;t[l].dates[n]||(t[l].dates[n]={hours:0,records:[]}),t[l].dates[n].hours+=e.hours,t[l].dates[n].records.push(e),t[l].total_hours+=e.hours}),Me.value=Object.values(t).map(e=>(e.total_hours=Math.round(e.total_hours*10)/10,e)).filter(e=>e.total_hours>0)}function at(){de().then(()=>{Y.value==="individual"&&H()})}function lt(t){_.user_id=t,Y.value="individual",H()}function H(){if(!_.user_id)return;const t={};Se.value.forEach(s=>{s.user_id===_.user_id&&(t[s.work_date]||(t[s.work_date]={hours:0,list:[]}),t[s.work_date].hours+=s.hours,t[s.work_date].list.push(s))}),$e.value=t;const[e,l]=_.month.split("-").map(Number),n=X.value;(n.getFullYear()!==e||n.getMonth()+1!==l)&&(X.value=new Date(e,l-1,1)),ot()}function st(t){J.value=t}function ot(){const t=new Date().toLocaleDateString("sv-SE",{timeZone:"Asia/Shanghai"});t.startsWith(_.month)?J.value=t:J.value=`${_.month}-01`}ze(X,t=>{if(t&&Y.value==="individual"){const e=t.getFullYear(),l=String(t.getMonth()+1).padStart(2,"0"),n=`${e}-${l}`;_.month!==n&&(_.month=n,de().then(()=>{H()}))}}),ze(D,()=>{Be()});const re=G(()=>{const[t,e]=_.month.split("-").map(Number),l=new Date(t,e,0).getDate();let n=0,s=0,i=0,r=0;for(let b=1;b<=l;b++){const c=`${_.month}-${String(b).padStart(2,"0")}`,g=B(c);r+=g,g>=8?n++:g>0?s++:cc.sub_project?`${c.client_name}-${c.sub_project}`:c.client_name));ie.value=[...n].sort();const s={};l.forEach(c=>{const g=c.sub_project?`${c.client_name}-${c.sub_project}`:c.client_name;s[c.user_name]||(s[c.user_name]={}),s[c.user_name][g]=(s[c.user_name][g]||0)+c.hours});const i=Object.entries(s).map(([c,g])=>{const O=Object.values(g).reduce((ce,Ce)=>ce+Ce,0);return{label:c,cells:g,total:Math.round(O*10)/10}}),r={};ie.value.forEach(c=>{r[c]=Math.round(i.reduce((g,O)=>g+(O.cells[c]||0),0)*10)/10});const b=Math.round(i.reduce((c,g)=>c+g.total,0)*10)/10;i.push({label:"合计",cells:r,total:b}),ue.value=i}finally{Ve.value=!1}}async function nt(){const t={};let e="开始",l="至今";R.dateRange&&R.dateRange.length===2&&(t.start_date=R.dateRange[0],t.end_date=R.dateRange[1],e=t.start_date,l=t.end_date);const n=await x.exportMatrixExcel(t);Re(n.data,`研发工时汇总_${e}至${l}.xlsx`),ee.success("导出成功")}return(t,e)=>{const l=k("el-date-picker"),n=k("el-button"),s=k("el-table-column"),i=k("el-table"),r=k("el-tab-pane"),b=k("el-option"),c=k("el-select"),g=k("el-tag"),O=k("el-empty"),ce=k("el-radio-button"),Ce=k("el-radio-group"),dt=k("el-calendar"),rt=k("el-tabs"),T=pt("loading");return u(),f("div",_t,[a("div",vt,[e[17]||(e[17]=a("div",null,[a("h1",null,"全局统计看板"),a("p",null,"多维度查看工时数据:销售视角 / 研发视角 / 项目视角")],-1)),a("div",ft,[d(l,{modelValue:F.value,"onUpdate:modelValue":e[0]||(e[0]=o=>F.value=o),type:"daterange","range-separator":"至","start-placeholder":"全部时间起","end-placeholder":"全部时间止","value-format":"YYYY-MM-DD",size:"large"},null,8,["modelValue"]),d(n,{type:"success",onClick:e[1]||(e[1]=o=>le("all")),loading:te.value,size:"large"},{default:p(()=>[...e[16]||(e[16]=[v(" 📊 总导出 (All in One) ",-1)])]),_:1},8,["loading"])])]),d(rt,{modelValue:_e.value,"onUpdate:modelValue":e[15]||(e[15]=o=>_e.value=o),type:"border-card",class:"dashboard-tabs"},{default:p(()=>[d(r,{label:"📈 销售视角",name:"sales"},{default:p(()=>[a("div",ht,[d(l,{modelValue:L.dateRange,"onUpdate:modelValue":e[2]||(e[2]=o=>L.dateRange=o),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",size:"default"},null,8,["modelValue"]),d(n,{type:"primary",onClick:Ue},{default:p(()=>[...e[18]||(e[18]=[v("查询",-1)])]),_:1}),d(n,{onClick:e[3]||(e[3]=o=>le("sales"))},{default:p(()=>[...e[19]||(e[19]=[v("📥 导出该页",-1)])]),_:1})]),a("div",gt,[a("div",yt,[e[20]||(e[20]=a("div",{class:"section-title"},"📋 销售人员汇总 (点击展开查看研发明细)",-1)),Z((u(),S(i,{data:ae.value,stripe:"",style:{width:"100%"},"row-key":"sales_name"},{default:p(()=>[d(s,{type:"expand"},{default:p(o=>[a("div",bt,[a("div",wt," [ "+h(o.row.sales_name)+" ] 的研发工时消耗明细: ",1),d(i,{data:o.row.rdList,border:"",style:{width:"100%"},size:"small"},{default:p(()=>[d(s,{prop:"rd_name",label:"研发人员",width:"150"}),d(s,{prop:"total_hours",label:"消耗工时(h)",width:"120"}),d(s,{prop:"work_days",label:"工作天数",width:"120"})]),_:1},8,["data"])])]),_:1}),d(s,{prop:"sales_name",label:"销售人员","min-width":"140"}),d(s,{prop:"project_count",label:"项目数","min-width":"100"}),d(s,{prop:"rd_count",label:"涉及研发","min-width":"120"}),d(s,{prop:"total_hours",label:"总消耗工时(h)","min-width":"130",sortable:""})]),_:1},8,["data"])),[[T,we.value]])]),a("div",kt,[a("div",xt,[e[21]||(e[21]=a("div",{class:"chart-title"},"销售占用工时占比(饼图)",-1)),a("div",{ref_key:"salesChartRef",ref:ve,class:"big-chart"},null,512)]),a("div",Dt,[e[22]||(e[22]=a("div",{class:"chart-title"},"各销售工时对比(柱状图)",-1)),a("div",{ref_key:"salesBarRef",ref:ge,class:"big-chart"},null,512)])])])]),_:1}),d(r,{label:"👨‍💻 研发视角",name:"rd"},{default:p(()=>[a("div",Rt,[d(l,{modelValue:w.dateRange,"onUpdate:modelValue":e[4]||(e[4]=o=>w.dateRange=o),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",size:"default"},null,8,["modelValue"]),d(c,{modelValue:w.user_id,"onUpdate:modelValue":e[5]||(e[5]=o=>w.user_id=o),placeholder:"全部研发",clearable:"",size:"default",style:{width:"150px"}},{default:p(()=>[(u(!0),f(U,null,A(D.value,o=>(u(),S(b,{key:o.id,label:o.realname,value:o.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),d(n,{type:"primary",onClick:Ae},{default:p(()=>[...e[23]||(e[23]=[v("查询",-1)])]),_:1}),d(n,{onClick:e[6]||(e[6]=o=>le("rd"))},{default:p(()=>[...e[24]||(e[24]=[v("📥 导出该页",-1)])]),_:1})]),a("div",St,[a("div",Mt,[e[25]||(e[25]=a("div",{class:"section-title"},"📋 研发人员填报明细",-1)),Z((u(),S(i,{data:ke.value,stripe:"",style:{width:"100%"}},{default:p(()=>[d(s,{prop:"user_name",label:"研发人员","min-width":"120"}),d(s,{prop:"client_name",label:"客户/项目","min-width":"180"}),d(s,{prop:"work_date",label:"日期","min-width":"120"}),d(s,{prop:"hours",label:"工时(h)","min-width":"100"}),d(s,{prop:"remark",label:"备注","min-width":"180"})]),_:1},8,["data"])),[[T,xe.value]])]),a("div",$t,[a("div",Vt,[e[26]||(e[26]=a("div",{class:"chart-title"},"研发人员工时产出占比(饼图)",-1)),a("div",{ref_key:"rdChartRef",ref:fe,class:"big-chart"},null,512)]),a("div",jt,[e[27]||(e[27]=a("div",{class:"chart-title"},"各研发人员工时对比(柱状图)",-1)),a("div",{ref_key:"rdBarRef",ref:ye,class:"big-chart"},null,512)])])])]),_:1}),d(r,{label:"🏢 项目视角",name:"project"},{default:p(()=>[a("div",Ct,[d(l,{modelValue:y.dateRange,"onUpdate:modelValue":e[7]||(e[7]=o=>y.dateRange=o),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",size:"default",style:{"margin-right":"12px"}},null,8,["modelValue"]),d(c,{modelValue:y.sales_id,"onUpdate:modelValue":e[8]||(e[8]=o=>y.sales_id=o),clearable:"",placeholder:"全部销售",style:{width:"140px","margin-right":"12px"}},{default:p(()=>[(u(!0),f(U,null,A(Le.value,o=>(u(),S(b,{key:o.id,label:o.realname,value:o.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"]),d(n,{type:"primary",onClick:Oe},{default:p(()=>[...e[28]||(e[28]=[v("查询",-1)])]),_:1}),d(n,{onClick:e[9]||(e[9]=o=>le("project"))},{default:p(()=>[...e[29]||(e[29]=[v("📥 导出该页",-1)])]),_:1})]),a("div",zt,[a("div",Lt,[e[30]||(e[30]=a("div",{class:"section-title"},"📋 项目总览 (点击展开查看研发明细)",-1)),Z((u(),S(i,{data:K.value,stripe:"",style:{width:"100%"},"row-key":"client_id"},{default:p(()=>[d(s,{type:"expand"},{default:p(o=>[a("div",Yt,[a("div",Et," [ "+h(o.row.client_name)+" ] 的参与研发明细: ",1),d(i,{data:o.row.rdList,border:"",style:{width:"100%"},size:"small"},{default:p(()=>[d(s,{prop:"rd_name",label:"研发人员",width:"150"}),d(s,{prop:"total_hours",label:"消耗工时(h)",width:"120",sortable:""}),d(s,{prop:"work_days",label:"工作天数",width:"120"}),d(s,{prop:"first_date",label:"首次介入",width:"120"}),d(s,{prop:"last_date",label:"最近介入",width:"120"})]),_:1},8,["data"])])]),_:1}),d(s,{prop:"client_name",label:"客户/项目","min-width":"200"}),d(s,{prop:"sales_name",label:"所属销售","min-width":"120"}),d(s,{prop:"client_status",label:"状态","min-width":"90"},{default:p(({row:o})=>[d(g,{type:o.client_status===1?"success":"info",effect:"dark",round:""},{default:p(()=>[v(h(o.client_status===1?"进行中":"已结算"),1)]),_:2},1032,["type"])]),_:1}),d(s,{prop:"total_hours",label:"总工时(h)","min-width":"110",sortable:""}),d(s,{prop:"rd_count",label:"研发人数","min-width":"100"})]),_:1},8,["data"])),[[T,De.value]])]),a("div",Ut,[a("div",At,[e[31]||(e[31]=a("div",{class:"chart-title"},"项目工时分布(饼图)",-1)),a("div",{ref_key:"projectChartRef",ref:he,class:"big-chart"},null,512)]),a("div",Ot,[e[32]||(e[32]=a("div",{class:"chart-title"},"各项目工时对比(柱状图)",-1)),a("div",{ref_key:"projectBarRef",ref:be,class:"big-chart"},null,512)])])])]),_:1}),d(r,{label:"📊 研发工时汇总",name:"matrix"},{default:p(()=>[a("div",Ft,[d(l,{modelValue:R.dateRange,"onUpdate:modelValue":e[10]||(e[10]=o=>R.dateRange=o),type:"daterange","range-separator":"至","start-placeholder":"开始日期","end-placeholder":"结束日期","value-format":"YYYY-MM-DD",size:"default"},null,8,["modelValue"]),d(n,{type:"primary",onClick:je},{default:p(()=>[...e[33]||(e[33]=[v("查询",-1)])]),_:1}),d(n,{onClick:nt},{default:p(()=>[...e[34]||(e[34]=[v("📥 导出该页",-1)])]),_:1})]),Z((u(),f("div",Nt,[ue.value.length?(u(),f("table",Pt,[a("thead",null,[a("tr",null,[e[35]||(e[35]=a("th",{class:"row-header"},"研发人员",-1)),(u(!0),f(U,null,A(ie.value,o=>(u(),f("th",{key:o},h(o),1))),128)),e[36]||(e[36]=a("th",{class:"total-col"},"合计",-1))])]),a("tbody",null,[(u(!0),f(U,null,A(ue.value,(o,E)=>(u(),f("tr",{key:E,class:Te({"total-row":E===ue.value.length-1})},[a("td",Wt,h(o.label),1),(u(!0),f(U,null,A(ie.value,He=>(u(),f("td",{key:He},h(o.cells[He]||"-"),1))),128)),a("td",Bt,h(o.total),1)],2))),128))])])):(u(),S(O,{key:1,description:"暂无工时数据"}))])),[[T,Ve.value]])]),_:1}),d(r,{label:"📅 填报日历",name:"calendar"},{default:p(()=>[a("div",Ht,[d(l,{modelValue:_.month,"onUpdate:modelValue":e[11]||(e[11]=o=>_.month=o),type:"month",placeholder:"选择月份","value-format":"YYYY-MM",size:"default",clearable:!1,onChange:at,style:{width:"140px","margin-right":"12px"}},null,8,["modelValue"]),d(Ce,{modelValue:Y.value,"onUpdate:modelValue":e[12]||(e[12]=o=>Y.value=o),size:"default",style:{"margin-right":"12px"}},{default:p(()=>[d(ce,{value:"grid"},{default:p(()=>[...e[37]||(e[37]=[v("全员概览",-1)])]),_:1}),d(ce,{value:"individual"},{default:p(()=>[...e[38]||(e[38]=[v("个人日历",-1)])]),_:1})]),_:1},8,["modelValue"]),Y.value==="individual"?(u(),S(c,{key:0,modelValue:_.user_id,"onUpdate:modelValue":e[13]||(e[13]=o=>_.user_id=o),placeholder:"选择研发人员",size:"default",style:{width:"150px"},onChange:H},{default:p(()=>[(u(!0),f(U,null,A(D.value,o=>(u(),S(b,{key:o.id,label:o.realname,value:o.id},null,8,["label","value"]))),128))]),_:1},8,["modelValue"])):me("",!0)]),Y.value==="grid"?Z((u(),f("div",Tt,[a("div",Gt,[a("span",null,"👥 R&D 全员填报状态矩阵 ("+h(_.month)+")",1),e[39]||(e[39]=a("div",{class:"calendar-legends"},[a("span",{class:"legend-item"},[a("span",{class:"dot green"}),v("已满8h")]),a("span",{class:"legend-item"},[a("span",{class:"dot yellow"}),v("未满8h")]),a("span",{class:"legend-item"},[a("span",{class:"dot red"}),v("漏填报")]),a("span",{class:"legend-item"},[a("span",{class:"dot gray"}),v("周末/未到期")])],-1))]),Me.value.length?(u(),f("table",Zt,[a("thead",null,[a("tr",null,[e[40]||(e[40]=a("th",{class:"name-header"},"姓名",-1)),(u(!0),f(U,null,A(Ne.value,o=>(u(),f("th",{key:o,class:"day-col"},[v(h(o)+" ",1),a("span",qt,h(qe(o)),1)]))),128)),e[41]||(e[41]=a("th",{class:"total-header"},"累计工时",-1))])]),a("tbody",null,[(u(!0),f(U,null,A(Me.value,o=>(u(),f("tr",{key:o.user_id,class:"grid-row"},[a("td",{class:"name-header clickable",onClick:E=>lt(o.user_id)},[v(h(o.user_name)+" ",1),e[42]||(e[42]=a("span",{class:"arrow-tip"},"📅",-1))],8,Kt),(u(!0),f(U,null,A(Ne.value,E=>(u(),f("td",{key:E,class:Te(["status-cell",Je(o,E)]),title:Qe(o,E)},[a("span",Jt,h(Ke(o,E)),1)],10,Xt))),128)),a("td",Qt,h(o.total_hours)+"h",1)]))),128))])])):(u(),S(O,{key:1,description:"暂无研发人员数据"}))])),[[T,se.value]]):Z((u(),f("div",It,[a("div",ea,[a("div",ta,[a("div",aa,[a("span",null,"📅 "+h(Ze.value)+" 的个人日历 ("+h(_.month)+")",1),e[43]||(e[43]=a("div",{class:"calendar-legends"},[a("span",{class:"legend-item"},[a("span",{class:"dot green"}),v("已满8h")]),a("span",{class:"legend-item"},[a("span",{class:"dot yellow"}),v("未满8h")]),a("span",{class:"legend-item"},[a("span",{class:"dot red"}),v("漏填")]),a("span",{class:"legend-item"},[a("span",{class:"dot gray"}),v("周末/未到期")])],-1))]),d(dt,{modelValue:X.value,"onUpdate:modelValue":e[14]||(e[14]=o=>X.value=o)},{"date-cell":p(({data:o})=>[a("div",{class:"day-cell-content",onClick:E=>st(o.day)},[a("div",sa,[a("span",oa,h(o.day.split("-")[2]),1),Q(o.day)?(u(),f("span",na,"休")):me("",!0)]),a("div",da,[B(o.day)>=8?(u(),f("div",ra,h(B(o.day))+"h ",1)):B(o.day)>0?(u(),f("div",ia,h(B(o.day))+"h ",1)):tt(o.day)?(u(),f("div",ua," 未填报 ")):me("",!0)])],8,la)]),_:1},8,["modelValue"])])]),a("div",ca,[a("div",pa,[e[52]||(e[52]=a("div",{class:"card-title"},"📊 月度数据汇总",-1)),a("div",ma,[a("div",_a,[e[45]||(e[45]=a("div",{class:"label"},"满额填报",-1)),a("div",va,[v(h(re.value.fullDays),1),e[44]||(e[44]=a("span",{class:"unit"},"天",-1))])]),a("div",fa,[e[47]||(e[47]=a("div",{class:"label"},"部分填报",-1)),a("div",ha,[v(h(re.value.partialDays),1),e[46]||(e[46]=a("span",{class:"unit"},"天",-1))])]),a("div",ga,[e[49]||(e[49]=a("div",{class:"label"},"漏填工作日",-1)),a("div",ya,[v(h(re.value.unfilledDays),1),e[48]||(e[48]=a("span",{class:"unit"},"天",-1))])]),a("div",ba,[e[51]||(e[51]=a("div",{class:"label"},"累计总工时",-1)),a("div",wa,[v(h(re.value.totalHours),1),e[50]||(e[50]=a("span",{class:"unit"},"小时",-1))])])])]),a("div",ka,[a("div",xa,"📋 "+h(J.value)+" 工时明细",1),d(i,{data:We.value,stripe:"",style:{width:"100%"},size:"small"},{default:p(()=>[d(s,{prop:"client_name",label:"客户/项目","min-width":"130"}),d(s,{prop:"hours",label:"工时",width:"70"}),d(s,{prop:"remark",label:"备注","min-width":"120","show-overflow-tooltip":""})]),_:1},8,["data"]),We.value.length?me("",!0):(u(),S(O,{key:0,description:"当天暂无工时记录","image-size":50}))])])])),[[T,se.value]])]),_:1})]),_:1},8,["modelValue"])])}}},ja=it(Da,[["__scopeId","data-v-1b72ad74"]]);export{ja as default};