chenyc
2025-08-01 24ef032c4ef5dad3a4f4450810f054f8012bb93b
患者检验检查增加
4个文件已修改
3个文件已添加
1252 ■■■■■ 已修改文件
package-lock.json 432 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/listIoc.png 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/xueye.png 补丁 | 查看 | 原始文档 | blame | 历史
src/views/home/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/report/components/DateRangePicker.vue 195 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/report/index.vue 325 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/report/item/index.vue 298 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package-lock.json
@@ -52,10 +52,18 @@
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-string-parser": {
      "version": "7.27.1",
      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@babel/helper-validator-identifier": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
      "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==",
      "version": "7.27.1",
      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
      "engines": {
        "node": ">=6.9.0"
      }
@@ -138,14 +146,29 @@
      }
    },
    "node_modules/@babel/parser": {
      "version": "7.19.0",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz",
      "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw==",
      "version": "7.28.0",
      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz",
      "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
      "dependencies": {
        "@babel/types": "^7.28.0"
      },
      "bin": {
        "parser": "bin/babel-parser.js"
      },
      "engines": {
        "node": ">=6.0.0"
      }
    },
    "node_modules/@babel/types": {
      "version": "7.28.2",
      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz",
      "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
      "dependencies": {
        "@babel/helper-string-parser": "^7.27.1",
        "@babel/helper-validator-identifier": "^7.27.1"
      },
      "engines": {
        "node": ">=6.9.0"
      }
    },
    "node_modules/@csstools/selector-specificity": {
@@ -724,49 +747,49 @@
      }
    },
    "node_modules/@vue/compiler-core": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.39.tgz",
      "integrity": "sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
      "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
      "dependencies": {
        "@babel/parser": "^7.16.4",
        "@vue/shared": "3.2.39",
        "@babel/parser": "^7.28.0",
        "@vue/shared": "3.5.18",
        "entities": "^4.5.0",
        "estree-walker": "^2.0.2",
        "source-map": "^0.6.1"
        "source-map-js": "^1.2.1"
      }
    },
    "node_modules/@vue/compiler-dom": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.39.tgz",
      "integrity": "sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
      "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
      "dependencies": {
        "@vue/compiler-core": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-core": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "node_modules/@vue/compiler-sfc": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.39.tgz",
      "integrity": "sha512-fqAQgFs1/BxTUZkd0Vakn3teKUt//J3c420BgnYgEOoVdTwYpBTSXCMJ88GOBCylmUBbtquGPli9tVs7LzsWIA==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
      "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
      "dependencies": {
        "@babel/parser": "^7.16.4",
        "@vue/compiler-core": "3.2.39",
        "@vue/compiler-dom": "3.2.39",
        "@vue/compiler-ssr": "3.2.39",
        "@vue/reactivity-transform": "3.2.39",
        "@vue/shared": "3.2.39",
        "@babel/parser": "^7.28.0",
        "@vue/compiler-core": "3.5.18",
        "@vue/compiler-dom": "3.5.18",
        "@vue/compiler-ssr": "3.5.18",
        "@vue/shared": "3.5.18",
        "estree-walker": "^2.0.2",
        "magic-string": "^0.25.7",
        "postcss": "^8.1.10",
        "source-map": "^0.6.1"
        "magic-string": "^0.30.17",
        "postcss": "^8.5.6",
        "source-map-js": "^1.2.1"
      }
    },
    "node_modules/@vue/compiler-ssr": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.39.tgz",
      "integrity": "sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
      "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
      "dependencies": {
        "@vue/compiler-dom": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-dom": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "node_modules/@vue/devtools-api": {
@@ -775,60 +798,49 @@
      "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ=="
    },
    "node_modules/@vue/reactivity": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.39.tgz",
      "integrity": "sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz",
      "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
      "dependencies": {
        "@vue/shared": "3.2.39"
      }
    },
    "node_modules/@vue/reactivity-transform": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.39.tgz",
      "integrity": "sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==",
      "dependencies": {
        "@babel/parser": "^7.16.4",
        "@vue/compiler-core": "3.2.39",
        "@vue/shared": "3.2.39",
        "estree-walker": "^2.0.2",
        "magic-string": "^0.25.7"
        "@vue/shared": "3.5.18"
      }
    },
    "node_modules/@vue/runtime-core": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.39.tgz",
      "integrity": "sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
      "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
      "dependencies": {
        "@vue/reactivity": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/reactivity": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "node_modules/@vue/runtime-dom": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.39.tgz",
      "integrity": "sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
      "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
      "dependencies": {
        "@vue/runtime-core": "3.2.39",
        "@vue/shared": "3.2.39",
        "csstype": "^2.6.8"
        "@vue/reactivity": "3.5.18",
        "@vue/runtime-core": "3.5.18",
        "@vue/shared": "3.5.18",
        "csstype": "^3.1.3"
      }
    },
    "node_modules/@vue/server-renderer": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.39.tgz",
      "integrity": "sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
      "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
      "dependencies": {
        "@vue/compiler-ssr": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-ssr": "3.5.18",
        "@vue/shared": "3.5.18"
      },
      "peerDependencies": {
        "vue": "3.2.39"
        "vue": "3.5.18"
      }
    },
    "node_modules/@vue/shared": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.39.tgz",
      "integrity": "sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw=="
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz",
      "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA=="
    },
    "node_modules/@webassemblyjs/ast": {
      "version": "1.11.1",
@@ -1645,9 +1657,9 @@
      }
    },
    "node_modules/csstype": {
      "version": "2.6.20",
      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
      "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
    },
    "node_modules/dashdash": {
      "version": "1.14.1",
@@ -1869,10 +1881,9 @@
      }
    },
    "node_modules/entities": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
      "dev": true,
      "version": "4.5.0",
      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
      "engines": {
        "node": ">=0.12"
      },
@@ -3868,12 +3879,17 @@
      }
    },
    "node_modules/magic-string": {
      "version": "0.25.9",
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
      "version": "0.30.17",
      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
      "dependencies": {
        "sourcemap-codec": "^1.4.8"
        "@jridgewell/sourcemap-codec": "^1.5.0"
      }
    },
    "node_modules/magic-string/node_modules/@jridgewell/sourcemap-codec": {
      "version": "1.5.4",
      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
      "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="
    },
    "node_modules/make-fetch-happen": {
      "version": "9.1.0",
@@ -4162,9 +4178,9 @@
      "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA=="
    },
    "node_modules/nanoid": {
      "version": "3.3.8",
      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz",
      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
      "version": "3.3.11",
      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
      "funding": [
        {
          "type": "github",
@@ -4672,9 +4688,9 @@
      }
    },
    "node_modules/postcss": {
      "version": "8.5.3",
      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
      "version": "8.5.6",
      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
      "funding": [
        {
          "type": "opencollective",
@@ -4690,7 +4706,7 @@
        }
      ],
      "dependencies": {
        "nanoid": "^3.3.8",
        "nanoid": "^3.3.11",
        "picocolors": "^1.1.1",
        "source-map-js": "^1.2.1"
      },
@@ -5467,6 +5483,7 @@
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
      "peer": true,
      "engines": {
        "node": ">=0.10.0"
      }
@@ -5478,11 +5495,6 @@
      "engines": {
        "node": ">=0.10.0"
      }
    },
    "node_modules/sourcemap-codec": {
      "version": "1.4.8",
      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
    },
    "node_modules/spdx-correct": {
      "version": "3.1.1",
@@ -6354,15 +6366,23 @@
      }
    },
    "node_modules/vue": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.39.tgz",
      "integrity": "sha512-tRkguhRTw9NmIPXhzk21YFBqXHT2t+6C6wPOgQ50fcFVWnPdetmRqbmySRHznrYjX2E47u0cGlKGcxKZJ38R/g==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz",
      "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
      "dependencies": {
        "@vue/compiler-dom": "3.2.39",
        "@vue/compiler-sfc": "3.2.39",
        "@vue/runtime-dom": "3.2.39",
        "@vue/server-renderer": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-dom": "3.5.18",
        "@vue/compiler-sfc": "3.5.18",
        "@vue/runtime-dom": "3.5.18",
        "@vue/server-renderer": "3.5.18",
        "@vue/shared": "3.5.18"
      },
      "peerDependencies": {
        "typescript": "*"
      },
      "peerDependenciesMeta": {
        "typescript": {
          "optional": true
        }
      }
    },
    "node_modules/vue-demi": {
@@ -6843,10 +6863,15 @@
        "@babel/highlight": "^7.18.6"
      }
    },
    "@babel/helper-string-parser": {
      "version": "7.27.1",
      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="
    },
    "@babel/helper-validator-identifier": {
      "version": "7.18.6",
      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz",
      "integrity": "sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g=="
      "version": "7.27.1",
      "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
      "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
    },
    "@babel/highlight": {
      "version": "7.18.6",
@@ -6910,9 +6935,21 @@
      }
    },
    "@babel/parser": {
      "version": "7.19.0",
      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.0.tgz",
      "integrity": "sha512-74bEXKX2h+8rrfQUfsBfuZZHzsEs6Eql4pqy/T4Nn6Y9wNPggQOqD6z6pn5Bl8ZfysKouFZT/UXEH94ummEeQw=="
      "version": "7.28.0",
      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz",
      "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==",
      "requires": {
        "@babel/types": "^7.28.0"
      }
    },
    "@babel/types": {
      "version": "7.28.2",
      "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz",
      "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==",
      "requires": {
        "@babel/helper-string-parser": "^7.27.1",
        "@babel/helper-validator-identifier": "^7.27.1"
      }
    },
    "@csstools/selector-specificity": {
      "version": "2.0.2",
@@ -7330,49 +7367,49 @@
      }
    },
    "@vue/compiler-core": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.39.tgz",
      "integrity": "sha512-mf/36OWXqWn0wsC40nwRRGheR/qoID+lZXbIuLnr4/AngM0ov8Xvv8GHunC0rKRIkh60bTqydlqTeBo49rlbqw==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz",
      "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==",
      "requires": {
        "@babel/parser": "^7.16.4",
        "@vue/shared": "3.2.39",
        "@babel/parser": "^7.28.0",
        "@vue/shared": "3.5.18",
        "entities": "^4.5.0",
        "estree-walker": "^2.0.2",
        "source-map": "^0.6.1"
        "source-map-js": "^1.2.1"
      }
    },
    "@vue/compiler-dom": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.39.tgz",
      "integrity": "sha512-HMFI25Be1C8vLEEv1hgEO1dWwG9QQ8LTTPmCkblVJY/O3OvWx6r1+zsox5mKPMGvqYEZa6l8j+xgOfUspgo7hw==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz",
      "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==",
      "requires": {
        "@vue/compiler-core": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-core": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "@vue/compiler-sfc": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.39.tgz",
      "integrity": "sha512-fqAQgFs1/BxTUZkd0Vakn3teKUt//J3c420BgnYgEOoVdTwYpBTSXCMJ88GOBCylmUBbtquGPli9tVs7LzsWIA==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz",
      "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==",
      "requires": {
        "@babel/parser": "^7.16.4",
        "@vue/compiler-core": "3.2.39",
        "@vue/compiler-dom": "3.2.39",
        "@vue/compiler-ssr": "3.2.39",
        "@vue/reactivity-transform": "3.2.39",
        "@vue/shared": "3.2.39",
        "@babel/parser": "^7.28.0",
        "@vue/compiler-core": "3.5.18",
        "@vue/compiler-dom": "3.5.18",
        "@vue/compiler-ssr": "3.5.18",
        "@vue/shared": "3.5.18",
        "estree-walker": "^2.0.2",
        "magic-string": "^0.25.7",
        "postcss": "^8.1.10",
        "source-map": "^0.6.1"
        "magic-string": "^0.30.17",
        "postcss": "^8.5.6",
        "source-map-js": "^1.2.1"
      }
    },
    "@vue/compiler-ssr": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.39.tgz",
      "integrity": "sha512-EoGCJ6lincKOZGW+0Ky4WOKsSmqL7hp1ZYgen8M7u/mlvvEQUaO9tKKOy7K43M9U2aA3tPv0TuYYQFrEbK2eFQ==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz",
      "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==",
      "requires": {
        "@vue/compiler-dom": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-dom": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "@vue/devtools-api": {
@@ -7381,57 +7418,46 @@
      "integrity": "sha512-OEgAMeQXvCoJ+1x8WyQuVZzFo0wcyCmUR3baRVLmKBo1LmYZWMlRiXlux5jd0fqVJu6PfDbOrZItVqUEzLobeQ=="
    },
    "@vue/reactivity": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.39.tgz",
      "integrity": "sha512-vlaYX2a3qMhIZfrw3Mtfd+BuU+TZmvDrPMa+6lpfzS9k/LnGxkSuf0fhkP0rMGfiOHPtyKoU9OJJJFGm92beVQ==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz",
      "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==",
      "requires": {
        "@vue/shared": "3.2.39"
      }
    },
    "@vue/reactivity-transform": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.39.tgz",
      "integrity": "sha512-HGuWu864zStiWs9wBC6JYOP1E00UjMdDWIG5W+FpUx28hV3uz9ODOKVNm/vdOy/Pvzg8+OcANxAVC85WFBbl3A==",
      "requires": {
        "@babel/parser": "^7.16.4",
        "@vue/compiler-core": "3.2.39",
        "@vue/shared": "3.2.39",
        "estree-walker": "^2.0.2",
        "magic-string": "^0.25.7"
        "@vue/shared": "3.5.18"
      }
    },
    "@vue/runtime-core": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.39.tgz",
      "integrity": "sha512-xKH5XP57JW5JW+8ZG1khBbuLakINTgPuINKL01hStWLTTGFOrM49UfCFXBcFvWmSbci3gmJyLl2EAzCaZWsx8g==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz",
      "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==",
      "requires": {
        "@vue/reactivity": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/reactivity": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "@vue/runtime-dom": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.39.tgz",
      "integrity": "sha512-4G9AEJP+sLhsqf5wXcyKVWQKUhI+iWfy0hWQgea+CpaTD7BR0KdQzvoQdZhwCY6B3oleSyNLkLAQwm0ya/wNoA==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz",
      "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==",
      "requires": {
        "@vue/runtime-core": "3.2.39",
        "@vue/shared": "3.2.39",
        "csstype": "^2.6.8"
        "@vue/reactivity": "3.5.18",
        "@vue/runtime-core": "3.5.18",
        "@vue/shared": "3.5.18",
        "csstype": "^3.1.3"
      }
    },
    "@vue/server-renderer": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.39.tgz",
      "integrity": "sha512-1yn9u2YBQWIgytFMjz4f/t0j43awKytTGVptfd3FtBk76t1pd8mxbek0G/DrnjJhd2V7mSTb5qgnxMYt8Z5iSQ==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz",
      "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==",
      "requires": {
        "@vue/compiler-ssr": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-ssr": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "@vue/shared": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.39.tgz",
      "integrity": "sha512-D3dl2ZB9qE6mTuWPk9RlhDeP1dgNRUKC3NJxji74A4yL8M2MwlhLKUC/49WHjrNzSPug58fWx/yFbaTzGAQSBw=="
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz",
      "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA=="
    },
    "@webassemblyjs/ast": {
      "version": "1.11.1",
@@ -8083,9 +8109,9 @@
      "dev": true
    },
    "csstype": {
      "version": "2.6.20",
      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
      "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
      "version": "3.1.3",
      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
    },
    "dashdash": {
      "version": "1.14.1",
@@ -8256,10 +8282,9 @@
      }
    },
    "entities": {
      "version": "4.4.0",
      "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
      "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==",
      "dev": true
      "version": "4.5.0",
      "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
      "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
    },
    "env-paths": {
      "version": "2.2.1",
@@ -9646,11 +9671,18 @@
      }
    },
    "magic-string": {
      "version": "0.25.9",
      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
      "version": "0.30.17",
      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz",
      "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==",
      "requires": {
        "sourcemap-codec": "^1.4.8"
        "@jridgewell/sourcemap-codec": "^1.5.0"
      },
      "dependencies": {
        "@jridgewell/sourcemap-codec": {
          "version": "1.5.4",
          "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz",
          "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="
        }
      }
    },
    "make-fetch-happen": {
@@ -9861,9 +9893,9 @@
      "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA=="
    },
    "nanoid": {
      "version": "3.3.8",
      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.8.tgz",
      "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w=="
      "version": "3.3.11",
      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
      "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="
    },
    "natural-compare": {
      "version": "1.4.0",
@@ -10220,11 +10252,11 @@
      }
    },
    "postcss": {
      "version": "8.5.3",
      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.3.tgz",
      "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
      "version": "8.5.6",
      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
      "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
      "requires": {
        "nanoid": "^3.3.8",
        "nanoid": "^3.3.11",
        "picocolors": "^1.1.1",
        "source-map-js": "^1.2.1"
      }
@@ -10750,17 +10782,13 @@
    "source-map": {
      "version": "0.6.1",
      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
      "peer": true
    },
    "source-map-js": {
      "version": "1.2.1",
      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
    },
    "sourcemap-codec": {
      "version": "1.4.8",
      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
    },
    "spdx-correct": {
      "version": "3.1.1",
@@ -11418,15 +11446,15 @@
      }
    },
    "vue": {
      "version": "3.2.39",
      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.39.tgz",
      "integrity": "sha512-tRkguhRTw9NmIPXhzk21YFBqXHT2t+6C6wPOgQ50fcFVWnPdetmRqbmySRHznrYjX2E47u0cGlKGcxKZJ38R/g==",
      "version": "3.5.18",
      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz",
      "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==",
      "requires": {
        "@vue/compiler-dom": "3.2.39",
        "@vue/compiler-sfc": "3.2.39",
        "@vue/runtime-dom": "3.2.39",
        "@vue/server-renderer": "3.2.39",
        "@vue/shared": "3.2.39"
        "@vue/compiler-dom": "3.5.18",
        "@vue/compiler-sfc": "3.5.18",
        "@vue/runtime-dom": "3.5.18",
        "@vue/server-renderer": "3.5.18",
        "@vue/shared": "3.5.18"
      }
    },
    "vue-demi": {
src/assets/listIoc.png
src/assets/xueye.png
src/views/home/index.vue
@@ -151,7 +151,7 @@
    }
    const topath=(url:string)=>{
        console.log('sss')
        if (url==='/report'){
        if (url==='/report222'){
            Toast('此功能暂未开通')
        } else {
            router.push(url)
src/views/report/components/DateRangePicker.vue
New file
@@ -0,0 +1,195 @@
<template>
    <van-popup v-model:show="showPopup" position="center" round>
        <div class="popup-content">
            <h3>检查时间</h3>
            <div class="date-range-buttons">
                <van-button :type="typeData === '近三个月' ? 'primary' : 'default'" size="small" @click="selectDateRange('近三个月')">近三个月</van-button>
                <van-button :type="typeData === '近6个月' ? 'primary' : 'default'" size="small" @click="selectDateRange('近6个月')">近6个月</van-button>
                <van-button :type="typeData === '近1年' ? 'primary' : 'default'" size="small" @click="selectDateRange('近1年')">近1年</van-button>
                <van-button :type="typeData === '全部' ? 'primary' : 'default'" size="small" @click="selectDateRange('全部')">全部</van-button>
            </div>
            <div class="date-range-inputs">
                <van-field v-model="startDate" placeholder="请选择开始日期" readonly @click="openDatePicker('start')">
                    <template #button>
                        <van-icon name="arrow-down" />
                    </template>
                </van-field>
                <span>-</span>
                <van-field v-model="endDate" placeholder="请选择结束日期" readonly @click="openDatePicker('end')">
                    <template #button>
                        <van-icon name="arrow-down" />
                    </template>
                </van-field>
            </div>
            <div class="buttons">
                <van-button type="default" block @click="cancel">取消</van-button>
                <van-button type="primary" block @click="confirm">确认</van-button>
            </div>
        </div>
    </van-popup>
    <!-- 使用 DatetimePicker,放在底部弹出的 Popup 中 -->
    <van-popup v-model:show="showDatePopup" position="bottom">
        <van-datetime-picker
            v-model="currentDate"
            type="date"
            :min-date="minDate"
            :max-date="maxDate"
            @confirm="onConfirmDate"
            @cancel="closeDatePicker"
        />
    </van-popup>
</template>
<script setup>
    import { ref, computed, onMounted } from 'vue'
    const props = defineProps({
        modelValue: Boolean,
    })
    const emit = defineEmits(['update:modelValue', 'confirm'])
    // 控制主弹窗的显示/隐藏 (v-model)
    const showPopup = computed({
        get: () => props.modelValue,
        set: value => emit('update:modelValue', value),
    })
    // 日期选择相关的状态
    const startDate = ref('')
    const endDate = ref('')
    const currentDate = ref(new Date())
    const minDate = new Date(2020, 0, 1) // 2020-01-01
    const maxDate = new Date(2050, 11, 31) // 2050-12-31
    // 控制日期选择器弹窗 (DatetimePicker) 的显示/隐藏
    const showDatePopup = ref(false)
    // 记录当前是选择开始日期还是结束日期
    const datePickerType = ref('')
    const typeData=ref('近三个月')
    // 选择预设时间范围
    const selectDateRange = (range) => {
        const now = new Date()
        typeData.value=range
        switch (range) {
            case '近三个月':
                const threeMonthsAgo = new Date(now)
                threeMonthsAgo.setMonth(now.getMonth() - 3)
                startDate.value = formatDate(threeMonthsAgo)
                endDate.value = formatDate(now)
                break
            case '近6个月':
                const sixMonthsAgo = new Date(now)
                sixMonthsAgo.setMonth(now.getMonth() - 6)
                startDate.value = formatDate(sixMonthsAgo)
                endDate.value = formatDate(now)
                break
            case '近1年':
                const oneYearAgo = new Date(now)
                oneYearAgo.setFullYear(now.getFullYear() - 1)
                startDate.value = formatDate(oneYearAgo)
                endDate.value = formatDate(now)
                break
            case '全部':
                startDate.value = ''
                endDate.value = ''
                break
        }
    }
    // 格式化日期为 YYYY-MM-DD
    const formatDate = (date) => {
        const year = date.getFullYear()
        const month = String(date.getMonth() + 1).padStart(2, '0')
        const day = String(date.getDate()).padStart(2, '0')
        return `${year}-${month}-${day}`
    }
    // 打开日期选择器弹窗 (方法名已更改)
    const openDatePicker = (type) => {
        if (typeData.value==='全部'){
            return
        }
        datePickerType.value = type
        // 设置当前选择的日期:如果已有值则用已有值,否则用今天
        if (type === 'start' && startDate.value) {
            currentDate.value = new Date(startDate.value)
        } else if (type === 'end' && endDate.value) {
            currentDate.value = new Date(endDate.value)
        } else {
            currentDate.value = new Date()
        }
        showDatePopup.value = true // 显示日期选择器弹窗
    }
    // 关闭日期选择器弹窗 (方法名已更改)
    const closeDatePicker = () => {
        showDatePopup.value = false
    }
    // 确认选择日期
    const onConfirmDate = (value) => {
        if (datePickerType.value === 'start') {
            startDate.value = formatDate(value)
        } else if (datePickerType.value === 'end') {
            endDate.value = formatDate(value)
        }
        closeDatePicker() // 确认后关闭弹窗
    }
    // 取消主弹窗
    const cancel = () => {
        emit('update:modelValue', false)
    }
    // 确认选择并关闭主弹窗
    const confirm = () => {
        emit('confirm', { startDate: startDate.value, endDate: endDate.value, type: typeData.value })
        emit('update:modelValue', false)
    }
    onMounted(()=>{
        // 初始化为近三个月
        selectDateRange('近三个月')
    })
</script>
<style scoped>
.popup-content {
    padding: 20px;
    text-align: center;
    width: 80vw;
    max-width: 400px;
}
.date-range-buttons {
    margin-bottom: 20px;
    display: flex;
    justify-content: space-between;
}
.date-range-buttons .van-button {
    flex: 1;
    margin: 0 5px;
}
.date-range-inputs {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 20px;
}
.date-range-inputs span {
    margin: 0 10px;
}
.buttons {
    display: flex;
    justify-content: space-between;
    margin-top: 20px;
}
.buttons .van-button {
    width: 48%;
}
</style>
src/views/report/index.vue
@@ -1,94 +1,269 @@
<template>
    <div class="report">
        <van-nav-bar
            title=""
            left-text="返回"
            left-arrow
            @click="fanhui"
        />
        <div class="inputdiv">
            <van-field left-icon="search" class="input" v-model="inputValue" placeholder="模糊匹配项目、日期检索" />
        <div style="border: 1pt solid #707070;">
            <van-nav-bar title="" :left-text="typeName">
                <template #right>
                    <van-button
                        icon="todo-list-o"
                        size="small"
                        plain
                        type="primary"
                        @click="showPopup = true"
                    >筛选</van-button
                    >
                </template>
            </van-nav-bar>
        </div>
        <div class="listdiv">
            <div class="listrow" v-for="x in 6" :key="x">
                <van-row>
                    <div class="info"></div>
                    <van-row class="lable">
                        <van-col span="12">检验值</van-col>
                        <van-col span="12" style="text-align: right;">血常规</van-col>
                    </van-row>
                    <van-row class="lable">
                        <van-col span="12">检验值</van-col>
                        <van-col span="12" style="text-align: right; color: #769aff ;" @click="topath('/reportItem')">点击查看详情</van-col>
                    </van-row>
                    <van-row class="lable">
                        <van-col span="12">最新检查日期</van-col>
                        <van-col span="12" style="text-align: right;">2022-08-01</van-col>
                    </van-row>
                </van-row>
        <DateRangePicker v-model="showPopup" @confirm="handleConfirm" />
        <!-- <div v-if="loading" style="margin-top: 20pt; text-align: center;"> -->
        <!-- <van-loading  type="spinner" /> -->
        <!-- </div> -->
        <div class="test-list">
            <div v-for="(item, index) in reportList" :key="index" class="test-item">
                <img src="@/assets/listIoc.png" alt="Icon" class="icon">
                <div class="content" @click="topath(item)">
                    <div class="title">{{ item.itemGroupName }}</div>
                    <div class="date">{{ item.date }}</div>
                </div>
                <!-- <div class="hospital">{{ item.client_code }}</div> -->
            </div>
        </div>
        <itembody ref="itembodyRef" />
    <!-- <div class="listdiv"> -->
        <!-- <div class="listrow" v-for="x in 6" :key="x"> -->
        <!-- <van-row> -->
        <!-- <div class="info"></div> -->
        <!-- <van-row class="lable"> -->
        <!-- <van-col span="12">检验值</van-col> -->
        <!-- <van-col span="12" style="text-align: right">血常规</van-col> -->
        <!-- </van-row> -->
        <!-- <van-row class="lable"> -->
        <!-- <van-col span="12">检验值</van-col> -->
        <!-- <van-col -->
        <!-- span="12" -->
        <!-- style="text-align: right; color: #769aff" -->
        <!-- @click="topath('/reportItem')" -->
        <!-- >点击查看详情</van-col -->
        <!-- > -->
        <!-- </van-row> -->
        <!-- <van-row class="lable"> -->
        <!-- <van-col span="12">最新检查日期</van-col> -->
        <!-- <van-col span="12" style="text-align: right">2022-08-01</van-col> -->
        <!-- </van-row> -->
        <!-- </van-row> -->
        <!-- </div> -->
    <!-- </div> -->
    </div>
</template>
<script lang="ts" setup>
    import {ref} from 'vue'
    import {useRouter} from 'vue-router'
    const router=useRouter()
    const inputValue=ref('')
    const topath=(url:string)=>{
        console.log('sss')
        router.push(url)
    import { onMounted, ref } from 'vue'
    import { Toast } from 'vant'
    import { userInfoStore } from '@/stores/userInfo'
    import DateRangePicker from './components/DateRangePicker.vue'
    import itembody from './item/index.vue'
    import { ajaxPost } from '@/utils/axios'
    import { AxiosRequestConfig } from 'axios'
    const showPopup = ref(false)
    const userInfo = userInfoStore()
    const typeName=ref('近三个月')
    const loading=ref(false)
    const dataDate=ref({
        startDate: '',
        endDate: '',
    })
    const reportList=ref(<any>[])
    const itembodyRef = ref(null)
    const topath = (row: any) => {
        console.log('sss',row)
        itembodyRef.value.showSet(row)
    }
    const fanhui=()=>{
        router.go(-1)
    const handleConfirm = (data) => {
        typeName.value=data.type
        console.log('Selected date range:', data)
        dataDate.value.startDate = data.startDate
        dataDate.value.endDate = data.endDate
        console.log('dataDate', dataDate.value)
        getDatas(dataDate.value)
    }
</script>
<style scoped lang="scss">
    .report {
        background-color: #f6faff;
        padding: 0;
        .inputdiv {
            width: 94%;
            margin-left: 3%;
            margin-top: 5px;
            .input {
                width: 100%;
                // height: 33px;
                border-radius: 22px;
                border: 1px solid #dadada;
                // line-height: 33px;
            }
        }
    // 格式化日期为 YYYY-MM-DD
    const formatDate = (date:any) => {
        const year = date.getFullYear()
        const month = String(date.getMonth() + 1).padStart(2, '0')
        const day = String(date.getDate()).padStart(2, '0')
        return `${year}-${month}-${day}`
    }
    .listdiv {
        .listrow {
            margin-top: 10px;
            width: 94%;
            margin-left: 3%;
            background: #fff;
            box-shadow: 0 2px 4px 0 rgba(70, 150, 249, 0.1);
            border-radius: 8px;
    // 排序结果数组
    function flattenData(data) {
        const result = []
        // 遍历每个日期
        for (const date in data) {
            if (data.hasOwnProperty(date)) {
                const groups = data[date]
            .lable {
                width: 90%;
                margin-left: 5%;
                height: 40px;
                // 遍历每个组别
                for (const groupName in groups) {
                    if (groups.hasOwnProperty(groupName)) {
                        const items = groups[groupName]
                div {
                    height: 40px;
                    font-size: 13px;
                    font-family: Arial, sans-serif;
                    font-weight: 400;
                    color: #777;
                    line-height: 40px;
                    border-bottom: #f1f1f2 1px solid;
                        // 创建一个新的对象来存储当前组别的信息
                        const groupItem = {
                            date: date,
                            itemGroupName: groupName,
                            client_code: items.length > 0 ? items[0].client_code : null, // 假设所有项有相同的client_code
                            itemGroupItems: items.map(item => (item))
                        }
                        result.push(groupItem)
                    }
                }
            }
        }
        return result
    }
    const getDatas=(dataDate)=>{
        console.log('获取数据', dataDate)
        console.log(userInfo.patient.patientInfo.code)
        // const pagedata={
        // patCode :'PAT9121102427442HIiL',
        // date1:dataDate.value.startDate,
        // date2:dataDate.value.endDate,
        // isGroupByFeeItem:1
        //
        // }
        //
        // const pasm=`date1=${dataDate.value.startDate}&date2=${dataDate.value.endDate}&isGroupByFeeItem=1&patCode="${userInfo.patient.patientInfo.code}"`
        // 配置请求头为 x-www-form-urlencoded
        const config: AxiosRequestConfig = {
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
            },
        }
        const pasm=`date1=${dataDate.value.startDate}&date2=${dataDate.value.endDate}&isGroupByFeeItem=1&patCode=PAT9121102427442HIiL`
        loading.value = true // 开始加载
        reportList.value=[]
        const toast = Toast.loading({
            duration: 0,
            forbidClick: true,
            message: '加载中...',
        })
        ajaxPost('/lis/report/getLatestReportByPat',pasm,config).then((re:any)=>{
            console.log('获取数据', re)
            console.log(re)
            const da= flattenData(re)
            console.log('扁平化数据', da)
            reportList.value = da
        }).finally(()=>{
            loading.value = false // 加载完成
            toast.clear() // 清除加载提示
        }).catch((error:any)=>{
            console.error('获取数据失败', error)
        })
    }
    onMounted(() => {
        const now = new Date()
        const threeMonthsAgo = new Date(now)
        threeMonthsAgo.setMonth(now.getMonth() - 3)
        dataDate.value.startDate = formatDate(threeMonthsAgo)
        dataDate.value.endDate = formatDate(now)
        console.log('dataDate', dataDate.value)
        getDatas()
    })
</script>
<style scoped lang="scss">
.report {
    background-color: #b9d0e2;
    padding: 0;
    .inputdiv {
        width: 94%;
        margin-left: 3%;
        margin-top: 5px;
        .input {
            width: 100%;
            // height: 33px;
            border-radius: 22px;
            border: 1px solid #dadada;
            // line-height: 33px;
        }
    }
}
.listdiv {
    .listrow {
        margin-top: 10px;
        width: 94%;
        margin-left: 3%;
        background: #fff;
        box-shadow: 0 2px 4px 0 rgba(70, 150, 249, 0.1);
        border-radius: 8px;
        .lable {
            width: 90%;
            margin-left: 5%;
            height: 40px;
            div {
                height: 40px;
                font-size: 13px;
                font-family: Arial, sans-serif;
                font-weight: 400;
                color: #777;
                line-height: 40px;
                border-bottom: #f1f1f2 1px solid;
            }
        }
    }
}
.test-list {
    background-color: #f0f8ff;
    padding: 10pt;
}
.test-item {
    display: flex;
    align-items: center;
    background-color: "#ffffff";
    border-radius: 5pt;
    margin-bottom: 10pt;
    padding: 7pt;
}
.icon {
    width: 40pt;
    height: 40pt;
    margin-right: ptpx;
}
.content {
    flex: 1;
}
.title {
    padding: 5pt;
    font-size: 12pt;
    font-weight: bold;
}
.date {
    padding: 5pt;
    font-size: 12pt;
    color: #666;
}
.hospital {
    font-size: 12pt;
    color: #666;
}
</style>
src/views/report/item/index.vue
@@ -1,171 +1,139 @@
<template>
    <div class="reportItem">
        <van-nav-bar
            title=""
            left-text="返回"
            left-arrow
            @click="fanhui"
        />
        <div class="tou">
            <van-row>
                <van-col span="10">
                    <span class="lable">姓名:</span>
                    <span class="value">张三丰</span>
                </van-col>
                <van-col span="8">
                    <span class="lable">性别:</span>
                    <span class="value">男</span>
                </van-col>
                <van-col span="6">
                    <span class="lable">年龄:</span>
                    <span class="value">30</span>
                </van-col>
                <van-col span="10">
                    <span class="lable">科别:</span>
                    <span class="value">体检中心</span>
                </van-col>
                <van-col span="14">
                    <span class="lable">临床诊断:</span>
                    <span class="value">职业健康查体</span>
                </van-col>
            </van-row>
        </div>
        <div class="listdiv">
            <div class="listrow">
                <van-row class="thclass">
                    <van-col span="12" style="padding-left: 20px;">检验项目</van-col>
                    <van-col span="4">结果</van-col>
                    <van-col span="4">单位</van-col>
                    <van-col span="4">参考范围</van-col>
                </van-row>
                <van-row :class="{ 'tdclass': i % 2,'tdclassb': !(i % 2) }" v-for="i in 15" :key="i">
                    <van-col span="12" style="padding-left: 20px;">嗜碱性粒细胞绝对值(BA#)</van-col>
                    <van-col span="4">0.1</van-col>
                    <van-col span="4">10∧9/L</van-col>
                    <van-col span="4">3.5-9.5</van-col>
                </van-row>
    <div class="blood-test-report">
        <van-popup v-model:show="showPopup" position="bottom" :style="{ height: '100%' }">
            <van-nav-bar
                title=""
                left-text="返回"
                left-arrow
                @click-left="onClickLeft"
            />
            <div class="report-container">
                <div class="report-headerda">
                    <div class="report-header">
                        <div class="title">{{reportData.itemGroupName}}</div>
                        <div class="hospital"></div>
                        <img src="@/assets/xueye.png" alt="Blood Icon" class="blood-icon" />
                    </div>
                    <div class="report-details">
                        <div class="doctor">申请医生:</div>
                        <div class="date">报告时间:{{reportData.date}}</div>
                    </div>
                </div>
                <table class="report-table">
                    <thead>
                        <tr>
                            <th>检查项</th>
                            <th>结果</th>
                            <th>参考值/单位</th>
                            <!-- <th>趋势图</th> -->
                        </tr>
                    </thead>
                    <tbody>
                        <tr v-for="(item, index) in reportData.itemGroupItems" :key="index">
                            <td>{{ item.item_name }}</td>
                            <td>{{ item.item_result }} <b style="color: #f56c6c;">{{item.item_result_flag}}</b></td>
                            <td>{{ item.item_result_ref }}/{{item.item_result_unit}}</td>
                            <!-- <td><img :src="item.trendIcon" alt="Trend Icon" /></td> -->
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div class="jiao">
            <van-row>
                <van-col span="12">
                    <span class="lable">送检时间:</span>
                    <span class="value">2022-09-27 16:20</span>
                </van-col>
                <van-col span="12">
                    <span class="lable">报告时间:</span>
                    <span class="value">2022-09-27 16:50</span>
                </van-col>
                <van-col span="12">
                    <span class="lable">检测医生:</span>
                    <span class="value">李四</span>
                </van-col>
                <van-col span="12">
                    <span class="lable">审核医生:</span>
                    <span class="value">王五</span>
                </van-col>
                <van-col span="24">
                    <span class="lable">备注:</span>
                    <span class="value">本报告仅对此次检验的样本负责</span>
                </van-col>
            </van-row>
        </div>
        </van-popup>
    </div>
</template>
<script lang="ts" setup>
    import {ref,reactive,watchEffect,watch} from 'vue'
    import {useRouter} from 'vue-router'
    const router=useRouter()
    const fanhui=()=>{
        router.go(-1)
    }
</script>
<style scoped lang="scss">
    .reportItem{
        background-color: #F6FAFF;
        .tou{
            padding-top: 10px;
            padding-left: 20px;
            height: 66px;
            box-shadow: 0px 2px 4px 0px rgba(70,150,249,0.1);
            border-radius: 8px;
            background: #FFFFFF;
            div {
                height: 30px;
                border-radius: 6px;
                line-height: 30px;
                .lable{
                    font-size: 13px;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #777777;
                }
                .value{
                    font-size: 13px;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #333333;
                }
            }
        }
        .jiao{
            padding-top: 20px;
            padding-left: 20px;
            height: 96px;
            box-shadow: 0px 2px 4px 0px rgba(70,150,249,0.1);
            border-radius: 8px;
            background: #FFFFFF;
            div {
                height: 30px;
                border-radius: 6px;
                line-height: 30px;
                .lable{
                    font-size: 13px;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #777777;
                }
                .value{
                    font-size: 13px;
                    font-family: PingFangSC-Regular, PingFang SC;
                    font-weight: 400;
                    color: #333333;
                }
            }
        }
    }
    .listdiv{
        .listrow{
            margin-top: 10px;
            background: #FFFFFF;
            .thclass{
                height:40px;
                line-height: 40px;
                font-size: 13px;
                font-family: PingFangSC-Medium, PingFang SC;
                font-weight: 500;
                color: #333333;
            }
            .tdclass{
                height:30px;
                line-height: 30px;
                font-size: 13px;
                font-family: PingFangSC-Medium, PingFang SC;
                font-weight: 400;
                background: #F0F6FF;
                color: #777777;
            }
            .tdclassb{
                // padding-left: 20px;
                height:30px;
                line-height: 30px;
                font-size: 13px;
                font-family: PingFangSC-Medium, PingFang SC;
                font-weight: 400;
                background: #FFFFFF;
                color: #777777;
            }
        }
  <script setup>
    import { ref } from 'vue'
    //   import listIoc from '@/assets/listIoc.png';
    const showPopup = ref(false)
    const reportData=ref({
        date:'',
        itemGroupName:'',
        itemGroupItems:[]
    })
    const onClickLeft = () => {
        showPopup.value = false
    }
</style>
    const showSet=(viveData)=>{
        console.log(viveData)
        reportData.value=Object.assign({},viveData)
        showPopup.value=true
    }
    defineExpose ({
        showSet
    })
  </script>
  <style scoped>
    .blood-test-report {
        text-align: center;
        background-color: #f0f4f8;
    }
    .report-container {
        padding: 10pt;
        background-color: #f0f4f8;
        min-height: 100%;
    }
    .report-headerda {
        border: 1px solid #ddd;
        padding: 8px;
        margin-bottom: 10px;
    }
    .report-header {
        display: flex;
        justify-content: space-between;
        align-items: center;
        margin-bottom: 10px;
        padding-bottom: 10px;
        border-bottom: 1pt solid #707070;
    }
    .title {
        font-size: 18px;
        font-weight: bold;
    }
    .hospital {
        font-size: 14px;
        color: #666;
    }
    .blood-icon {
        width: 50px;
        height: 50px;
    }
    .report-details {
        display: flex;
        justify-content: space-between;
        margin-bottom: 20px;
    }
    .doctor,
    .date {
        font-size: 14px;
        color: #666;
    }
    .report-table {
        width: 100%;
        border-collapse: collapse;
    }
    .report-table th,
    .report-table td {
        border: 1px solid #ddd;
        padding: 8px;
        text-align: center;
    }
    .report-table th {
        background-color: #e6f2ff;
    }
  </style>