| 1 |
- import{periodApi as K}from"./index-Dhl0yoWK.js";import{u as _e}from"./auth-BfQBitXm.js";import{_ as me,r as S,j as fe,o as n,c as d,a as s,n as R,f as T,w as i,g as v,t as l,b as o,F as k,p as I,x as m,e as f,h as r,q as J,E as ye,y as $}from"./index-BwYZ2HSO.js";const ge={class:"app-page period-workbench"},ke={class:"app-page-header page-hero"},be={key:0,class:"period-metrics metric-row"},De={class:"metric-card"},he={class:"metric-card"},Ce={class:"metric-card"},Ee={class:"metric-card"},Te={key:1,class:"empty-state"},Ie={key:0,class:"tab-bar"},Ae=["onClick"],Se={class:"tab-label"},Re={class:"tab-count"},we={key:1,class:"category"},Ne={class:"cat-head"},Ve={class:"cat-count"},Oe={key:0,class:"sub-group"},Le={class:"card-body"},Ke={class:"card-main"},Ge={class:"card-info"},ze={class:"card-name"},Ue={class:"card-date"},He={class:"card-actions"},Ye={class:"card-guide"},Me={key:1,class:"sub-group"},$e={class:"card-body"},xe={class:"card-main"},Be={class:"card-info"},Fe={class:"card-name"},Xe={class:"card-date"},We={class:"card-actions"},Pe={class:"card-guide"},qe={key:2,class:"sub-group"},Qe={class:"card-body"},je={class:"card-main"},Je={class:"card-info"},Ze={class:"card-name"},et={class:"card-date"},tt={key:0,class:"card-actions"},st={key:2,class:"category"},at={class:"cat-head"},lt={class:"cat-count"},nt={class:"card-body"},ot={class:"card-main"},it={class:"card-info"},dt={class:"card-name"},rt={class:"card-date"},ut={key:0,class:"card-actions"},ct={key:3,class:"category"},vt={class:"cat-head"},pt={class:"cat-count"},_t={class:"card-body"},mt={class:"card-main"},ft={class:"card-info"},yt={class:"card-name"},gt={class:"card-date"},kt={key:0,class:"batch-preview"},bt={class:"bp-num"},Dt={class:"bp-name"},ht={class:"bp-date"},Ct={__name:"PeriodListView",setup(Et){const h=_e(),C=S([]),w=S(!1),b=S(!1),U=S(null),u=S({name:"",periodType:"MONTHLY",startDate:"",endDate:""}),Z={WEEKLY:7,BI_WEEKLY:14},x={MONTHLY:1,BI_MONTHLY:2,QUARTERLY:3};function B(a,e){const c=new Date(a);if(x[e]){const p=x[e],y=new Date(c);return y.setMonth(y.getMonth()+p),y.setDate(y.getDate()-1),y}const g=Z[e]||7;return new Date(c.getTime()+g*864e5)}const F=new Date().toISOString().split("T")[0],ee=m(()=>(h.isAdmin,"active")),D=S(ee.value),te=m(()=>[{key:"all",label:"全部",count:C.value.length},{key:"active",label:"进行中",count:E.value.length},{key:"upcoming",label:"未开始",count:G.value.length},{key:"archived",label:"已结束",count:N.value.length}]),se=m(()=>D.value==="all"||D.value==="active"),ae=m(()=>D.value==="all"||D.value==="upcoming"),le=m(()=>D.value==="all"||D.value==="archived"),N=m(()=>C.value.filter(a=>a.status==="ARCHIVED")),E=m(()=>C.value.filter(a=>a.status!=="ARCHIVED"&&a.startDate<=F)),G=m(()=>C.value.filter(a=>a.status!=="ARCHIVED"&&a.startDate>F)),X=m(()=>E.value.filter(a=>a.status==="EXECUTING"||a.status==="ASSESSING")),ne=m(()=>E.value.filter(a=>a.status==="ASSESSING")),H=m(()=>E.value.filter(a=>a.status==="OKR_ALIGN")),W=m(()=>E.value.filter(a=>a.status==="DRAFT")),P=m(()=>{if(!b.value)return[];const a=u.value.startDate;if(!a)return[];const e=new Date(a),c=[];let g=new Date(e);for(let p=0;p<6;p++){const y=B(g,u.value.periodType);c.push({startDate:g.toISOString().split("T")[0],endDate:y.toISOString().split("T")[0]}),g=new Date(y),g.setDate(g.getDate()+1)}return c});function Y(){const a=u.value.startDate;if(a&&!b.value){const e=B(a,u.value.periodType);u.value.endDate=e.toISOString().split("T")[0]}}function M(a){return a?typeof a=="string"?a:a.toISOString().split("T")[0]:""}fe(()=>z());async function z(){C.value=await K.list()}async function oe(){if(b.value)await K.batchCreate({namePrefix:(u.value.name||"周期")+"",periodType:u.value.periodType,startDate:M(u.value.startDate)}),$.success("已批量创建 6 个连续周期");else{const a=u.value;await K.create({name:a.name,periodType:a.periodType,startDate:M(a.startDate),endDate:M(a.endDate)}),$.success("周期已创建")}w.value=!1,b.value=!1,u.value={name:"",periodType:"MONTHLY",startDate:"",endDate:""},z()}async function A(a,e){if(!U.value){U.value=a;try{await K.transition(a,e),z()}catch{}finally{U.value=null}}}async function q(a){await ye.confirm("确定删除该周期吗?","提示",{type:"warning"}),await K.delete(a),$.success("已删除"),z()}function V(a){return{WEEKLY:"单周",BI_WEEKLY:"双周",MONTHLY:"单月",BI_MONTHLY:"双月",QUARTERLY:"季度"}[a]||a}function ie(a){return{DRAFT:"待发布",OKR_ALIGN:"OKR 对齐中",EXECUTING:"执行中",ASSESSING:"考评中",ARCHIVED:"已归档"}[a]||a}function de(a){return{DRAFT:"info",OKR_ALIGN:"",EXECUTING:"success",ASSESSING:"warning",ARCHIVED:"info"}[a]||"info"}function Q(a){return{DRAFT:"管理员发布后团队成员即可提交 OKR。",OKR_ALIGN:"部门负责人发布部门 OKR → 员工提交个人 OKR 并对齐 → 上级审核。",EXECUTING:"OKR 已锁定,员工每周更新 KR 进度。",ASSESSING:"员工自评 → 上级打分 → 面谈沟通 → 归档。",ARCHIVED:"已归档,数据不可修改。"}[a.status]||""}return(a,e)=>{const c=f("el-button"),g=f("el-empty"),p=f("el-tag"),y=f("el-input"),O=f("el-form-item"),L=f("el-option"),re=f("el-select"),j=f("el-date-picker"),ue=f("el-divider"),ce=f("el-checkbox"),ve=f("el-form"),pe=f("el-dialog");return n(),d("div",ge,[s("div",ke,[e[9]||(e[9]=s("div",{class:"hero-info"},[s("h2",{class:"app-page-title"},"考核周期"),s("p",{class:"app-page-subtitle"},"管理考核节奏,推动 OKR 对齐")],-1)),R(h).isAdmin?(n(),T(c,{key:0,type:"primary",size:"large",onClick:e[0]||(e[0]=t=>w.value=!0),round:""},{default:i(()=>[...e[8]||(e[8]=[r(" 创建新周期 ",-1)])]),_:1})):v("",!0)]),C.value.length?(n(),d("div",be,[s("div",De,[e[10]||(e[10]=s("span",{class:"metric-card__label"},"进行中",-1)),s("strong",null,l(E.value.length),1)]),s("div",he,[e[11]||(e[11]=s("span",{class:"metric-card__label"},"OKR 对齐",-1)),s("strong",null,l(H.value.length),1)]),s("div",Ce,[e[12]||(e[12]=s("span",{class:"metric-card__label"},"考评中",-1)),s("strong",null,l(ne.value.length),1)]),s("div",Ee,[e[13]||(e[13]=s("span",{class:"metric-card__label"},"已归档",-1)),s("strong",null,l(N.value.length),1)])])):v("",!0),C.value.length===0?(n(),d("div",Te,[o(g,{description:"暂无考核周期"},{extra:i(()=>[...e[14]||(e[14]=[s("span",{class:"empty-hint"},"管理员创建周期后,团队即可开始 OKR 对齐",-1)])]),_:1})])):(n(),d(k,{key:2},[R(h).isAdmin?(n(),d("div",Ie,[(n(!0),d(k,null,I(te.value,t=>(n(),d("div",{key:t.key,class:J(["tab-item",{active:D.value===t.key}]),onClick:_=>D.value=t.key},[s("span",Se,l(t.label),1),s("span",Re,l(t.count),1)],10,Ae))),128))])):v("",!0),se.value?(n(),d("div",we,[s("div",Ne,[e[15]||(e[15]=s("span",{class:"cat-badge active"},"进行中",-1)),s("span",Ve,l(E.value.length)+" 个周期",1)]),X.value.length?(n(),d("div",Oe,[e[21]||(e[21]=s("div",{class:"sub-label"},"执行 & 考评",-1)),(n(!0),d(k,null,I(X.value,t=>(n(),d("div",{key:t.id,class:J(["period-card","status-"+t.status])},[s("div",Le,[s("div",Ke,[s("div",Ge,[s("span",ze,l(t.name),1),o(p,{size:"small",type:de(t.status),effect:"dark",round:""},{default:i(()=>[r(l(ie(t.status)),1)]),_:2},1032,["type"]),o(p,{size:"small",effect:"plain",type:"info",round:""},{default:i(()=>[r(l(V(t.periodType)),1)]),_:2},1024)]),s("div",Ue,l(t.startDate)+" ~ "+l(t.endDate),1)]),s("div",He,[R(h).isAdmin?(n(),d(k,{key:0},[t.status==="EXECUTING"?(n(),T(c,{key:0,type:"warning",size:"small",plain:"",onClick:_=>A(t.id,"OKR_ALIGN"),round:""},{default:i(()=>[...e[16]||(e[16]=[r("回退",-1)])]),_:1},8,["onClick"])):v("",!0),t.status==="EXECUTING"?(n(),T(c,{key:1,type:"primary",size:"small",onClick:_=>A(t.id,"ASSESSING"),round:""},{default:i(()=>[...e[17]||(e[17]=[r("进入考评",-1)])]),_:1},8,["onClick"])):v("",!0),t.status==="EXECUTING"?(n(),T(c,{key:2,type:"danger",size:"small",plain:"",onClick:_=>A(t.id,"ARCHIVED"),round:""},{default:i(()=>[...e[18]||(e[18]=[r("直接归档",-1)])]),_:1},8,["onClick"])):v("",!0),t.status==="ASSESSING"?(n(),T(c,{key:3,type:"warning",onClick:_=>A(t.id,"ARCHIVED"),round:""},{default:i(()=>[...e[19]||(e[19]=[r("结束并归档",-1)])]),_:1},8,["onClick"])):v("",!0)],64)):v("",!0),t.status==="ASSESSING"?(n(),T(c,{key:1,type:"warning",size:"small",onClick:_=>a.$router.push({path:"/scores/my",query:{periodId:t.id}}),round:""},{default:i(()=>[...e[20]||(e[20]=[r("去自评",-1)])]),_:1},8,["onClick"])):v("",!0)])]),s("div",Ye,l(Q(t)),1)],2))),128))])):v("",!0),H.value.length?(n(),d("div",Me,[e[25]||(e[25]=s("div",{class:"sub-label"},"OKR 对齐中",-1)),(n(!0),d(k,null,I(H.value,t=>(n(),d("div",{key:t.id,class:"period-card status-OKR_ALIGN"},[s("div",$e,[s("div",xe,[s("div",Be,[s("span",Fe,l(t.name),1),o(p,{type:"warning",size:"small",effect:"dark",round:""},{default:i(()=>[...e[22]||(e[22]=[r("OKR 对齐中",-1)])]),_:1}),o(p,{size:"small",effect:"plain",type:"info",round:""},{default:i(()=>[r(l(V(t.periodType)),1)]),_:2},1024)]),s("div",Xe,l(t.startDate)+" ~ "+l(t.endDate),1)]),s("div",We,[R(h).isAdmin?(n(),T(c,{key:0,type:"warning",size:"small",onClick:_=>A(t.id,"EXECUTING"),round:""},{default:i(()=>[...e[23]||(e[23]=[r("锁定并开始执行",-1)])]),_:1},8,["onClick"])):v("",!0),o(c,{type:"primary",size:"small",onClick:_=>a.$router.push({path:"/okr/my",query:{periodId:t.id}}),round:""},{default:i(()=>[...e[24]||(e[24]=[r("去填写 OKR",-1)])]),_:1},8,["onClick"])])]),s("div",Pe,l(Q(t)),1)]))),128))])):v("",!0),W.value.length?(n(),d("div",qe,[e[29]||(e[29]=s("div",{class:"sub-label"},"未发布",-1)),(n(!0),d(k,null,I(W.value,t=>(n(),d("div",{key:t.id,class:"period-card status-DRAFT"},[s("div",Qe,[s("div",je,[s("div",Je,[s("span",Ze,l(t.name),1),o(p,{type:"info",size:"small",effect:"dark",round:""},{default:i(()=>[...e[26]||(e[26]=[r("待发布",-1)])]),_:1}),o(p,{size:"small",effect:"plain",type:"info",round:""},{default:i(()=>[r(l(V(t.periodType)),1)]),_:2},1024)]),s("div",et,l(t.startDate)+" ~ "+l(t.endDate),1)]),R(h).isAdmin?(n(),d("div",tt,[o(c,{type:"primary",size:"small",onClick:_=>A(t.id,"OKR_ALIGN"),round:""},{default:i(()=>[...e[27]||(e[27]=[r("发布 OKR 对齐",-1)])]),_:1},8,["onClick"]),o(c,{type:"danger",size:"small",plain:"",onClick:_=>q(t.id),round:""},{default:i(()=>[...e[28]||(e[28]=[r("删除",-1)])]),_:1},8,["onClick"])])):v("",!0)])]))),128))])):v("",!0)])):v("",!0),ae.value&&G.value.length?(n(),d("div",st,[s("div",at,[e[30]||(e[30]=s("span",{class:"cat-badge upcoming"},"未开始",-1)),s("span",lt,l(G.value.length)+" 个周期",1)]),(n(!0),d(k,null,I(G.value,t=>(n(),d("div",{key:t.id,class:"period-card status-DRAFT"},[s("div",nt,[s("div",ot,[s("div",it,[s("span",dt,l(t.name),1),o(p,{type:"info",size:"small",effect:"dark",round:""},{default:i(()=>[...e[31]||(e[31]=[r("未开始",-1)])]),_:1}),o(p,{size:"small",effect:"plain",type:"info",round:""},{default:i(()=>[r(l(V(t.periodType)),1)]),_:2},1024)]),s("div",rt,l(t.startDate)+" ~ "+l(t.endDate),1)]),R(h).isAdmin?(n(),d("div",ut,[o(c,{type:"danger",size:"small",plain:"",onClick:_=>q(t.id),round:""},{default:i(()=>[...e[32]||(e[32]=[r("删除",-1)])]),_:1},8,["onClick"])])):v("",!0)])]))),128))])):v("",!0),le.value&&N.value.length?(n(),d("div",ct,[s("div",vt,[e[33]||(e[33]=s("span",{class:"cat-badge archived"},"已结束",-1)),s("span",pt,l(N.value.length)+" 个周期",1)]),(n(!0),d(k,null,I(N.value,t=>(n(),d("div",{key:t.id,class:"period-card status-ARCHIVED"},[s("div",_t,[s("div",mt,[s("div",ft,[s("span",yt,l(t.name),1),o(p,{type:"info",size:"small",effect:"plain",round:""},{default:i(()=>[...e[34]||(e[34]=[r("已归档",-1)])]),_:1}),o(p,{size:"small",effect:"plain",type:"info",round:""},{default:i(()=>[r(l(V(t.periodType)),1)]),_:2},1024)]),s("div",gt,l(t.startDate)+" ~ "+l(t.endDate),1)])])]))),128))])):v("",!0)],64)),o(pe,{modelValue:w.value,"onUpdate:modelValue":e[7]||(e[7]=t=>w.value=t),title:"创建考核周期",width:"520px"},{footer:i(()=>[o(c,{onClick:e[6]||(e[6]=t=>w.value=!1)},{default:i(()=>[...e[37]||(e[37]=[r("取消",-1)])]),_:1}),o(c,{type:"primary",onClick:oe},{default:i(()=>[r(l(b.value?"批量创建 6 个周期":"创建"),1)]),_:1})]),default:i(()=>[o(ve,{model:u.value,"label-width":"80px"},{default:i(()=>[o(O,{label:"名称前缀"},{default:i(()=>[o(y,{modelValue:u.value.name,"onUpdate:modelValue":e[1]||(e[1]=t=>u.value.name=t),placeholder:"如:2026、"},null,8,["modelValue"])]),_:1}),o(O,{label:"周期类型"},{default:i(()=>[o(re,{modelValue:u.value.periodType,"onUpdate:modelValue":e[2]||(e[2]=t=>u.value.periodType=t),placeholder:"选择周期类型",onChange:Y,style:{width:"100%"}},{default:i(()=>[o(L,{label:"单周(7天)",value:"WEEKLY"}),o(L,{label:"双周(14天)",value:"BI_WEEKLY"}),o(L,{label:"单月(自然月)",value:"MONTHLY"}),o(L,{label:"双月(2个自然月)",value:"BI_MONTHLY"}),o(L,{label:"季度(3个自然月)",value:"QUARTERLY"})]),_:1},8,["modelValue"])]),_:1}),o(O,{label:"开始日期"},{default:i(()=>[o(j,{modelValue:u.value.startDate,"onUpdate:modelValue":e[3]||(e[3]=t=>u.value.startDate=t),type:"date",placeholder:"选择日期",onChange:Y,style:{width:"100%"}},null,8,["modelValue"])]),_:1}),o(O,{label:"结束日期"},{default:i(()=>[o(j,{modelValue:u.value.endDate,"onUpdate:modelValue":e[4]||(e[4]=t=>u.value.endDate=t),type:"date",placeholder:"自动计算或手动选择",style:{width:"100%"}},null,8,["modelValue"])]),_:1}),o(ue),o(O,{label:"批量创建"},{default:i(()=>[o(ce,{modelValue:b.value,"onUpdate:modelValue":e[5]||(e[5]=t=>b.value=t),onChange:Y},{default:i(()=>[...e[35]||(e[35]=[r(" 批量创建 6 个连续周期 ",-1)])]),_:1},8,["modelValue"])]),_:1}),b.value&&P.value.length?(n(),d("div",kt,[e[36]||(e[36]=s("div",{class:"bp-title"},"预览(将创建以下 6 个周期)",-1)),(n(!0),d(k,null,I(P.value,(t,_)=>(n(),d("div",{key:_,class:"bp-item"},[s("span",bt,l(_+1),1),s("span",Dt,l(u.value.name||"周期")+l(_+1),1),s("span",ht,l(t.startDate)+" ~ "+l(t.endDate),1)]))),128))])):v("",!0)]),_:1},8,["model"])]),_:1},8,["modelValue"])])}}},St=me(Ct,[["__scopeId","data-v-95ee1f42"]]);export{St as default};
|