| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942 |
- <!doctype html>
- <html lang="zh-CN">
- <head>
- <meta charset="utf-8" />
- <meta name="viewport" content="width=device-width, initial-scale=1" />
- <title>医梦AI · OKR绩效 — 完整设计原型</title>
- <style>
- /* ═══════════════════════════════════════════════════════════════════
- Cohere-inspired tokens · 医梦AI (智慧医疗 OKR)
- Brand: 深靛蓝 #2b1f99 · 青 #3ad4d8
- ═══════════════════════════════════════════════════════════════ */
- :root {
- --bg: #ffffff;
- --surface: #ffffff;
- --surface-alt: #f7f7f8;
- --dark: #2b1f99;
- --dark-surface: #1d166b;
- --dark-deeper: #120d4a;
- --fg: #17171c;
- --fg-2: #616161;
- --muted: #93939f;
- --meta: #b0b0b8;
- --on-dark: #ffffff;
- --accent: #3ad4d8;
- --accent-hover: #17a9ad;
- --accent-soft: rgba(58,212,216,0.10);
- --accent-glow: rgba(58,212,216,0.18);
- --accent-hover-bg: rgba(58,212,216,0.06);
- --accent-micro: rgba(58,212,216,0.035);
- --success: #2e9d65;
- --warn: #c98219;
- --danger: #c94a4a;
- --info: #4c6f91;
- --orange: #f59e0b;
- --orange-bg: rgba(245,158,11,0.10);
- --orange-text: #b45309;
- --orange-border: rgba(245,158,11,0.25);
- --red: #dc2626;
- --red-bg: rgba(220,38,38,0.08);
- --red-text: #b91c1c;
- --red-border: rgba(220,38,38,0.20);
- --green-bg: rgba(46,157,101,0.08);
- --green-text: #1e6b3e;
- --indigo-soft: rgba(43,31,153,0.07);
- --indigo-border: rgba(43,31,153,0.18);
- --indigo-text: #1d166b;
- --border: #e5e5e9;
- --border-light: #f0f0f3;
- --border-soft: rgba(0,0,0,0.05);
- --font-display: 'Space Grotesk', -apple-system, 'Segoe UI', sans-serif;
- --font-body: -apple-system, BlinkMacSystemFont, 'PingFang SC', 'Microsoft YaHei', 'Segoe UI', system-ui, sans-serif;
- --font-mono: 'SF Mono', 'JetBrains Mono', 'Menlo', ui-monospace, monospace;
- --fs-hero: clamp(48px,6vw,72px);
- --fs-h1: clamp(32px,3.8vw,48px);
- --fs-h2: 28px;
- --fs-h3: 20px;
- --fs-lead: 17px;
- --fs-body: 15px;
- --fs-sm: 13px;
- --fs-xs: 11px;
- --fs-num: clamp(40px,5vw,56px);
- --gap-xs: 6px;
- --gap-sm: 12px;
- --gap-md: 20px;
- --gap-lg: 32px;
- --gap-xl: 56px;
- --gap-2xl: 96px;
- --radius-xs: 4px;
- --radius-sm: 8px;
- --radius-md: 16px;
- --radius-lg: 22px;
- --radius-pill: 9999px;
- --container: 1120px;
- --gutter: 28px;
- --sidebar-w: 240px;
- }
- *, *::before, *::after { box-sizing: border-box; margin: 0; }
- html { font-size: var(--fs-body); line-height: 1.5; -webkit-font-smoothing: antialiased; }
- body { font-family: var(--font-body); color: var(--fg); background: var(--bg); }
- /* ─── App shell ──────────────────────────────────────────────── */
- .app { display: flex; height: 100vh; overflow: hidden; }
- .sidebar {
- width: var(--sidebar-w); min-width: var(--sidebar-w);
- background: var(--surface); border-right: 1px solid var(--border);
- display: flex; flex-direction: column; overflow-y: auto;
- }
- .sidebar-brand {
- padding: 20px 20px 16px; font-family: var(--font-display);
- font-size: 18px; font-weight: 600; color: var(--dark);
- border-bottom: 1px solid var(--border-light); letter-spacing: -0.3px;
- }
- .sidebar-brand span { color: var(--accent); }
- .nav-module { border-bottom: 1px solid var(--border-light); padding: 8px 0; }
- .nav-module__header {
- display: flex; align-items: center; gap: 8px; padding: 10px 20px;
- font-size: var(--fs-sm); font-weight: 600; color: var(--muted);
- cursor: pointer; user-select: none; letter-spacing: 0.5px; text-transform: uppercase;
- transition: color .15s;
- }
- .nav-module__header:hover { color: var(--fg-2); }
- .nav-module__arrow { font-size: 10px; transition: transform .2s; margin-left: auto; }
- .nav-module--collapsed .nav-module__arrow { transform: rotate(-90deg); }
- .nav-module--collapsed .nav-item { display: none; }
- .nav-item {
- display: flex; align-items: center; gap: 10px; padding: 9px 20px 9px 32px;
- font-size: 14px; color: var(--fg-2); cursor: pointer;
- border-radius: 0; transition: background .12s, color .12s;
- }
- .nav-item:hover { background: var(--accent-hover-bg); color: var(--fg); }
- .nav-item--active { background: var(--accent-soft); color: var(--dark); font-weight: 600;
- box-shadow: inset 3px 0 0 var(--accent); }
- .nav-item__icon { width: 18px; height: 18px; display: flex; align-items: center; justify-content: center;
- font-size: 13px; flex-shrink: 0; }
- .nav-item__dot { width: 6px; height: 6px; border-radius: 50%; background: var(--accent);
- margin-left: auto; }
- .main {
- flex: 1; overflow-y: auto; background: var(--surface-alt);
- display: flex; flex-direction: column;
- }
- .page-panel { display: none; padding: var(--gap-lg); flex: 1; }
- .page-panel--active { display: block; }
- /* ─── Top bar ────────────────────────────────────────────────── */
- .topbar {
- display: flex; align-items: center; justify-content: space-between;
- padding: 0 var(--gap-lg); height: 56px; background: var(--surface);
- border-bottom: 1px solid var(--border-light); flex-shrink: 0;
- }
- .topbar__left { display: flex; align-items: center; gap: var(--gap-sm); }
- .topbar__title { font-size: var(--fs-h3); font-weight: 600; color: var(--fg); letter-spacing: -0.3px; }
- .topbar__actions { display: flex; align-items: center; gap: var(--gap-sm); }
- .topbar__avatar {
- width: 32px; height: 32px; border-radius: 50%; background: var(--accent);
- color: var(--dark); display: flex; align-items: center; justify-content: center;
- font-size: 13px; font-weight: 700; cursor: pointer;
- }
- /* ─── Common components ──────────────────────────────────────── */
- .s-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: var(--gap-md); }
- .s-head__left h2 { font-size: var(--fs-h2); font-weight: 600; letter-spacing: -0.5px; color: var(--fg); }
- .s-head__left p { font-size: var(--fs-sm); color: var(--muted); margin-top: 2px; }
- .card {
- background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
- padding: var(--gap-md); transition: box-shadow .15s, border-color .15s;
- }
- .card:hover { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
- .card--flat { border-radius: var(--radius-sm); }
- .card--lg { border-radius: var(--radius-lg); }
- /* Buttons */
- .btn {
- display: inline-flex; align-items: center; gap: 6px; border: none; cursor: pointer;
- font-family: var(--font-body); font-size: 14px; font-weight: 500;
- padding: 10px 20px; border-radius: var(--radius-pill); transition: all .15s;
- }
- .btn-primary { background: var(--accent); color: var(--dark); }
- .btn-primary:hover { background: var(--accent-hover); box-shadow: 0 0 0 3px var(--accent-glow); }
- .btn-outline { background: transparent; border: 1px solid var(--border); color: var(--fg-2); }
- .btn-outline:hover { border-color: var(--accent); color: var(--accent-hover); background: var(--accent-hover-bg); }
- .btn-sm { padding: 6px 14px; font-size: var(--fs-sm); }
- .btn-dark { background: var(--dark); color: var(--on-dark); }
- .btn-dark:hover { background: var(--dark-surface); }
- .btn-ghost { background: transparent; color: var(--fg-2); padding: 8px 12px; }
- .btn-ghost:hover { background: var(--accent-hover-bg); color: var(--fg); }
- .btn-danger { background: var(--red-bg); color: var(--red-text); }
- .btn-danger:hover { background: var(--red); color: #fff; }
- /* Tags / Badges */
- .tag {
- display: inline-flex; align-items: center; gap: 4px;
- font-size: var(--fs-xs); font-weight: 500; padding: 3px 10px;
- border-radius: var(--radius-pill); white-space: nowrap;
- }
- .tag-accent { background: var(--accent-soft); color: var(--accent-hover); }
- .tag-warn { background: var(--orange-bg); color: var(--orange-text); }
- .tag-danger { background: var(--red-bg); color: var(--red-text); }
- .tag-success { background: var(--green-bg); color: var(--green-text); }
- .tag-indigo { background: var(--indigo-soft); color: var(--indigo-text); }
- .tag-muted { background: var(--surface-alt); color: var(--muted); }
- /* Progress bar */
- .prog { height: 8px; background: var(--border-light); border-radius: var(--radius-pill); overflow: hidden; }
- .prog__fill { height: 100%; border-radius: var(--radius-pill); transition: width .4s; }
- .prog__fill--accent { background: var(--accent); }
- .prog__fill--indigo { background: var(--dark); }
- .prog__fill--orange { background: var(--orange); }
- .prog__fill--red { background: var(--red); }
- .prog__fill--green { background: var(--success); }
- /* Stat card */
- .stat-card {
- background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-md);
- padding: var(--gap-md); transition: border-color .15s, box-shadow .15s;
- }
- .stat-card:hover { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
- .stat-card__top { height: 4px; margin: calc(-1 * var(--gap-md)) calc(-1 * var(--gap-md)) var(--gap-sm); border-radius: var(--radius-md) var(--radius-md) 0 0; }
- .stat-card__top--accent { background: var(--accent); }
- .stat-card__top--indigo { background: var(--dark); }
- .stat-card__top--orange { background: var(--orange); }
- .stat-card__top--red { background: var(--red); }
- .stat-card__top--green { background: var(--success); }
- .stat-card__num { font-family: var(--font-display); font-size: var(--fs-num); font-weight: 700; line-height: 1; color: var(--fg); }
- .stat-card__label { font-size: var(--fs-sm); color: var(--muted); margin-top: 4px; }
- /* Metric bar */
- .m-bar { display: flex; align-items: center; gap: var(--gap-sm); }
- .m-bar__label { font-size: var(--fs-sm); color: var(--fg-2); min-width: 80px; }
- .m-bar__val { font-family: var(--font-mono); font-size: var(--fs-sm); color: var(--fg); font-weight: 600; min-width: 44px; text-align: right; }
- .m-bar__prog { flex: 1; }
- /* Table */
- .tbl { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
- .tbl th { text-align: left; font-weight: 600; color: var(--muted); padding: 10px var(--gap-sm); border-bottom: 1px solid var(--border); font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: 0.5px; }
- .tbl td { padding: 10px var(--gap-sm); border-bottom: 1px solid var(--border-light); color: var(--fg-2); }
- .tbl tr:nth-child(even) td { background: var(--accent-micro); }
- .tbl tr:hover td { background: var(--accent-hover-bg); }
- .tbl__link { color: var(--dark); font-weight: 500; cursor: pointer; }
- .tbl__link:hover { color: var(--accent-hover); }
- /* Grid helpers */
- .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: var(--gap-md); }
- .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: var(--gap-md); }
- .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--gap-md); }
- .flex-between { display: flex; align-items: center; justify-content: space-between; }
- .flex-wrap { display: flex; flex-wrap: wrap; gap: var(--gap-sm); }
- .gap-md { gap: var(--gap-md); }
- .gap-sm { gap: var(--gap-sm); }
- .mt-xs { margin-top: var(--gap-xs); }
- .mt-sm { margin-top: var(--gap-sm); }
- .mt-md { margin-top: var(--gap-md); }
- .mt-lg { margin-top: var(--gap-lg); }
- .mb-sm { margin-bottom: var(--gap-sm); }
- .mb-md { margin-bottom: var(--gap-md); }
- .mb-lg { margin-bottom: var(--gap-lg); }
- .text-muted { color: var(--muted); }
- .text-accent { color: var(--accent); }
- .text-danger { color: var(--red-text); }
- .text-sm { font-size: var(--fs-sm); }
- .text-xs { font-size: var(--fs-xs); }
- .mono { font-family: var(--font-mono); }
- /* Form */
- .fld { margin-bottom: var(--gap-md); }
- .fld label { display: block; font-size: var(--fs-sm); font-weight: 500; color: var(--fg-2); margin-bottom: 4px; }
- .fld input, .fld select, .fld textarea {
- width: 100%; padding: 10px 14px; font-size: var(--fs-body); font-family: var(--font-body);
- border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface);
- color: var(--fg); outline: none; transition: border-color .15s;
- }
- .fld input:focus, .fld select:focus, .fld textarea:focus { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-glow); }
- /* Timeline */
- .tl { position: relative; padding-left: 28px; }
- .tl::before { content:''; position: absolute; left: 8px; top: 4px; bottom: 4px; width: 2px; background: var(--border); }
- .tl__item { position: relative; padding-bottom: var(--gap-lg); }
- .tl__item:last-child { padding-bottom: 0; }
- .tl__dot { position: absolute; left: -23px; top: 5px; width: 12px; height: 12px; border-radius: 50%; border: 2px solid var(--accent); background: var(--surface); }
- .tl__dot--done { background: var(--accent); }
- .tl__dot--warn { border-color: var(--orange); background: var(--orange); }
- .tl__dot--active { background: var(--surface); box-shadow: 0 0 0 3px var(--accent-glow); }
- .tl__title { font-weight: 600; font-size: var(--fs-body); color: var(--fg); }
- .tl__desc { font-size: var(--fs-sm); color: var(--muted); margin-top: 2px; }
- /* Tree */
- .tree { list-style: none; padding: 0; }
- .tree li { position: relative; padding: 6px 0 6px 24px; font-size: var(--fs-sm); }
- .tree li::before { content:''; position: absolute; left: 8px; top: 0; bottom: 50%; width: 1px; background: var(--border); }
- .tree li::after { content:''; position: absolute; left: 8px; top: 50%; width: 12px; height: 1px; background: var(--border); }
- .tree li:last-child::before { height: 50%; }
- .tree__node { font-weight: 600; color: var(--fg); }
- .tree__leaf { color: var(--fg-2); }
- /* Notification */
- .notif { display: flex; gap: var(--gap-sm); padding: var(--gap-sm) 0; border-bottom: 1px solid var(--border-light); cursor: pointer; transition: background .12s; }
- .notif:hover { background: var(--accent-micro); }
- .notif--unread { background: var(--accent-soft); }
- .notif__dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex-shrink: 0; margin-top: 6px; }
- .notif__body { flex: 1; }
- .notif__title { font-size: var(--fs-sm); font-weight: 600; color: var(--fg); }
- .notif__desc { font-size: var(--fs-xs); color: var(--muted); margin-top: 2px; }
- .notif__time { font-size: var(--fs-xs); color: var(--meta); white-space: nowrap; }
- /* Chat / feedback */
- .chat { display: flex; flex-direction: column; gap: var(--gap-sm); }
- .chat__msg { max-width: 75%; padding: 12px 16px; border-radius: var(--radius-md); font-size: var(--fs-sm); line-height: 1.5; }
- .chat__msg--in { align-self: flex-start; background: var(--surface); border: 1px solid var(--border); }
- .chat__msg--out { align-self: flex-end; background: var(--accent-soft); border: 1px solid var(--accent-glow); }
- .chat__msg--ai { align-self: flex-start; background: var(--indigo-soft); border: 1px solid var(--indigo-border); }
- .chat__meta { font-size: var(--fs-xs); color: var(--muted); margin-top: 4px; }
- /* Alignment tree */
- .align-tree { display: flex; flex-direction: column; align-items: center; gap: var(--gap-md); }
- .align-node {
- background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-sm);
- padding: 10px 18px; font-size: var(--fs-sm); text-align: center; min-width: 160px;
- }
- .align-node--root { border-color: var(--dark); background: var(--indigo-soft); font-weight: 700; color: var(--dark); }
- .align-node--warn { border-color: var(--orange); background: var(--orange-bg); }
- .align-connector { width: 2px; height: 20px; background: var(--border); }
- .align-row { display: flex; gap: var(--gap-lg); justify-content: center; }
- .align-col { display: flex; flex-direction: column; align-items: center; gap: 4px; }
- /* Gantt */
- .gantt { display: flex; flex-direction: column; gap: 1px; background: var(--border-light); border: 1px solid var(--border); border-radius: var(--radius-sm); overflow: hidden; }
- .gantt__row { display: flex; align-items: center; background: var(--surface); padding: 0; }
- .gantt__label { width: 160px; padding: 10px 14px; font-size: var(--fs-sm); font-weight: 500; color: var(--fg); flex-shrink: 0; }
- .gantt__track { flex: 1; height: 40px; position: relative; }
- .gantt__bar { position: absolute; top: 8px; height: 24px; border-radius: var(--radius-xs); display: flex; align-items: center; padding: 0 8px; font-size: 11px; font-weight: 600; color: #fff; }
- .gantt__bar--accent { background: var(--accent); color: var(--dark); }
- .gantt__bar--indigo { background: var(--dark); }
- .gantt__bar--orange { background: var(--orange); }
- .gantt__bar--red { background: var(--red); }
- .gantt__bar--green { background: var(--success); }
- .gantt__marker { position: absolute; top: 4px; width: 2px; height: 32px; background: var(--red); }
- /* Org chart */
- .org-node {
- display: flex; align-items: center; gap: 10px; padding: 10px 14px;
- border: 1px solid var(--border); border-radius: var(--radius-sm); background: var(--surface);
- cursor: pointer; transition: border-color .15s;
- }
- .org-node:hover { border-color: var(--accent); }
- .org-node__avatar { width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 14px; font-weight: 700; color: #fff; flex-shrink: 0; }
- .org-node__name { font-weight: 600; font-size: var(--fs-sm); }
- .org-node__role { font-size: var(--fs-xs); color: var(--muted); }
- /* Appeal status flow */
- .flow { display: flex; align-items: center; gap: 0; }
- .flow__step { display: flex; align-items: center; gap: 6px; font-size: var(--fs-sm); color: var(--muted); padding: 6px 12px; border-radius: var(--radius-pill); background: var(--surface-alt); }
- .flow__step--done { color: var(--green-text); background: var(--green-bg); }
- .flow__step--active { color: var(--accent-hover); background: var(--accent-soft); font-weight: 600; }
- .flow__step--reject { color: var(--red-text); background: var(--red-bg); }
- .flow__arrow { color: var(--meta); margin: 0 2px; font-size: 10px; }
- /* Slider */
- input[type=range] { -webkit-appearance: none; width: 100%; height: 6px; border-radius: 3px; background: var(--border-light); outline: none; }
- input[type=range]::-webkit-slider-thumb { -webkit-appearance: none; width: 20px; height: 20px; border-radius: 50%; background: var(--accent); cursor: pointer; border: none; }
- /* Login page special */
- .login-page { display: flex; height: 100vh; }
- .login-brand {
- flex: 1; background: var(--dark); display: flex; flex-direction: column;
- align-items: center; justify-content: center; padding: var(--gap-xl); color: var(--on-dark);
- }
- .login-brand h1 { font-family: var(--font-display); font-size: var(--fs-hero); font-weight: 700; letter-spacing: -0.5px; }
- .login-brand h1 span { color: var(--accent); }
- .login-brand p { font-size: var(--fs-lead); color: rgba(255,255,255,0.7); margin-top: var(--gap-sm); max-width: 360px; text-align: center; }
- .login-brand__stats { display: flex; gap: var(--gap-xl); margin-top: var(--gap-xl); }
- .login-brand__stat { text-align: center; }
- .login-brand__stat b { display: block; font-family: var(--font-display); font-size: 32px; color: var(--accent); }
- .login-brand__stat span { font-size: var(--fs-sm); color: rgba(255,255,255,0.6); }
- .login-form {
- width: 440px; display: flex; flex-direction: column; justify-content: center; padding: var(--gap-xl);
- }
- .login-form h2 { font-size: var(--fs-h2); font-weight: 600; margin-bottom: var(--gap-xs); }
- .login-form .sub { color: var(--muted); font-size: var(--fs-sm); margin-bottom: var(--gap-lg); }
- /* Scrollbar */
- ::-webkit-scrollbar { width: 6px; }
- ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
- /* Responsive */
- @media (max-width: 860px) {
- .sidebar { display: none; }
- .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
- .login-form { width: 100%; }
- .login-brand { display: none; }
- }
- @media (max-width: 1100px) {
- .grid-4 { grid-template-columns: 1fr 1fr; }
- }
- </style>
- </head>
- <body>
- <div class="app" id="app">
- <!-- ═══ Sidebar ═══ -->
- <nav class="sidebar" id="sidebar">
- <div class="sidebar-brand">医梦<span>AI</span> · OKR</div>
- <div class="nav-module" id="mod-workspace">
- <div class="nav-module__header" onclick="toggleMod('mod-workspace')">🏠 工作台 <span class="nav-module__arrow">▾</span></div>
- <div class="nav-item nav-item--active" data-page="login" onclick="navTo('login',this)"><span class="nav-item__icon">🔑</span> 登录</div>
- <div class="nav-item" data-page="workspace" onclick="navTo('workspace',this)"><span class="nav-item__icon">🏠</span> 工作台</div>
- </div>
- <div class="nav-module" id="mod-okr">
- <div class="nav-module__header" onclick="toggleMod('mod-okr')">📋 OKR <span class="nav-module__arrow">▾</span></div>
- <div class="nav-item" data-page="my-okr" onclick="navTo('my-okr',this)"><span class="nav-item__icon">🎯</span> 我的 OKR</div>
- <div class="nav-item" data-page="team-okr" onclick="navTo('team-okr',this)"><span class="nav-item__icon">👥</span> 团队 OKR</div>
- <div class="nav-item" data-page="okr-align" onclick="navTo('okr-align',this)"><span class="nav-item__icon">🔗</span> OKR 对齐</div>
- <div class="nav-item" data-page="okr-exec" onclick="navTo('okr-exec',this)"><span class="nav-item__icon">📈</span> 执行进度</div>
- </div>
- <div class="nav-module" id="mod-score">
- <div class="nav-module__header" onclick="toggleMod('mod-score')">📊 绩效 <span class="nav-module__arrow">▾</span></div>
- <div class="nav-item" data-page="my-result" onclick="navTo('my-result',this)"><span class="nav-item__icon">⭐</span> 我的绩效</div>
- <div class="nav-item" data-page="score-history" onclick="navTo('score-history',this)"><span class="nav-item__icon">📅</span> 历史绩效</div>
- <div class="nav-item" data-page="scoring-list" onclick="navTo('scoring-list',this)"><span class="nav-item__icon">✏️</span> 绩效打分</div>
- <div class="nav-item" data-page="scoring-detail" onclick="navTo('scoring-detail',this)"><span class="nav-item__icon">📝</span> 绩效考评</div>
- <div class="nav-item" data-page="appeal" onclick="navTo('appeal',this)"><span class="nav-item__icon">⚖️</span> 绩效申诉</div>
- <div class="nav-item" data-page="feedback" onclick="navTo('feedback',this)"><span class="nav-item__icon">💬</span> 绩效沟通</div>
- </div>
- <div class="nav-module" id="mod-admin">
- <div class="nav-module__header" onclick="toggleMod('mod-admin')">⚙️ 管理 <span class="nav-module__arrow">▾</span></div>
- <div class="nav-item" data-page="periods" onclick="navTo('periods',this)"><span class="nav-item__icon">🔄</span> 考核周期</div>
- <div class="nav-item" data-page="templates" onclick="navTo('templates',this)"><span class="nav-item__icon">📐</span> 绩效模板</div>
- <div class="nav-item" data-page="dimensions" onclick="navTo('dimensions',this)"><span class="nav-item__icon">📏</span> 考核维度</div>
- <div class="nav-item" data-page="org" onclick="navTo('org',this)"><span class="nav-item__icon">🏛️</span> 组织架构</div>
- </div>
- <div class="nav-module" id="mod-sys">
- <div class="nav-module__header" onclick="toggleMod('mod-sys')">🔔 系统 <span class="nav-module__arrow">▾</span></div>
- <div class="nav-item" data-page="notifications" onclick="navTo('notifications',this)"><span class="nav-item__icon">🔔</span> 消息通知<span class="nav-item__dot"></span></div>
- <div class="nav-item" data-page="logs" onclick="navTo('logs',this)"><span class="nav-item__icon">📋</span> 操作日志</div>
- </div>
- </nav>
- <!-- ═══ Main ═══ -->
- <div class="main">
- <div class="topbar">
- <div class="topbar__left"><span class="topbar__title" id="topbarTitle">登录</span></div>
- <div class="topbar__actions">
- <span style="font-size:var(--fs-sm);color:var(--muted);">2025 Q4 · 年度考核</span>
- <div class="topbar__avatar">李</div>
- </div>
- </div>
- <!-- ═══════════════════════════════════════════════════════════════
- PAGE PANELS — 18 pages
- ═══════════════════════════════════════════════════════════════ -->
- <!-- ── LOGIN ──────────────────────────────────────────────── -->
- <div class="login-page page-panel page-panel--active" id="pg-login" style="padding:0;">
- <div class="login-brand">
- <h1>医梦<span>AI</span></h1>
- <p>AI 驱动的智慧医疗绩效管理平台 — 让每一份付出都被看见</p>
- <div class="login-brand__stats">
- <div class="login-brand__stat"><b>1,280</b><span>活跃用户</span></div>
- <div class="login-brand__stat"><b>98.6%</b><span>评分完成率</span></div>
- <div class="login-brand__stat"><b>42</b><span>医院科室</span></div>
- </div>
- </div>
- <div class="login-form">
- <h2>欢迎回来</h2>
- <p class="sub">登录你的 OKR 绩效账户</p>
- <div class="fld"><label>邮箱 / 工号</label><input type="text" placeholder="liming@emoon-med.com" value="liming@emoon-med.com"></div>
- <div class="fld"><label>密码</label><input type="password" placeholder="······" value="123456"></div>
- <button class="btn btn-primary" style="width:100%;justify-content:center;margin-top:var(--gap-sm);" onclick="navTo('workspace')">登录</button>
- <p style="text-align:center;margin-top:var(--gap-md);font-size:var(--fs-sm);color:var(--muted);">演示模式 — 点击登录查看完整原型</p>
- </div>
- </div>
- <!-- ── WORKSPACE ───────────────────────────────────────────── -->
- <div class="page-panel" id="pg-workspace">
- <div class="s-head"><div class="s-head__left"><h2>工作台</h2><p>下午好,李明医生 — 2025 Q4 考核周期还有 18 天结束</p></div><button class="btn btn-outline btn-sm">📅 切换周期</button></div>
- <div class="grid-4 mb-md">
- <div class="stat-card"><div class="stat-card__top stat-card__top--accent"></div><div class="stat-card__num">8</div><div class="stat-card__label">我的 OKR 目标</div><div class="text-xs text-muted mt-xs">4 个进行中 · 3 个已完成</div></div>
- <div class="stat-card"><div class="stat-card__top stat-card__top--indigo"></div><div class="stat-card__num">76%</div><div class="stat-card__label">总体完成进度</div><div class="text-xs text-muted mt-xs">较上月 +5%</div></div>
- <div class="stat-card"><div class="stat-card__top stat-card__top--orange"></div><div class="stat-card__num">86</div><div class="stat-card__label">当前绩效评分</div><div class="text-xs text-muted mt-xs">评级 A · 待上级确认</div></div>
- <div class="stat-card"><div class="stat-card__top stat-card__top--red"></div><div class="stat-card__num">2</div><div class="stat-card__label">待处理预警</div><div class="text-xs text-danger mt-xs">1 项超时 · 1 项评分异常</div></div>
- </div>
- <div class="grid-2 mb-md">
- <div class="card card--lg" style="background:var(--dark);color:var(--on-dark);">
- <div style="display:flex;align-items:center;gap:8px;margin-bottom:12px;"><span class="tag tag-accent">AI 洞察</span><span style="font-size:var(--fs-xs);color:rgba(255,255,255,0.5);">基于历史数据生成</span></div>
- <p style="font-size:var(--fs-body);opacity:0.9;line-height:1.6;">当前周期你的「患者满意度」KR 滞后同期 14%,建议本周增加门诊随访频次至每日 ≥ 5 例。<b style="color:var(--accent);">转化率 18%</b> 超出预期 3 个百分点,继续保持。</p>
- <div class="flex-between mt-md">
- <span class="tag tag-warn">⚠ 延迟 14%</span><button class="btn btn-sm" style="background:rgba(255,255,255,0.15);color:#fff;">查看详情 →</button>
- </div>
- </div>
- <div class="card" style="display:flex;flex-direction:column;">
- <div class="flex-between mb-sm"><strong style="font-size:var(--fs-body);">待办事项</strong><span class="tag tag-accent">3 项</span></div>
- <div style="font-size:var(--fs-sm);color:var(--fg-2);padding:8px 0;border-bottom:1px solid var(--border-light);">📌 完成 Q4 自评报告 <span class="tag tag-warn" style="float:right;">明天截止</span></div>
- <div style="font-size:var(--fs-sm);color:var(--fg-2);padding:8px 0;border-bottom:1px solid var(--border-light);">📌 审核张护士的 OKR 对齐申请 <span class="tag tag-muted" style="float:right;">3天后</span></div>
- <div style="font-size:var(--fs-sm);color:var(--fg-2);padding:8px 0;">📌 提交科室设备采购绩效指标 <span style="float:right;color:var(--red-text);font-size:var(--fs-xs);">⏰ 已超时 2 天</span></div>
- </div>
- </div>
- <div class="card mb-md">
- <div class="flex-between mb-sm"><strong style="font-size:var(--fs-body);">团队绩效概览</strong><span class="text-sm text-muted">神经内科 · 12 人</span></div>
- <table class="tbl"><thead><tr><th>成员</th><th>OKR 进度</th><th>评分</th><th>状态</th><th>预警</th></tr></thead><tbody>
- <tr><td><span class="tbl__link">李明</span></td><td><div class="m-bar"><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--accent" style="width:76%"></div></div></div><span class="mono text-sm">76%</span></div></td><td class="mono">86</td><td><span class="tag tag-success">正常</span></td><td>—</td></tr>
- <tr><td><span class="tbl__link">张伟</span></td><td><div class="m-bar"><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--indigo" style="width:92%"></div></div></div><span class="mono text-sm">92%</span></div></td><td class="mono">93</td><td><span class="tag tag-success">正常</span></td><td>—</td></tr>
- <tr><td><span class="tbl__link">王芳</span></td><td><div class="m-bar"><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--orange" style="width:45%"></div></div></div><span class="mono text-sm">45%</span></div></td><td class="mono">62</td><td><span class="tag tag-warn">延迟</span></td><td><span class="tag tag-warn">超时</span></td></tr>
- <tr><td><span class="tbl__link">赵丽</span></td><td><div class="m-bar"><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--red" style="width:28%"></div></div></div><span class="mono text-sm">28%</span></div></td><td class="mono">—</td><td><span class="tag tag-danger">严重</span></td><td><span class="tag tag-danger">落后</span></td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── MY OKR ──────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-my-okr">
- <div class="s-head"><div class="s-head__left"><h2>我的 OKR</h2><p>2025 Q4 · 神经内科主治医师</p></div><div class="flex-wrap"><button class="btn btn-outline btn-sm">📥 导入</button><button class="btn btn-primary btn-sm">+ 新建 KR</button></div></div>
- <div class="card mb-md" style="border-left:4px solid var(--dark);">
- <div style="display:flex;align-items:center;gap:10px;margin-bottom:12px;"><span class="tag tag-indigo">O1</span><span style="font-weight:700;font-size:var(--fs-h3);color:var(--fg);">提升门诊诊疗效率与患者满意度</span><span class="tag tag-accent">权重 40%</span></div>
- <p style="font-size:var(--fs-sm);color:var(--muted);margin-bottom:var(--gap-md);">通过 AI 辅助问诊和流程优化,将平均就诊等待时间从 18 分钟降至 10 分钟以内,患者满意度评分达到 4.5/5。</p>
- <div style="display:flex;flex-direction:column;gap:10px;">
- <div class="card card--flat" style="border-left:4px solid var(--accent);">
- <div class="flex-between"><div><span class="tag tag-accent">KR1.1</span> <strong>AI 预问诊覆盖率 ≥ 60%</strong><span class="mono text-sm" style="margin-left:8px;">当前 52%</span></div><span class="tag tag-success">进行中</span></div>
- <div class="prog mt-sm"><div class="prog__fill prog__fill--accent" style="width:52%"></div></div>
- </div>
- <div class="card card--flat" style="border-left:4px solid var(--dark);">
- <div class="flex-between"><div><span class="tag tag-indigo">KR1.2</span> <strong>平均候诊时间 ≤ 10 分钟</strong><span class="mono text-sm" style="margin-left:8px;">当前 14 分钟</span></div><span class="tag tag-success">进行中</span></div>
- <div class="prog mt-sm"><div class="prog__fill prog__fill--indigo" style="width:60%"></div></div>
- </div>
- <div class="card card--flat" style="border-left:4px solid var(--dark);">
- <div class="flex-between"><div><span class="tag tag-indigo">KR1.3</span> <strong>患者满意度 ≥ 4.5/5</strong><span class="mono text-sm" style="margin-left:8px;">当前 4.2</span></div><span class="tag tag-success">进行中</span></div>
- <div class="prog mt-sm"><div class="prog__fill prog__fill--indigo" style="width:70%"></div></div>
- </div>
- <div class="card card--flat" style="border-left:4px solid var(--red);">
- <div class="flex-between"><div><span class="tag tag-danger">KR1.4</span> <strong>门诊电子病历完整率 ≥ 95%</strong><span class="mono text-sm text-danger" style="margin-left:8px;">当前 33%</span></div><span class="tag tag-warn">延迟</span></div>
- <div class="prog mt-sm"><div class="prog__fill prog__fill--red" style="width:33%"></div></div>
- </div>
- </div>
- </div>
- <div class="card mb-md" style="border-left:4px solid var(--accent);">
- <div style="display:flex;align-items:center;gap:10px;margin-bottom:12px;"><span class="tag tag-indigo">O2</span><span style="font-weight:700;font-size:var(--fs-h3);color:var(--fg);">推动科室 AI 质控体系建设</span><span class="tag tag-accent">权重 30%</span></div>
- <p style="font-size:var(--fs-sm);color:var(--muted);margin-bottom:var(--gap-md);">建立基于 AI 的病历质控闭环,实现病历缺陷自动检测与实时提醒。</p>
- <div style="display:flex;flex-direction:column;gap:10px;">
- <div class="card card--flat" style="border-left:4px solid var(--accent);"><div class="flex-between"><div><span class="tag tag-accent">KR2.1</span> <strong>病历 AI 质控覆盖 100% 出院病历</strong></div><span class="tag tag-success">已完成</span></div><div class="prog mt-sm"><div class="prog__fill prog__fill--green" style="width:100%"></div></div></div>
- <div class="card card--flat" style="border-left:4px solid var(--accent);"><div class="flex-between"><div><span class="tag tag-accent">KR2.2</span> <strong>病历缺陷率降至 5% 以下</strong></div><span class="tag tag-success">已完成</span></div><div class="prog mt-sm"><div class="prog__fill prog__fill--green" style="width:100%"></div></div></div>
- </div>
- </div>
- <div class="card">
- <strong style="font-size:var(--fs-body);">承接上级目标</strong>
- <table class="tbl mt-sm"><thead><tr><th>上级目标</th><th>负责人</th><th>对齐关系</th><th>进度</th></tr></thead><tbody>
- <tr><td>神经内科综合服务能力提升 20%</td><td>王主任</td><td>→ O1 提升门诊诊疗效率</td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--accent" style="width:65%"></div></div></td></tr>
- <tr><td>全院 AI 质控平台上线</td><td>陈院长</td><td>→ O2 科室 AI 质控体系</td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--green" style="width:100%"></div></div></td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── TEAM OKR ────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-team-okr">
- <div class="s-head"><div class="s-head__left"><h2>团队 OKR</h2><p>神经内科 · 12 名成员 · 2025 Q4</p></div><div class="flex-wrap"><button class="btn btn-outline btn-sm">📥 导出</button><button class="btn btn-primary btn-sm">+ 新建团队目标</button></div></div>
- <div class="card mb-md" style="border-left:4px solid var(--dark);">
- <div style="display:flex;align-items:center;gap:10px;margin-bottom:12px;"><span class="tag tag-indigo">部门 O</span><span style="font-weight:700;font-size:var(--fs-h3);">神经内科综合服务能力提升 20%</span><span class="tag tag-accent">权重 50%</span></div>
- <div style="display:flex;flex-direction:column;gap:10px;margin-bottom:var(--gap-md);">
- <div class="card card--flat" style="border-left:4px solid var(--accent);"><div class="flex-between"><span><span class="tag tag-accent">KR-A</span> 门诊量同比 +15%</span><span class="mono text-sm">82%</span></div><div class="prog mt-xs"><div class="prog__fill prog__fill--accent" style="width:82%"></div></div></div>
- <div class="card card--flat" style="border-left:4px solid var(--accent);"><div class="flex-between"><span><span class="tag tag-accent">KR-B</span> 患者满意度 ≥ 4.3</span><span class="mono text-sm">70%</span></div><div class="prog mt-xs"><div class="prog__fill prog__fill--indigo" style="width:70%"></div></div></div>
- </div>
- </div>
- <div class="flex-between mb-md"><strong style="font-size:var(--fs-body);">成员 OKR 概览</strong><span class="text-sm text-muted">按进度排序</span></div>
- <div class="grid-2">
- <div class="card"><div class="flex-between mb-sm"><span class="tbl__link">张伟 · 副主任医师</span><span class="tag tag-success">92%</span></div><div class="prog mb-xs"><div class="prog__fill prog__fill--green" style="width:92%"></div></div><span class="text-xs text-muted">4 KR · 3 完成 · 1 进行中</span></div>
- <div class="card"><div class="flex-between mb-sm"><span class="tbl__link">刘洋 · 主治医师</span><span class="tag tag-accent">84%</span></div><div class="prog mb-xs"><div class="prog__fill prog__fill--accent" style="width:84%"></div></div><span class="text-xs text-muted">5 KR · 3 完成 · 2 进行中</span></div>
- <div class="card"><div class="flex-between mb-sm"><span class="tbl__link">李明 · 主治医师</span><span class="tag tag-accent">76%</span></div><div class="prog mb-xs"><div class="prog__fill prog__fill--accent" style="width:76%"></div></div><span class="text-xs text-muted">6 KR · 2 完成 · 3 进行中 · 1 延迟</span></div>
- <div class="card"><div class="flex-between mb-sm"><span class="tbl__link">王芳 · 住院医师</span><span class="tag tag-warn">45%</span></div><div class="prog mb-xs"><div class="prog__fill prog__fill--orange" style="width:45%"></div></div><span class="text-xs text-danger">3 KR · 0 完成 · 2 进行中 · 1 超时</span></div>
- <div class="card"><div class="flex-between mb-sm"><span class="tbl__link">赵丽 · 住院医师</span><span class="tag tag-danger">28%</span></div><div class="prog mb-xs"><div class="prog__fill prog__fill--red" style="width:28%"></div></div><span class="text-xs text-danger">2 KR · 0 完成 · 1 进行中 · 1 严重落后</span></div>
- <div class="card"><div class="flex-between mb-sm"><span class="tbl__link">陈静 · 护士长</span><span class="tag tag-success">95%</span></div><div class="prog mb-xs"><div class="prog__fill prog__fill--green" style="width:95%"></div></div><span class="text-xs text-muted">3 KR · 3 完成</span></div>
- </div>
- </div>
- <!-- ── OKR ALIGNMENT ───────────────────────────────────────── -->
- <div class="page-panel" id="pg-okr-align">
- <div class="s-head"><div class="s-head__left"><h2>OKR 对齐</h2><p>可视化目标层级关系 · 检测未对齐节点</p></div><button class="btn btn-outline btn-sm">🔍 检测未对齐</button></div>
- <div class="card mb-md" style="overflow-x:auto;padding:var(--gap-lg);">
- <div class="align-tree">
- <div class="align-node align-node--root">🏥 全院 AI 质控平台上线<br><span class="text-xs" style="color:var(--muted);">陈院长 · 权重 40%</span></div>
- <div class="align-connector"></div>
- <div class="align-row">
- <div class="align-col"><div class="align-connector"></div><div class="align-node">神经内科综合服务能力<br><span class="text-xs text-muted">王主任</span></div><div class="align-connector"></div><div class="align-node" style="border-color:var(--accent);">提升门诊诊疗效率<br><span class="text-xs text-muted">李明</span></div></div>
- <div class="align-col"><div class="align-connector"></div><div class="align-node">心内科质控达标<br><span class="text-xs text-muted">赵主任</span></div></div>
- <div class="align-col"><div class="align-connector"></div><div class="align-node align-node--warn">⚠ 骨科科室 OKR<br><span class="text-xs" style="color:var(--orange-text);">未对齐全院目标</span></div></div>
- </div>
- </div>
- </div>
- <div class="card">
- <div class="flex-between mb-sm"><strong style="font-size:var(--fs-body);">对齐异常</strong><span class="tag tag-danger">2 项</span></div>
- <table class="tbl"><thead><tr><th>部门/个人</th><th>问题</th><th>影响</th><th>建议</th><th>操作</th></tr></thead><tbody>
- <tr><td>骨科</td><td><span class="tag tag-danger">未对齐</span></td><td>科室 OKR 与全院目标无连接</td><td class="text-sm">建议关联「全院质控平台」目标</td><td><button class="btn btn-outline btn-sm">发起对齐</button></td></tr>
- <tr><td>赵丽</td><td><span class="tag tag-warn">未对齐</span></td><td>个人 OKR 未承接上级目标</td><td class="text-sm">建议对齐王主任「综合服务能力」KR</td><td><button class="btn btn-outline btn-sm">发起对齐</button></td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── OKR EXECUTION ───────────────────────────────────────── -->
- <div class="page-panel" id="pg-okr-exec">
- <div class="s-head"><div class="s-head__left"><h2>执行进度</h2><p>Q4 关键结果时间线 · 10 月 — 12 月</p></div><button class="btn btn-outline btn-sm">📥 导出报告</button></div>
- <div class="card mb-md">
- <div class="gantt">
- <div class="gantt__row"><div class="gantt__label">AI 预问诊覆盖</div><div class="gantt__track"><div class="gantt__bar gantt__bar--accent" style="left:0;width:58%;">52%</div></div></div>
- <div class="gantt__row"><div class="gantt__label">候诊时间优化</div><div class="gantt__track"><div class="gantt__bar gantt__bar--accent" style="left:0;width:66%;">60%</div></div></div>
- <div class="gantt__row"><div class="gantt__label">患者满意度</div><div class="gantt__track"><div class="gantt__bar gantt__bar--indigo" style="left:0;width:72%;">70%</div></div></div>
- <div class="gantt__row"><div class="gantt__label">病历完整率</div><div class="gantt__track"><div class="gantt__bar gantt__bar--red" style="left:0;width:33%;">33%</div><div class="gantt__marker" style="left:66%;"></div></div></div>
- </div>
- <div class="text-xs text-muted mt-sm">红色标记 = 预期进度线(当前应达 66%)· 滑块位置 = 实际进度</div>
- </div>
- <div class="grid-2 mb-md">
- <div class="card"><strong style="font-size:var(--fs-body);">里程碑</strong>
- <div class="tl mt-sm">
- <div class="tl__item"><div class="tl__dot tl__dot--done"></div><div class="tl__title">Q4 目标制定</div><div class="tl__desc">2025-10-01 · 已完成</div></div>
- <div class="tl__item"><div class="tl__dot tl__dot--done"></div><div class="tl__title">中期回顾</div><div class="tl__desc">2025-11-15 · 已完成</div></div>
- <div class="tl__item"><div class="tl__dot tl__dot--active"></div><div class="tl__title">自评提交截止</div><div class="tl__desc">2025-12-20 · 进行中</div></div>
- <div class="tl__item"><div class="tl__dot"></div><div class="tl__title">上级评审</div><div class="tl__desc">2025-12-31 · 待开始</div></div>
- </div>
- </div>
- <div class="card"><strong style="font-size:var(--fs-body);">风险预警</strong>
- <div style="padding:10px 0;border-bottom:1px solid var(--border-light);"><span class="tag tag-danger mb-sm">🔴 严重</span><p class="text-sm mt-xs">赵丽 — 2 项 KR 均严重落后,无提交记录</p></div>
- <div style="padding:10px 0;border-bottom:1px solid var(--border-light);"><span class="tag tag-warn mb-sm">🟠 超时</span><p class="text-sm mt-xs">王芳 — 「病历规范率」KR 超时未更新</p></div>
- <div style="padding:10px 0;"><span class="tag tag-muted mb-sm">🟡 待处理</span><p class="text-sm mt-xs">3 名成员尚未提交中期自评</p></div>
- </div>
- </div>
- </div>
- <!-- ── MY RESULT ───────────────────────────────────────────── -->
- <div class="page-panel" id="pg-my-result">
- <div class="s-head"><div class="s-head__left"><h2>我的绩效</h2><p>2025 Q4 · 李明 · 神经内科主治医师</p></div><button class="btn btn-outline btn-sm">📄 查看详情</button></div>
- <div class="grid-3 mb-md">
- <div class="stat-card" style="text-align:center;"><div class="stat-card__num text-accent" style="font-size:64px;">86</div><div class="stat-card__label">综合得分</div><span class="tag tag-success mt-xs">A 级</span></div>
- <div class="card" style="display:flex;flex-direction:column;justify-content:center;">
- <div class="m-bar mb-sm"><span class="m-bar__label">OKR 达成</span><span class="m-bar__val mono">85</span><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--accent" style="width:85%"></div></div></div></div>
- <div class="m-bar mb-sm"><span class="m-bar__label">KPI 指标</span><span class="m-bar__val mono">82</span><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--indigo" style="width:82%"></div></div></div></div>
- <div class="m-bar mb-sm"><span class="m-bar__label">能力评估</span><span class="m-bar__val mono">90</span><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--green" style="width:90%"></div></div></div></div>
- <div class="m-bar"><span class="m-bar__label">价值观</span><span class="m-bar__val mono">88</span><div class="m-bar__prog"><div class="prog"><div class="prog__fill prog__fill--accent" style="width:88%"></div></div></div></div>
- </div>
- <div class="card" style="display:flex;flex-direction:column;justify-content:center;">
- <div class="flex-between mb-sm"><span class="text-sm">自评分</span><span class="mono" style="font-size:24px;font-weight:700;color:var(--dark);">88</span></div>
- <div class="flex-between mb-sm"><span class="text-sm">上级终审</span><span class="mono" style="font-size:24px;font-weight:700;color:var(--accent);">86</span></div>
- <div class="flex-between mb-sm"><span class="text-sm">差距</span><span class="mono" style="font-size:24px;font-weight:700;color:var(--red-text);">-2</span></div>
- <div class="text-xs text-muted mt-sm">上级评语:整体表现优秀,AI 质控项目成果显著。建议下季度将门诊随访纳入 OKR。</div>
- </div>
- </div>
- <div class="card">
- <strong style="font-size:var(--fs-body);">扣分明细</strong>
- <table class="tbl mt-sm"><thead><tr><th>KR</th><th>目标值</th><th>实际值</th><th>得分率</th><th>扣分</th><th>说明</th></tr></thead><tbody>
- <tr><td>KR1.4 病历完整率</td><td class="mono">≥ 95%</td><td class="mono text-danger">33%</td><td><div class="prog" style="width:80px;"><div class="prog__fill prog__fill--red" style="width:34%"></div></div></td><td class="mono text-danger">-2</td><td class="text-sm">未达预期目标</td></tr>
- <tr><td>KR1.2 候诊时间</td><td class="mono">≤ 10min</td><td class="mono">14min</td><td><div class="prog" style="width:80px;"><div class="prog__fill prog__fill--orange" style="width:60%"></div></div></td><td class="mono" style="color:var(--orange-text);">-1</td><td class="text-sm">部分达成</td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── SCORE HISTORY ───────────────────────────────────────── -->
- <div class="page-panel" id="pg-score-history">
- <div class="s-head"><div class="s-head__left"><h2>历史绩效</h2><p>李明 · 近 4 个季度趋势</p></div><button class="btn btn-outline btn-sm">📥 导出</button></div>
- <div class="card mb-md" style="padding:var(--gap-lg);">
- <div style="display:flex;align-items:flex-end;gap:40px;height:200px;padding:0 20px;">
- <div style="flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;">
- <span class="mono" style="font-weight:700;color:var(--fg);">79</span>
- <div style="width:48px;background:rgba(43,31,153,0.25);border-radius:4px 4px 0 0;height:110px;"></div>
- <span class="text-xs text-muted">2025 Q1</span><span class="tag tag-muted">B+</span>
- </div>
- <div style="flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;">
- <span class="mono" style="font-weight:700;color:var(--fg);">82</span>
- <div style="width:48px;background:rgba(43,31,153,0.45);border-radius:4px 4px 0 0;height:125px;"></div>
- <span class="text-xs text-muted">2025 Q2</span><span class="tag tag-muted">A-</span>
- </div>
- <div style="flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;">
- <span class="mono" style="font-weight:700;color:var(--fg);">84</span>
- <div style="width:48px;background:rgba(43,31,153,0.65);border-radius:4px 4px 0 0;height:140px;"></div>
- <span class="text-xs text-muted">2025 Q3</span><span class="tag tag-muted">A-</span>
- </div>
- <div style="flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;">
- <span class="mono" style="font-weight:700;color:var(--accent);">86</span>
- <div style="width:48px;background:var(--accent);border-radius:4px 4px 0 0;height:155px;box-shadow:0 0 12px var(--accent-glow);"></div>
- <span class="text-xs text-muted">2025 Q4</span><span class="tag tag-success">A</span>
- </div>
- </div>
- </div>
- <div class="card">
- <strong style="font-size:var(--fs-body);">周期对比</strong>
- <table class="tbl mt-sm"><thead><tr><th>周期</th><th>OKR</th><th>KPI</th><th>能力</th><th>总分</th><th>评级</th><th>排名</th></tr></thead><tbody>
- <tr><td class="tbl__link">2025 Q4</td><td class="mono">85</td><td class="mono">82</td><td class="mono">90</td><td class="mono" style="color:var(--accent);font-weight:700;">86</td><td><span class="tag tag-success">A</span></td><td>3/12</td></tr>
- <tr><td class="tbl__link">2025 Q3</td><td class="mono">82</td><td class="mono">80</td><td class="mono">88</td><td class="mono">84</td><td><span class="tag tag-muted">A-</span></td><td>5/12</td></tr>
- <tr><td class="tbl__link">2025 Q2</td><td class="mono">80</td><td class="mono">78</td><td class="mono">86</td><td class="mono">82</td><td><span class="tag tag-muted">A-</span></td><td>6/12</td></tr>
- <tr><td class="tbl__link">2025 Q1</td><td class="mono">78</td><td class="mono">75</td><td class="mono">84</td><td class="mono">79</td><td><span class="tag tag-muted">B+</span></td><td>8/12</td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── SCORING LIST ────────────────────────────────────────── -->
- <div class="page-panel" id="pg-scoring-list">
- <div class="s-head"><div class="s-head__left"><h2>绩效打分</h2><p>待评分人员 · 神经内科 · 2025 Q4</p></div><div class="flex-wrap"><button class="btn btn-outline btn-sm">📥 导出</button><button class="btn btn-primary btn-sm">批量评分</button></div></div>
- <div class="card">
- <div class="flex-between mb-sm"><div class="flex-wrap"><button class="btn btn-sm" style="background:var(--accent-soft);color:var(--accent-hover);border-radius:var(--radius-pill);">全部 (12)</button><button class="btn btn-ghost btn-sm">待评分 (4)</button><button class="btn btn-ghost btn-sm">已完成 (6)</button><button class="btn btn-ghost btn-sm">申诉中 (2)</button></div><span class="text-sm text-muted">已评 6/12</span></div>
- <table class="tbl"><thead><tr><th>成员</th><th>OKR 进度</th><th>自评分</th><th>状态</th><th>操作</th></tr></thead><tbody>
- <tr><td><span class="tbl__link">张伟</span></td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--green" style="width:92%"></div></div><span class="text-sm" style="margin-left:8px;">92%</span></td><td class="mono">91</td><td><span class="tag tag-warn">待评分</span></td><td><button class="btn btn-primary btn-sm">去评分</button></td></tr>
- <tr><td><span class="tbl__link">刘洋</span></td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--accent" style="width:84%"></div></div><span class="text-sm" style="margin-left:8px;">84%</span></td><td class="mono">85</td><td><span class="tag tag-warn">待评分</span></td><td><button class="btn btn-primary btn-sm">去评分</button></td></tr>
- <tr><td><span class="tbl__link">王芳</span></td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--orange" style="width:45%"></div></div><span class="text-sm" style="margin-left:8px;">45%</span></td><td class="mono">60</td><td><span class="tag tag-warn">待评分</span></td><td><button class="btn btn-primary btn-sm">去评分</button></td></tr>
- <tr><td><span class="tbl__link">赵丽</span></td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--red" style="width:28%"></div></div><span class="text-sm" style="margin-left:8px;">28%</span></td><td class="mono">55</td><td><span class="tag tag-warn">待评分</span></td><td><button class="btn btn-primary btn-sm">去评分</button></td></tr>
- <tr><td><span class="tbl__link">陈静</span></td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--green" style="width:95%"></div></div><span class="text-sm" style="margin-left:8px;">95%</span></td><td class="mono">94</td><td><span class="tag tag-success">已完成</span></td><td><button class="btn btn-outline btn-sm">查看</button></td></tr>
- <tr><td><span class="tbl__link">周涛</span></td><td><div class="prog" style="width:120px;"><div class="prog__fill prog__fill--green" style="width:88%"></div></div><span class="text-sm" style="margin-left:8px;">88%</span></td><td class="mono">87</td><td><span class="tag tag-danger">申诉中</span></td><td><button class="btn btn-outline btn-sm">处理</button></td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── SCORING DETAIL ──────────────────────────────────────── -->
- <div class="page-panel" id="pg-scoring-detail">
- <div class="s-head"><div class="s-head__left"><h2>绩效考评</h2><p>被评人:张伟 · 神经内科副主任医师</p></div><div class="flex-wrap"><button class="btn btn-outline btn-sm">💾 暂存</button><button class="btn btn-primary btn-sm">提交评审</button></div></div>
- <div class="grid-2 mb-md">
- <div class="card"><strong style="font-size:var(--fs-body);">自评</strong><span class="text-xs text-muted" style="margin-left:8px;">张伟 提交于 12-15</span>
- <div style="margin-top:var(--gap-sm);display:flex;flex-direction:column;gap:12px;">
- <div><div class="flex-between text-sm"><span>OKR 达成</span><span class="mono">90</span></div><div class="prog mt-xs"><div class="prog__fill prog__fill--accent" style="width:90%"></div></div></div>
- <div><div class="flex-between text-sm"><span>KPI 指标</span><span class="mono">92</span></div><div class="prog mt-xs"><div class="prog__fill prog__fill--indigo" style="width:92%"></div></div></div>
- <div><div class="flex-between text-sm"><span>能力评估</span><span class="mono">88</span></div><div class="prog mt-xs"><div class="prog__fill prog__fill--green" style="width:88%"></div></div></div>
- <div style="background:var(--surface-alt);padding:10px;border-radius:var(--radius-sm);font-size:var(--fs-sm);">"本季度完成了神经介入手术质控标准制定,手术并发症率下降至 1.2%。"</div>
- </div>
- </div>
- <div class="card"><strong style="font-size:var(--fs-body);">上级评审</strong><span class="text-xs text-muted" style="margin-left:8px;">李明 · 当前评分人</span>
- <div style="margin-top:var(--gap-sm);display:flex;flex-direction:column;gap:12px;">
- <div><div class="flex-between text-sm"><span>OKR 达成</span><span class="mono" style="color:var(--accent);">88</span></div><input type="range" value="88" min="0" max="100" class="mt-xs"></div>
- <div><div class="flex-between text-sm"><span>KPI 指标</span><span class="mono" style="color:var(--accent);">90</span></div><input type="range" value="90" min="0" max="100" class="mt-xs"></div>
- <div><div class="flex-between text-sm"><span>能力评估</span><span class="mono" style="color:var(--accent);">92</span></div><input type="range" value="92" min="0" max="100" class="mt-xs"></div>
- <textarea placeholder="输入评语..." style="width:100%;padding:10px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--fs-sm);resize:vertical;min-height:60px;">手术质控成果显著,建议将论文发表纳入下季度 OKR。</textarea>
- </div>
- </div>
- </div>
- <div class="card"><div class="flex-between"><strong style="font-size:var(--fs-body);">终审得分</strong><span class="mono" style="font-size:28px;font-weight:700;color:var(--accent);">90</span></div></div>
- </div>
- <!-- ── APPEAL ──────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-appeal">
- <div class="s-head"><div class="s-head__left"><h2>绩效申诉</h2><p>申诉工单管理 · 2025 Q4</p></div><button class="btn btn-primary btn-sm">+ 发起申诉</button></div>
- <div class="card">
- <div class="flex-wrap mb-sm"><button class="btn btn-sm" style="background:var(--accent-soft);color:var(--accent-hover);border-radius:var(--radius-pill);">全部 (5)</button><button class="btn btn-ghost btn-sm">待处理 (2)</button><button class="btn btn-ghost btn-sm">处理中 (2)</button><button class="btn btn-ghost btn-sm">已解决 (1)</button></div>
- <table class="tbl"><thead><tr><th>申诉人</th><th>KR</th><th>原评分</th><th>申诉理由</th><th>状态</th><th>处理人</th><th>操作</th></tr></thead><tbody>
- <tr><td>周涛</td><td class="text-sm">KR2.1 手术质控标准</td><td class="mono">78</td><td class="text-sm">扣分依据不充分,手术并发症率已下降</td><td><span class="tag tag-warn">待处理</span></td><td>李明</td><td><button class="btn btn-primary btn-sm">处理</button></td></tr>
- <tr><td>王芳</td><td class="text-sm">KR1.2 病历规范率</td><td class="mono">60</td><td class="text-sm">系统统计口径有误,未计入12月补录</td><td><span class="tag tag-warn">待处理</span></td><td>李明</td><td><button class="btn btn-primary btn-sm">处理</button></td></tr>
- <tr><td>刘洋</td><td class="text-sm">KR3.1 门诊随访率</td><td class="mono">82</td><td class="text-sm">评分标准与Q3不一致</td><td><span class="tag tag-accent">处理中</span></td><td>王主任</td><td><span class="flow"><span class="flow__step flow__step--active">审核中</span></span></td></tr>
- <tr><td>陈静</td><td class="text-sm">KR1.3 护理满意度</td><td class="mono">85</td><td class="text-sm">参考数据有误</td><td><span class="tag tag-success">已解决</span></td><td>李明</td><td><button class="btn btn-outline btn-sm">查看</button></td></tr>
- </tbody></table>
- </div>
- </div>
- <!-- ── FEEDBACK ────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-feedback">
- <div class="s-head"><div class="s-head__left"><h2>绩效沟通</h2><p>与上级的反馈对话 · 2025 Q4</p></div><button class="btn btn-outline btn-sm">📅 预约面谈</button></div>
- <div class="grid-2" style="grid-template-columns:2fr 1fr;">
- <div class="card">
- <div class="chat">
- <div class="chat__msg chat__msg--out">王主任好,我想约个时间讨论一下 Q4 绩效评分中 KR1.4 的扣分项。<div class="chat__meta">李明 · 12-18 14:30</div></div>
- <div class="chat__msg chat__msg--in">好的,明天下午 3 点方便吗?我看了你的申诉材料,病历完整率数据确实有讨论空间。<div class="chat__meta">王主任 · 12-18 15:10</div></div>
- <div class="chat__msg chat__msg--out">可以,明天下午 3 点。我会带上 12 月补录记录和系统日志。<div class="chat__meta">李明 · 12-18 15:22</div></div>
- <div class="chat__msg chat__msg--ai"><b>🤖 AI 辅助建议</b><br>检测到你在讨论「KR1.4 病历完整率」的评分争议。建议:<br>1. 准备 12 月 EHR 系统操作日志<br>2. 对照同期科室平均值(87%)作为参考<br>3. 引用评分规则 §3.2「数据核实流程」<div class="chat__meta">AI 助手 · 自动生成</div></div>
- </div>
- <div style="display:flex;gap:8px;margin-top:var(--gap-md);">
- <input type="text" placeholder="输入消息..." style="flex:1;padding:10px 14px;border:1px solid var(--border);border-radius:var(--radius-pill);font-size:var(--fs-sm);">
- <button class="btn btn-primary btn-sm">发送</button>
- </div>
- </div>
- <div class="card">
- <strong style="font-size:var(--fs-body);">沟通历史</strong>
- <div class="mt-sm" style="display:flex;flex-direction:column;gap:10px;">
- <div style="padding:8px 0;border-bottom:1px solid var(--border-light);"><div class="text-sm" style="font-weight:600;">Q4 中期回顾面谈</div><div class="text-xs text-muted">2025-11-20 · 30 分钟 · 已完成</div></div>
- <div style="padding:8px 0;border-bottom:1px solid var(--border-light);"><div class="text-sm" style="font-weight:600;">Q3 绩效结果沟通</div><div class="text-xs text-muted">2025-09-28 · 45 分钟 · 已完成</div></div>
- <div style="padding:8px 0;"><div class="text-sm" style="font-weight:600;">Q2 目标对齐讨论</div><div class="text-xs text-muted">2025-06-15 · 20 分钟 · 已完成</div></div>
- </div>
- </div>
- </div>
- </div>
- <!-- ── PERIODS ─────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-periods">
- <div class="s-head"><div class="s-head__left"><h2>考核周期</h2><p>管理考核周期与阶段切换</p></div><button class="btn btn-primary btn-sm">+ 新建周期</button></div>
- <div class="card mb-md">
- <div class="tl">
- <div class="tl__item">
- <div class="tl__dot tl__dot--done"></div>
- <div class="flex-between"><div><div class="tl__title">2025 Q3 · 季度考核</div><div class="tl__desc">2025-07-01 — 2025-09-30</div></div><span class="tag tag-success">已归档</span></div>
- <div class="flex-wrap mt-xs"><span class="tag tag-muted">制定</span><span class="tag tag-muted">执行</span><span class="tag tag-muted">评分</span><span class="tag tag-muted">归档</span></div>
- </div>
- <div class="tl__item">
- <div class="tl__dot tl__dot--active"></div>
- <div class="flex-between"><div><div class="tl__title">2025 Q4 · 季度考核</div><div class="tl__desc">2025-10-01 — 2025-12-31 · <span class="text-accent">当前周期</span></div></div><span class="tag tag-accent">评分阶段</span></div>
- <div class="flex-wrap mt-xs"><span class="tag tag-success">✅ 制定</span><span class="tag tag-success">✅ 执行</span><span class="tag tag-accent">● 评分</span><span class="tag tag-muted">归档</span></div>
- </div>
- <div class="tl__item">
- <div class="tl__dot"></div>
- <div class="flex-between"><div><div class="tl__title">2026 Q1 · 季度考核</div><div class="tl__desc">2026-01-01 — 2026-03-31</div></div><span class="tag tag-muted">待开始</span></div>
- <div class="flex-wrap mt-xs"><span class="tag tag-muted">制定</span><span class="tag tag-muted">执行</span><span class="tag tag-muted">评分</span><span class="tag tag-muted">归档</span></div>
- </div>
- </div>
- </div>
- </div>
- <!-- ── TEMPLATES ───────────────────────────────────────────── -->
- <div class="page-panel" id="pg-templates">
- <div class="s-head"><div class="s-head__left"><h2>绩效模板</h2><p>管理考核模板与评分规则</p></div><button class="btn btn-primary btn-sm">+ 新建模板</button></div>
- <div class="grid-2">
- <div class="card"><div class="flex-between mb-sm"><span style="font-weight:700;font-size:var(--fs-body);">标准医师 OKR 模板</span><span class="tag tag-accent">默认</span></div><p class="text-sm text-muted">OKR 权重 60% · KPI 权重 40% · 4 维度评分</p><div class="mt-sm"><span class="tag tag-muted">OKR达成</span><span class="tag tag-muted" style="margin-left:4px;">KPI指标</span><span class="tag tag-muted" style="margin-left:4px;">能力评估</span><span class="tag tag-muted" style="margin-left:4px;">价值观</span></div><div class="mt-sm text-xs text-muted">已关联 8 个科室 · 评分公式:加权平均</div></div>
- <div class="card"><div class="flex-between mb-sm"><span style="font-weight:700;font-size:var(--fs-body);">护理人员 KPI 模板</span><span class="tag tag-indigo">护理部</span></div><p class="text-sm text-muted">KPI 权重 80% · 能力评估 20% · 3 维度评分</p><div class="mt-sm"><span class="tag tag-muted">护理质量</span><span class="tag tag-muted" style="margin-left:4px;">操作规范</span><span class="tag tag-muted" style="margin-left:4px;">患者反馈</span></div><div class="mt-sm text-xs text-muted">已关联 12 个护理单元 · 评分公式:加权平均</div></div>
- <div class="card"><div class="flex-between mb-sm"><span style="font-weight:700;font-size:var(--fs-body);">行政人员 KPI 模板</span></div><p class="text-sm text-muted">KPI 权重 70% · 360° 评估 30%</p><div class="mt-sm"><span class="tag tag-muted">任务完成</span><span class="tag tag-muted" style="margin-left:4px;">协作评价</span><span class="tag tag-muted" style="margin-left:4px;">创新贡献</span></div><div class="mt-sm text-xs text-muted">已关联 5 个部门</div></div>
- <div class="card" style="border:2px dashed var(--border);display:flex;align-items:center;justify-content:center;min-height:120px;cursor:pointer;"><span style="color:var(--muted);">+ 新建模板</span></div>
- </div>
- </div>
- <!-- ── DIMENSIONS ──────────────────────────────────────────── -->
- <div class="page-panel" id="pg-dimensions">
- <div class="s-head"><div class="s-head__left"><h2>考核维度</h2><p>配置评分维度与权重</p></div><button class="btn btn-primary btn-sm">+ 新建维度</button></div>
- <div class="grid-2">
- <div class="card">
- <strong style="font-size:var(--fs-body);">维度列表</strong>
- <div style="display:flex;flex-direction:column;gap:8px;margin-top:var(--gap-sm);">
- <div class="card card--flat" style="border-left:4px solid var(--accent);display:flex;align-items:center;justify-content:space-between;padding:12px 16px;"><span style="font-weight:600;">OKR 达成</span><span class="tag tag-accent">权重 40%</span></div>
- <div class="card card--flat" style="border-left:4px solid var(--dark);display:flex;align-items:center;justify-content:space-between;padding:12px 16px;"><span style="font-weight:600;">KPI 指标</span><span class="tag tag-indigo">权重 30%</span></div>
- <div class="card card--flat" style="border-left:4px solid var(--success);display:flex;align-items:center;justify-content:space-between;padding:12px 16px;"><span style="font-weight:600;">能力评估</span><span class="tag tag-success">权重 20%</span></div>
- <div class="card card--flat" style="border-left:4px solid var(--orange);display:flex;align-items:center;justify-content:space-between;padding:12px 16px;"><span style="font-weight:600;">价值观</span><span class="tag tag-warn">权重 10%</span></div>
- </div>
- </div>
- <div class="card" style="text-align:center;">
- <strong style="font-size:var(--fs-body);">权重分布</strong>
- <div style="margin:var(--gap-md) auto;width:160px;height:160px;border-radius:50%;background:conic-gradient(var(--accent) 0% 40%, var(--dark) 40% 70%, var(--success) 70% 90%, var(--orange) 90% 100%);"></div>
- <div class="flex-wrap" style="justify-content:center;">
- <span style="display:flex;align-items:center;gap:4px;font-size:var(--fs-xs);"><span style="width:10px;height:10px;border-radius:2px;background:var(--accent);display:inline-block;"></span> OKR 40%</span>
- <span style="display:flex;align-items:center;gap:4px;font-size:var(--fs-xs);"><span style="width:10px;height:10px;border-radius:2px;background:var(--dark);display:inline-block;"></span> KPI 30%</span>
- <span style="display:flex;align-items:center;gap:4px;font-size:var(--fs-xs);"><span style="width:10px;height:10px;border-radius:2px;background:var(--success);display:inline-block;"></span> 能力 20%</span>
- <span style="display:flex;align-items:center;gap:4px;font-size:var(--fs-xs);"><span style="width:10px;height:10px;border-radius:2px;background:var(--orange);display:inline-block;"></span> 价值观 10%</span>
- </div>
- </div>
- </div>
- </div>
- <!-- ── ORG ─────────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-org">
- <div class="s-head"><div class="s-head__left"><h2>组织架构</h2><p>医院部门与人员结构</p></div><div class="flex-wrap"><input type="text" placeholder="搜索人员..." style="padding:8px 14px;border:1px solid var(--border);border-radius:var(--radius-pill);font-size:var(--fs-sm);width:200px;"></div></div>
- <div class="grid-2" style="grid-template-columns:1fr 1fr;">
- <div class="card">
- <strong style="font-size:var(--fs-body);">部门树</strong>
- <ul class="tree mt-sm">
- <li><span class="tree__node">🏥 医梦总院</span>
- <ul class="tree">
- <li><span class="tree__node">🧠 神经内科</span> <span class="text-xs text-muted">12 人</span>
- <ul class="tree"><li><span class="tree__leaf">李明 · 主治医师</span></li><li><span class="tree__leaf">张伟 · 副主任医师</span></li><li><span class="tree__leaf">王芳 · 住院医师</span></li></ul>
- </li>
- <li><span class="tree__node">❤️ 心内科</span> <span class="text-xs text-muted">8 人</span></li>
- <li><span class="tree__node">🦴 骨科</span> <span class="text-xs text-muted">6 人</span></li>
- <li><span class="tree__node">💊 药剂科</span> <span class="text-xs text-muted">5 人</span></li>
- </ul>
- </li>
- </ul>
- </div>
- <div class="card">
- <strong style="font-size:var(--fs-body);">神经内科成员</strong>
- <div class="mt-sm" style="display:flex;flex-direction:column;gap:8px;">
- <div class="org-node"><div class="org-node__avatar" style="background:var(--dark);">王</div><div><div class="org-node__name">王建国</div><div class="org-node__role">主任医师 · 科室主任</div></div><span class="tag tag-indigo" style="margin-left:auto;">管理者</span></div>
- <div class="org-node"><div class="org-node__avatar" style="background:var(--accent);color:var(--dark);">李</div><div><div class="org-node__name">李明</div><div class="org-node__role">主治医师</div></div></div>
- <div class="org-node"><div class="org-node__avatar" style="background:var(--success);">张</div><div><div class="org-node__name">张伟</div><div class="org-node__role">副主任医师</div></div></div>
- <div class="org-node"><div class="org-node__avatar" style="background:var(--orange);">王</div><div><div class="org-node__name">王芳</div><div class="org-node__role">住院医师</div></div></div>
- <div class="org-node"><div class="org-node__avatar" style="background:var(--red);">赵</div><div><div class="org-node__name">赵丽</div><div class="org-node__role">住院医师</div></div></div>
- </div>
- </div>
- </div>
- </div>
- <!-- ── NOTIFICATIONS ───────────────────────────────────────── -->
- <div class="page-panel" id="pg-notifications">
- <div class="s-head"><div class="s-head__left"><h2>消息通知</h2><p>系统通知 · 绩效提醒 · 审批请求</p></div><div class="flex-wrap"><button class="btn btn-outline btn-sm">全部标为已读</button></div></div>
- <div class="card">
- <div class="flex-wrap mb-sm"><button class="btn btn-sm" style="background:var(--accent-soft);color:var(--accent-hover);border-radius:var(--radius-pill);">全部</button><button class="btn btn-ghost btn-sm">未读 (4)</button><button class="btn btn-ghost btn-sm">系统 (3)</button><button class="btn btn-ghost btn-sm">绩效 (5)</button></div>
- <div class="notif notif--unread"><div class="notif__dot"></div><div class="notif__body"><div class="notif__title">绩效评分结果已发布</div><div class="notif__desc">2025 Q4 绩效评分已完成,你的最终得分 86 分(A 级)。点击查看详情。</div></div><span class="notif__time">10 分钟前</span></div>
- <div class="notif notif--unread"><div class="notif__dot"></div><div class="notif__body"><div class="notif__title">王芳提交了申诉</div><div class="notif__desc">关于 KR1.2「病历规范率」评分,申诉理由:系统统计口径有误。</div></div><span class="notif__time">1 小时前</span></div>
- <div class="notif notif--unread"><div class="notif__dot"></div><div class="notif__body"><div class="notif__title">周期提醒:自评截止还有 2 天</div><div class="notif__desc">2025 Q4 自评提交截止日期为 12 月 20 日,请尽快完成。</div></div><span class="notif__time">3 小时前</span></div>
- <div class="notif"><div class="notif__body" style="margin-left:16px;"><div class="notif__title">系统升级通知</div><div class="notif__desc">OKR 系统将于 12 月 25 日凌晨 2:00-4:00 进行维护升级。</div></div><span class="notif__time">昨天</span></div>
- <div class="notif"><div class="notif__body" style="margin-left:16px;"><div class="notif__title">张伟提交了 OKR 对齐申请</div><div class="notif__desc">张伟请求将其「手术质控标准」KR 对齐到你的 O2 目标。</div></div><span class="notif__time">昨天</span></div>
- <div class="notif"><div class="notif__body" style="margin-left:16px;"><div class="notif__title">绩效沟通预约确认</div><div class="notif__desc">与王主任的面谈已确认:12 月 19 日下午 3:00。</div></div><span class="notif__time">2 天前</span></div>
- </div>
- </div>
- <!-- ── LOGS ────────────────────────────────────────────────── -->
- <div class="page-panel" id="pg-logs">
- <div class="s-head"><div class="s-head__left"><h2>操作日志</h2><p>系统操作记录 · 最近 30 天</p></div><div class="flex-wrap"><button class="btn btn-outline btn-sm">📥 导出日志</button></div></div>
- <div class="card">
- <div class="flex-between mb-sm"><div class="flex-wrap"><input type="date" style="padding:6px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--fs-sm);"> <span class="text-sm text-muted" style="align-self:center;">—</span> <input type="date" style="padding:6px 12px;border:1px solid var(--border);border-radius:var(--radius-sm);font-size:var(--fs-sm);"></div><div class="flex-wrap"><button class="btn btn-sm" style="background:var(--accent-soft);color:var(--accent-hover);border-radius:var(--radius-pill);">全部</button><button class="btn btn-ghost btn-sm">评分</button><button class="btn btn-ghost btn-sm">编辑</button><button class="btn btn-ghost btn-sm">登录</button></div></div>
- <table class="tbl"><thead><tr><th>时间</th><th>操作人</th><th>操作类型</th><th>描述</th><th>IP</th></tr></thead><tbody>
- <tr><td class="mono text-sm">2025-12-18 15:22</td><td>李明</td><td><span class="tag tag-accent">评分</span></td><td>提交了对张伟的绩效评审</td><td class="mono text-xs">192.168.1.42</td></tr>
- <tr><td class="mono text-sm">2025-12-18 14:30</td><td>李明</td><td><span class="tag tag-indigo">编辑</span></td><td>更新了 KR1.4 的进度数据</td><td class="mono text-xs">192.168.1.42</td></tr>
- <tr><td class="mono text-sm">2025-12-18 10:15</td><td>王芳</td><td><span class="tag tag-warn">申诉</span></td><td>提交了 KR1.2 评分申诉</td><td class="mono text-xs">192.168.1.88</td></tr>
- <tr><td class="mono text-sm">2025-12-18 09:00</td><td>张伟</td><td><span class="tag tag-success">登录</span></td><td>用户登录系统</td><td class="mono text-xs">192.168.1.56</td></tr>
- <tr><td class="mono text-sm">2025-12-17 16:40</td><td>王主任</td><td><span class="tag tag-indigo">编辑</span></td><td>修改了 Q4 考核周期截止日期</td><td class="mono text-xs">192.168.1.10</td></tr>
- <tr><td class="mono text-sm">2025-12-17 14:20</td><td>李明</td><td><span class="tag tag-accent">评分</span></td><td>完成了对陈静的绩效评审</td><td class="mono text-xs">192.168.1.42</td></tr>
- </tbody></table>
- <div class="flex-between mt-sm"><span class="text-xs text-muted">共 128 条记录</span><div class="flex-wrap"><button class="btn btn-outline btn-sm" disabled>上一页</button><span class="btn btn-sm" style="background:var(--accent-soft);color:var(--accent-hover);border-radius:var(--radius-sm);">1</span><button class="btn btn-ghost btn-sm">2</button><button class="btn btn-ghost btn-sm">3</button><button class="btn btn-ghost btn-sm">...</button><button class="btn btn-outline btn-sm">下一页</button></div></div>
- </div>
- </div>
- </div><!-- /main -->
- </div><!-- /app -->
- <script>
- const pages = {
- login:'登录', workspace:'工作台', 'my-okr':'我的 OKR', 'team-okr':'团队 OKR',
- 'okr-align':'OKR 对齐', 'okr-exec':'执行进度', 'my-result':'我的绩效',
- 'score-history':'历史绩效', 'scoring-list':'绩效打分', 'scoring-detail':'绩效考评',
- appeal:'绩效申诉', feedback:'绩效沟通', periods:'考核周期',
- templates:'绩效模板', dimensions:'考核维度', org:'组织架构',
- notifications:'消息通知', logs:'操作日志'
- };
- let cur = 'login';
- function navTo(id, el) {
- document.getElementById('pg-'+cur).classList.remove('page-panel--active');
- document.querySelector('.nav-item--active')?.classList.remove('nav-item--active');
- cur = id;
- document.getElementById('pg-'+id).classList.add('page-panel--active');
- if (el) el.classList.add('nav-item--active');
- else document.querySelector('[data-page="'+id+'"]')?.classList.add('nav-item--active');
- document.getElementById('topbarTitle').textContent = pages[id] || id;
- // Switch login to full-height mode
- if (id==='login') {
- document.getElementById('pg-login').style.display='flex';
- document.querySelector('.topbar').style.display='none';
- document.querySelector('.main').style.background='#ffffff';
- } else {
- document.getElementById('pg-login').style.display='';
- document.querySelector('.topbar').style.display='';
- document.querySelector('.main').style.background='';
- }
- }
- function toggleMod(id) { document.getElementById(id).classList.toggle('nav-module--collapsed'); }
- // Init: login mode hides topbar
- document.querySelector('.topbar').style.display='none';
- document.querySelector('.main').style.background='#ffffff';
- </script>
- </body>
- </html>
|