Files
tongjiweb/server/public/assets/TimesheetDetails-dfTClOx8.js

2 lines
5.8 KiB
JavaScript

import{_ as Z,h as c,p as q,c as r,a as s,y as K,D as O,k as F,w as g,t as i,e as _,z as f,b as u,x as P,r as y,j as C,u as G,o as d,E as J}from"./index-B5IUyHJe.js";import{r as N}from"./index-OKS9XN2R.js";const Q={class:"details-layout"},X={class:"calendar-section"},ee={class:"content-card"},te=["onClick"],se={class:"day-header"},ae={class:"day-num"},le={key:0,class:"weekend-tag"},oe={key:0,class:"day-body"},ne={key:0,class:"status-badge filled"},ie={key:1,class:"status-badge partial"},de={key:2,class:"status-badge unfilled"},ce={class:"info-section"},re={class:"content-card stats-mini-card"},ue={class:"card-title"},ve={class:"mini-stats-grid"},pe={class:"mini-stat-item green-glow"},_e={class:"value green-text"},ye={class:"mini-stat-item yellow-glow"},me={class:"value yellow-text"},he={class:"mini-stat-item red-glow"},ge={class:"value red-text"},fe={class:"mini-stat-item purple-glow"},we={class:"value purple-text"},De={class:"content-card records-card"},ke={class:"card-title"},be={key:0,class:"empty-placeholder"},Se={__name:"TimesheetDetails",setup(Me){const B=G(),v=c(new Date),m=c(new Date().toLocaleDateString("sv-SE",{timeZone:"Asia/Shanghai"})),E=c(new Date().toLocaleDateString("sv-SE",{timeZone:"Asia/Shanghai"})),x=c({}),V=c(!1),$=c(0),R=C(()=>{const t=v.value.getFullYear(),e=String(v.value.getMonth()+1).padStart(2,"0");return`${t}-${e}`}),T=C(()=>{var t;return((t=x.value[m.value])==null?void 0:t.list)||[]}),w=c({}),z=c(null);async function Y(t){try{const e=await N.getHolidays(t);w.value=e.data||{},$.value++}catch(e){console.error("Failed to load holidays:",e)}}const A=t=>new Date(t+"T00:00:00").getDay(),j=t=>{const e=t.substring(5);if(w.value&&w.value[e])return!w.value[e].holiday;const o=A(t);return o!==0&&o!==6},H=t=>!j(t),p=t=>{var e;return((e=x.value[t])==null?void 0:e.hours)||0},I=t=>t>=E.value||H(t)?!1:p(t)===0;async function L(t){V.value=!0;try{const o=(await N.getTimesheets({month:t})).data.records||[],n={};o.forEach(l=>{n[l.work_date]||(n[l.work_date]={hours:0,list:[]}),n[l.work_date].hours+=l.hours,n[l.work_date].list.push(l)}),x.value=n,$.value++}catch{J.error("获取月度工时失败")}finally{V.value=!1}}q(v,t=>{if(t){const e=t.getFullYear(),o=String(t.getMonth()+1).padStart(2,"0"),n=`${e}-${o}`;z.value!==e&&(z.value=e,Y(e)),L(n)}},{immediate:!0});function U(t){m.value=t}function W(){B.push({path:"/timesheet",query:{date:m.value}})}const D=C(()=>{const t=v.value,e=t.getFullYear(),o=t.getMonth()+1,n=new Date(e,o,0).getDate();let l=0,k=0,b=0,S=0;for(let h=1;h<=n;h++){const a=`${e}-${String(o).padStart(2,"0")}-${String(h).padStart(2,"0")}`,M=p(a);S+=M,M>=8?l++:M>0?k++:a<E.value&&!H(a)&&b++}return{fullDays:l,partialDays:k,unfilledDays:b,totalHours:Math.round(S*10)/10}});return(t,e)=>{const o=y("el-calendar"),n=y("el-button"),l=y("el-table-column"),k=y("el-tag"),b=y("el-table"),S=y("el-empty"),h=P("loading");return d(),r("div",null,[e[11]||(e[11]=s("div",{class:"page-header"},[s("h1",null,"填报详情"),s("p",null,"查看您的每日工时填报日历和明细记录")],-1)),K((d(),r("div",Q,[s("div",X,[s("div",ee,[e[1]||(e[1]=O('<div class="card-title" data-v-e631ac04><span data-v-e631ac04>📅 工时填报日历</span><div class="calendar-legends" data-v-e631ac04><span class="legend-item" data-v-e631ac04><span class="dot green" data-v-e631ac04></span>已满8h</span><span class="legend-item" data-v-e631ac04><span class="dot yellow" data-v-e631ac04></span>未满8h</span><span class="legend-item" data-v-e631ac04><span class="dot red" data-v-e631ac04></span>漏填报</span><span class="legend-item" data-v-e631ac04><span class="dot gray" data-v-e631ac04></span>未到期/周末</span></div></div>',1)),(d(),F(o,{modelValue:v.value,"onUpdate:modelValue":e[0]||(e[0]=a=>v.value=a),key:$.value},{"date-cell":g(({data:a})=>[s("div",{class:"day-cell-content",onClick:M=>U(a.day)},[s("div",se,[s("span",ae,i(a.day.split("-")[2]),1),a.type==="current-month"&&H(a.day)?(d(),r("span",le,"休")):f("",!0)]),a.type==="current-month"?(d(),r("div",oe,[p(a.day)>=8?(d(),r("div",ne,i(p(a.day))+"h ",1)):p(a.day)>0?(d(),r("div",ie,i(p(a.day))+"h ",1)):I(a.day)?(d(),r("div",de," 未填报 ")):f("",!0)])):f("",!0)],8,te)]),_:1},8,["modelValue"]))])]),s("div",ce,[s("div",re,[s("div",ue,"📊 本月度汇总 ("+i(R.value)+")",1),s("div",ve,[s("div",pe,[e[3]||(e[3]=s("div",{class:"label"},"满额填报",-1)),s("div",_e,[_(i(D.value.fullDays),1),e[2]||(e[2]=s("span",{class:"unit"},"天",-1))])]),s("div",ye,[e[5]||(e[5]=s("div",{class:"label"},"部分填报",-1)),s("div",me,[_(i(D.value.partialDays),1),e[4]||(e[4]=s("span",{class:"unit"},"天",-1))])]),s("div",he,[e[7]||(e[7]=s("div",{class:"label"},"漏填工作日",-1)),s("div",ge,[_(i(D.value.unfilledDays),1),e[6]||(e[6]=s("span",{class:"unit"},"天",-1))])]),s("div",fe,[e[9]||(e[9]=s("div",{class:"label"},"累计总工时",-1)),s("div",we,[_(i(D.value.totalHours),1),e[8]||(e[8]=s("span",{class:"unit"},"小时",-1))])])])]),s("div",De,[s("div",ke,[s("span",null,"📋 "+i(m.value)+" 工时明细",1),m.value?(d(),F(n,{key:0,type:"primary",size:"default",onClick:W},{default:g(()=>[...e[10]||(e[10]=[_(" ✍️ 去填报/修改 ",-1)])]),_:1})):f("",!0)]),u(b,{data:T.value,stripe:"",style:{width:"100%"},size:"default"},{default:g(()=>[u(l,{prop:"client_name",label:"客户/项目","min-width":"120"}),u(l,{prop:"service_type",label:"售前/售后",width:"90"},{default:g(({row:a})=>[u(k,{type:a.service_type==="售后"?"warning":"success",size:"small"},{default:g(()=>[_(i(a.service_type||"售前"),1)]),_:2},1032,["type"])]),_:1}),u(l,{prop:"project_type",label:"子项目",width:"100"}),u(l,{prop:"hours",label:"工时(h)",width:"80"}),u(l,{prop:"remark",label:"备注","min-width":"120","show-overflow-tooltip":""})]),_:1},8,["data"]),T.value.length?f("",!0):(d(),r("div",be,[u(S,{description:"该日期暂无工时记录","image-size":60})]))])])])),[[h,V.value]])])}}},$e=Z(Se,[["__scopeId","data-v-e631ac04"]]);export{$e as default};