{"id":2018,"date":"2026-03-21T13:46:00","date_gmt":"2026-03-21T05:46:00","guid":{"rendered":"https:\/\/www.funpt.cn\/?page_id=2018"},"modified":"2026-10-28T13:31:44","modified_gmt":"2026-10-28T05:31:44","slug":"%e8%bf%90%e5%8a%a8%e8%82%a9%e6%b5%8b%e8%af%95-athletic-shoulder-test-ash","status":"publish","type":"page","link":"https:\/\/www.funpt.cn\/?page_id=2018","title":{"rendered":"ITY\u8fd0\u52a8\u80a9\u6d4b\u8bd5"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2018\" class=\"elementor elementor-2018\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8119b8a e-flex e-con-boxed e-con e-parent\" data-id=\"8119b8a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f09ae1b elementor-widget elementor-widget-html\" data-id=\"f09ae1b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"app\">\n<style>\n  \/* ================= \u57fa\u7ebf\u53d8\u91cf ================= *\/\n  #app {\n    --primary: #2563eb;\n    --primary-d: #1d4ed8;\n    --primary-color: #2563eb;\n    --secondary-color: #1d4ed8;\n    --success-color: #15803d;\n    --warning-color: #b45309;\n    --danger-color: #b91c1c;\n    --accent-color: #2563eb;\n    --ink: #0f172a;\n    --body: #334155;\n    --muted: #64748b;\n    --line: #e2e8f0;\n    --soft: #f8fafc;\n    max-width: 100%;\n    margin: 0 auto;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Hiragino Sans GB\", \"Microsoft YaHei\", sans-serif;\n    color: var(--body);\n    font-size: 14.5px;\n    line-height: 1.75;\n    -webkit-text-size-adjust: 100%;\n  }\n  #app *, #app *::before, #app *::after { box-sizing: border-box; }\n  #app h1, #app h2, #app h3, #app h4, #app h5, #app p, #app ul, #app ol,\n  #app li, #app label, #app table { margin: 0; padding: 0; }\n  #app ul, #app ol { list-style: none; }\n  #app li { position: relative; padding-left: 15px; }\n  #app li::before {\n    content: \"\";\n    position: absolute;\n    left: 1px;\n    top: 0.72em;\n    width: 5px;\n    height: 5px;\n    border-radius: 50%;\n    background: #94a3b8;\n  }\n  #app ul ul { margin-top: 4px; }\n  #app ul ul li { color: var(--muted); font-size: 13.5px; }\n  #app strong { font-weight: 700; color: var(--ink); }\n  #app a { color: var(--primary-d); text-decoration: none; }\n  #app em { font-style: normal; }\n\n  \/* ================= \u5916\u58f3 ================= *\/\n  #app .ps-card {\n    background: #fff;\n    border: 1px solid var(--line);\n    border-radius: 14px;\n    overflow: hidden;\n    box-shadow: 0 1px 3px rgba(15, 23, 42, 0.05);\n  }\n  #app .ps-head {\n    background: linear-gradient(135deg, #0f172a 0%, #1e3a8a 100%);\n    padding: 24px 28px;\n    display: flex;\n    align-items: flex-start;\n    justify-content: space-between;\n    gap: 14px;\n    flex-wrap: wrap;\n  }\n  #app .ps-head h1 {\n    font-size: 21px;\n    font-weight: 700;\n    color: #fff;\n    line-height: 1.35;\n    letter-spacing: 0.2px;\n  }\n  #app .ps-head p { font-size: 13.5px; color: #cbd5e1; margin-top: 6px; line-height: 1.5; }\n  #app .ps-badge {\n    font-size: 11.5px;\n    font-weight: 600;\n    letter-spacing: 0.6px;\n    color: #dbeafe;\n    background: rgba(255, 255, 255, 0.14);\n    border: 1px solid rgba(255, 255, 255, 0.22);\n    padding: 3px 10px;\n    border-radius: 999px;\n    white-space: nowrap;\n    margin-top: 2px;\n  }\n  #app .ps-body { padding: 6px 28px 20px; }\n  #app .ps-foot {\n    padding: 18px 28px;\n    border-top: 1px solid #eef2f7;\n    background: var(--soft);\n    font-size: 12.5px;\n    line-height: 1.75;\n    color: var(--muted);\n  }\n  #app .ps-foot p + p { margin-top: 6px; }\n  #app .ps-foot a { color: var(--primary-d); font-weight: 600; }\n  #app .ps-foot a:hover { text-decoration: underline; }\n\n  \/* ================= \u5206\u533a ================= *\/\n  #app .sec { padding: 22px 0; border-top: 1px solid #eef2f7; }\n  #app .sec:first-child { border-top: none; padding-top: 18px; }\n  #app .sec-title {\n    display: flex;\n    align-items: baseline;\n    gap: 9px;\n    font-size: 17px;\n    font-weight: 700;\n    color: var(--ink);\n    line-height: 1.35;\n    border-left: 3px solid var(--primary);\n    padding-left: 11px;\n    margin-bottom: 16px;\n  }\n  #app .sec-num {\n    font-size: 11.5px;\n    font-weight: 700;\n    color: var(--primary-d);\n    background: #eff6ff;\n    border: 1px solid #dbeafe;\n    border-radius: 5px;\n    padding: 1px 6px;\n    letter-spacing: 0.4px;\n  }\n  #app .grp-title {\n    display: flex;\n    align-items: center;\n    gap: 8px;\n    font-size: 14px;\n    font-weight: 700;\n    color: var(--ink);\n    margin: 2px 0 10px;\n  }\n  #app .grp-title::before {\n    content: \"\";\n    width: 6px;\n    height: 6px;\n    background: var(--primary);\n    transform: rotate(45deg);\n    flex: 0 0 auto;\n  }\n\n  \/* ================= \u8868\u5355 ================= *\/\n  #app .grid-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }\n  #app .grid-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }\n  #app .field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }\n  #app .field label { font-size: 13px; font-weight: 600; color: #475569; }\n  #app input[type=\"text\"], #app input[type=\"number\"], #app input[type=\"date\"],\n  #app select, #app textarea {\n    width: 100%;\n    height: 42px;\n    padding: 0 12px;\n    font-family: inherit;\n    font-size: 14px;\n    color: var(--ink);\n    background: var(--soft);\n    border: 1.5px solid #cbd5e1;\n    border-radius: 8px;\n    transition: border-color 0.15s, box-shadow 0.15s, background 0.15s;\n    -webkit-appearance: none;\n    appearance: none;\n    line-height: normal;\n  }\n  #app textarea { height: auto; padding: 10px 12px; line-height: 1.7; resize: vertical; }\n  #app input::placeholder, #app textarea::placeholder { color: #94a3b8; }\n  #app input:focus, #app select:focus, #app textarea:focus {\n    outline: none;\n    border-color: var(--primary);\n    background: #fff;\n    box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.15);\n  }\n  #app select {\n    padding-right: 34px;\n    background-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%2364748b' stroke-width='2.4' stroke-linecap='round'%3E%3Cpath d='M6 9l6 6 6-6'\/%3E%3C\/svg%3E\");\n    background-repeat: no-repeat;\n    background-position: right 12px center;\n  }\n  #app input[type=\"date\"], #app input[type=\"file\"] { -webkit-appearance: auto; appearance: auto; }\n  #app input[type=\"file\"] { height: auto; padding: 8px 10px; background: #fff; font-size: 13px; color: var(--muted); }\n  #app .hint { font-size: 12.5px; color: var(--muted); line-height: 1.65; }\n\n  \/* ================= \u6309\u94ae ================= *\/\n  #app .btn, #app .btn-primary, #app .btn-secondary, #app .btn-accent,\n  #app .btn-info, #app .btn-success, #app .btn-danger, #app .btn-reset,\n  #app .correction-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    gap: 6px;\n    height: 42px;\n    padding: 0 18px;\n    font-family: inherit;\n    font-size: 14px;\n    font-weight: 600;\n    line-height: 1;\n    white-space: nowrap;\n    border: 1px solid transparent;\n    border-radius: 8px;\n    cursor: pointer;\n    text-transform: none;\n    letter-spacing: normal;\n    transition: background 0.15s, border-color 0.15s, color 0.15s, box-shadow 0.15s;\n  }\n  #app .btn, #app .btn-primary { background: var(--primary); color: #fff; }\n  #app .btn:hover, #app .btn-primary:hover { background: var(--primary-d); box-shadow: 0 2px 6px rgba(37, 99, 235, 0.25); color: #fff; }\n  #app .btn-secondary, #app .btn-reset, #app .correction-btn {\n    background: #f1f5f9;\n    color: #334155;\n    border-color: #e2e8f0;\n  }\n  #app .btn-secondary:hover, #app .btn-reset:hover, #app .correction-btn:hover { background: #e8eef5; border-color: #cbd5e1; color: #0f172a; }\n  #app .btn-info { background: #eff6ff; color: var(--primary-d); border-color: #bfdbfe; }\n  #app .btn-info:hover { background: #dbeafe; border-color: #93c5fd; color: var(--primary-d); }\n  #app .btn-accent, #app .btn-success { background: #15803d; color: #fff; }\n  #app .btn-accent:hover, #app .btn-success:hover { background: #166534; color: #fff; }\n  #app .btn-danger { background: #fef2f2; color: #b91c1c; border-color: #fecaca; }\n  #app .btn-danger:hover { background: #fee2e2; border-color: #fca5a5; color: #b91c1c; }\n  #app .btn-row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin-top: 18px; }\n  #app .buttons { display: flex; gap: 10px; flex-wrap: wrap; }\n  #app .buttons .btn,\n  #app .buttons .btn-primary,\n  #app .buttons .btn-secondary,\n  #app .buttons .btn-accent { flex: 1 1 0; min-width: 0; }\n\n  \/* ================= \u63d0\u793a\u6846 ================= *\/\n  #app .info-box, #app .warning-box, #app .danger-box, #app .success-box {\n    border-radius: 10px;\n    border: 1px solid;\n    padding: 14px 16px;\n    font-size: 13.5px;\n    line-height: 1.75;\n    margin-bottom: 14px;\n  }\n  #app .info-box { background: var(--soft); border-color: var(--line); color: var(--body); }\n  #app .warning-box { background: #fffbeb; border-color: #fde68a; color: #92400e; }\n  #app .danger-box { background: #fef2f2; border-color: #fecaca; color: #991b1b; }\n  #app .success-box { background: #f0fdf4; border-color: #bbf7d0; color: #166534; }\n  #app .info-box p + p, #app .warning-box p + p, #app .danger-box p + p, #app .success-box p + p { margin-top: 8px; }\n  #app .info-box ul, #app .warning-box ul, #app .danger-box ul, #app .success-box ul { margin-top: 6px; }\n  #app .info-box strong, #app .warning-box strong, #app .danger-box strong, #app .success-box strong { color: inherit; }\n  #app .warning-box li::before, #app .danger-box li::before, #app .success-box li::before { background: currentColor; opacity: 0.55; }\n\n  \/* ================= \u6298\u53e0\u9762\u677f ================= *\/\n  #app .accordion { border: 1px solid var(--line); border-radius: 10px; overflow: hidden; margin-top: 14px; }\n  #app .accordion-header {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 10px;\n    padding: 12px 14px;\n    background: var(--soft);\n    font-size: 13.5px;\n    font-weight: 600;\n    color: #334155;\n    cursor: pointer;\n    user-select: none;\n    transition: background 0.15s, color 0.15s;\n  }\n  #app .accordion-header:hover { background: #f1f5f9; }\n  #app .accordion-header.active { background: #eff6ff; color: var(--primary-d); }\n  #app .accordion-header i {\n    display: inline-block;\n    width: 8px;\n    height: 8px;\n    flex: 0 0 auto;\n    border-right: 2px solid currentColor;\n    border-bottom: 2px solid currentColor;\n    transform: rotate(45deg);\n    margin-right: 3px;\n    margin-top: -3px;\n    transition: transform 0.25s ease, margin 0.25s ease;\n  }\n  #app .accordion-header i.fa-chevron-up { transform: rotate(-135deg); margin-top: 3px; }\n  #app .accordion-content {\n    max-height: 0;\n    overflow: hidden;\n    padding: 0 14px;\n    font-size: 13.5px;\n    line-height: 1.75;\n    transition: max-height 0.28s ease;\n  }\n  #app .accordion-content.active { max-height: 4000px; padding: 14px; }\n  #app .accordion-content h4 {\n    font-size: 13.5px;\n    font-weight: 700;\n    color: var(--ink);\n    margin: 14px 0 6px;\n    padding-left: 9px;\n    border-left: 2px solid #bfdbfe;\n  }\n  #app .accordion-content h4:first-child { margin-top: 0; }\n\n  \/* ================= \u8868\u683c ================= *\/\n  #app .tbl-wrap, #app .table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; margin: 12px 0 4px; }\n  #app table {\n    width: 100%;\n    border-collapse: collapse;\n    font-size: 13px;\n    background: #fff;\n  }\n  #app th, #app td {\n    padding: 10px 8px;\n    text-align: center;\n    border-bottom: 1px solid #eef2f7;\n    font-variant-numeric: tabular-nums;\n    vertical-align: middle;\n  }\n  #app th {\n    background: var(--soft);\n    font-size: 12.5px;\n    font-weight: 700;\n    color: #475569;\n    border-bottom: 1px solid var(--line);\n    white-space: nowrap;\n  }\n  #app th:first-child, #app td:first-child { text-align: left; }\n  #app tbody tr:last-child td { border-bottom: none; }\n  #app tbody tr:hover td { background: #fbfdff; }\n\n  \/* ================= \u56fe\u8868 ================= *\/\n  #app .chart-container { position: relative; width: 100%; height: 300px; }\n  #app .chart-container canvas { display: block; max-width: 100%; }\n\n  \/* ================= \u7ed3\u679c\u6570\u5b57 ================= *\/\n  #app .result-card {\n    background: #fff;\n    border: 1px solid var(--line);\n    border-top: 3px solid var(--primary);\n    border-radius: 10px;\n    padding: 14px 12px;\n    text-align: center;\n  }\n  #app .result-value {\n    font-size: 23px;\n    font-weight: 700;\n    color: var(--primary-d);\n    line-height: 1.25;\n    margin: 4px 0 2px;\n    font-variant-numeric: tabular-nums;\n    letter-spacing: -0.2px;\n  }\n  #app .result-label { font-size: 12px; font-weight: 600; color: var(--muted); }\n  #app .results-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; }\n\n  \/* ================= \u72b6\u6001\u8272 ================= *\/\n  #app .standard-optimal, #app .green-text, #app .text-ok { color: #15803d; font-weight: 600; }\n  #app .standard-pass, #app .yellow-text, #app .text-warn { color: #b45309; font-weight: 600; }\n  #app .standard-below, #app .red-text, #app .text-bad { color: #b91c1c; font-weight: 600; }\n\n  \/* ================= \u5de5\u5177\u7c7b ================= *\/\n  #app .hidden { display: none !important; }\n  #app .mt14 { margin-top: 14px; }\n  #app .mt-20 { margin-top: 20px; }\n\n  \/* ================= \u54cd\u5e94\u5f0f ================= *\/\n  @media (min-width: 720px) {\n    #app .results-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }\n  }\n  @media (max-width: 560px) {\n    #app .ps-head { padding: 20px 18px; }\n    #app .ps-head h1 { font-size: 18px; }\n    #app .ps-body { padding: 4px 18px 16px; }\n    #app .ps-foot { padding: 16px 18px; }\n    #app .grid-2, #app .grid-3 { grid-template-columns: 1fr; gap: 12px; }\n    #app .results-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }\n    #app .result-value { font-size: 20px; }\n    #app .btn-row { grid-template-columns: 1fr; }\n    #app .btn, #app .btn-primary, #app .btn-secondary, #app .btn-accent,\n    #app .btn-info, #app .btn-success, #app .btn-danger, #app .btn-reset { padding: 0 14px; font-size: 13.5px; }\n    #app table { font-size: 12.5px; }\n    #app th, #app td { padding: 9px 5px; }\n  }\n\n  \/* ---------- \u5ba2\u6237\u4fe1\u606f\u680f ---------- *\/\n  #app .client-bar {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 14px;\n  }\n  #app .client-actions {\n    display: flex;\n    gap: 8px;\n    flex-wrap: wrap;\n    margin-top: 14px;\n  }\n  #app .client-actions .btn-secondary,\n  #app .client-actions .btn-danger { flex: 1 1 0; min-width: 120px; }\n\n  \/* ---------- \u529b\u91cf\u5f55\u5165 ---------- *\/\n  #app .force-card {\n    border: 1px solid var(--line);\n    border-radius: 10px;\n    overflow: hidden;\n  }\n  #app .force-grid {\n    display: grid;\n    grid-template-columns: 108px minmax(0, 1fr) minmax(0, 1fr);\n    gap: 8px 10px;\n    align-items: center;\n    padding: 14px 16px 16px;\n  }\n  #app .force-grid .fg-head {\n    font-size: 11.5px;\n    font-weight: 700;\n    color: var(--muted);\n    letter-spacing: 0.3px;\n    text-align: center;\n    padding-bottom: 2px;\n  }\n  #app .force-grid .fg-head:first-child { text-align: left; }\n  #app .force-grid .fg-pos {\n    font-size: 13px;\n    font-weight: 600;\n    color: #475569;\n  }\n  #app .force-grid .fg-pos small {\n    display: block;\n    font-size: 11px;\n    font-weight: 500;\n    color: var(--muted);\n  }\n  #app .force-grid input[type=\"number\"] { text-align: center; height: 40px; }\n  #app .force-note {\n    padding: 10px 16px;\n    background: var(--soft);\n    border-top: 1px solid #eef2f7;\n    font-size: 12.5px;\n    color: var(--muted);\n  }\n  #app .side-legend {\n    display: flex;\n    gap: 16px;\n    flex-wrap: wrap;\n    margin-top: 10px;\n    font-size: 12.5px;\n    color: var(--muted);\n  }\n  #app .side-legend span { display: inline-flex; align-items: center; gap: 6px; }\n  #app .side-legend i {\n    width: 10px;\n    height: 10px;\n    border-radius: 3px;\n    display: inline-block;\n  }\n  #app .side-legend .lg-left { background: rgba(37, 99, 235, 0.85); }\n  #app .side-legend .lg-right { background: rgba(217, 119, 6, 0.85); }\n\n  \/* ---------- \u62a5\u544a ---------- *\/\n  #app .report-head {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    flex-wrap: wrap;\n    margin-bottom: 14px;\n  }\n  #app .report-actions { display: flex; gap: 8px; flex-wrap: wrap; }\n  #app .report-card {\n    border: 1px solid var(--line);\n    border-left: 3px solid var(--primary);\n    border-radius: 10px;\n    background: var(--soft);\n    padding: 16px 18px;\n    margin-top: 16px;\n  }\n  #app .report-text {\n    font-size: 13.5px;\n    line-height: 1.9;\n    color: var(--body);\n    white-space: pre-wrap;\n    font-variant-numeric: tabular-nums;\n  }\n  #app .report-foot { display: flex; justify-content: flex-end; margin-top: 14px; }\n\n  @media (max-width: 720px) {\n    #app .client-bar { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n  }\n  @media (max-width: 560px) {\n    #app .client-bar { grid-template-columns: 1fr; gap: 12px; }\n    #app .client-actions .btn-secondary,\n    #app .client-actions .btn-danger { flex: 1 1 100%; }\n    #app .force-grid {\n      grid-template-columns: 76px minmax(0, 1fr) minmax(0, 1fr);\n      padding: 12px 12px 14px;\n      gap: 8px 6px;\n    }\n    #app .force-grid input[type=\"number\"] { padding: 0 4px; font-size: 13px; }\n    #app .force-grid .fg-head { font-size: 11px; }\n    #app .chart-container { height: 260px; }\n  }\n<\/style>\n<script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/Chart.js\/4.4.1\/chart.umd.min.js\"><\/script>\n<div class=\"ps-card\">\n  <div class=\"ps-head\">\n    <div>\n      <h1>\u80a9\u90e8 I-Y-T \u529b\u91cf\u5206\u6790\u7cfb\u7edf<\/h1>\n      <p>\u4fef\u5367\u4f4d\u6d4b\u529b\u53f0\u6d4b\u8bd5 \u00b7 \u5355\u5ba2\u6237\u5bf9\u6bd4\u62a5\u544a \u00b7 \u6570\u636e\u4fdd\u5b58\u5728\u672c\u5730\u6d4f\u89c8\u5668<\/p>\n    <\/div>\n    <span class=\"ps-badge\">I-Y-T<\/span>\n  <\/div>\n  <div class=\"ps-body\">\n    <section class=\"sec\">\n      <h2 class=\"sec-title\"><span class=\"sec-num\">01<\/span>\u6d4b\u8bd5\u8bf4\u660e<\/h2>\n      <div class=\"info-box\">\n        <p><strong>\u6d4b\u8bd5\u4f53\u4f4d\uff1a<\/strong>\u4fef\u5367\u4f4d\uff0c\u975e\u6d4b\u8bd5\u4fa7\u624b\u7f6e\u4e8e\u80cc\u90e8\uff0c3\u20135 \u79d2\u5185\u9010\u6e10\u63a8\u81f3\u6700\u5927\u529b\u91cf\u3002<\/p>\n        <p><strong>\u6d4b\u8bd5\u987a\u5e8f\uff1a<\/strong>I \u2192 Y \u2192 T\uff0c\u5de6\u53f3\u4fa7\u5206\u5f00\u6d4b\u8bd5\uff0c\u4e2d\u95f4\u4f11\u606f 20\u201330 \u79d2\uff0c\u8bb0\u5f55\u5cf0\u503c\u529b\u91cf\uff08kg\uff09\u3002<\/p>\n        <p><strong>\u7ed3\u679c\u89e3\u8bfb\uff1a<\/strong>\u7cfb\u7edf\u81ea\u52a8\u751f\u6210\u5de6\u53f3\u4fa7\u5bf9\u6bd4\u56fe\u8868\u4e0e\u8bc4\u4f30\u62a5\u544a\uff1b\u5efa\u8bae\u5404\u4f4d\u7f6e\u5de6\u53f3\u5dee\u5f02\u63a7\u5236\u5728 10% \u4ee5\u5185\u3002<\/p>\n      <\/div>\n    <\/section>\n    <section class=\"sec\">\n      <h2 class=\"sec-title\"><span class=\"sec-num\">02<\/span>\u5ba2\u6237\u4fe1\u606f<\/h2>\n      <div class=\"client-bar\">\n        <div class=\"field\"><label for=\"clientName\">\u5ba2\u6237\u59d3\u540d \/ ID<\/label><input type=\"text\" id=\"clientName\" placeholder=\"\u4f8b\u5982\uff1a\u5f20\u654f\" value=\"\u674e\u6b63\u6d69\"><\/div>\n        <div class=\"field\"><label for=\"testDate\">\u6d4b\u8bd5\u65e5\u671f<\/label><input type=\"date\" id=\"testDate\" value=\"2026-03-21\"><\/div>\n        <div class=\"field\"><label for=\"customerSelect\">\u5207\u6362\u5ba2\u6237<\/label>\n          <select id=\"customerSelect\"><option value=\"\">\u52a0\u8f7d\u5df2\u6709\u5ba2\u6237<\/option><\/select>\n        <\/div>\n      <\/div>\n      <div class=\"client-actions\">\n        <button class=\"btn-secondary\" id=\"saveCurrentBtn\">\u4fdd\u5b58\u5f53\u524d\u5ba2\u6237<\/button>\n        <button class=\"btn-secondary\" id=\"newCustomerBtn\">\u65b0\u5efa\u5ba2\u6237<\/button>\n        <button class=\"btn-danger\" id=\"deleteCustomerBtn\">\u5220\u9664\u5f53\u524d\u5ba2\u6237<\/button>\n      <\/div>\n    <\/section>\n    <section class=\"sec\">\n      <h2 class=\"sec-title\"><span class=\"sec-num\">03<\/span>\u529b\u91cf\u6570\u636e\u5f55\u5165<\/h2>\n      <div class=\"force-card\">\n        <div class=\"force-grid\">\n          <div class=\"fg-head\">\u6d4b\u8bd5\u4f4d\u7f6e<\/div>\n          <div class=\"fg-head\">\u5de6\u4fa7\uff08kg\uff09<\/div>\n          <div class=\"fg-head\">\u53f3\u4fa7\uff08kg\uff09<\/div>\n\n          <div class=\"fg-pos\">I \u4f4d<small>\u80a9\u80db\u540e\u7f29<\/small><\/div>\n          <input type=\"number\" id=\"leftI\" step=\"0.1\" value=\"18.5\" placeholder=\"0.0\">\n          <input type=\"number\" id=\"rightI\" step=\"0.1\" value=\"22.3\" placeholder=\"0.0\">\n\n          <div class=\"fg-pos\">Y \u4f4d<small>\u4e0b\u659c\u65b9<\/small><\/div>\n          <input type=\"number\" id=\"leftY\" step=\"0.1\" value=\"21.2\" placeholder=\"0.0\">\n          <input type=\"number\" id=\"rightY\" step=\"0.1\" value=\"24.8\" placeholder=\"0.0\">\n\n          <div class=\"fg-pos\">T \u4f4d<small>\u4e2d\u659c\u65b9<\/small><\/div>\n          <input type=\"number\" id=\"leftT\" step=\"0.1\" value=\"19.6\" placeholder=\"0.0\">\n          <input type=\"number\" id=\"rightT\" step=\"0.1\" value=\"23.4\" placeholder=\"0.0\">\n        <\/div>\n        <div class=\"force-note\">\u6bcf\u6b21\u6d4b\u8bd5\u53d6 3\u20135 \u79d2\u7a33\u5b9a\u53d1\u529b\u8fc7\u7a0b\u7684\u5cf0\u503c\uff1b\u5de6\u53f3\u4fa7\u5206\u522b\u8bb0\u5f55\uff0c\u5355\u4f4d kg\uff0c\u7cbe\u786e\u5230 0.1\u3002<\/div>\n      <\/div>\n      <div class=\"side-legend\">\n        <span><i class=\"lg-left\"><\/i>\u5de6\u4fa7\uff08\u975e\u4f18\u52bf \/ \u6d4b\u8bd5\u4fa7\uff09<\/span>\n        <span><i class=\"lg-right\"><\/i>\u53f3\u4fa7\uff08\u6d4b\u8bd5\u4fa7\uff09<\/span>\n      <\/div>\n    <\/section>\n    <section class=\"sec\">\n      <h2 class=\"sec-title\"><span class=\"sec-num\">04<\/span>\u529b\u91cf\u5bf9\u6bd4\u5206\u6790<\/h2>\n      <div class=\"report-head\">\n        <span class=\"hint\">\u6570\u636e\u53d8\u5316\u5b9e\u65f6\u5237\u65b0\u56fe\u8868\u4e0e\u62a5\u544a<\/span>\n        <div class=\"report-actions\">\n          <button class=\"btn-info\" id=\"exportReportBtn\">\u5bfc\u51fa\u62a5\u544a\uff08TXT\uff09<\/button>\n          <button class=\"btn-secondary\" id=\"exportDataBtn\">\u5bfc\u51fa\u6570\u636e\uff08CSV\uff09<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"chart-container\">\n        <canvas id=\"strengthChart\"><\/canvas>\n      <\/div>\n      <div class=\"report-card\" id=\"reportCard\">\n        <div class=\"report-text\" id=\"dynamicReport\">\u6b63\u5728\u5206\u6790\u5de6\u53f3\u4fa7\u529b\u91cf\u6570\u636e...<\/div>\n        <div class=\"report-foot\">\n          <button class=\"btn-secondary\" id=\"refreshReportBtn\">\u5237\u65b0\u62a5\u544a<\/button>\n        <\/div>\n      <\/div>\n    <\/section>\n  <\/div>\n  <div class=\"ps-foot\">\n    <p>\u6d4b\u8bd5\u89c4\u8303\uff1a\u4fef\u5367\u4f4d\uff0c\u975e\u6d4b\u8bd5\u624b\u4e0a\u7f6e\u4e8e\u80cc\u90e8\uff0c3\u20135 \u79d2\u5185\u9010\u6e10\u63a8\u81f3\u6700\u5927\u529b\u91cf\u5e76\u8bb0\u5f55\u5cf0\u503c\uff1b\u5de6\u53f3\u4fa7\u5206\u5f00\u6d4b\u8bd5\uff0c\u987a\u5e8f I \u2192 Y \u2192 T\uff0c\u4e2d\u95f4\u4f11\u606f 20\u201330 \u79d2\u3002<\/p>\n    <p>\u6570\u636e\u4fdd\u5b58\u5728\u672c\u673a\u6d4f\u89c8\u5668\uff08localStorage\uff09\uff0c\u4e0d\u4e0a\u4f20\u670d\u52a1\u5668\uff1b\u66f4\u6362\u8bbe\u5907\u6216\u6e05\u7406\u6d4f\u89c8\u5668\u6570\u636e\u5c06\u4e22\u5931\u8bb0\u5f55\u3002<\/p>\n    <p>\u672c\u5de5\u5177\u4ec5\u4f5c\u8f85\u52a9\u8bc4\u4f30\uff0c\u4e0d\u80fd\u66ff\u4ee3\u4e13\u4e1a\u533b\u7597\u8bca\u65ad\u3002<\/p>\n  <\/div>\n<\/div>\n<script>\/\/ ---------- \u5b58\u50a8KEY ----------\n    const STORAGE_KEY = 'ITY_SingleClient_System';\n    \/\/ ---------- \u6570\u636e\u7ed3\u6784 ----------\n    \/\/ \u6240\u6709\u5ba2\u6237\u5217\u8868: [{ id, name, date, left: {I,Y,T}, right: {I,Y,T} }]\n    let customers = [];\n    let currentCustomerId = null;\n    \/\/ Chart\u5b9e\u4f8b\n    let strengthChart = null;\n    \/\/ DOM \u5143\u7d20\n    const clientNameInput = document.getElementById('clientName');\n    const testDateInput = document.getElementById('testDate');\n    const customerSelect = document.getElementById('customerSelect');\n    const leftI = document.getElementById('leftI');\n    const leftY = document.getElementById('leftY');\n    const leftT = document.getElementById('leftT');\n    const rightI = document.getElementById('rightI');\n    const rightY = document.getElementById('rightY');\n    const rightT = document.getElementById('rightT');\n    \/\/ \u8f85\u52a9\u51fd\u6570\uff1a\u4fdd\u5b58\u6574\u4e2acustomers\u5230localStorage\n    function saveCustomersToLocal() {\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(customers));\n    }\n    \/\/ \u52a0\u8f7d\u521d\u59cb\u6570\u636e\n    function loadCustomersFromLocal() {\n        const stored = localStorage.getItem(STORAGE_KEY);\n        if (stored) {\n            try {\n                customers = JSON.parse(stored);\n                if (!Array.isArray(customers)) customers = [];\n                return;\n            } catch(e) { console.warn(e); }\n        }\n        \/\/ \u9ed8\u8ba4\u6f14\u793a\u5ba2\u6237\n        customers = [\n            {\n                id: 'c1',\n                name: '\u674e\u6b63\u6d69',\n                date: '2026-03-21',\n                left: { I: 18.5, Y: 21.2, T: 19.6 },\n                right: { I: 22.3, Y: 24.8, T: 23.4 }\n            },\n            {\n                id: 'c2',\n                name: '\u738b\u96c5\u5a77',\n                date: '2026-03-20',\n                left: { I: 16.2, Y: 18.9, T: 17.1 },\n                right: { I: 17.8, Y: 20.3, T: 18.5 }\n            }\n        ];\n        saveCustomersToLocal();\n    }\n    \/\/ \u5237\u65b0\u4e0b\u62c9\u9009\u62e9\u5217\u8868\n    function updateCustomerSelect() {\n        customerSelect.innerHTML = '<option value=\"\">-- \u5207\u6362\u5ba2\u6237 --<\/option>';\n        customers.forEach(cust => {\n            const option = document.createElement('option');\n            option.value = cust.id;\n            option.textContent = `${cust.name} (${cust.date})`;\n            if (currentCustomerId === cust.id) option.selected = true;\n            customerSelect.appendChild(option);\n        });\n    }\n    \/\/ \u6839\u636e\u5f53\u524dcurrentCustomerId\uff0c\u5c06\u6570\u636e\u663e\u793a\u5230UI\n    function loadCurrentCustomerToUI() {\n        if (!currentCustomerId) {\n            \/\/ \u5982\u679c\u6ca1\u6709\u5f53\u524d\u5ba2\u6237\uff0c\u5c1d\u8bd5\u9009\u62e9\u7b2c\u4e00\u4e2a\n            if (customers.length > 0) {\n                currentCustomerId = customers[0].id;\n            } else {\n                \/\/ \u5b8c\u5168\u7a7a\u767d\n                clientNameInput.value = '';\n                testDateInput.value = new Date().toISOString().slice(0,10);\n                leftI.value = ''; leftY.value = ''; leftT.value = '';\n                rightI.value = ''; rightY.value = ''; rightT.value = '';\n                return;\n            }\n        }\n        const customer = customers.find(c => c.id === currentCustomerId);\n        if (!customer) {\n            if (customers.length) currentCustomerId = customers[0].id;\n            else return;\n            loadCurrentCustomerToUI();\n            return;\n        }\n        clientNameInput.value = customer.name || '';\n        testDateInput.value = customer.date || '';\n        leftI.value = customer.left?.I !== undefined ? customer.left.I : '';\n        leftY.value = customer.left?.Y !== undefined ? customer.left.Y : '';\n        leftT.value = customer.left?.T !== undefined ? customer.left.T : '';\n        rightI.value = customer.right?.I !== undefined ? customer.right.I : '';\n        rightY.value = customer.right?.Y !== undefined ? customer.right.Y : '';\n        rightT.value = customer.right?.T !== undefined ? customer.right.T : '';\n    }\n    \/\/ \u5c06\u5f53\u524dUI\u6570\u636e\u4fdd\u5b58\u5230 currentCustomer \u5bf9\u8c61 (\u4e0d\u4fdd\u5b58\u5230localstorage\uff0c\u9700\u663e\u5f0f\u8c03\u7528\u4fdd\u5b58)\n    function syncUIToCurrentCustomer() {\n        if (!currentCustomerId) return false;\n        const index = customers.findIndex(c => c.id === currentCustomerId);\n        if (index === -1) return false;\n        const name = clientNameInput.value.trim();\n        if (name === \"\") {\n            alert(\"\u5ba2\u6237\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a\uff0c\u8bf7\u586b\u5199\u540e\u518d\u4fdd\u5b58\");\n            return false;\n        }\n        const leftVal = {\n            I: parseFloat(leftI.value) || 0,\n            Y: parseFloat(leftY.value) || 0,\n            T: parseFloat(leftT.value) || 0\n        };\n        const rightVal = {\n            I: parseFloat(rightI.value) || 0,\n            Y: parseFloat(rightY.value) || 0,\n            T: parseFloat(rightT.value) || 0\n        };\n        customers[index] = {\n            ...customers[index],\n            name: name,\n            date: testDateInput.value,\n            left: leftVal,\n            right: rightVal\n        };\n        return true;\n    }\n    \/\/ \u4fdd\u5b58\u5f53\u524d\u5ba2\u6237\u6570\u636e (UI -> \u5185\u5b58 -> localStorage)\n    function saveCurrentCustomer() {\n        if (!currentCustomerId) {\n            \/\/ \u5982\u679c\u6ca1\u6709\u5f53\u524d\u5ba2\u6237\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u5ba2\u6237\n            createNewCustomerAndSetCurrent();\n            return;\n        }\n        const success = syncUIToCurrentCustomer();\n        if (success) {\n            saveCustomersToLocal();\n            updateCustomerSelect();\n            updateChartAndReport();   \/\/ \u6570\u636e\u66f4\u65b0\u540e\u5237\u65b0\u5206\u6790\u548c\u56fe\u8868\n            alert(\"\u5ba2\u6237\u6570\u636e\u5df2\u4fdd\u5b58\");\n        }\n    }\n    \/\/ \u65b0\u5efa\u5ba2\u6237\n    function createNewCustomerAndSetCurrent() {\n        const newId = 'cust_' + Date.now() + '_' + Math.random().toString(36).substr(2, 6);\n        const defaultName = \"\u65b0\u5ba2\u6237\";\n        const today = new Date().toISOString().slice(0,10);\n        const newCustomer = {\n            id: newId,\n            name: defaultName,\n            date: today,\n            left: { I: 0, Y: 0, T: 0 },\n            right: { I: 0, Y: 0, T: 0 }\n        };\n        customers.push(newCustomer);\n        currentCustomerId = newId;\n        saveCustomersToLocal();\n        \/\/ \u6e05\u7a7aUI\u5e76\u663e\u793a\u9ed8\u8ba4\n        clientNameInput.value = defaultName;\n        testDateInput.value = today;\n        leftI.value = ''; leftY.value = ''; leftT.value = '';\n        rightI.value = ''; rightY.value = ''; rightT.value = '';\n        updateCustomerSelect();\n        updateChartAndReport();\n        alert(\"\u5df2\u521b\u5efa\u65b0\u5ba2\u6237\uff0c\u8bf7\u586b\u5199\u6d4b\u8bd5\u6570\u636e\u540e\u70b9\u51fb\u4fdd\u5b58\");\n    }\n    \/\/ \u5220\u9664\u5f53\u524d\u5ba2\u6237\n    function deleteCurrentCustomer() {\n        if (!currentCustomerId) return;\n        if (customers.length === 1) {\n            if(confirm(\"\u5220\u9664\u540e\u65e0\u5176\u4ed6\u5ba2\u6237\uff0c\u7cfb\u7edf\u5c06\u81ea\u52a8\u521b\u5efa\u4e00\u4e2a\u7a7a\u767d\u5ba2\u6237\u3002\u786e\u8ba4\u5220\u9664\uff1f\")){\n                customers = [];\n                saveCustomersToLocal();\n                createNewCustomerAndSetCurrent();\n                updateCustomerSelect();\n                updateChartAndReport();\n            }\n            return;\n        }\n        if(confirm(`\u786e\u5b9a\u8981\u5220\u9664\u5ba2\u6237\u201c${clientNameInput.value}\u201d\u7684\u6240\u6709\u6d4b\u8bd5\u8bb0\u5f55\u5417\uff1f`)){\n            customers = customers.filter(c => c.id !== currentCustomerId);\n            saveCustomersToLocal();\n            \/\/ \u91cd\u65b0\u8bbe\u7f6e\u5f53\u524d\u5ba2\u6237\u4e3a\u7b2c\u4e00\u4e2a\n            currentCustomerId = customers.length ? customers[0].id : null;\n            if(!currentCustomerId && customers.length === 0){\n                createNewCustomerAndSetCurrent();\n            } else {\n                loadCurrentCustomerToUI();\n                updateCustomerSelect();\n                updateChartAndReport();\n            }\n        }\n    }\n    \/\/ \u5207\u6362\u5ba2\u6237\n    function switchCustomer(customerId) {\n        const target = customers.find(c => c.id === customerId);\n        if (target) {\n            currentCustomerId = target.id;\n            loadCurrentCustomerToUI();\n            updateCustomerSelect();\n            updateChartAndReport();\n        }\n    }\n    \/\/ ---------- \u56fe\u8868 & \u62a5\u544a\u751f\u6210\u6a21\u5757 ----------\n    function getCurrentForceData() {\n        \/\/ \u4eceUI\u5b9e\u65f6\u83b7\u53d6\u529b\u91cf\u503c (\u4fdd\u8bc1\u6700\u65b0)\n        const left = {\n            I: parseFloat(leftI.value) || 0,\n            Y: parseFloat(leftY.value) || 0,\n            T: parseFloat(leftT.value) || 0\n        };\n        const right = {\n            I: parseFloat(rightI.value) || 0,\n            Y: parseFloat(rightY.value) || 0,\n            T: parseFloat(rightT.value) || 0\n        };\n        return { left, right };\n    }\n    \/\/ \u66f4\u65b0\u56fe\u8868\n    function renderChart(leftData, rightData) {\n        if (typeof Chart === 'undefined') {\n            var box = document.querySelector('#app .chart-container');\n            if (box && !box.dataset.warned) {\n                box.dataset.warned = '1';\n                box.innerHTML = '<p class=\"hint\">\u56fe\u8868\u7ec4\u4ef6\u5c1a\u672a\u52a0\u8f7d\u5b8c\u6210\uff0c\u8bf7\u786e\u8ba4\u7f51\u7edc\u7545\u901a\u540e\u5237\u65b0\u9875\u9762\u3002<\/p>';\n            }\n            return;\n        }\n        Chart.defaults.font.family = '-apple-system, BlinkMacSystemFont, \"Segoe UI\", \"PingFang SC\", \"Microsoft YaHei\", sans-serif';\n        Chart.defaults.color = '#64748b';\n        const ctx = document.getElementById('strengthChart').getContext('2d');\n        const positions = ['I \u4f4d\u7f6e', 'Y \u4f4d\u7f6e', 'T \u4f4d\u7f6e'];\n        if (strengthChart) {\n            strengthChart.destroy();\n        }\n        strengthChart = new Chart(ctx, {\n            type: 'bar',\n            data: {\n                labels: positions,\n                datasets: [\n                    {\n                        label: '\u5de6\u4fa7\u529b\u91cf (kg)',\n                        data: [leftData.I, leftData.Y, leftData.T],\n                        backgroundColor: 'rgba(37, 99, 235, 0.82)',\n                        borderRadius: 8,\n                        borderSkipped: false,\n                    },\n                    {\n                        label: '\u53f3\u4fa7\u529b\u91cf (kg)',\n                        data: [rightData.I, rightData.Y, rightData.T],\n                        backgroundColor: 'rgba(217, 119, 6, 0.82)',\n                        borderRadius: 8,\n                        borderSkipped: false,\n                    }\n                ]\n            },\n            options: {\n                responsive: true,\n                maintainAspectRatio: false,\n                layout: { padding: { left: 4, right: 8, top: 4 } },\n                plugins: {\n                    tooltip: { callbacks: { label: (ctx) => `${ctx.dataset.label}: ${ctx.raw} kg` } },\n                    legend: { position: 'top' },\n                    title: { display: true, text: '\u5de6\u53f3\u4fa7 I\/Y\/T \u6700\u5927\u529b\u91cf\u5bf9\u6bd4', font: { size: 14 } }\n                },\n                scales: {\n                    y: { title: { display: true, text: '\u529b\u91cf (kg)', font: { weight: 'bold' } }, beginAtZero: true }\n                }\n            }\n        });\n    }\n    \/\/ \u667a\u80fd\u62a5\u544a\u751f\u6210 (\u57fa\u4e8e\u5de6\u53f3\u4fa7\u529b\u91cf\u5bf9\u6bd4\u548c\u529f\u80fd\u5efa\u8bae)\n    function generateReport(left, right) {\n        const positions = ['I', 'Y', 'T'];\n        let comparisonText = \"\";\n        let totalLeft = left.I + left.Y + left.T;\n        let totalRight = right.I + right.Y + right.T;\n        let asymmetryWarnings = [];\n        for (let pos of positions) {\n            let lVal = left[pos];\n            let rVal = right[pos];\n            let diff = Math.abs(lVal - rVal);\n            let percentDiff = (lVal + rVal) > 0 ? (diff \/ ((lVal + rVal)\/2) * 100) : 0;\n            let stronger = lVal > rVal ? \"\u5de6\u4fa7\" : (rVal > lVal ? \"\u53f3\u4fa7\" : \"\u53cc\u4fa7\u76f8\u7b49\");\n            if (diff > 0.5 && percentDiff > 10) {\n                asymmetryWarnings.push(` ${pos}\u4f4d\u7f6e\u5de6\u53f3\u5dee\u5f02\u8fbe ${diff.toFixed(1)}kg (${percentDiff.toFixed(0)}%)\uff0c${stronger}\u4fa7\u4f18\u52bf\u660e\u663e\uff0c\u9700\u5173\u6ce8\u5e73\u8861\u6027\u3002`);\n            }\n            comparisonText += ` \u25b8 ${pos}\u4f4d\uff1a\u5de6\u4fa7 ${lVal.toFixed(1)} kg\uff0c\u53f3\u4fa7 ${rVal.toFixed(1)} kg\uff1b`;\n        }\n        let totalDiff = Math.abs(totalLeft - totalRight);\n        let totalPercent = (totalLeft+totalRight)>0 ? (totalDiff\/((totalLeft+totalRight)\/2)*100) : 0;\n        let summary = \"\";\n        if (totalLeft > totalRight) {\n            summary = `\u603b\u4f53\u529b\u91cf\u5de6\u4fa7\u5f3a\u4e8e\u53f3\u4fa7\uff0c\u603b\u529b\u91cf\u9ad8\u51fa ${totalDiff.toFixed(1)}kg (${totalPercent.toFixed(0)}%)\u3002\u5efa\u8bae\u5f3a\u5316\u53f3\u4fa7\u808c\u529b\u53ca\u52a8\u4f5c\u63a7\u5236\u3002`;\n        } else if (totalRight > totalLeft) {\n            summary = `\u603b\u4f53\u529b\u91cf\u53f3\u4fa7\u5f3a\u4e8e\u5de6\u4fa7\uff0c\u603b\u529b\u91cf\u9ad8\u51fa ${totalDiff.toFixed(1)}kg (${totalPercent.toFixed(0)}%)\u3002\u5efa\u8bae\u589e\u52a0\u5de6\u4fa7\u80a9\u90e8\u8bad\u7ec3\u3002`;\n        } else {\n            summary = `\u5de6\u53f3\u4fa7\u603b\u529b\u91cf\u57fa\u672c\u5747\u8861\uff0c\u6574\u4f53\u5bf9\u79f0\u6027\u826f\u597d\u3002`;\n        }\n        let advice = \"\";\n        if (asymmetryWarnings.length > 0) {\n            advice = `\u4e0d\u5bf9\u79f0\u63d0\u793a\uff1a${asymmetryWarnings.join(\" \")} \u5efa\u8bae\u52a0\u5f3a\u8f83\u5f31\u4fa7\u9488\u5bf9\u6027\u8bad\u7ec3\uff08\u4fef\u5367YTW\u3001\u5f39\u529b\u5e26\u6297\u963b\uff09\uff0c\u5e76\u590d\u67e5\u52a8\u4f5c\u8d28\u91cf\u3002`;\n        } else {\n            advice = `\u80a9\u90e8\u529b\u91cf\u5bf9\u79f0\u6027\u826f\u597d\uff0c\u5404\u4f4d\u7f6e\u5dee\u5f02\u5728\u5408\u7406\u8303\u56f4\u5185\u3002\u7ee7\u7eed\u4fdd\u6301\u529f\u80fd\u6027\u8bad\u7ec3\uff0c\u6ce8\u610f\u6d4b\u8bd5\u65f63-5\u79d2\u7a33\u5b9a\u53d1\u529b\u3002`;\n        }\n        const clientName = clientNameInput.value || \"\u5ba2\u6237\";\n        const testDate = testDateInput.value || \"\u672a\u77e5\u65e5\u671f\";\n        const report = [\n            `\u6d4b\u8bd5\u62a5\u544a \u2014\u2014 ${clientName}\uff08${testDate}\uff09`,\n            '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500',\n            '\u3010\u529b\u91cf\u6570\u636e\u603b\u89c8\u3011',\n            comparisonText.trim(),\n            '',\n            `\u3010\u603b\u529b\u91cf\u5bf9\u6bd4\u3011\u5de6\u4fa7 ${totalLeft.toFixed(1)} kg\uff0f\u53f3\u4fa7 ${totalRight.toFixed(1)} kg`,\n            summary,\n            '',\n            `\u3010\u8bc4\u4f30\u4e0e\u5efa\u8bae\u3011${advice}`,\n            '\u3010\u4e34\u5e8a\u63d0\u793a\u3011\u4fef\u5367\u4f4d I\/Y\/T \u662f\u80a9\u80db\u540e\u4fa7\u94fe\u91cd\u8981\u6307\u6807\uff0c\u5efa\u8bae\u6bcf\u6708\u590d\u6d4b\uff0c\u5de6\u53f3\u5dee\u503c\u76ee\u6807 < 5%\u3002'\n        ].join('\\n');\n        return report;\n    }\n    \/\/ \u5237\u65b0\u56fe\u8868\u548c\u62a5\u544a\u6a21\u5757\n    function updateChartAndReport() {\n        const { left, right } = getCurrentForceData();\n        renderChart(left, right);\n        const reportText = generateReport(left, right);\n        const reportDiv = document.getElementById('dynamicReport');\n        if (reportDiv) {\n            reportDiv.innerText = reportText;\n            reportDiv.style.whiteSpace = \"pre-wrap\";\n        }\n    }\n    \/\/ \u5bfc\u51fa\u62a5\u544a\u4e3atxt\n    function exportReportAsText() {\n        const { left, right } = getCurrentForceData();\n        const report = generateReport(left, right);\n        const blob = new Blob([report], { type: 'text\/plain;charset=utf-8' });\n        const link = document.createElement('a');\n        const url = URL.createObjectURL(blob);\n        link.href = url;\n        link.download = `\u80a9\u90e8\u6d4b\u8bd5\u62a5\u544a_${clientNameInput.value || \"\u5ba2\u6237\"}_${testDateInput.value}.txt`;\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n        URL.revokeObjectURL(url);\n    }\n    \/\/ \u5bfc\u51fa\u5f53\u524d\u5ba2\u6237\u5b8c\u6574\u6570\u636eCSV (\u5305\u62ec\u5de6\u53f3\u4fa7\u529b\u91cf\u8be6\u7ec6)\n    function exportDataCSV() {\n        const { left, right } = getCurrentForceData();\n        const name = clientNameInput.value || \"\u672a\u547d\u540d\";\n        const date = testDateInput.value || \"\";\n        const rows = [\n            [\"\u5ba2\u6237\", \"\u6d4b\u8bd5\u65e5\u671f\", \"\u4fa7\u522b\", \"\u6d4b\u8bd5\u4f4d\u7f6e\", \"\u6700\u5927\u529b\u91cf(kg)\"],\n            [name, date, \"\u5de6\u4fa7\", \"I\", left.I],\n            [name, date, \"\u5de6\u4fa7\", \"Y\", left.Y],\n            [name, date, \"\u5de6\u4fa7\", \"T\", left.T],\n            [name, date, \"\u53f3\u4fa7\", \"I\", right.I],\n            [name, date, \"\u53f3\u4fa7\", \"Y\", right.Y],\n            [name, date, \"\u53f3\u4fa7\", \"T\", right.T],\n        ];\n        const csvContent = rows.map(row => row.map(cell => `\"${String(cell).replace(\/\"\/g, '\"\"')}\"`).join(\",\")).join(\"\\n\");\n        const blob = new Blob([\"\\uFEFF\" + csvContent], { type: \"text\/csv;charset=utf-8;\" });\n        const link = document.createElement(\"a\");\n        const url = URL.createObjectURL(blob);\n        link.href = url;\n        link.download = `\u80a9\u90e8\u529b\u91cf\u6570\u636e_${name}_${date}.csv`;\n        document.body.appendChild(link);\n        link.click();\n        document.body.removeChild(link);\n        URL.revokeObjectURL(url);\n    }\n    \/\/ \u76d1\u542c\u8f93\u5165\u53d8\u5316\u65f6\u5b9e\u65f6\u66f4\u65b0\u56fe\u8868\u548c\u62a5\u544a (\u8ba9\u62a5\u544a\u52a8\u6001)\n    function bindInputEvents() {\n        const inputs = [leftI, leftY, leftT, rightI, rightY, rightT, clientNameInput, testDateInput];\n        inputs.forEach(inp => {\n            inp.addEventListener('input', () => {\n                updateChartAndReport();\n            });\n            inp.addEventListener('change', () => {\n                updateChartAndReport();\n            });\n        });\n    }\n    \/\/ \u521d\u59cb\u5316\u4e8b\u4ef6\u7ed1\u5b9a\n    function bindButtons() {\n        document.getElementById('saveCurrentBtn').addEventListener('click', saveCurrentCustomer);\n        document.getElementById('newCustomerBtn').addEventListener('click', createNewCustomerAndSetCurrent);\n        document.getElementById('deleteCustomerBtn').addEventListener('click', deleteCurrentCustomer);\n        document.getElementById('exportReportBtn').addEventListener('click', exportReportAsText);\n        document.getElementById('exportDataBtn').addEventListener('click', exportDataCSV);\n        document.getElementById('refreshReportBtn').addEventListener('click', () => updateChartAndReport());\n        customerSelect.addEventListener('change', (e) => {\n            if (e.target.value) switchCustomer(e.target.value);\n        });\n    }\n    \/\/ \u542f\u52a8\u5e94\u7528\n    function init() {\n        loadCustomersFromLocal();\n        if (customers.length > 0) {\n            currentCustomerId = customers[0].id;\n        } else {\n            createNewCustomerAndSetCurrent();\n        }\n        loadCurrentCustomerToUI();\n        updateCustomerSelect();\n        bindInputEvents();\n        bindButtons();\n        updateChartAndReport();\n    }\n    init();<\/script>\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u80a9\u90e8\u529b\u91cf\u6d4b\u8bd5 | I-Y-T \u5355\u5ba2\u6237\u5206\u6790\u62a5\u544a \ud83d\udcca \u80a9\u90e8 I-Y-T \u529b\u91cf\u5206\u6790\u7cfb\u7edf \u5355\u5ba2\u6237 \u00b7 \u7cbe\u51c6\u62a5\u544a \ud83d\udd39 \u57fa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1307,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2018","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/2018","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2018"}],"version-history":[{"count":8,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/2018\/revisions"}],"predecessor-version":[{"id":2168,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/2018\/revisions\/2168"}],"up":[{"embeddable":true,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/1307"}],"wp:attachment":[{"href":"https:\/\/www.funpt.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2018"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}