{"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-03-21T13:47:57","modified_gmt":"2026-03-21T05:47:57","slug":"elementor-2018","status":"publish","type":"page","link":"https:\/\/www.funpt.cn\/?page_id=2018","title":{"rendered":"ITY"},"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<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\">\r\n    <title>\u80a9\u90e8\u529b\u91cf\u6d4b\u8bd5 | I-Y-T \u5355\u5ba2\u6237\u5206\u6790\u62a5\u544a<\/title>\r\n    <!-- Chart.js CDN for data visualization -->\r\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/chart.js@4.4.0\/dist\/chart.umd.min.js\"><\/script>\r\n    <style>\r\n        * {\r\n            margin: 0;\r\n            padding: 0;\r\n            box-sizing: border-box;\r\n        }\r\n\r\n        body {\r\n            background: #eef2f8;\r\n            font-family: 'Segoe UI', Roboto, 'Helvetica Neue', sans-serif;\r\n            padding: 24px 20px;\r\n            color: #1a2c3e;\r\n        }\r\n\r\n        .container {\r\n            max-width: 1400px;\r\n            margin: 0 auto;\r\n            background: white;\r\n            border-radius: 32px;\r\n            box-shadow: 0 12px 30px rgba(0, 0, 0, 0.08);\r\n            overflow: hidden;\r\n            padding: 24px 28px 32px 28px;\r\n        }\r\n\r\n        h1 {\r\n            font-size: 1.8rem;\r\n            font-weight: 700;\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: space-between;\r\n            flex-wrap: wrap;\r\n            gap: 12px;\r\n            margin-bottom: 8px;\r\n            color: #0f2b3d;\r\n        }\r\n\r\n        h1 small {\r\n            font-size: 0.8rem;\r\n            font-weight: normal;\r\n            background: #eaf1f9;\r\n            padding: 5px 14px;\r\n            border-radius: 40px;\r\n            color: #2c6e9e;\r\n        }\r\n\r\n        .sub {\r\n            border-left: 4px solid #3b82f6;\r\n            background: #f9fbfe;\r\n            padding: 12px 16px;\r\n            border-radius: 20px;\r\n            margin: 15px 0 24px 0;\r\n            font-size: 0.88rem;\r\n            color: #2c5a7a;\r\n            line-height: 1.4;\r\n        }\r\n\r\n        \/* \u5ba2\u6237\u7ba1\u7406\u680f *\/\r\n        .client-bar {\r\n            background: #f7fafd;\r\n            border-radius: 24px;\r\n            padding: 16px 20px;\r\n            margin-bottom: 28px;\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            align-items: flex-end;\r\n            gap: 18px;\r\n            border: 1px solid #e2edf7;\r\n        }\r\n        .client-field {\r\n            display: flex;\r\n            flex-direction: column;\r\n            gap: 6px;\r\n            min-width: 160px;\r\n        }\r\n        .client-field label {\r\n            font-size: 0.75rem;\r\n            font-weight: 600;\r\n            text-transform: uppercase;\r\n            letter-spacing: 0.5px;\r\n            color: #4f7ea3;\r\n        }\r\n        .client-field input, .client-field select {\r\n            background: white;\r\n            border: 1px solid #cbdde9;\r\n            border-radius: 16px;\r\n            padding: 10px 14px;\r\n            font-size: 0.9rem;\r\n            font-family: inherit;\r\n            transition: 0.2s;\r\n        }\r\n        .client-field input:focus, .client-field select:focus {\r\n            outline: none;\r\n            border-color: #3b82f6;\r\n            box-shadow: 0 0 0 2px rgba(59,130,246,0.2);\r\n        }\r\n        .btn-group {\r\n            display: flex;\r\n            gap: 10px;\r\n            flex-wrap: wrap;\r\n            align-items: center;\r\n            margin-left: auto;\r\n        }\r\n        .btn {\r\n            background: white;\r\n            border: 1px solid #cbdde9;\r\n            padding: 8px 18px;\r\n            border-radius: 40px;\r\n            font-weight: 500;\r\n            font-size: 0.8rem;\r\n            cursor: pointer;\r\n            transition: all 0.2s;\r\n            color: #1f4662;\r\n            display: inline-flex;\r\n            align-items: center;\r\n            gap: 6px;\r\n        }\r\n        .btn-primary {\r\n            background: #1e6f9f;\r\n            border-color: #1e6f9f;\r\n            color: white;\r\n            box-shadow: 0 2px 5px rgba(30,111,159,0.2);\r\n        }\r\n        .btn-primary:hover {\r\n            background: #0f5a87;\r\n            transform: translateY(-1px);\r\n        }\r\n        .btn-outline {\r\n            border-color: #b9cfe6;\r\n        }\r\n        .btn-outline:hover {\r\n            background: #eef3fc;\r\n        }\r\n        .btn-danger {\r\n            border-color: #f3c1c1;\r\n            color: #b91c1c;\r\n        }\r\n        .btn-danger:hover {\r\n            background: #fee2e2;\r\n        }\r\n\r\n        \/* \u5de6\u53f3\u6570\u636e\u5361\u7247\u5e03\u5c40 *\/\r\n        .data-row {\r\n            display: flex;\r\n            flex-wrap: wrap;\r\n            gap: 24px;\r\n            margin: 20px 0 28px 0;\r\n        }\r\n        .side-card {\r\n            flex: 1;\r\n            min-width: 260px;\r\n            background: #ffffff;\r\n            border-radius: 28px;\r\n            box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);\r\n            border: 1px solid #e9f0f5;\r\n            padding: 20px 18px;\r\n            transition: all 0.2s;\r\n        }\r\n        .side-card h3 {\r\n            font-size: 1.4rem;\r\n            font-weight: 600;\r\n            margin-bottom: 20px;\r\n            padding-bottom: 10px;\r\n            border-bottom: 2px solid #e4edf5;\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 10px;\r\n        }\r\n        .side-card.left h3 { color: #2c6e9e; }\r\n        .side-card.right h3 { color: #9e6e2c; }\r\n        .force-input-group {\r\n            display: flex;\r\n            flex-direction: column;\r\n            gap: 16px;\r\n        }\r\n        .input-item {\r\n            display: flex;\r\n            align-items: center;\r\n            justify-content: space-between;\r\n            flex-wrap: wrap;\r\n            background: #fafcff;\r\n            padding: 8px 12px;\r\n            border-radius: 20px;\r\n        }\r\n        .input-item label {\r\n            font-weight: 600;\r\n            width: 50px;\r\n            font-size: 1.1rem;\r\n            color: #2b4f6e;\r\n        }\r\n        .input-item input {\r\n            flex: 1;\r\n            min-width: 100px;\r\n            padding: 10px 12px;\r\n            border: 1px solid #d4e2ec;\r\n            border-radius: 24px;\r\n            font-size: 1rem;\r\n            text-align: center;\r\n            background: white;\r\n            font-weight: 500;\r\n        }\r\n        .input-item input:focus {\r\n            border-color: #3b82f6;\r\n            outline: none;\r\n            box-shadow: 0 0 0 2px rgba(59,130,246,0.1);\r\n        }\r\n        .unit {\r\n            font-size: 0.75rem;\r\n            color: #6f8eac;\r\n            margin-left: 8px;\r\n        }\r\n\r\n        \/* \u5206\u6790\u4e0e\u62a5\u544a\u6a21\u5757 *\/\r\n        .analysis-section {\r\n            margin-top: 30px;\r\n            border-top: 2px dashed #d9e6f2;\r\n            padding-top: 28px;\r\n        }\r\n        .section-title {\r\n            font-size: 1.4rem;\r\n            font-weight: 700;\r\n            margin-bottom: 20px;\r\n            display: flex;\r\n            align-items: center;\r\n            gap: 12px;\r\n            flex-wrap: wrap;\r\n            justify-content: space-between;\r\n        }\r\n        .chart-container {\r\n            background: #fefefe;\r\n            border-radius: 24px;\r\n            padding: 16px;\r\n            border: 1px solid #e2edf5;\r\n            margin-bottom: 28px;\r\n        }\r\n        canvas {\r\n            max-height: 350px;\r\n            width: 100%;\r\n        }\r\n        .report-card {\r\n            background: #f5f9fe;\r\n            border-radius: 24px;\r\n            padding: 20px 24px;\r\n            border-left: 6px solid #3b82f6;\r\n            margin-top: 20px;\r\n        }\r\n        .report-text {\r\n            font-size: 1rem;\r\n            line-height: 1.55;\r\n            color: #1e3a5f;\r\n            white-space: pre-wrap;\r\n        }\r\n        .report-actions {\r\n            display: flex;\r\n            justify-content: flex-end;\r\n            gap: 12px;\r\n            margin-top: 20px;\r\n        }\r\n        .footer-note {\r\n            margin-top: 30px;\r\n            font-size: 0.7rem;\r\n            text-align: center;\r\n            color: #7f9bbc;\r\n            border-top: 1px solid #e2edf5;\r\n            padding-top: 20px;\r\n        }\r\n\r\n        @media (max-width: 780px) {\r\n            .container {\r\n                padding: 16px;\r\n            }\r\n            .btn-group {\r\n                margin-left: 0;\r\n                width: 100%;\r\n                justify-content: flex-start;\r\n            }\r\n            .client-bar {\r\n                flex-direction: column;\r\n                align-items: stretch;\r\n            }\r\n        }\r\n    <\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"container\">\r\n    <h1>\r\n        \ud83d\udcca \u80a9\u90e8 I-Y-T \u529b\u91cf\u5206\u6790\u7cfb\u7edf\r\n        <small>\u5355\u5ba2\u6237 \u00b7 \u7cbe\u51c6\u62a5\u544a<\/small>\r\n    <\/h1>\r\n    <div class=\"sub\">\r\n        \ud83d\udd39 \u57fa\u4e8e\u4fef\u5367\u4f4d\u6d4b\u529b\u53f0\u6d4b\u8bd5\u6d41\u7a0b\uff1a\u975e\u6d4b\u8bd5\u4fa7\u624b\u7f6e\u4e8e\u80cc\u90e8\uff0c3-5\u79d2\u63a8\u81f3\u6700\u5927\u529b\u91cf\uff0c\u987a\u5e8f I \u2192 Y \u2192 T\u3002<br>\r\n        \ud83d\udd39 \u8bb0\u5f55\u5de6\u53f3\u4e24\u4fa7\u5206\u522b\u5728I\u3001Y\u3001T\u4f4d\u7f6e\u7684\u6700\u5927\u529b\u91cf\u503c (kg)\uff0c\u7cfb\u7edf\u81ea\u52a8\u751f\u6210\u5bf9\u6bd4\u56fe\u8868\u4e0e\u667a\u80fd\u8bc4\u4f30\u62a5\u544a\u3002\r\n    <\/div>\r\n\r\n    <!-- \u5ba2\u6237\u4fe1\u606f & \u7ba1\u7406\u680f -->\r\n    <div class=\"client-bar\">\r\n        <div class=\"client-field\">\r\n            <label>\ud83d\udc64 \u5ba2\u6237\u59d3\u540d \/ ID<\/label>\r\n            <input type=\"text\" id=\"clientName\" placeholder=\"\u4f8b\u5982\uff1a\u5f20\u654f\" value=\"\u674e\u6b63\u6d69\">\r\n        <\/div>\r\n        <div class=\"client-field\">\r\n            <label>\ud83d\udcc5 \u6d4b\u8bd5\u65e5\u671f<\/label>\r\n            <input type=\"date\" id=\"testDate\" value=\"2026-03-21\">\r\n        <\/div>\r\n        <div class=\"client-field\">\r\n            <label>\ud83d\udcc2 \u5207\u6362\u5ba2\u6237<\/label>\r\n            <select id=\"customerSelect\">\r\n                <option value=\"\">-- \u52a0\u8f7d\u5df2\u6709\u5ba2\u6237 --<\/option>\r\n            <\/select>\r\n        <\/div>\r\n        <div class=\"btn-group\">\r\n            <button class=\"btn btn-outline\" id=\"saveCurrentBtn\">\ud83d\udcbe \u4fdd\u5b58\u5f53\u524d\u5ba2\u6237<\/button>\r\n            <button class=\"btn btn-outline\" id=\"newCustomerBtn\">\u2728 \u65b0\u5efa\u5ba2\u6237<\/button>\r\n            <button class=\"btn btn-danger\" id=\"deleteCustomerBtn\">\ud83d\uddd1 \u5220\u9664\u5f53\u524d\u5ba2\u6237<\/button>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u5de6\u53f3\u4fa7\u529b\u91cf\u6570\u636e\u5361\u7247 -->\r\n    <div class=\"data-row\">\r\n        <!-- \u5de6\u4fa7\u5361\u7247 -->\r\n        <div class=\"side-card left\">\r\n            <h3>\ud83e\uddd1\u200d\u2695\ufe0f \u5de6\u4fa7 (\u975e\u4f18\u52bf\/\u6d4b\u8bd5\u4fa7)<\/h3>\r\n            <div class=\"force-input-group\">\r\n                <div class=\"input-item\">\r\n                    <label>I \u4f4d\u7f6e<\/label>\r\n                    <input type=\"number\" id=\"leftI\" step=\"0.1\" value=\"18.5\" placeholder=\"kg\">\r\n                    <span class=\"unit\">kg<\/span>\r\n                <\/div>\r\n                <div class=\"input-item\">\r\n                    <label>Y \u4f4d\u7f6e<\/label>\r\n                    <input type=\"number\" id=\"leftY\" step=\"0.1\" value=\"21.2\" placeholder=\"kg\">\r\n                    <span class=\"unit\">kg<\/span>\r\n                <\/div>\r\n                <div class=\"input-item\">\r\n                    <label>T \u4f4d\u7f6e<\/label>\r\n                    <input type=\"number\" id=\"leftT\" step=\"0.1\" value=\"19.6\" placeholder=\"kg\">\r\n                    <span class=\"unit\">kg<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div style=\"font-size:0.7rem; margin-top:12px; color:#6a8daf;\">\u2728 \u6700\u5927\u63a8\u538b\u529b (kg)<\/div>\r\n        <\/div>\r\n        <!-- \u53f3\u4fa7\u5361\u7247 -->\r\n        <div class=\"side-card right\">\r\n            <h3>\ud83d\udcaa \u53f3\u4fa7 (\u6d4b\u8bd5\u4fa7)<\/h3>\r\n            <div class=\"force-input-group\">\r\n                <div class=\"input-item\">\r\n                    <label>I \u4f4d\u7f6e<\/label>\r\n                    <input type=\"number\" id=\"rightI\" step=\"0.1\" value=\"22.3\" placeholder=\"kg\">\r\n                    <span class=\"unit\">kg<\/span>\r\n                <\/div>\r\n                <div class=\"input-item\">\r\n                    <label>Y \u4f4d\u7f6e<\/label>\r\n                    <input type=\"number\" id=\"rightY\" step=\"0.1\" value=\"24.8\" placeholder=\"kg\">\r\n                    <span class=\"unit\">kg<\/span>\r\n                <\/div>\r\n                <div class=\"input-item\">\r\n                    <label>T \u4f4d\u7f6e<\/label>\r\n                    <input type=\"number\" id=\"rightT\" step=\"0.1\" value=\"23.4\" placeholder=\"kg\">\r\n                    <span class=\"unit\">kg<\/span>\r\n                <\/div>\r\n            <\/div>\r\n            <div style=\"font-size:0.7rem; margin-top:12px; color:#6a8daf;\">\u2728 \u6700\u5927\u63a8\u538b\u529b (kg)<\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <!-- \u6570\u636e\u5206\u6790\u548c\u62a5\u544a\u6a21\u5757 -->\r\n    <div class=\"analysis-section\">\r\n        <div class=\"section-title\">\r\n            <span>\ud83d\udcc8 \u529b\u91cf\u5bf9\u6bd4\u5206\u6790 & \u667a\u80fd\u62a5\u544a<\/span>\r\n            <div>\r\n                <button class=\"btn btn-outline\" id=\"exportReportBtn\">\ud83d\udcc4 \u5bfc\u51fa\u62a5\u544a (\u6587\u672c)<\/button>\r\n                <button class=\"btn btn-outline\" id=\"exportDataBtn\">\ud83d\udcce \u5bfc\u51fa\u6570\u636e CSV<\/button>\r\n            <\/div>\r\n        <\/div>\r\n        <div class=\"chart-container\">\r\n            <canvas id=\"strengthChart\" width=\"800\" height=\"350\" style=\"max-height: 350px; width:100%\"><\/canvas>\r\n        <\/div>\r\n        <div class=\"report-card\" id=\"reportCard\">\r\n            <div class=\"report-text\" id=\"dynamicReport\">\r\n                <!-- \u52a8\u6001\u751f\u6210\u5206\u6790\u62a5\u544a -->\r\n                \u6b63\u5728\u5206\u6790\u5de6\u53f3\u4fa7\u529b\u91cf\u6570\u636e...\r\n            <\/div>\r\n            <div class=\"report-actions\">\r\n                <button class=\"btn btn-outline\" id=\"refreshReportBtn\">\ud83d\udd04 \u5237\u65b0\u62a5\u544a<\/button>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"footer-note\">\r\n        \u26a1 \u6d4b\u8bd5\u89c4\u8303\uff1a\u4fef\u5367\u4f4d\uff0c\u975e\u6d4b\u8bd5\u624b\u7f6e\u4e8e\u80cc\u90e8\uff0c3-5\u79d2\u5185\u9010\u6e10\u63a8\u81f3\u6700\u5927\u529b\u91cf\uff0c\u8bb0\u5f55\u5cf0\u503c\u3002\u5de6\u53f3\u4fa7\u5206\u5f00\u6d4b\u8bd5\uff0c\u987a\u5e8f I \u2192 Y \u2192 T\uff0c\u4e2d\u95f4\u4f11\u606f20-30\u79d2\u3002\r\n        <br> \ud83d\udccc \u6570\u636e\u4fdd\u5b58\u5728\u6d4f\u89c8\u5668\u672c\u5730\uff0c\u53ef\u968f\u65f6\u5207\u6362\u5ba2\u6237\u5e76\u751f\u6210\u5bf9\u6bd4\u62a5\u544a\u3002\r\n    <\/div>\r\n<\/div>\r\n\r\n<script>\r\n    \/\/ ---------- \u5b58\u50a8KEY ----------\r\n    const STORAGE_KEY = 'ITY_SingleClient_System';\r\n\r\n    \/\/ ---------- \u6570\u636e\u7ed3\u6784 ----------\r\n    \/\/ \u6240\u6709\u5ba2\u6237\u5217\u8868: [{ id, name, date, left: {I,Y,T}, right: {I,Y,T} }]\r\n    let customers = [];\r\n    let currentCustomerId = null;\r\n\r\n    \/\/ Chart\u5b9e\u4f8b\r\n    let strengthChart = null;\r\n\r\n    \/\/ DOM \u5143\u7d20\r\n    const clientNameInput = document.getElementById('clientName');\r\n    const testDateInput = document.getElementById('testDate');\r\n    const customerSelect = document.getElementById('customerSelect');\r\n    const leftI = document.getElementById('leftI');\r\n    const leftY = document.getElementById('leftY');\r\n    const leftT = document.getElementById('leftT');\r\n    const rightI = document.getElementById('rightI');\r\n    const rightY = document.getElementById('rightY');\r\n    const rightT = document.getElementById('rightT');\r\n\r\n    \/\/ \u8f85\u52a9\u51fd\u6570\uff1a\u4fdd\u5b58\u6574\u4e2acustomers\u5230localStorage\r\n    function saveCustomersToLocal() {\r\n        localStorage.setItem(STORAGE_KEY, JSON.stringify(customers));\r\n    }\r\n\r\n    \/\/ \u52a0\u8f7d\u521d\u59cb\u6570\u636e\r\n    function loadCustomersFromLocal() {\r\n        const stored = localStorage.getItem(STORAGE_KEY);\r\n        if (stored) {\r\n            try {\r\n                customers = JSON.parse(stored);\r\n                if (!Array.isArray(customers)) customers = [];\r\n                return;\r\n            } catch(e) { console.warn(e); }\r\n        }\r\n        \/\/ \u9ed8\u8ba4\u6f14\u793a\u5ba2\u6237\r\n        customers = [\r\n            {\r\n                id: 'c1',\r\n                name: '\u674e\u6b63\u6d69',\r\n                date: '2026-03-21',\r\n                left: { I: 18.5, Y: 21.2, T: 19.6 },\r\n                right: { I: 22.3, Y: 24.8, T: 23.4 }\r\n            },\r\n            {\r\n                id: 'c2',\r\n                name: '\u738b\u96c5\u5a77',\r\n                date: '2026-03-20',\r\n                left: { I: 16.2, Y: 18.9, T: 17.1 },\r\n                right: { I: 17.8, Y: 20.3, T: 18.5 }\r\n            }\r\n        ];\r\n        saveCustomersToLocal();\r\n    }\r\n\r\n    \/\/ \u5237\u65b0\u4e0b\u62c9\u9009\u62e9\u5217\u8868\r\n    function updateCustomerSelect() {\r\n        customerSelect.innerHTML = '<option value=\"\">-- \u5207\u6362\u5ba2\u6237 --<\/option>';\r\n        customers.forEach(cust => {\r\n            const option = document.createElement('option');\r\n            option.value = cust.id;\r\n            option.textContent = `${cust.name} (${cust.date})`;\r\n            if (currentCustomerId === cust.id) option.selected = true;\r\n            customerSelect.appendChild(option);\r\n        });\r\n    }\r\n\r\n    \/\/ \u6839\u636e\u5f53\u524dcurrentCustomerId\uff0c\u5c06\u6570\u636e\u663e\u793a\u5230UI\r\n    function loadCurrentCustomerToUI() {\r\n        if (!currentCustomerId) {\r\n            \/\/ \u5982\u679c\u6ca1\u6709\u5f53\u524d\u5ba2\u6237\uff0c\u5c1d\u8bd5\u9009\u62e9\u7b2c\u4e00\u4e2a\r\n            if (customers.length > 0) {\r\n                currentCustomerId = customers[0].id;\r\n            } else {\r\n                \/\/ \u5b8c\u5168\u7a7a\u767d\r\n                clientNameInput.value = '';\r\n                testDateInput.value = new Date().toISOString().slice(0,10);\r\n                leftI.value = ''; leftY.value = ''; leftT.value = '';\r\n                rightI.value = ''; rightY.value = ''; rightT.value = '';\r\n                return;\r\n            }\r\n        }\r\n        const customer = customers.find(c => c.id === currentCustomerId);\r\n        if (!customer) {\r\n            if (customers.length) currentCustomerId = customers[0].id;\r\n            else return;\r\n            loadCurrentCustomerToUI();\r\n            return;\r\n        }\r\n        clientNameInput.value = customer.name || '';\r\n        testDateInput.value = customer.date || '';\r\n        leftI.value = customer.left?.I !== undefined ? customer.left.I : '';\r\n        leftY.value = customer.left?.Y !== undefined ? customer.left.Y : '';\r\n        leftT.value = customer.left?.T !== undefined ? customer.left.T : '';\r\n        rightI.value = customer.right?.I !== undefined ? customer.right.I : '';\r\n        rightY.value = customer.right?.Y !== undefined ? customer.right.Y : '';\r\n        rightT.value = customer.right?.T !== undefined ? customer.right.T : '';\r\n    }\r\n\r\n    \/\/ \u5c06\u5f53\u524dUI\u6570\u636e\u4fdd\u5b58\u5230 currentCustomer \u5bf9\u8c61 (\u4e0d\u4fdd\u5b58\u5230localstorage\uff0c\u9700\u663e\u5f0f\u8c03\u7528\u4fdd\u5b58)\r\n    function syncUIToCurrentCustomer() {\r\n        if (!currentCustomerId) return false;\r\n        const index = customers.findIndex(c => c.id === currentCustomerId);\r\n        if (index === -1) return false;\r\n        const name = clientNameInput.value.trim();\r\n        if (name === \"\") {\r\n            alert(\"\u5ba2\u6237\u59d3\u540d\u4e0d\u80fd\u4e3a\u7a7a\uff0c\u8bf7\u586b\u5199\u540e\u518d\u4fdd\u5b58\");\r\n            return false;\r\n        }\r\n        const leftVal = {\r\n            I: parseFloat(leftI.value) || 0,\r\n            Y: parseFloat(leftY.value) || 0,\r\n            T: parseFloat(leftT.value) || 0\r\n        };\r\n        const rightVal = {\r\n            I: parseFloat(rightI.value) || 0,\r\n            Y: parseFloat(rightY.value) || 0,\r\n            T: parseFloat(rightT.value) || 0\r\n        };\r\n        customers[index] = {\r\n            ...customers[index],\r\n            name: name,\r\n            date: testDateInput.value,\r\n            left: leftVal,\r\n            right: rightVal\r\n        };\r\n        return true;\r\n    }\r\n\r\n    \/\/ \u4fdd\u5b58\u5f53\u524d\u5ba2\u6237\u6570\u636e (UI -> \u5185\u5b58 -> localStorage)\r\n    function saveCurrentCustomer() {\r\n        if (!currentCustomerId) {\r\n            \/\/ \u5982\u679c\u6ca1\u6709\u5f53\u524d\u5ba2\u6237\uff0c\u521b\u5efa\u4e00\u4e2a\u65b0\u5ba2\u6237\r\n            createNewCustomerAndSetCurrent();\r\n            return;\r\n        }\r\n        const success = syncUIToCurrentCustomer();\r\n        if (success) {\r\n            saveCustomersToLocal();\r\n            updateCustomerSelect();\r\n            updateChartAndReport();   \/\/ \u6570\u636e\u66f4\u65b0\u540e\u5237\u65b0\u5206\u6790\u548c\u56fe\u8868\r\n            alert(\"\u5ba2\u6237\u6570\u636e\u5df2\u4fdd\u5b58\");\r\n        }\r\n    }\r\n\r\n    \/\/ \u65b0\u5efa\u5ba2\u6237\r\n    function createNewCustomerAndSetCurrent() {\r\n        const newId = 'cust_' + Date.now() + '_' + Math.random().toString(36).substr(2, 6);\r\n        const defaultName = \"\u65b0\u5ba2\u6237\";\r\n        const today = new Date().toISOString().slice(0,10);\r\n        const newCustomer = {\r\n            id: newId,\r\n            name: defaultName,\r\n            date: today,\r\n            left: { I: 0, Y: 0, T: 0 },\r\n            right: { I: 0, Y: 0, T: 0 }\r\n        };\r\n        customers.push(newCustomer);\r\n        currentCustomerId = newId;\r\n        saveCustomersToLocal();\r\n        \/\/ \u6e05\u7a7aUI\u5e76\u663e\u793a\u9ed8\u8ba4\r\n        clientNameInput.value = defaultName;\r\n        testDateInput.value = today;\r\n        leftI.value = ''; leftY.value = ''; leftT.value = '';\r\n        rightI.value = ''; rightY.value = ''; rightT.value = '';\r\n        updateCustomerSelect();\r\n        updateChartAndReport();\r\n        alert(\"\u5df2\u521b\u5efa\u65b0\u5ba2\u6237\uff0c\u8bf7\u586b\u5199\u6d4b\u8bd5\u6570\u636e\u540e\u70b9\u51fb\u4fdd\u5b58\");\r\n    }\r\n\r\n    \/\/ \u5220\u9664\u5f53\u524d\u5ba2\u6237\r\n    function deleteCurrentCustomer() {\r\n        if (!currentCustomerId) return;\r\n        if (customers.length === 1) {\r\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\")){\r\n                customers = [];\r\n                saveCustomersToLocal();\r\n                createNewCustomerAndSetCurrent();\r\n                updateCustomerSelect();\r\n                updateChartAndReport();\r\n            }\r\n            return;\r\n        }\r\n        if(confirm(`\u786e\u5b9a\u8981\u5220\u9664\u5ba2\u6237\u201c${clientNameInput.value}\u201d\u7684\u6240\u6709\u6d4b\u8bd5\u8bb0\u5f55\u5417\uff1f`)){\r\n            customers = customers.filter(c => c.id !== currentCustomerId);\r\n            saveCustomersToLocal();\r\n            \/\/ \u91cd\u65b0\u8bbe\u7f6e\u5f53\u524d\u5ba2\u6237\u4e3a\u7b2c\u4e00\u4e2a\r\n            currentCustomerId = customers.length ? customers[0].id : null;\r\n            if(!currentCustomerId && customers.length === 0){\r\n                createNewCustomerAndSetCurrent();\r\n            } else {\r\n                loadCurrentCustomerToUI();\r\n                updateCustomerSelect();\r\n                updateChartAndReport();\r\n            }\r\n        }\r\n    }\r\n\r\n    \/\/ \u5207\u6362\u5ba2\u6237\r\n    function switchCustomer(customerId) {\r\n        const target = customers.find(c => c.id === customerId);\r\n        if (target) {\r\n            currentCustomerId = target.id;\r\n            loadCurrentCustomerToUI();\r\n            updateCustomerSelect();\r\n            updateChartAndReport();\r\n        }\r\n    }\r\n\r\n    \/\/ ---------- \u56fe\u8868 & \u62a5\u544a\u751f\u6210\u6a21\u5757 ----------\r\n    function getCurrentForceData() {\r\n        \/\/ \u4eceUI\u5b9e\u65f6\u83b7\u53d6\u529b\u91cf\u503c (\u4fdd\u8bc1\u6700\u65b0)\r\n        const left = {\r\n            I: parseFloat(leftI.value) || 0,\r\n            Y: parseFloat(leftY.value) || 0,\r\n            T: parseFloat(leftT.value) || 0\r\n        };\r\n        const right = {\r\n            I: parseFloat(rightI.value) || 0,\r\n            Y: parseFloat(rightY.value) || 0,\r\n            T: parseFloat(rightT.value) || 0\r\n        };\r\n        return { left, right };\r\n    }\r\n\r\n    \/\/ \u66f4\u65b0\u56fe\u8868\r\n    function renderChart(leftData, rightData) {\r\n        const ctx = document.getElementById('strengthChart').getContext('2d');\r\n        const positions = ['I \u4f4d\u7f6e', 'Y \u4f4d\u7f6e', 'T \u4f4d\u7f6e'];\r\n        if (strengthChart) {\r\n            strengthChart.destroy();\r\n        }\r\n        strengthChart = new Chart(ctx, {\r\n            type: 'bar',\r\n            data: {\r\n                labels: positions,\r\n                datasets: [\r\n                    {\r\n                        label: '\u5de6\u4fa7\u529b\u91cf (kg)',\r\n                        data: [leftData.I, leftData.Y, leftData.T],\r\n                        backgroundColor: 'rgba(44, 110, 158, 0.7)',\r\n                        borderRadius: 8,\r\n                        borderSkipped: false,\r\n                    },\r\n                    {\r\n                        label: '\u53f3\u4fa7\u529b\u91cf (kg)',\r\n                        data: [rightData.I, rightData.Y, rightData.T],\r\n                        backgroundColor: 'rgba(210, 140, 60, 0.7)',\r\n                        borderRadius: 8,\r\n                        borderSkipped: false,\r\n                    }\r\n                ]\r\n            },\r\n            options: {\r\n                responsive: true,\r\n                maintainAspectRatio: true,\r\n                plugins: {\r\n                    tooltip: { callbacks: { label: (ctx) => `${ctx.dataset.label}: ${ctx.raw} kg` } },\r\n                    legend: { position: 'top' },\r\n                    title: { display: true, text: '\u5de6\u53f3\u4fa7 I\/Y\/T \u6700\u5927\u529b\u91cf\u5bf9\u6bd4', font: { size: 14 } }\r\n                },\r\n                scales: {\r\n                    y: { title: { display: true, text: '\u529b\u91cf (kg)', font: { weight: 'bold' } }, beginAtZero: true }\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    \/\/ \u667a\u80fd\u62a5\u544a\u751f\u6210 (\u57fa\u4e8e\u5de6\u53f3\u4fa7\u529b\u91cf\u5bf9\u6bd4\u548c\u529f\u80fd\u5efa\u8bae)\r\n    function generateReport(left, right) {\r\n        const positions = ['I', 'Y', 'T'];\r\n        let comparisonText = \"\";\r\n        let totalLeft = left.I + left.Y + left.T;\r\n        let totalRight = right.I + right.Y + right.T;\r\n        let asymmetryWarnings = [];\r\n        \r\n        for (let pos of positions) {\r\n            let lVal = left[pos];\r\n            let rVal = right[pos];\r\n            let diff = Math.abs(lVal - rVal);\r\n            let percentDiff = (lVal + rVal) > 0 ? (diff \/ ((lVal + rVal)\/2) * 100) : 0;\r\n            let stronger = lVal > rVal ? \"\u5de6\u4fa7\" : (rVal > lVal ? \"\u53f3\u4fa7\" : \"\u53cc\u4fa7\u76f8\u7b49\");\r\n            if (diff > 0.5 && percentDiff > 10) {\r\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`);\r\n            }\r\n            comparisonText += ` \u25b8 ${pos}\u4f4d\uff1a\u5de6\u4fa7 ${lVal.toFixed(1)} kg\uff0c\u53f3\u4fa7 ${rVal.toFixed(1)} kg\uff1b`;\r\n        }\r\n        \r\n        let totalDiff = Math.abs(totalLeft - totalRight);\r\n        let totalPercent = (totalLeft+totalRight)>0 ? (totalDiff\/((totalLeft+totalRight)\/2)*100) : 0;\r\n        let summary = \"\";\r\n        if (totalLeft > totalRight) {\r\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`;\r\n        } else if (totalRight > totalLeft) {\r\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`;\r\n        } else {\r\n            summary = `\u5de6\u53f3\u4fa7\u603b\u529b\u91cf\u57fa\u672c\u5747\u8861\uff0c\u6574\u4f53\u5bf9\u79f0\u6027\u826f\u597d\u3002`;\r\n        }\r\n        \r\n        let advice = \"\";\r\n        if (asymmetryWarnings.length > 0) {\r\n            advice = `\u26a0\ufe0f \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`;\r\n        } else {\r\n            advice = `\u2705 \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`;\r\n        }\r\n        \r\n        const clientName = clientNameInput.value || \"\u5ba2\u6237\";\r\n        const testDate = testDateInput.value || \"\u672a\u77e5\u65e5\u671f\";\r\n        const report = `\r\n\ud83d\udccb \u6d4b\u8bd5\u62a5\u544a \u2014\u2014 ${clientName} (${testDate})\r\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\r\n\ud83d\udd39 \u529b\u91cf\u6570\u636e\u603b\u89c8\uff1a\r\n${comparisonText}\r\n\ud83d\udd39 \u603b\u529b\u91cf\u5bf9\u6bd4\uff1a\u5de6\u4fa7\u603b\u529b\u91cf ${totalLeft.toFixed(1)} kg\uff0c\u53f3\u4fa7\u603b\u529b\u91cf ${totalRight.toFixed(1)} kg\u3002\r\n\ud83d\udd39 ${summary}\r\n\ud83d\udd39 \u4e13\u9879\u8bc4\u4f30\uff1a${advice}\r\n\ud83d\udd39 \u4e34\u5e8a\u5efa\u8bae\uff1a\u4fef\u5367\u4f4d I\/Y\/T \u662f\u80a9\u80db\u540e\u4fa7\u94fe\u91cd\u8981\u6307\u6807\uff0c\u5efa\u8bae\u6bcf\u6708\u590d\u6d4b\uff0c\u529b\u91cf\u63d0\u5347\u76ee\u6807\u5dee\u503c<5%\u3002 \r\n        `;\r\n        return report;\r\n    }\r\n\r\n    \/\/ \u5237\u65b0\u56fe\u8868\u548c\u62a5\u544a\u6a21\u5757\r\n    function updateChartAndReport() {\r\n        const { left, right } = getCurrentForceData();\r\n        renderChart(left, right);\r\n        const reportText = generateReport(left, right);\r\n        const reportDiv = document.getElementById('dynamicReport');\r\n        if (reportDiv) {\r\n            reportDiv.innerText = reportText;\r\n            reportDiv.style.whiteSpace = \"pre-wrap\";\r\n        }\r\n    }\r\n\r\n    \/\/ \u5bfc\u51fa\u62a5\u544a\u4e3atxt\r\n    function exportReportAsText() {\r\n        const { left, right } = getCurrentForceData();\r\n        const report = generateReport(left, right);\r\n        const blob = new Blob([report], { type: 'text\/plain;charset=utf-8' });\r\n        const link = document.createElement('a');\r\n        const url = URL.createObjectURL(blob);\r\n        link.href = url;\r\n        link.download = `\u80a9\u90e8\u6d4b\u8bd5\u62a5\u544a_${clientNameInput.value || \"\u5ba2\u6237\"}_${testDateInput.value}.txt`;\r\n        document.body.appendChild(link);\r\n        link.click();\r\n        document.body.removeChild(link);\r\n        URL.revokeObjectURL(url);\r\n    }\r\n\r\n    \/\/ \u5bfc\u51fa\u5f53\u524d\u5ba2\u6237\u5b8c\u6574\u6570\u636eCSV (\u5305\u62ec\u5de6\u53f3\u4fa7\u529b\u91cf\u8be6\u7ec6)\r\n    function exportDataCSV() {\r\n        const { left, right } = getCurrentForceData();\r\n        const name = clientNameInput.value || \"\u672a\u547d\u540d\";\r\n        const date = testDateInput.value || \"\";\r\n        const rows = [\r\n            [\"\u5ba2\u6237\", \"\u6d4b\u8bd5\u65e5\u671f\", \"\u4fa7\u522b\", \"\u6d4b\u8bd5\u4f4d\u7f6e\", \"\u6700\u5927\u529b\u91cf(kg)\"],\r\n            [name, date, \"\u5de6\u4fa7\", \"I\", left.I],\r\n            [name, date, \"\u5de6\u4fa7\", \"Y\", left.Y],\r\n            [name, date, \"\u5de6\u4fa7\", \"T\", left.T],\r\n            [name, date, \"\u53f3\u4fa7\", \"I\", right.I],\r\n            [name, date, \"\u53f3\u4fa7\", \"Y\", right.Y],\r\n            [name, date, \"\u53f3\u4fa7\", \"T\", right.T],\r\n        ];\r\n        const csvContent = rows.map(row => row.map(cell => `\"${String(cell).replace(\/\"\/g, '\"\"')}\"`).join(\",\")).join(\"\\n\");\r\n        const blob = new Blob([\"\\uFEFF\" + csvContent], { type: \"text\/csv;charset=utf-8;\" });\r\n        const link = document.createElement(\"a\");\r\n        const url = URL.createObjectURL(blob);\r\n        link.href = url;\r\n        link.download = `\u80a9\u90e8\u529b\u91cf\u6570\u636e_${name}_${date}.csv`;\r\n        document.body.appendChild(link);\r\n        link.click();\r\n        document.body.removeChild(link);\r\n        URL.revokeObjectURL(url);\r\n    }\r\n\r\n    \/\/ \u76d1\u542c\u8f93\u5165\u53d8\u5316\u65f6\u5b9e\u65f6\u66f4\u65b0\u56fe\u8868\u548c\u62a5\u544a (\u8ba9\u62a5\u544a\u52a8\u6001)\r\n    function bindInputEvents() {\r\n        const inputs = [leftI, leftY, leftT, rightI, rightY, rightT, clientNameInput, testDateInput];\r\n        inputs.forEach(inp => {\r\n            inp.addEventListener('input', () => {\r\n                updateChartAndReport();\r\n            });\r\n            inp.addEventListener('change', () => {\r\n                updateChartAndReport();\r\n            });\r\n        });\r\n    }\r\n\r\n    \/\/ \u521d\u59cb\u5316\u4e8b\u4ef6\u7ed1\u5b9a\r\n    function bindButtons() {\r\n        document.getElementById('saveCurrentBtn').addEventListener('click', saveCurrentCustomer);\r\n        document.getElementById('newCustomerBtn').addEventListener('click', createNewCustomerAndSetCurrent);\r\n        document.getElementById('deleteCustomerBtn').addEventListener('click', deleteCurrentCustomer);\r\n        document.getElementById('exportReportBtn').addEventListener('click', exportReportAsText);\r\n        document.getElementById('exportDataBtn').addEventListener('click', exportDataCSV);\r\n        document.getElementById('refreshReportBtn').addEventListener('click', () => updateChartAndReport());\r\n        customerSelect.addEventListener('change', (e) => {\r\n            if (e.target.value) switchCustomer(e.target.value);\r\n        });\r\n    }\r\n\r\n    \/\/ \u542f\u52a8\u5e94\u7528\r\n    function init() {\r\n        loadCustomersFromLocal();\r\n        if (customers.length > 0) {\r\n            currentCustomerId = customers[0].id;\r\n        } else {\r\n            createNewCustomerAndSetCurrent();\r\n        }\r\n        loadCurrentCustomerToUI();\r\n        updateCustomerSelect();\r\n        bindInputEvents();\r\n        bindButtons();\r\n        updateChartAndReport();\r\n    }\r\n    init();\r\n<\/script>\r\n<\/body>\r\n<\/html>\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"],"blocksy_meta":[],"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":5,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/2018\/revisions"}],"predecessor-version":[{"id":2023,"href":"https:\/\/www.funpt.cn\/index.php?rest_route=\/wp\/v2\/pages\/2018\/revisions\/2023"}],"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}]}}