Просмотр исходного кода

style: redesign period status colors — ASSESSING amber instead of red, ARCHIVED grey, cleaner lifecycle palette

wangkangyjy 2 месяцев назад
Родитель
Сommit
8015a15f83
32 измененных файлов с 19 добавлено и 21 удалено
  1. 0 0
      backend/src/main/resources/static/assets/AlignmentView-B7PQ_eJ7.js
  2. 0 0
      backend/src/main/resources/static/assets/DimensionConfigView-Cx1voAV4.js
  3. 0 0
      backend/src/main/resources/static/assets/FeedbackView-DquHIEBV.js
  4. 0 0
      backend/src/main/resources/static/assets/HistoryView-CZR7lUPv.js
  5. 0 0
      backend/src/main/resources/static/assets/KpiTemplateView-DBaYrc00.js
  6. 0 0
      backend/src/main/resources/static/assets/LogView-D68Ph_fs.js
  7. 0 0
      backend/src/main/resources/static/assets/LoginView-4JlB4y1J.js
  8. 0 1
      backend/src/main/resources/static/assets/MainLayout-Dj3tFI8C.js
  9. 0 0
      backend/src/main/resources/static/assets/MyOkrView-A_E-HxmB.js
  10. 0 0
      backend/src/main/resources/static/assets/MyOkrView-DLn_xYu_.css
  11. 0 0
      backend/src/main/resources/static/assets/MyOkrView-d2G2d-un.css
  12. 0 0
      backend/src/main/resources/static/assets/MyResultView-BGqD1Ly8.js
  13. 1 1
      backend/src/main/resources/static/assets/NotificationView-1b9A9d7e.js
  14. 0 0
      backend/src/main/resources/static/assets/OrgView-V1bQqNSk.js
  15. 0 0
      backend/src/main/resources/static/assets/PeriodBanner-Bgo0p1nw.js
  16. 0 0
      backend/src/main/resources/static/assets/PeriodBanner-Bq0-4QKL.js
  17. 1 0
      backend/src/main/resources/static/assets/PeriodBanner-D4Mc5jvC.css
  18. 0 1
      backend/src/main/resources/static/assets/PeriodBanner-DHo6KqN8.css
  19. 0 0
      backend/src/main/resources/static/assets/PeriodListView-BE0TOKgv.js
  20. 0 0
      backend/src/main/resources/static/assets/PeriodListView-CI4nnOu9.js
  21. 0 0
      backend/src/main/resources/static/assets/PeriodListView-Cj7wjMiE.css
  22. 0 0
      backend/src/main/resources/static/assets/PeriodListView-Cm2rz-8f.css
  23. 0 0
      backend/src/main/resources/static/assets/ScoringEditView-D8AmITJT.js
  24. 0 0
      backend/src/main/resources/static/assets/ScoringListView-BA439uBI.js
  25. 0 1
      backend/src/main/resources/static/assets/TeamOkrView-CgA0HonJ.js
  26. 1 1
      backend/src/main/resources/static/assets/auth-WIKIZ8Ia.js
  27. 1 1
      backend/src/main/resources/static/assets/index-DJRnqVGv.js
  28. 0 0
      backend/src/main/resources/static/assets/index-DRieORBm.js
  29. 1 1
      backend/src/main/resources/static/index.html
  30. 3 3
      frontend/src/components/PeriodBanner.vue
  31. 1 1
      frontend/src/views/okr/MyOkrView.vue
  32. 10 10
      frontend/src/views/period/PeriodListView.vue

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/AlignmentView-B7PQ_eJ7.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/DimensionConfigView-Cx1voAV4.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/FeedbackView-DquHIEBV.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/HistoryView-CZR7lUPv.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/KpiTemplateView-DBaYrc00.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/LogView-D68Ph_fs.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/LoginView-4JlB4y1J.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
backend/src/main/resources/static/assets/MainLayout-Dj3tFI8C.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/MyOkrView-A_E-HxmB.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/MyOkrView-DLn_xYu_.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/MyOkrView-d2G2d-un.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/MyResultView-BGqD1Ly8.js


+ 1 - 1
backend/src/main/resources/static/assets/NotificationView-CYuTpY7b.js → backend/src/main/resources/static/assets/NotificationView-1b9A9d7e.js

@@ -1 +1 @@
-import{notificationApi as m}from"./index-Tp0ZZGLd.js";import{_ as h,k as x,o as g,c as I,d as t,w as a,r as l,f as s,C as O,n as k,g as A,i as p,t as v,a as _}from"./index-iBAYXZct.js";const V={class:"notification-page"},B={class:"card-header"},F={style:{"margin-top":"16px","text-align":"center"}},K={__name:"NotificationView",setup(z){const u=s([]),r=s(!1),c=s(1),f=s(0);function R(o){return{OKR_REVIEW:"OKR审核",OKR_REVIEWED:"审核结果",SCORE_CONFIRM:"评分确认",SCORE_CONFIRMED:"确认通知",PERIOD_DEADLINE:"截止提醒",KR_LAGGING:"进度滞后",FEEDBACK_NOTIFY:"面谈通知"}[o]||o}async function d(){r.value=!0;try{const o=await m.getPage({page:c.value,size:20});u.value=o.records,f.value=o.total}finally{r.value=!1}}async function w(){await m.markAllRead(),await d()}return x(d),(o,e)=>{const E=l("el-button"),y=l("el-tag"),i=l("el-table-column"),b=l("el-table"),C=l("el-pagination"),D=l("el-card"),N=O("loading");return g(),I("div",V,[t(D,null,{header:a(()=>[_("div",B,[e[2]||(e[2]=_("span",null,"消息通知",-1)),t(E,{text:"",type:"primary",onClick:w},{default:a(()=>[...e[1]||(e[1]=[p("全部已读",-1)])]),_:1})])]),default:a(()=>[k((g(),A(b,{data:u.value,stripe:""},{default:a(()=>[t(i,{label:"状态",width:"70"},{default:a(({row:n})=>[t(y,{size:"small",type:n.isRead===0?"danger":"info"},{default:a(()=>[p(v(n.isRead===0?"未读":"已读"),1)]),_:2},1032,["type"])]),_:1}),t(i,{prop:"title",label:"标题","min-width":"180"}),t(i,{prop:"content",label:"内容","min-width":"240","show-overflow-tooltip":""}),t(i,{label:"类型",width:"120"},{default:a(({row:n})=>[p(v(R(n.type)),1)]),_:1}),t(i,{prop:"createdAtFriendly",label:"时间",width:"100"})]),_:1},8,["data"])),[[N,r.value]]),_("div",F,[t(C,{"current-page":c.value,"onUpdate:currentPage":e[0]||(e[0]=n=>c.value=n),total:f.value,"page-size":20,layout:"prev, pager, next",onCurrentChange:d},null,8,["current-page","total"])])]),_:1})])}}},M=h(K,[["__scopeId","data-v-162a2170"]]);export{M as default};
+import{notificationApi as m}from"./index-DRieORBm.js";import{_ as h,k as x,o as g,c as I,d as t,w as a,r as l,f as s,C as O,n as k,g as A,i as p,t as v,a as _}from"./index-DJRnqVGv.js";const V={class:"notification-page"},B={class:"card-header"},F={style:{"margin-top":"16px","text-align":"center"}},K={__name:"NotificationView",setup(z){const u=s([]),r=s(!1),c=s(1),f=s(0);function R(o){return{OKR_REVIEW:"OKR审核",OKR_REVIEWED:"审核结果",SCORE_CONFIRM:"评分确认",SCORE_CONFIRMED:"确认通知",PERIOD_DEADLINE:"截止提醒",KR_LAGGING:"进度滞后",FEEDBACK_NOTIFY:"面谈通知"}[o]||o}async function d(){r.value=!0;try{const o=await m.getPage({page:c.value,size:20});u.value=o.records,f.value=o.total}finally{r.value=!1}}async function w(){await m.markAllRead(),await d()}return x(d),(o,e)=>{const E=l("el-button"),y=l("el-tag"),i=l("el-table-column"),b=l("el-table"),C=l("el-pagination"),D=l("el-card"),N=O("loading");return g(),I("div",V,[t(D,null,{header:a(()=>[_("div",B,[e[2]||(e[2]=_("span",null,"消息通知",-1)),t(E,{text:"",type:"primary",onClick:w},{default:a(()=>[...e[1]||(e[1]=[p("全部已读",-1)])]),_:1})])]),default:a(()=>[k((g(),A(b,{data:u.value,stripe:""},{default:a(()=>[t(i,{label:"状态",width:"70"},{default:a(({row:n})=>[t(y,{size:"small",type:n.isRead===0?"danger":"info"},{default:a(()=>[p(v(n.isRead===0?"未读":"已读"),1)]),_:2},1032,["type"])]),_:1}),t(i,{prop:"title",label:"标题","min-width":"180"}),t(i,{prop:"content",label:"内容","min-width":"240","show-overflow-tooltip":""}),t(i,{label:"类型",width:"120"},{default:a(({row:n})=>[p(v(R(n.type)),1)]),_:1}),t(i,{prop:"createdAtFriendly",label:"时间",width:"100"})]),_:1},8,["data"])),[[N,r.value]]),_("div",F,[t(C,{"current-page":c.value,"onUpdate:currentPage":e[0]||(e[0]=n=>c.value=n),total:f.value,"page-size":20,layout:"prev, pager, next",onCurrentChange:d},null,8,["current-page","total"])])]),_:1})])}}},M=h(K,[["__scopeId","data-v-162a2170"]]);export{M as default};

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/OrgView-V1bQqNSk.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/PeriodBanner-Bgo0p1nw.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/PeriodBanner-Bq0-4QKL.js


+ 1 - 0
backend/src/main/resources/static/assets/PeriodBanner-D4Mc5jvC.css

@@ -0,0 +1 @@
+.period-banner[data-v-8c823bdc]{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-radius:10px;margin-bottom:20px;box-shadow:0 1px 4px #0000000a}.banner-DRAFT[data-v-8c823bdc]{background:#f5f5f5;border:1px solid #e0e0e0}.banner-OKR_ALIGN[data-v-8c823bdc]{background:#e0f7fa;border:1px solid #b2ebf2}.banner-EXECUTING[data-v-8c823bdc]{background:#e8f5e9;border:1px solid #c8e6c9}.banner-ASSESSING[data-v-8c823bdc]{background:#fef7e8;border:1px solid #f5dab1}.pb-left[data-v-8c823bdc]{display:flex;align-items:center;gap:12px}.pb-icon[data-v-8c823bdc]{font-size:24px}.pb-name[data-v-8c823bdc]{font-size:16px;font-weight:700;color:#1a1a2e}.pb-date[data-v-8c823bdc]{font-size:12px;color:#888;margin-top:2px}.pb-switch-btn[data-v-8c823bdc]{display:inline-flex;align-items:center;gap:4px;padding:8px 14px;background:#fffc;border-radius:8px;cursor:pointer;font-size:13px;color:#555;font-weight:500;border:1px solid #ddd;transition:all .15s}.pb-switch-btn[data-v-8c823bdc]:hover{border-color:#2b1f99;color:#2b1f99}.pbd-name[data-v-8c823bdc]{margin-right:8px;font-size:13px}.is-active .pbd-name[data-v-8c823bdc]{color:#2b1f99;font-weight:600}

+ 0 - 1
backend/src/main/resources/static/assets/PeriodBanner-DHo6KqN8.css

@@ -1 +0,0 @@
-.period-banner[data-v-8de05fe2]{display:flex;align-items:center;justify-content:space-between;padding:14px 20px;border-radius:10px;margin-bottom:20px;box-shadow:0 1px 4px #0000000a}.banner-DRAFT[data-v-8de05fe2]{background:#f5f5f5;border:1px solid #e0e0e0}.banner-OKR_ALIGN[data-v-8de05fe2]{background:#e0f7fa;border:1px solid #b2ebf2}.banner-EXECUTING[data-v-8de05fe2]{background:#e8f5e9;border:1px solid #c8e6c9}.banner-ASSESSING[data-v-8de05fe2]{background:#fce4ec;border:1px solid #f8bbd0}.pb-left[data-v-8de05fe2]{display:flex;align-items:center;gap:12px}.pb-icon[data-v-8de05fe2]{font-size:24px}.pb-name[data-v-8de05fe2]{font-size:16px;font-weight:700;color:#1a1a2e}.pb-date[data-v-8de05fe2]{font-size:12px;color:#888;margin-top:2px}.pb-switch-btn[data-v-8de05fe2]{display:inline-flex;align-items:center;gap:4px;padding:8px 14px;background:#fffc;border-radius:8px;cursor:pointer;font-size:13px;color:#555;font-weight:500;border:1px solid #ddd;transition:all .15s}.pb-switch-btn[data-v-8de05fe2]:hover{border-color:#2b1f99;color:#2b1f99}.pbd-name[data-v-8de05fe2]{margin-right:8px;font-size:13px}.is-active .pbd-name[data-v-8de05fe2]{color:#2b1f99;font-weight:600}

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/PeriodListView-BE0TOKgv.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/PeriodListView-CI4nnOu9.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/PeriodListView-Cj7wjMiE.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/PeriodListView-Cm2rz-8f.css


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/ScoringEditView-D8AmITJT.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/ScoringListView-BA439uBI.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 1
backend/src/main/resources/static/assets/TeamOkrView-CgA0HonJ.js


+ 1 - 1
backend/src/main/resources/static/assets/auth-DWcI-k9D.js → backend/src/main/resources/static/assets/auth-WIKIZ8Ia.js

@@ -1 +1 @@
-import{A as t}from"./index-iBAYXZct.js";import{authApi as o}from"./index-Tp0ZZGLd.js";const n=t("auth",{state:()=>({user:null,accessToken:localStorage.getItem("accessToken")||"",refreshToken:localStorage.getItem("refreshToken")||""}),getters:{isLoggedIn:s=>!!s.accessToken,isAdmin:s=>{var e;return((e=s.user)==null?void 0:e.role)==="SUPER_ADMIN"},isHrAdminOrAbove:s=>{var e;return["SUPER_ADMIN","HR_ADMIN"].includes((e=s.user)==null?void 0:e.role)},isDeptLeaderOrAbove:s=>{var e;return["SUPER_ADMIN","HR_ADMIN","DEPT_LEADER"].includes((e=s.user)==null?void 0:e.role)},roleLabel:s=>{var r;return{EMPLOYEE:"员工",TEAM_LEADER:"团队主管",DEPT_LEADER:"部门负责人",HR_ADMIN:"HR管理员",SUPER_ADMIN:"管理员"}[(r=s.user)==null?void 0:r.role]||"员工"},roleColor:s=>{var r;return{SUPER_ADMIN:"#f56c6c",HR_ADMIN:"#e6a23c",DEPT_LEADER:"#8b5cf6",TEAM_LEADER:"#3ad4d8",EMPLOYEE:"#409eff"}[(r=s.user)==null?void 0:r.role]||"#409eff"}},actions:{async login(s,e){const r=await o.login({username:s,password:e});this.accessToken=r.accessToken,this.refreshToken=r.refreshToken,this.user=r.user,localStorage.setItem("accessToken",r.accessToken),localStorage.setItem("refreshToken",r.refreshToken)},async register(s){const e=await o.register(s);this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.user=e.user,localStorage.setItem("accessToken",e.accessToken),localStorage.setItem("refreshToken",e.refreshToken)},async fetchUser(){try{this.user=await o.me()}catch{this.logout()}},logout(){this.user=null,this.accessToken="",this.refreshToken="",localStorage.removeItem("accessToken"),localStorage.removeItem("refreshToken")}}});export{n as u};
+import{A as t}from"./index-DJRnqVGv.js";import{authApi as o}from"./index-DRieORBm.js";const n=t("auth",{state:()=>({user:null,accessToken:localStorage.getItem("accessToken")||"",refreshToken:localStorage.getItem("refreshToken")||""}),getters:{isLoggedIn:s=>!!s.accessToken,isAdmin:s=>{var e;return((e=s.user)==null?void 0:e.role)==="SUPER_ADMIN"},isHrAdminOrAbove:s=>{var e;return["SUPER_ADMIN","HR_ADMIN"].includes((e=s.user)==null?void 0:e.role)},isDeptLeaderOrAbove:s=>{var e;return["SUPER_ADMIN","HR_ADMIN","DEPT_LEADER"].includes((e=s.user)==null?void 0:e.role)},roleLabel:s=>{var r;return{EMPLOYEE:"员工",TEAM_LEADER:"团队主管",DEPT_LEADER:"部门负责人",HR_ADMIN:"HR管理员",SUPER_ADMIN:"管理员"}[(r=s.user)==null?void 0:r.role]||"员工"},roleColor:s=>{var r;return{SUPER_ADMIN:"#f56c6c",HR_ADMIN:"#e6a23c",DEPT_LEADER:"#8b5cf6",TEAM_LEADER:"#3ad4d8",EMPLOYEE:"#409eff"}[(r=s.user)==null?void 0:r.role]||"#409eff"}},actions:{async login(s,e){const r=await o.login({username:s,password:e});this.accessToken=r.accessToken,this.refreshToken=r.refreshToken,this.user=r.user,localStorage.setItem("accessToken",r.accessToken),localStorage.setItem("refreshToken",r.refreshToken)},async register(s){const e=await o.register(s);this.accessToken=e.accessToken,this.refreshToken=e.refreshToken,this.user=e.user,localStorage.setItem("accessToken",e.accessToken),localStorage.setItem("refreshToken",e.refreshToken)},async fetchUser(){try{this.user=await o.me()}catch{this.logout()}},logout(){this.user=null,this.accessToken="",this.refreshToken="",localStorage.removeItem("accessToken"),localStorage.removeItem("refreshToken")}}});export{n as u};

Разница между файлами не показана из-за своего большого размера
+ 1 - 1
backend/src/main/resources/static/assets/index-DJRnqVGv.js


Разница между файлами не показана из-за своего большого размера
+ 0 - 0
backend/src/main/resources/static/assets/index-DRieORBm.js


+ 1 - 1
backend/src/main/resources/static/index.html

@@ -5,7 +5,7 @@
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <title>医梦AI · OKR绩效</title>
   <link rel="icon" type="image/png" href="/logo-small.png" />
-  <script type="module" crossorigin src="/assets/index-iBAYXZct.js"></script>
+  <script type="module" crossorigin src="/assets/index-DJRnqVGv.js"></script>
   <link rel="stylesheet" crossorigin href="/assets/index-DPlaWbzU.css">
 </head>
 <body>

+ 3 - 3
frontend/src/components/PeriodBanner.vue

@@ -62,7 +62,7 @@ const statusLabel = computed(() => {
 })
 
 const statusTagType = computed(() => {
-  return { ASSESSING: 'danger', EXECUTING: 'success', OKR_ALIGN: 'warning', DRAFT: 'info' }[active.value.status] || 'info'
+  return { ASSESSING: 'warning', EXECUTING: 'success', OKR_ALIGN: '', DRAFT: 'info' }[active.value.status] || 'info'
 })
 
 function statusText(s) {
@@ -70,7 +70,7 @@ function statusText(s) {
 }
 
 function statusTag(s) {
-  return { ASSESSING: 'danger', EXECUTING: 'success', OKR_ALIGN: 'warning', DRAFT: 'info' }[s] || 'info'
+  return { ASSESSING: 'warning', EXECUTING: 'success', OKR_ALIGN: '', DRAFT: 'info' }[s] || 'info'
 }
 
 function handleSwitch(id) {
@@ -87,7 +87,7 @@ function handleSwitch(id) {
 .banner-DRAFT       { background: #f5f5f5; border: 1px solid #e0e0e0; }
 .banner-OKR_ALIGN   { background: #e0f7fa; border: 1px solid #b2ebf2; }
 .banner-EXECUTING   { background: #e8f5e9; border: 1px solid #c8e6c9; }
-.banner-ASSESSING   { background: #fce4ec; border: 1px solid #f8bbd0; }
+.banner-ASSESSING   { background: #fef7e8; border: 1px solid #f5dab1; }
 
 .pb-left { display: flex; align-items: center; gap: 12px; }
 .pb-icon { font-size: 24px; }

+ 1 - 1
frontend/src/views/okr/MyOkrView.vue

@@ -673,7 +673,7 @@ function truncate(s, n) { if (!s) return ''; return s.length > n ? s.slice(0, n)
 .state-banner { padding: 14px 20px; border-radius: 10px; margin-bottom: 16px; display: flex; align-items: center; gap: 10px; font-size: 14px; }
 .banner-OKR_ALIGN { background: #e0f7fa; color: #00838f; border: 1px solid #b2ebf2; }
 .banner-EXECUTING { background: #e8f5e9; color: #2e7d32; border: 1px solid #c8e6c9; }
-.banner-ASSESSING { background: #fce4ec; color: #c62828; border: 1px solid #f8bbd0; }
+.banner-ASSESSING { background: #fef7e8; color: #b88230; border: 1px solid #f5dab1; }
 
 .rules-card { background: #fff; border-radius: 10px; padding: 14px 20px; margin-bottom: 20px; box-shadow: 0 1px 4px rgba(0,0,0,0.04); border: 1px solid #f0f0f0; }
 .rules-title { font-weight: 700; color: #2b1f99; font-size: 14px; margin-bottom: 8px; }

+ 10 - 10
frontend/src/views/period/PeriodListView.vue

@@ -52,7 +52,7 @@
                   <el-button v-if="p.status === 'EXECUTING'" type="warning" size="small" plain @click="transition(p.id, 'OKR_ALIGN')" round>回退</el-button>
                   <el-button v-if="p.status === 'EXECUTING'" type="primary" size="small" @click="transition(p.id, 'ASSESSING')" round>进入考评</el-button>
                   <el-button v-if="p.status === 'EXECUTING'" type="danger" size="small" plain @click="transition(p.id, 'ARCHIVED')" round>直接归档</el-button>
-                  <el-button v-if="p.status === 'ASSESSING'" type="danger" @click="transition(p.id, 'ARCHIVED')" round>结束并归档</el-button>
+                  <el-button v-if="p.status === 'ASSESSING'" type="warning" @click="transition(p.id, 'ARCHIVED')" round>结束并归档</el-button>
                 </template>
                 <el-button v-if="p.status === 'ASSESSING'" type="warning" size="small" @click="$router.push({ path: '/scores/my', query: { periodId: p.id } })" round>去自评</el-button>
               </div>
@@ -308,7 +308,7 @@ async function handleDelete(id) {
 
 function typeLabel(t) { return { WEEKLY: '单周', BI_WEEKLY: '双周', MONTHLY: '单月', BI_MONTHLY: '双月', QUARTERLY: '季度' }[t] || t }
 function statusLabel(s) { return { DRAFT: '待发布', OKR_ALIGN: 'OKR 对齐中', EXECUTING: '执行中', ASSESSING: '考评中', ARCHIVED: '已归档' }[s] || s }
-function statusTagType(s) { return { DRAFT: 'info', OKR_ALIGN: '', EXECUTING: 'success', ASSESSING: 'danger', ARCHIVED: 'info' }[s] || 'info' }
+function statusTagType(s) { return { DRAFT: 'info', OKR_ALIGN: '', EXECUTING: 'success', ASSESSING: 'warning', ARCHIVED: 'info' }[s] || 'info' }
 function statusGuide(p) {
   return {
     DRAFT: '管理员发布后团队成员即可提交 OKR。',
@@ -340,9 +340,9 @@ function statusGuide(p) {
 .category { margin-bottom: 32px; }
 .cat-head { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; }
 .cat-badge { padding: 5px 16px; border-radius: 16px; font-size: 14px; font-weight: 700; color: #fff; }
-.cat-badge.active { background: #3ad4d8; }
-.cat-badge.upcoming { background: #3498db; }
-.cat-badge.archived { background: #95a5a6; }
+.cat-badge.active { background: #2b1f99; }
+.cat-badge.upcoming { background: #909399; }
+.cat-badge.archived { background: #b0b4ba; }
 .cat-count { font-size: 13px; color: #999; }
 
 /* Sub-group */
@@ -355,11 +355,11 @@ function statusGuide(p) {
   box-shadow: 0 1px 3px rgba(0,0,0,0.04); overflow: hidden; border: 1px solid #f0f0f0;
   border-left: 5px solid #ddd;
 }
-.period-card.status-EXECUTING { border-left-color: #27ae60; }
-.period-card.status-ASSESSING { border-left-color: #e74c3c; }
-.period-card.status-OKR_ALIGN { border-left-color: #f39c12; }
-.period-card.status-DRAFT { border-left-color: #ddd; }
-.period-card.status-ARCHIVED { border-left-color: #bbb; opacity: 0.7; }
+.period-card.status-EXECUTING { border-left-color: #3ad4d8; }
+.period-card.status-ASSESSING { border-left-color: #e6a23c; }
+.period-card.status-OKR_ALIGN { border-left-color: #409eff; }
+.period-card.status-DRAFT { border-left-color: #c0c4cc; }
+.period-card.status-ARCHIVED { border-left-color: #909399; opacity: 0.7; }
 
 .card-body { padding: 16px 20px; display: flex; justify-content: space-between; align-items: center; gap: 24px; }
 .card-main { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }

Некоторые файлы не были показаны из-за большого количества измененных файлов