| | |
| | | "undici-types": "~7.19.0" |
| | | } |
| | | }, |
| | | "node_modules/@vitejs/plugin-vue": { |
| | | "version": "1.10.2", |
| | | "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz", |
| | | "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==", |
| | | "dev": true, |
| | | "engines": { |
| | | "node": ">=12.0.0" |
| | | }, |
| | | "peerDependencies": { |
| | | "vite": "^2.5.10" |
| | | } |
| | | }, |
| | | "node_modules/@vue/compiler-core": { |
| | | "version": "3.5.32", |
| | | "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.32.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-2.0.0.tgz", |
| | | "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", |
| | | "dev": true |
| | | }, |
| | | "node_modules/esbuild": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz", |
| | | "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", |
| | | "dev": true, |
| | | "hasInstallScript": true, |
| | | "bin": { |
| | | "esbuild": "bin/esbuild" |
| | | }, |
| | | "engines": { |
| | | "node": ">=12" |
| | | }, |
| | | "optionalDependencies": { |
| | | "@esbuild/linux-loong64": "0.14.54", |
| | | "esbuild-android-64": "0.14.54", |
| | | "esbuild-android-arm64": "0.14.54", |
| | | "esbuild-darwin-64": "0.14.54", |
| | | "esbuild-darwin-arm64": "0.14.54", |
| | | "esbuild-freebsd-64": "0.14.54", |
| | | "esbuild-freebsd-arm64": "0.14.54", |
| | | "esbuild-linux-32": "0.14.54", |
| | | "esbuild-linux-64": "0.14.54", |
| | | "esbuild-linux-arm": "0.14.54", |
| | | "esbuild-linux-arm64": "0.14.54", |
| | | "esbuild-linux-mips64le": "0.14.54", |
| | | "esbuild-linux-ppc64le": "0.14.54", |
| | | "esbuild-linux-riscv64": "0.14.54", |
| | | "esbuild-linux-s390x": "0.14.54", |
| | | "esbuild-netbsd-64": "0.14.54", |
| | | "esbuild-openbsd-64": "0.14.54", |
| | | "esbuild-sunos-64": "0.14.54", |
| | | "esbuild-windows-32": "0.14.54", |
| | | "esbuild-windows-64": "0.14.54", |
| | | "esbuild-windows-arm64": "0.14.54" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-windows-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", |
| | | "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "win32" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/escalade": { |
| | | "version": "3.2.0", |
| | |
| | | "url": "https://github.com/sponsors/isaacs" |
| | | } |
| | | }, |
| | | "node_modules/rollup": { |
| | | "version": "2.77.3", |
| | | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz", |
| | | "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", |
| | | "dev": true, |
| | | "bin": { |
| | | "rollup": "dist/bin/rollup" |
| | | }, |
| | | "engines": { |
| | | "node": ">=10.0.0" |
| | | }, |
| | | "optionalDependencies": { |
| | | "fsevents": "~2.3.2" |
| | | } |
| | | }, |
| | | "node_modules/schema-utils": { |
| | | "version": "4.3.3", |
| | | "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", |
| | |
| | | "HBuilderX": "^3.1.0", |
| | | "uni-app": "^4.66", |
| | | "uni-app-x": "" |
| | | } |
| | | }, |
| | | "node_modules/vite": { |
| | | "version": "2.9.18", |
| | | "resolved": "https://registry.npmmirror.com/vite/-/vite-2.9.18.tgz", |
| | | "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", |
| | | "dev": true, |
| | | "dependencies": { |
| | | "esbuild": "^0.14.27", |
| | | "postcss": "^8.4.13", |
| | | "resolve": "^1.22.0", |
| | | "rollup": ">=2.59.0 <2.78.0" |
| | | }, |
| | | "bin": { |
| | | "vite": "bin/vite.js" |
| | | }, |
| | | "engines": { |
| | | "node": ">=12.2.0" |
| | | }, |
| | | "optionalDependencies": { |
| | | "fsevents": "~2.3.2" |
| | | }, |
| | | "peerDependencies": { |
| | | "less": "*", |
| | | "sass": "*", |
| | | "stylus": "*" |
| | | }, |
| | | "peerDependenciesMeta": { |
| | | "less": { |
| | | "optional": true |
| | | }, |
| | | "sass": { |
| | | "optional": true |
| | | }, |
| | | "stylus": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/vue": { |
| | |
| | | "vue-i18n": "^9.2.2" |
| | | }, |
| | | "devDependencies": { |
| | | "@vitejs/plugin-vue": "^1.10.2", |
| | | "@vue/compiler-sfc": "^3.3.0", |
| | | "typescript": "^5.0.0", |
| | | "vite": "^2.9.0", |
| | | "vue-cli-plugin-i18n": "~2.3.2", |
| | | "webpack": "^5.103.0", |
| | | "webpack-cli": "^6.0.1" |
| | |
| | | "dev": true, |
| | | "engines": { |
| | | "node": ">=14.17.0" |
| | | } |
| | | }, |
| | | "node_modules/@esbuild/linux-loong64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", |
| | | "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", |
| | | "cpu": [ |
| | | "loong64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/@intlify/core-base": { |
| | |
| | | "dev": true, |
| | | "dependencies": { |
| | | "undici-types": "~7.19.0" |
| | | } |
| | | }, |
| | | "node_modules/@vitejs/plugin-vue": { |
| | | "version": "1.10.2", |
| | | "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz", |
| | | "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==", |
| | | "dev": true, |
| | | "engines": { |
| | | "node": ">=12.0.0" |
| | | }, |
| | | "peerDependencies": { |
| | | "vite": "^2.5.10" |
| | | } |
| | | }, |
| | | "node_modules/@vue/compiler-core": { |
| | |
| | | "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", |
| | | "dev": true |
| | | }, |
| | | "node_modules/esbuild": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz", |
| | | "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", |
| | | "dev": true, |
| | | "hasInstallScript": true, |
| | | "bin": { |
| | | "esbuild": "bin/esbuild" |
| | | }, |
| | | "engines": { |
| | | "node": ">=12" |
| | | }, |
| | | "optionalDependencies": { |
| | | "@esbuild/linux-loong64": "0.14.54", |
| | | "esbuild-android-64": "0.14.54", |
| | | "esbuild-android-arm64": "0.14.54", |
| | | "esbuild-darwin-64": "0.14.54", |
| | | "esbuild-darwin-arm64": "0.14.54", |
| | | "esbuild-freebsd-64": "0.14.54", |
| | | "esbuild-freebsd-arm64": "0.14.54", |
| | | "esbuild-linux-32": "0.14.54", |
| | | "esbuild-linux-64": "0.14.54", |
| | | "esbuild-linux-arm": "0.14.54", |
| | | "esbuild-linux-arm64": "0.14.54", |
| | | "esbuild-linux-mips64le": "0.14.54", |
| | | "esbuild-linux-ppc64le": "0.14.54", |
| | | "esbuild-linux-riscv64": "0.14.54", |
| | | "esbuild-linux-s390x": "0.14.54", |
| | | "esbuild-netbsd-64": "0.14.54", |
| | | "esbuild-openbsd-64": "0.14.54", |
| | | "esbuild-sunos-64": "0.14.54", |
| | | "esbuild-windows-32": "0.14.54", |
| | | "esbuild-windows-64": "0.14.54", |
| | | "esbuild-windows-arm64": "0.14.54" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-android-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", |
| | | "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "android" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-android-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", |
| | | "cpu": [ |
| | | "arm64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "android" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-darwin-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", |
| | | "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "darwin" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-darwin-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", |
| | | "cpu": [ |
| | | "arm64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "darwin" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-freebsd-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", |
| | | "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "freebsd" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-freebsd-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", |
| | | "cpu": [ |
| | | "arm64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "freebsd" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-32": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", |
| | | "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", |
| | | "cpu": [ |
| | | "ia32" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", |
| | | "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-arm": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", |
| | | "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", |
| | | "cpu": [ |
| | | "arm" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", |
| | | "cpu": [ |
| | | "arm64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-mips64le": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", |
| | | "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", |
| | | "cpu": [ |
| | | "mips64el" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-ppc64le": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", |
| | | "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", |
| | | "cpu": [ |
| | | "ppc64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-riscv64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", |
| | | "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", |
| | | "cpu": [ |
| | | "riscv64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-linux-s390x": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", |
| | | "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", |
| | | "cpu": [ |
| | | "s390x" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "linux" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-netbsd-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", |
| | | "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "netbsd" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-openbsd-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", |
| | | "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "openbsd" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-sunos-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", |
| | | "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "sunos" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-windows-32": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", |
| | | "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", |
| | | "cpu": [ |
| | | "ia32" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "win32" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-windows-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", |
| | | "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", |
| | | "cpu": [ |
| | | "x64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "win32" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/esbuild-windows-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", |
| | | "cpu": [ |
| | | "arm64" |
| | | ], |
| | | "dev": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "win32" |
| | | ], |
| | | "engines": { |
| | | "node": ">=12" |
| | | } |
| | | }, |
| | | "node_modules/escalade": { |
| | | "version": "3.2.0", |
| | | "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", |
| | | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", |
| | | "dev": true |
| | | }, |
| | | "node_modules/fsevents": { |
| | | "version": "2.3.3", |
| | | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", |
| | | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", |
| | | "dev": true, |
| | | "hasInstallScript": true, |
| | | "optional": true, |
| | | "os": [ |
| | | "darwin" |
| | | ], |
| | | "engines": { |
| | | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" |
| | | } |
| | | }, |
| | | "node_modules/function-bind": { |
| | | "version": "1.1.2", |
| | |
| | | "url": "https://github.com/sponsors/isaacs" |
| | | } |
| | | }, |
| | | "node_modules/rollup": { |
| | | "version": "2.77.3", |
| | | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz", |
| | | "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", |
| | | "dev": true, |
| | | "bin": { |
| | | "rollup": "dist/bin/rollup" |
| | | }, |
| | | "engines": { |
| | | "node": ">=10.0.0" |
| | | }, |
| | | "optionalDependencies": { |
| | | "fsevents": "~2.3.2" |
| | | } |
| | | }, |
| | | "node_modules/schema-utils": { |
| | | "version": "4.3.3", |
| | | "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", |
| | |
| | | "HBuilderX": "^3.1.0", |
| | | "uni-app": "^4.66", |
| | | "uni-app-x": "" |
| | | } |
| | | }, |
| | | "node_modules/vite": { |
| | | "version": "2.9.18", |
| | | "resolved": "https://registry.npmmirror.com/vite/-/vite-2.9.18.tgz", |
| | | "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", |
| | | "dev": true, |
| | | "dependencies": { |
| | | "esbuild": "^0.14.27", |
| | | "postcss": "^8.4.13", |
| | | "resolve": "^1.22.0", |
| | | "rollup": ">=2.59.0 <2.78.0" |
| | | }, |
| | | "bin": { |
| | | "vite": "bin/vite.js" |
| | | }, |
| | | "engines": { |
| | | "node": ">=12.2.0" |
| | | }, |
| | | "optionalDependencies": { |
| | | "fsevents": "~2.3.2" |
| | | }, |
| | | "peerDependencies": { |
| | | "less": "*", |
| | | "sass": "*", |
| | | "stylus": "*" |
| | | }, |
| | | "peerDependenciesMeta": { |
| | | "less": { |
| | | "optional": true |
| | | }, |
| | | "sass": { |
| | | "optional": true |
| | | }, |
| | | "stylus": { |
| | | "optional": true |
| | | } |
| | | } |
| | | }, |
| | | "node_modules/vue": { |
| | |
| | | "integrity": "sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==", |
| | | "dev": true |
| | | }, |
| | | "@esbuild/linux-loong64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", |
| | | "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "@intlify/core-base": { |
| | | "version": "9.14.4", |
| | | "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.14.4.tgz", |
| | |
| | | "requires": { |
| | | "undici-types": "~7.19.0" |
| | | } |
| | | }, |
| | | "@vitejs/plugin-vue": { |
| | | "version": "1.10.2", |
| | | "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-1.10.2.tgz", |
| | | "integrity": "sha512-/QJ0Z9qfhAFtKRY+r57ziY4BSbGUTGsPRMpB/Ron3QPwBZM4OZAZHdTa4a8PafCwU5DTatXG8TMDoP8z+oDqJw==", |
| | | "dev": true, |
| | | "requires": {} |
| | | }, |
| | | "@vue/compiler-core": { |
| | | "version": "3.5.32", |
| | |
| | | "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==", |
| | | "dev": true |
| | | }, |
| | | "esbuild": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.14.54.tgz", |
| | | "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", |
| | | "dev": true, |
| | | "requires": { |
| | | "@esbuild/linux-loong64": "0.14.54", |
| | | "esbuild-android-64": "0.14.54", |
| | | "esbuild-android-arm64": "0.14.54", |
| | | "esbuild-darwin-64": "0.14.54", |
| | | "esbuild-darwin-arm64": "0.14.54", |
| | | "esbuild-freebsd-64": "0.14.54", |
| | | "esbuild-freebsd-arm64": "0.14.54", |
| | | "esbuild-linux-32": "0.14.54", |
| | | "esbuild-linux-64": "0.14.54", |
| | | "esbuild-linux-arm": "0.14.54", |
| | | "esbuild-linux-arm64": "0.14.54", |
| | | "esbuild-linux-mips64le": "0.14.54", |
| | | "esbuild-linux-ppc64le": "0.14.54", |
| | | "esbuild-linux-riscv64": "0.14.54", |
| | | "esbuild-linux-s390x": "0.14.54", |
| | | "esbuild-netbsd-64": "0.14.54", |
| | | "esbuild-openbsd-64": "0.14.54", |
| | | "esbuild-sunos-64": "0.14.54", |
| | | "esbuild-windows-32": "0.14.54", |
| | | "esbuild-windows-64": "0.14.54", |
| | | "esbuild-windows-arm64": "0.14.54" |
| | | } |
| | | }, |
| | | "esbuild-android-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", |
| | | "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-android-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-darwin-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", |
| | | "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-darwin-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-freebsd-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", |
| | | "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-freebsd-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-32": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", |
| | | "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", |
| | | "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-arm": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", |
| | | "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-mips64le": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", |
| | | "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-ppc64le": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", |
| | | "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-riscv64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", |
| | | "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-linux-s390x": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", |
| | | "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-netbsd-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", |
| | | "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-openbsd-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", |
| | | "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-sunos-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", |
| | | "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-windows-32": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", |
| | | "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-windows-64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", |
| | | "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "esbuild-windows-arm64": { |
| | | "version": "0.14.54", |
| | | "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", |
| | | "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "escalade": { |
| | | "version": "3.2.0", |
| | | "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", |
| | |
| | | "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", |
| | | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", |
| | | "dev": true |
| | | }, |
| | | "fsevents": { |
| | | "version": "2.3.3", |
| | | "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", |
| | | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", |
| | | "dev": true, |
| | | "optional": true |
| | | }, |
| | | "function-bind": { |
| | | "version": "1.1.2", |
| | |
| | | "glob": "^7.1.3" |
| | | } |
| | | }, |
| | | "rollup": { |
| | | "version": "2.77.3", |
| | | "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.77.3.tgz", |
| | | "integrity": "sha512-/qxNTG7FbmefJWoeeYJFbHehJ2HNWnjkAFRKzWN/45eNBBF/r8lo992CwcJXEzyVxs5FmfId+vTSTQDb+bxA+g==", |
| | | "dev": true, |
| | | "requires": { |
| | | "fsevents": "~2.3.2" |
| | | } |
| | | }, |
| | | "schema-utils": { |
| | | "version": "4.3.3", |
| | | "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-4.3.3.tgz", |
| | |
| | | "version": "3.7.36", |
| | | "resolved": "https://registry.npmmirror.com/uview-plus/-/uview-plus-3.7.36.tgz", |
| | | "integrity": "sha512-44pW0oKKatYxCHhXPljaNv5E+CESSJlhsz0FRZRNpMv1ms02m5Agk+CNpgDnv/XNHt9YxHdYSYerN+xnNP5orw==" |
| | | }, |
| | | "vite": { |
| | | "version": "2.9.18", |
| | | "resolved": "https://registry.npmmirror.com/vite/-/vite-2.9.18.tgz", |
| | | "integrity": "sha512-sAOqI5wNM9QvSEE70W3UGMdT8cyEn0+PmJMTFvTB8wB0YbYUWw3gUbY62AOyrXosGieF2htmeLATvNxpv/zNyQ==", |
| | | "dev": true, |
| | | "requires": { |
| | | "esbuild": "^0.14.27", |
| | | "fsevents": "~2.3.2", |
| | | "postcss": "^8.4.13", |
| | | "resolve": "^1.22.0", |
| | | "rollup": ">=2.59.0 <2.78.0" |
| | | } |
| | | }, |
| | | "vue": { |
| | | "version": "3.5.32", |
| | |
| | | "vue": "^3.3.0", |
| | | "vue-i18n": "^9.2.2" |
| | | }, |
| | | "type": "module", |
| | | "devDependencies": { |
| | | "@vitejs/plugin-vue": "^1.10.2", |
| | | "@vue/compiler-sfc": "^3.3.0", |
| | | "typescript": "^5.0.0", |
| | | "vite": "^2.9.0", |
| | | "vue-cli-plugin-i18n": "~2.3.2", |
| | | "webpack": "^5.103.0", |
| | | "webpack-cli": "^6.0.1" |
| | |
| | | :customStyle="textareaStyle(!form.diagnosisname)" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">æ¯å¦éè¦è½¬è¿</text> |
| | | <view class="radio-group horizontal"> |
| | | <view |
| | | v-for="bloodType in isTransportOptions" |
| | | :key="bloodType.value" |
| | | class="radio-item" |
| | | @click="form.isTransport = bloodType.value" |
| | | > |
| | | <view |
| | | class="radio-dot" |
| | | :class="{ active: form.isTransport === bloodType.value }" |
| | | ></view> |
| | | <text class="radio-label">{{ bloodType.label }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | <view class="form-item"> |
| | | <text class="item-label">è¡å</text> |
| | | <view class="radio-group horizontal"> |
| | |
| | | { label: "Oå", value: "O" }, |
| | | { label: "ABå", value: "AB" }, |
| | | ]); |
| | | |
| | | const isTransportOptions = ref([ |
| | | { label: "éè¦", value: "2" }, |
| | | { label: "ä¸éè¦", value: "1" }, |
| | | ]); |
| | | const rhOptions = ref([ |
| | | { label: "鳿§", value: "positive" }, |
| | | { label: "é´æ§", value: "negative" }, |
| | |
| | | ? idCardTypeLabels.value[idCardTypeIndex.value] |
| | | : "è¯·éæ©è¯ä»¶ç±»å"; |
| | | }); |
| | | |
| | | |
| | | const onNationChange = (e) => { |
| | | const index = parseInt(e.detail.value); |
| | |
| | | |
| | | // å¤çå
¶ä»éä»¶ä¸ä¼ |
| | | const handleFilesUpdate = (files) => { |
| | | formData.attachments = files.map((file) => ({ |
| | | attachments.value = files.map((file) => ({ |
| | | ...file, |
| | | // ç¡®ä¿åªåå¨åè·¯å¾ |
| | | url: file.url.startsWith("http") |
| | |
| | | |
| | | if (file.type.includes("image")) { |
| | | uni.previewImage({ |
| | | urls: formData.attachments |
| | | urls: attachments.value |
| | | .filter((f) => f.type.includes("image")) |
| | | .map((f) => |
| | | f.url.startsWith("http") |
| | |
| | | } |
| | | |
| | | try { |
| | | uni.showLoading({ title: isEditMode.value ? "ä¿®æ¹ä¸..." : "æäº¤ä¸..." }); |
| | | console.log(attachments.value); |
| | | |
| | | uni.showLoading({ title: isEditMode.value ? "ä¿®æ¹ä¸..." : "æäº¤ä¸..." }); |
| | | // åå¤æäº¤æ°æ® |
| | | const submitData = { |
| | | ...form.value, |
| | |
| | | <view class="hospital-info"> |
| | | <image :src="caseDetail.hospitalLogo" mode="aspectFit" class="hospital-logo" /> |
| | | <view class="hospital-details"> |
| | | <text class="hospital-name">{{ caseDetail.hospitalName }}</text> |
| | | <text class="case-type">{{ caseDetail.caseType }}</text> |
| | | <text class="hospital-name">{{ caseDetail.treatmenthospitalname || 'æªå¡«åæ²»çå»é¢' }}</text> |
| | | <text class="case-type">{{ caseDetail.donorNo ? 'å¨å®æç®æ¡ä¾' : 'æ¡ä¾è¯¦æ
' }}</text> |
| | | </view> |
| | | </view> |
| | | <view class="case-status" :class="caseDetail.status"> |
| | | {{ caseDetail.statusText }} |
| | | <view class="case-status" :class="getStatusClass(caseDetail.reportStatus)"> |
| | | {{ getStatusText(caseDetail.reportStatus) }} |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="case-basic-info"> |
| | | <view class="info-row"> |
| | | <view class="info-item"> |
| | | <text class="label">æç®ç¼å·</text> |
| | | <text class="value">{{ caseDetail.donorNo }}</text> |
| | | <text class="label">æ¡ä¾ç¼å·</text> |
| | | <text class="value">{{ caseDetail.caseNo || 'æªçæ' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">䏿¥æ¶é´</text> |
| | | <text class="value">{{ caseDetail.reportTime }}</text> |
| | | <text class="value">{{ formatDateTime(caseDetail.reporttime) }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <view class="info-grid"> |
| | | <view class="info-item"> |
| | | <text class="label">å§å</text> |
| | | <text class="value">{{ caseDetail.donorName }}</text> |
| | | <text class="value">{{ caseDetail.name || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">æ§å«</text> |
| | | <text class="value">{{ caseDetail.gender }}</text> |
| | | <text class="value">{{ getGenderText(caseDetail.sex) }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">å¹´é¾</text> |
| | | <text class="value">{{ caseDetail.age }}å²</text> |
| | | <text class="value">{{ caseDetail.age || '0' }} {{ getAgeUnitText(caseDetail.ageunit) }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">è¯ä»¶å·ç </text> |
| | | <text class="value">{{ caseDetail.idCardNo }}</text> |
| | | <text class="value">{{ caseDetail.idcardno || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">è¡å</text> |
| | | <text class="value">{{ caseDetail.bloodType }}</text> |
| | | <text class="value">{{ getBloodTypeText(caseDetail.bloodType) }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">æ°æ</text> |
| | | <text class="value">{{ caseDetail.nation }}</text> |
| | | <text class="value">{{ caseDetail.nation || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">å½ç±</text> |
| | | <text class="value">{{ caseDetail.nationality || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">ç±è´¯</text> |
| | | <text class="value">{{ caseDetail.nativeplace || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">å¦å</text> |
| | | <text class="value">{{ caseDetail.education || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">èä¸</text> |
| | | <text class="value">{{ caseDetail.occupation || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item full-width"> |
| | | <text class="label">ä½å</text> |
| | | <text class="value">{{ caseDetail.address }}</text> |
| | | <text class="label">æ·ç±å°å</text> |
| | | <text class="value">{{ getFullRegisterAddress() || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item full-width"> |
| | | <text class="label">ç°ä½å°å</text> |
| | | <text class="value">{{ getFullResidenceAddress() || 'æªå¡«å' }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | |
| | | <view class="info-content"> |
| | | <view class="info-group"> |
| | | <text class="group-title">ç¾ç
è¯æ</text> |
| | | <text class="group-content">{{ caseDetail.diagnosis }}</text> |
| | | <text class="group-content">{{ caseDetail.diagnosisname || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-group"> |
| | | <text class="group-title">ç
æ
æ¦åµ</text> |
| | | <text class="group-content">{{ caseDetail.illnessoverview || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-group"> |
| | | <text class="group-title">ç
人ç¶åµ</text> |
| | | <text class="group-content">{{ caseDetail.patientstate || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-group"> |
| | | <text class="group-title">ä½é¢å·</text> |
| | | <text class="group-content">{{ caseDetail.inpatientNo }}</text> |
| | | <text class="group-content">{{ caseDetail.inpatientno || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-group"> |
| | | <text class="group-title">æå¨ç§å®¤</text> |
| | | <text class="group-content">{{ caseDetail.departmentName }}</text> |
| | | <text class="group-title">GCSè¯å</text> |
| | | <text class="group-content">{{ caseDetail.gcsScore || 'æªè¯ä¼°' }}</text> |
| | | </view> |
| | | <view class="info-group"> |
| | | <text class="group-title">ä¼ æç
æ
åµ</text> |
| | | <text class="group-content">{{ caseDetail.infectiousDisease || 'æ ' }}</text> |
| | | <text class="group-content">{{ caseDetail.infectious || 'æ ' }}{{ caseDetail.infectiousOther ? `(${caseDetail.infectiousOther})` : '' }}</text> |
| | | </view> |
| | | <view class="info-group"> |
| | | <text class="group-title">Rhé´æ§</text> |
| | | <text class="group-content">{{ caseDetail.rhYin === '1' ? 'æ¯' : 'å¦' }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- æç®æµç¨ä¿¡æ¯ --> |
| | | <view v-if="activeTab === 'process'" class="info-section fade-in-up"> |
| | | <!-- å»é¢ä¸èç³»ä¿¡æ¯ --> |
| | | <view v-if="activeTab === 'contact'" class="info-section fade-in-up"> |
| | | <view class="section-card"> |
| | | <view class="section-header"> |
| | | <text class="section-title">æç®æµç¨ä¿¡æ¯</text> |
| | | <text class="section-title">å»é¢ä¸è系信æ¯</text> |
| | | </view> |
| | | <view class="process-timeline"> |
| | | <view class="timeline-item" v-for="step in processSteps" :key="step.id"> |
| | | <view class="timeline-marker" :class="{ active: step.completed }"></view> |
| | | <view class="timeline-content"> |
| | | <text class="step-title">{{ step.title }}</text> |
| | | <text class="step-time" v-if="step.time">{{ step.time }}</text> |
| | | <text class="step-person" v-if="step.person">ç»å人ï¼{{ step.person }}</text> |
| | | <view class="info-grid"> |
| | | <view class="info-item full-width"> |
| | | <text class="label">æ²»çå»é¢</text> |
| | | <text class="value">{{ caseDetail.treatmenthospitalname || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">æ²»çç§å®¤</text> |
| | | <text class="value">{{ caseDetail.treatmentdeptname || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">䏿¥å»é¢</text> |
| | | <text class="value">{{ caseDetail.toHospital || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item full-width"> |
| | | <text class="label">èç³»çµè¯</text> |
| | | <text class="value">{{ caseDetail.phone || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">ä¿¡æ¯å</text> |
| | | <text class="value">{{ caseDetail.infoName || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">ä¿¡æ¯åç¼å·</text> |
| | | <text class="value">{{ caseDetail.infoNo || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">æ¥åè
</text> |
| | | <text class="value">{{ caseDetail.reportername || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">æ¥åè
çµè¯</text> |
| | | <text class="value">{{ caseDetail.reporterphone || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">åè°å</text> |
| | | <text class="value">{{ caseDetail.coordinatorName || 'æªå¡«å' }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">åè°åç¼å·</text> |
| | | <text class="value">{{ caseDetail.coordinatorNo || 'æªå¡«å' }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 转è¿ä¿¡æ¯ --> |
| | | <view v-if="activeTab === 'transport'" class="info-section fade-in-up"> |
| | | <view class="section-card"> |
| | | <view class="section-header"> |
| | | <view style="display: flex; justify-content: space-between; align-items: center;"> |
| | | <text class="section-title">转è¿ä¿¡æ¯</text> |
| | | <!-- è½¬è¿æä½æé® --> |
| | | <view v-if="caseDetail.reportStatus === '3'" style="display: flex; gap: 20rpx;"> |
| | | <button |
| | | v-if="caseDetail.isTransport === '2' && !hasTransport" |
| | | class="small-btn primary" |
| | | @tap.stop="createTransport" |
| | | > |
| | | å建转è¿å |
| | | </button> |
| | | <button |
| | | v-if="hasTransport" |
| | | class="small-btn secondary" |
| | | @tap.stop="viewTransportDetail" |
| | | > |
| | | æ¥ç转è¿å |
| | | </button> |
| | | </view> |
| | | </view> |
| | | </view> + |
| | | </view> |
| | | |
| | | <view class="info-content"> |
| | | <view class="info-group"> |
| | | <text class="group-title">æ¯å¦éè¦è½¬è¿</text> |
| | | <text class="group-content">{{ caseDetail.isTransport === '2' ? 'éè¦' : 'ä¸éè¦' }}</text> |
| | | </view> |
| | | |
| | | <!-- æè½¬è¿ä¿¡æ¯æ¶æ¾ç¤º --> |
| | | <view v-if="hasTransport && caseDetail.serviceTransport" class="transport-info"> |
| | | <view class="info-group" v-for="transport in caseDetail.serviceTransport" :key="transport.id"> |
| | | <view class="sub-group"> |
| | | <text class="sub-label">转è¿åå·:</text> |
| | | <text class="sub-value">{{ transport.reportId || transport.id }}</text> |
| | | </view> |
| | | <view class="sub-group"> |
| | | <text class="sub-label">åºåå°ç¹:</text> |
| | | <text class="sub-value">{{ transport.transportStartPlace }}</text> |
| | | </view> |
| | | <view class="sub-group"> |
| | | <text class="sub-label">åºåæ¶é´:</text> |
| | | <text class="sub-value">{{ formatDateTime(transport.transportStartTime) }}</text> |
| | | </view> |
| | | <view class="sub-group"> |
| | | <text class="sub-label">è´è´£åè°å:</text> |
| | | <text class="sub-value">{{ transport.contactPerson }}</text> |
| | | </view> |
| | | <view class="sub-group"> |
| | | <text class="sub-label">转è¿ç¶æ:</text> |
| | | <text class="sub-value status" :class="getTransportStatusClass(transport.transitStatus)"> |
| | | {{ getTransportStatusText(transport.transitStatus) }} |
| | | </text> |
| | | </view> |
| | | <view class="sub-group" v-if="transport.doctor"> |
| | | <text class="sub-label">æ¥è¯ç§å»ç:</text> |
| | | <text class="sub-value">{{ transport.doctor }}</text> |
| | | </view> |
| | | <view class="sub-group" v-if="transport.nurse"> |
| | | <text class="sub-label">æ¤å£«:</text> |
| | | <text class="sub-value">{{ transport.nurse }}</text> |
| | | </view> |
| | | <view class="sub-group" v-if="transport.driver"> |
| | | <text class="sub-label">驾驶å:</text> |
| | | <text class="sub-value">{{ transport.driver }}</text> |
| | | </view> |
| | | <view class="sub-group" v-if="transport.icuDoctor"> |
| | | <text class="sub-label">ICUè¯ä¼°å»ç:</text> |
| | | <text class="sub-value">{{ transport.icuDoctor }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- æ 转è¿ä¿¡æ¯ä½éè¦è½¬è¿ --> |
| | | <view v-else-if="caseDetail.isTransport === '2'" class="transport-info"> |
| | | <view class="empty-transport"> |
| | | <text>该æ¡ä¾éè¦è½¬è¿ï¼ä½å°æªå建转è¿å</text> |
| | | <text v-if="caseDetail.reportStatus !== '3'" style="color: #f0ad4e; font-size: 24rpx; margin-top: 10rpx;"> |
| | | éå
审æ¹åææè½å建转è¿å |
| | | </text> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- æ éè½¬è¿ --> |
| | | <view v-else class="transport-info"> |
| | | <view class="empty-transport"> |
| | | <text>该æ¡ä¾æ é转è¿</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- æä½æé® --> |
| | | <view class="action-bar"> |
| | | <button class="action-btn secondary" @tap="goBack">è¿å</button> |
| | | <button class="action-btn primary" v-if="caseDetail.status === 'reported'" |
| | | @tap="withdrawCase">æ¤åæ¡ä¾</button> |
| | | <button class="action-btn primary" v-else @tap="contactCoordinator">èç³»åè°å</button> |
| | | |
| | | <!-- æ ¹æ®ç¶ææ¾ç¤ºä¸åæä½ --> |
| | | <button v-if="caseDetail.reportStatus === '1' || caseDetail.reportStatus === '2'" |
| | | class="action-btn primary" |
| | | @tap="handleEdit"> |
| | | ç¼è¾æ¡ä¾ |
| | | </button> |
| | | |
| | | <!-- <button v-if="canDelete" |
| | | class="action-btn error" |
| | | @tap="handleDelete"> |
| | | å 餿¡ä¾ |
| | | </button> --> |
| | | </view> |
| | | |
| | | <!-- å è½½ç¶æ --> |
| | | <u-loading-icon v-if="loading" :show="loading" text="å è½½ä¸..." /> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, onMounted } from 'vue' |
| | | import { onLoad } from '@dcloudio/uni-app' |
| | | import { useDict } from "@/utils/dict" |
| | | |
| | | import { onLoad } from '@dcloudio/uni-app' |
| | | // åå
¸æ°æ® |
| | | const dict = ref({}) |
| | | |
| | | const caseDetail = ref({ |
| | | id: 1, |
| | | donorNo: 'DON20240325001', |
| | | hospitalName: 'éå²éæ¹å»é¢', |
| | | hospitalLogo: '/static/hospital/kiang-wu.jpg', |
| | | caseType: 'å¨å®æç®æ¡ä¾', |
| | | donorName: 'å¼ ä¸', |
| | | idCardNo: '370203198510123456', |
| | | gender: 'ç·', |
| | | age: 38, |
| | | bloodType: 'Aå', |
| | | nation: 'æ±æ', |
| | | address: 'å±±ä¸çéå²å¸å¸ååºé¦æ¸¯ä¸è·¯100å·', |
| | | diagnosis: 'èå¤ä¼¤å¯¼è´èæ»äº¡', |
| | | inpatientNo: 'ZY20240325001', |
| | | departmentName: 'ç¥ç»å¤ç§', |
| | | infectiousDisease: 'æ ', |
| | | reportTime: '2024-03-25 09:30:00', |
| | | status: 'reported', |
| | | statusText: '已䏿¥' |
| | | }) |
| | | // æ°æ® |
| | | const caseDetail = ref({}) |
| | | const loading = ref(false) |
| | | const activeTab = ref('basic') |
| | | const caseId = ref(null) |
| | | |
| | | // éé¡¹å¡ |
| | | const tabs = ref([ |
| | | { id: 'basic', label: 'åºæ¬ä¿¡æ¯' }, |
| | | { id: 'medical', label: 'å»çä¿¡æ¯' }, |
| | | { id: 'process', label: 'æµç¨ä¿¡æ¯' } |
| | | { id: 'contact', label: 'è系信æ¯' }, |
| | | { id: 'transport', label: '转è¿ä¿¡æ¯' } |
| | | ]) |
| | | |
| | | const activeTab = ref('basic') |
| | | // 计ç®å±æ§ |
| | | const hasTransport = computed(() => { |
| | | return caseDetail.value.serviceTransport |
| | | }) |
| | | |
| | | const processSteps = ref([ |
| | | { id: 1, title: 'æ¡ä¾ä¸æ¥', completed: true, time: '2024-03-25 09:30', person: 'æå»ç' }, |
| | | { id: 2, title: 'ä¿¡æ¯å®¡æ ¸', completed: false, time: null, person: null }, |
| | | { id: 3, title: '家屿²é', completed: false, time: null, person: null }, |
| | | { id: 4, title: 'æç®ç¡®è®¤', completed: false, time: null, person: null }, |
| | | { id: 5, title: 'å¨å®è·å', completed: false, time: null, person: null } |
| | | ]) |
| | | const canDelete = computed(() => { |
| | | // å
许å 餿ªå®¡æ¹æå·²é©³åçæ¡ä¾ |
| | | return caseDetail.value.reportStatus === '1' || |
| | | caseDetail.value.reportStatus === '2' || |
| | | caseDetail.value.reportStatus === '4' |
| | | }) |
| | | |
| | | onLoad((options) => { |
| | | onLoad(async (options) => { |
| | | if (options.id) { |
| | | // æ ¹æ®IDå è½½æ¡ä¾è¯¦æ
|
| | | loadCaseDetail(options.id) |
| | | caseId.value = options.id |
| | | // è·ååå
¸æ°æ® |
| | | dict.value = await useDict( |
| | | "sys_user_sex", |
| | | "sys_BloodType", |
| | | "sys_IDType", |
| | | "sys_AgeUnit" |
| | | ) |
| | | // å è½½æ¡ä¾è¯¦æ
|
| | | await loadCaseDetail(options.id) |
| | | } |
| | | }) |
| | | |
| | | // å è½½æ¡ä¾è¯¦æ
|
| | | const loadCaseDetail = async (id) => { |
| | | loading.value = true |
| | | try { |
| | | const res = await uni.$uapi.get(`/project/donatebaseinforeport/getInfo/${id}`) |
| | | |
| | | if (res) { |
| | | caseDetail.value = res |
| | | |
| | | // å¦æç¶ææ¯"已䏿¥"(1)ï¼èªå¨æ´æ°ä¸º"å·²é
读"(2) |
| | | if (caseDetail.value.reportStatus === '1') { |
| | | await updateCaseStatus('2') |
| | | } |
| | | } else { |
| | | throw new Error(res.msg || 'æ°æ®å 载失败') |
| | | } |
| | | } catch (error) { |
| | | console.error('å è½½æ¡ä¾è¯¦æ
失败:', error) |
| | | uni.showToast({ |
| | | title: 'æ°æ®å 载失败ï¼è¯·éè¯', |
| | | icon: 'none' |
| | | }) |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | |
| | | // æ´æ°æ¡ä¾ç¶æ |
| | | const updateCaseStatus = async (newStatus) => { |
| | | try { |
| | | const updateData = { |
| | | ...caseDetail.value, |
| | | reportStatus: newStatus, |
| | | updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19), |
| | | updateBy: 'ç§»å¨ç«¯ç¨æ·' |
| | | } |
| | | |
| | | const res = await uni.$uapi.post("/project/donatebaseinforeport/edit", updateData) |
| | | |
| | | if (res.code === 200) { |
| | | caseDetail.value.reportStatus = newStatus |
| | | } |
| | | } catch (error) { |
| | | console.error('æ´æ°ç¶æå¤±è´¥:', error) |
| | | } |
| | | } |
| | | |
| | | // è·åç¶ææ ·å¼ |
| | | const getStatusClass = (status) => { |
| | | const map = { |
| | | '1': 'reported', |
| | | '2': 'read', |
| | | '3': 'agreed', |
| | | '4': 'rejected' |
| | | } |
| | | return map[status] || 'reported' |
| | | } |
| | | |
| | | // è·åç¶æææ¬ |
| | | const getStatusText = (status) => { |
| | | const map = { |
| | | '1': '已䏿¥', |
| | | '2': 'å·²é
读', |
| | | '3': 'å·²åæ', |
| | | '4': '已驳å' |
| | | } |
| | | return map[status] || '已䏿¥' |
| | | } |
| | | |
| | | // è·åæ§å«ææ¬ |
| | | const getGenderText = (gender) => { |
| | | if (!dict.value.sys_user_sex) return gender |
| | | const genderItem = dict.value.sys_user_sex.find(item => item.dictValue === gender) |
| | | return genderItem ? genderItem.dictLabel : gender |
| | | } |
| | | |
| | | // è·åè¡åææ¬ |
| | | const getBloodTypeText = (bloodType) => { |
| | | if (!dict.value.sys_BloodType) return bloodType |
| | | const bloodTypeItem = dict.value.sys_BloodType.find(item => item.dictValue === bloodType) |
| | | return bloodTypeItem ? bloodTypeItem.dictLabel : bloodType |
| | | } |
| | | |
| | | // è·åå¹´é¾åä½ææ¬ |
| | | const getAgeUnitText = (ageunit) => { |
| | | if (!ageunit) return '' |
| | | const unitMap = { |
| | | 'year': 'å²', |
| | | 'month': '个æ', |
| | | 'day': '天' |
| | | } |
| | | return unitMap[ageunit] || ageunit |
| | | } |
| | | |
| | | // è·å宿´æ·ç±å°å |
| | | const getFullRegisterAddress = () => { |
| | | const { |
| | | registerprovincename, |
| | | registercityname, |
| | | registertownname, |
| | | registercommunityname, |
| | | registeraddress |
| | | } = caseDetail.value |
| | | |
| | | const parts = [ |
| | | registerprovincename, |
| | | registercityname, |
| | | registertownname, |
| | | registercommunityname, |
| | | registeraddress |
| | | ] |
| | | return parts.filter(part => part).join('') |
| | | } |
| | | |
| | | // è·å宿´ç°ä½å°å |
| | | const getFullResidenceAddress = () => { |
| | | const { |
| | | residenceprovincename, |
| | | residencecountyname, |
| | | residencetownname, |
| | | residencecommunityname, |
| | | residenceaddress |
| | | } = caseDetail.value |
| | | |
| | | const parts = [ |
| | | residenceprovincename, |
| | | residencecountyname, |
| | | residencetownname, |
| | | residencecommunityname, |
| | | residenceaddress |
| | | ] |
| | | return parts.filter(part => part).join('') |
| | | } |
| | | |
| | | // è·å转è¿ç¶æææ¬ |
| | | const getTransportStatusText = (status) => { |
| | | const map = { |
| | | 1: 'å¾
转è¿', |
| | | 2: '转è¿ä¸', |
| | | 3: '转è¿å®æ', |
| | | 4: '转è¿åæ¶', |
| | | 5: 'æå' |
| | | } |
| | | return map[status] || 'æªç¥' |
| | | } |
| | | |
| | | // è·å转è¿ç¶ææ ·å¼ |
| | | const getTransportStatusClass = (status) => { |
| | | const map = { |
| | | 1: 'pending', |
| | | 2: 'transporting', |
| | | 3: 'completed', |
| | | 4: 'cancelled', |
| | | 5: 'draft' |
| | | } |
| | | return map[status] || 'pending' |
| | | } |
| | | |
| | | // æ ¼å¼åæ¥ææ¶é´ |
| | | const formatDateTime = (dateTime) => { |
| | | if (!dateTime) return '' |
| | | return dateTime.replace('T', ' ').substring(0, 16) |
| | | } |
| | | |
| | | // é项å¡åæ¢ |
| | | const switchTab = (tabId) => { |
| | | activeTab.value = tabId |
| | | } |
| | | |
| | | // è¿å |
| | | const goBack = () => { |
| | | uni.navigateBack() |
| | | } |
| | | |
| | | const withdrawCase = () => { |
| | | // ç¼è¾æ¡ä¾ |
| | | const handleEdit = () => { |
| | | uni.navigateTo({ |
| | | url: `/pages/case/CaseDetails?id=${caseId.value}&edit=true` |
| | | }) |
| | | } |
| | | |
| | | |
| | | |
| | | // å 餿¡ä¾ |
| | | const handleDelete = () => { |
| | | uni.showModal({ |
| | | title: '确认æ¤å', |
| | | content: 'ç¡®å®è¦æ¤åè¿ä¸ªæç®æ¡ä¾åï¼', |
| | | success: (res) => { |
| | | title: '确认å é¤', |
| | | content: `ç¡®å®è¦å 餿¡ä¾ ${caseDetail.value.caseNo} åï¼`, |
| | | success: async (res) => { |
| | | if (res.confirm) { |
| | | uni.showToast({ title: 'æ¤åæå', icon: 'success' }) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | try { |
| | | const result = await uni.$uapi.delete(`/project/donatebaseinforeport/${caseId.value}`) |
| | | if (result.code === 200) { |
| | | uni.showToast({ title: 'å 餿å', icon: 'success' }) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | } else { |
| | | uni.showToast({ title: result.msg || 'å é¤å¤±è´¥', icon: 'none' }) |
| | | } |
| | | } catch (error) { |
| | | console.error('å é¤å¤±è´¥:', error) |
| | | uni.showToast({ title: 'å é¤å¤±è´¥', icon: 'none' }) |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const contactCoordinator = () => { |
| | | uni.makePhoneCall({ |
| | | phoneNumber: '13800138000' |
| | | // å建转è¿å |
| | | const createTransport = () => { |
| | | if (caseDetail.value.reportStatus !== '3') { |
| | | uni.showToast({ title: 'æ¡ä¾éå
审æ¹åæ', icon: 'none' }) |
| | | return |
| | | } |
| | | |
| | | uni.navigateTo({ |
| | | url: `/pages/transport/create?caseId=${caseId.value}&caseNo=${caseDetail.value.caseNo}` |
| | | }) |
| | | } |
| | | |
| | | const loadCaseDetail = (id) => { |
| | | // 模æAPIè°ç¨ |
| | | console.log('å è½½æ¡ä¾è¯¦æ
:', id) |
| | | // æ¥ç转è¿å详æ
|
| | | const viewTransportDetail = () => { |
| | | if (hasTransport.value && caseDetail.value.serviceTransport[0]) { |
| | | const transport = caseDetail.value.serviceTransport[0] |
| | | uni.navigateTo({ |
| | | url: `/pages/transport/detail?id=${transport.id}` |
| | | }) |
| | | } |
| | | } |
| | | </script> |
| | | |
| | |
| | | min-height: 100vh; |
| | | background: linear-gradient(135deg, #fafdff 0%, #e3f0ff 100%); |
| | | padding: 20rpx; |
| | | padding-bottom: 120rpx; /* 为æä½æ çåºç©ºé´ */ |
| | | } |
| | | |
| | | .header-card { |
| | |
| | | height: 80rpx; |
| | | border-radius: 16rpx; |
| | | margin-right: 20rpx; |
| | | background: #f5f5f7; |
| | | } |
| | | |
| | | .hospital-details { |
| | |
| | | font-weight: 600; |
| | | color: #1d1d1f; |
| | | margin-bottom: 8rpx; |
| | | max-width: 400rpx; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | } |
| | | |
| | | .case-type { |
| | |
| | | &.agreed { |
| | | background: rgba(52, 199, 89, 0.1); |
| | | color: #34c759; |
| | | } |
| | | |
| | | &.rejected { |
| | | background: rgba(255, 59, 48, 0.1); |
| | | color: #ff3b30; |
| | | } |
| | | } |
| | | |
| | |
| | | padding: 8rpx; |
| | | margin-bottom: 30rpx; |
| | | box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.05); |
| | | overflow-x: auto; |
| | | white-space: nowrap; |
| | | |
| | | &::-webkit-scrollbar { |
| | | display: none; |
| | | } |
| | | } |
| | | |
| | | .tab-item { |
| | | flex: 1; |
| | | min-width: 140rpx; |
| | | text-align: center; |
| | | padding: 20rpx; |
| | | font-size: 28rpx; |
| | |
| | | font-size: 28rpx; |
| | | color: #1d1d1f; |
| | | font-weight: 500; |
| | | word-break: break-all; |
| | | } |
| | | } |
| | | |
| | | .info-content { |
| | | .info-group { |
| | | margin-bottom: 32rpx; |
| | | padding-bottom: 20rpx; |
| | | border-bottom: 1rpx solid #f0f0f0; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | padding-bottom: 0; |
| | | border-bottom: none; |
| | | } |
| | | } |
| | | |
| | |
| | | color: #86868b; |
| | | margin-bottom: 12rpx; |
| | | display: block; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | .group-content { |
| | |
| | | } |
| | | } |
| | | |
| | | .process-timeline { |
| | | position: relative; |
| | | padding-left: 40rpx; |
| | | /* 转è¿ä¿¡æ¯æ ·å¼ */ |
| | | .transport-info { |
| | | .info-group { |
| | | border: 2rpx solid #f0f0f0; |
| | | border-radius: 12rpx; |
| | | padding: 20rpx; |
| | | margin-bottom: 20rpx; |
| | | background: #fafafa; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | &::before { |
| | | content: ''; |
| | | position: absolute; |
| | | left: 15rpx; |
| | | top: 0; |
| | | bottom: 0; |
| | | width: 2rpx; |
| | | background: #e5e5e7; |
| | | .sub-group { |
| | | display: flex; |
| | | margin-bottom: 12rpx; |
| | | align-items: center; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | .sub-label { |
| | | font-size: 26rpx; |
| | | color: #606266; |
| | | min-width: 160rpx; |
| | | margin-right: 10rpx; |
| | | } |
| | | |
| | | .sub-value { |
| | | font-size: 26rpx; |
| | | color: #303133; |
| | | flex: 1; |
| | | |
| | | &.status { |
| | | padding: 4rpx 12rpx; |
| | | border-radius: 6rpx; |
| | | font-size: 24rpx; |
| | | |
| | | &.pending { |
| | | background: rgba(240, 173, 78, 0.1); |
| | | color: #f0ad4e; |
| | | } |
| | | |
| | | &.transporting { |
| | | background: rgba(0, 122, 255, 0.1); |
| | | color: #007aff; |
| | | } |
| | | |
| | | &.completed { |
| | | background: rgba(76, 217, 100, 0.1); |
| | | color: #4cd964; |
| | | } |
| | | |
| | | &.cancelled { |
| | | background: rgba(220, 223, 230, 0.1); |
| | | color: #dcdfe6; |
| | | } |
| | | |
| | | &.draft { |
| | | background: rgba(144, 147, 153, 0.1); |
| | | color: #909399; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .empty-transport { |
| | | text-align: center; |
| | | padding: 40rpx 0; |
| | | color: #909399; |
| | | font-size: 28rpx; |
| | | } |
| | | } |
| | | |
| | | .timeline-item { |
| | | position: relative; |
| | | margin-bottom: 40rpx; |
| | | |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | } |
| | | |
| | | .timeline-marker { |
| | | position: absolute; |
| | | left: -40rpx; |
| | | top: 8rpx; |
| | | width: 32rpx; |
| | | height: 32rpx; |
| | | border-radius: 50%; |
| | | background: #e5e5e7; |
| | | border: 4rpx solid #fff; |
| | | box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); |
| | | |
| | | &.active { |
| | | background: #007aff; |
| | | } |
| | | } |
| | | |
| | | .timeline-content { |
| | | padding-bottom: 20rpx; |
| | | } |
| | | |
| | | .step-title { |
| | | display: block; |
| | | font-size: 28rpx; |
| | | font-weight: 600; |
| | | color: #1d1d1f; |
| | | margin-bottom: 8rpx; |
| | | } |
| | | |
| | | .step-time, .step-person { |
| | | display: block; |
| | | /* å°åæé® */ |
| | | .small-btn { |
| | | padding: 8rpx 20rpx; |
| | | font-size: 24rpx; |
| | | color: #86868b; |
| | | margin-bottom: 4rpx; |
| | | border-radius: 6rpx; |
| | | border: none; |
| | | |
| | | &.primary { |
| | | background: #007aff; |
| | | color: #fff; |
| | | } |
| | | |
| | | &.secondary { |
| | | background: #ecf5ff; |
| | | color: #007aff; |
| | | border: 1rpx solid #007aff; |
| | | } |
| | | |
| | | &:active { |
| | | opacity: 0.8; |
| | | } |
| | | } |
| | | |
| | | .action-bar { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | padding: 40rpx 0; |
| | | background: transparent; |
| | | padding: 20rpx 0; |
| | | background: #fff; |
| | | position: fixed; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | padding: 20rpx 30rpx; |
| | | padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); |
| | | box-shadow: 0 -2rpx 20rpx rgba(0, 0, 0, 0.08); |
| | | z-index: 100; |
| | | } |
| | | |
| | | .action-btn { |
| | |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | |
| | | &.success { |
| | | background: linear-gradient(90deg, #34c759 0%, #4cd964 100%); |
| | | color: #fff; |
| | | |
| | | &:active { |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | |
| | | &.error { |
| | | background: linear-gradient(90deg, #ff3b30 0%, #ff5a5a 100%); |
| | | color: #fff; |
| | | |
| | | &:active { |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | } |
| | | |
| | | .fade-in-up { |
| | |
| | | </button> |
| | | |
| | | <!-- é转è¿ä½æªåæ --> |
| | | <button |
| | | <!-- <button |
| | | v-if="caseItem.isTransport == '2' && !hasTransport(caseItem)" |
| | | class="transport-btn disabled" |
| | | disabled |
| | | > |
| | | éå
åææ¡ä¾ |
| | | </button> |
| | | </button> --> |
| | | |
| | | <!-- æè½¬è¿å坿¥ç --> |
| | | <button |
| | |
| | | // 转è¿å¤ææ¹æ³ - ä¸PCç«¯ä¿æä¸è´ |
| | | const hasTransport = (caseData) => { |
| | | console.log(caseData.serviceTransport); |
| | | |
| | | return caseData.serviceTransport; |
| | | return caseData.serviceTransport && caseData.serviceTransport.length > 0; |
| | | }; |
| | | |
| | | const canCreateTransport = (caseData) => { |
| | | return ( |
| | | caseData.status == "3" && // å·²åæ |
| | | (caseData.isTransport == "2" || caseData.isTransport == 2) && // éè¦è½¬è¿ |
| | | (caseData.isTransport != "4" || caseData.isTransport == 2) && // éè¦è½¬è¿ |
| | | !hasTransport(caseData) |
| | | ); // æ 转è¿å |
| | | }; |
| | |
| | | // åæçè½¬è¿æä½æ¹æ³ä¿æä¸å |
| | | const createTransportOrder = (caseItem) => { |
| | | uni.navigateTo({ |
| | | url: `/pages/transport/create?caseId=${caseItem.id}&caseNo=${caseItem.donorNo}`, |
| | | url: `/pages/case/transferinfo?caseId=${caseItem.id}&caseNo=${caseItem.donorNo}`, |
| | | }); |
| | | }; |
| | | |
| | |
| | | if (hasTransport(caseItem)) { |
| | | const transport = caseItem.serviceTransport[0]; |
| | | uni.navigateTo({ |
| | | url: `/pages/transport/detail?orderNo=${transport.id}`, |
| | | url: `/pages/case/transferinfo?id=${transport.id}`, |
| | | }); |
| | | } |
| | | }; |
| | |
| | | try { |
| | | const res = await uni.$uapi.post("/project/donatebaseinforeport/getTotal"); |
| | | stats.value = { |
| | | totalCases: res["1"] || 0, |
| | | totalCases: res["all"] || 0, |
| | | readCases: res["2"] || 0, |
| | | agreedCases: res["3"] || 0, |
| | | }; |
| | |
| | | <view class="header"> |
| | | <view class="case-info"> |
| | | <view class="info"> |
| | | <text class="case-no">{{ item.caseNo }}</text> |
| | | <text class="case-no">{{ item.caseNo || item.reportId }}</text> |
| | | <text class="patient" |
| | | >{{ item.donorName }} | {{ item.gender }} | |
| | | >{{ item.patName }} | {{ getGenderText(item.sex) }} | |
| | | {{ item.age }}å²</text |
| | | > |
| | | </view> |
| | | </view> |
| | | <text class="status" :class="item.status">{{ item.statusText }}</text> |
| | | <text class="status" :class="getStatusClass(item.transitStatus)">{{ |
| | | getStatusText(item.transitStatus) |
| | | }}</text> |
| | | </view> |
| | | |
| | | <view class="detail-info"> |
| | | <view class="info-item"> |
| | | <text class="label">ç¾ç
è¯æ</text> |
| | | <text class="value">{{ item.diagnosis }}</text> |
| | | <text class="value">{{ item.diagnosisname || "æªå¡«å" }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">æå¨å»çæºæ</text> |
| | | <text class="value">{{ item.hospitalName }}</text> |
| | | <text class="value">{{ |
| | | item.treatmentHospitalName || "æªå¡«å" |
| | | }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">计åè½¬è¿æ¶é´</text> |
| | | <text class="value">{{ item.transportTime }}</text> |
| | | <text class="value">{{ formatTime(item.transportStartTime) }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">è´è´£åè°å</text> |
| | | <text class="value">{{ item.coordinator }}</text> |
| | | <text class="value">{{ item.contactPerson || "æªæå®" }}</text> |
| | | </view> |
| | | <view class="info-item"> |
| | | <text class="label">å建æ¶é´</text> |
| | | <text class="value">{{ item.createTime }}</text> |
| | | <text class="value">{{ formatTime(item.createTime) }}</text> |
| | | </view> |
| | | </view> |
| | | |
| | | <view class="footer"> |
| | | <view class="action-info"> |
| | | <text class="label">转è¿ç¶æ</text> |
| | | <text class="transport-status">{{ item.statusText }}</text> |
| | | <text class="transport-status">{{ |
| | | getStatusText(item.transitStatus) |
| | | }}</text> |
| | | </view> |
| | | <view class="actions"> |
| | | <button |
| | | class="action-btn" |
| | | v-if="item.status === 'pending'" |
| | | v-if="item.transitStatus === 1" |
| | | @tap.stop="startTransport(item)" |
| | | > |
| | | å¼å§è½¬è¿ |
| | | </button> |
| | | <button |
| | | class="action-btn" |
| | | v-if="item.status === 'transporting'" |
| | | v-if="item.transitStatus === 2" |
| | | @tap.stop="completeTransport(item)" |
| | | > |
| | | å®æè½¬è¿ |
| | | </button> |
| | | <button |
| | | class="action-btn secondary" |
| | | v-if="item.transitStatus === 1 || item.transitStatus === 5" |
| | | @tap.stop="editTransport(item)" |
| | | > |
| | | ç¼è¾ |
| | |
| | | </view> |
| | | |
| | | <!-- å è½½æ´å¤ --> |
| | | <view class="load-more" v-if="hasMore"> |
| | | <text>å è½½ä¸...</text> |
| | | <view class="load-more" v-if="loading"> |
| | | <u-loading-icon text="å è½½ä¸..."></u-loading-icon> |
| | | </view> |
| | | |
| | | <!-- ç©ºç¶æ --> |
| | | <view class="empty-state" v-if="filteredTransports.length === 0"> |
| | | <view |
| | | class="empty-state" |
| | | v-if="!loading && filteredTransports.length === 0" |
| | | > |
| | | <image src="/static/empty/no-transport.png" mode="aspectFit" /> |
| | | <text>ææ è½¬è¿åè®°å½</text> |
| | | </view> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed } from "vue"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | import { ref, computed, onMounted } from "vue"; |
| | | import { onLoad, onShow } from "@dcloudio/uni-app"; |
| | | import { useDict } from "@/utils/dict"; |
| | | |
| | | // åå
¸æ°æ® |
| | | const dict = ref({}); |
| | | |
| | | // ç»è®¡æ°æ® |
| | | const stats = ref({ |
| | | totalTransports: 12, |
| | | pendingTransports: 4, |
| | | completedTransports: 6, |
| | | totalTransports: 0, |
| | | pendingTransports: 0, |
| | | completedTransports: 0, |
| | | }); |
| | | |
| | | // 转è¿åæ°æ® |
| | | const transports = ref([]); |
| | | const loading = ref(false); |
| | | const refreshing = ref(false); |
| | | const hasMore = ref(true); |
| | | const pageNum = ref(1); |
| | | const pageSize = ref(10); |
| | | |
| | | // æä½ç¡®è®¤å¼¹çªç¸å
³ |
| | | const showActionModal = ref(false); |
| | | const currentTransport = ref({}); |
| | | const modalTitle = ref(""); |
| | | const modalAction = ref(""); |
| | | |
| | | onLoad(async (options) => { |
| | | // åå§åæ°æ® |
| | | loadTransports(); |
| | | }); |
| | | |
| | | // çéç¸å
³ |
| | | const transportTypes = [ |
| | | { label: "å
¨é¨", value: "all" }, |
| | | { label: "å¾
åºå", value: "pending" }, |
| | | { label: "转è¿ä¸", value: "transporting" }, |
| | | { label: "已宿", value: "completed" }, |
| | | { label: "已忶", value: "cancelled" }, |
| | | { label: "å
¨é¨", value: "" }, |
| | | { label: "å¾
转è¿", value: 1 }, |
| | | { label: "转è¿ä¸", value: 2 }, |
| | | { label: "已宿", value: 3 }, |
| | | { label: "已忶", value: 4 }, |
| | | { label: "æå", value: 5 }, |
| | | ]; |
| | | const currentType = ref("all"); |
| | | const currentType = ref(""); |
| | | const startDate = ref(""); |
| | | const endDate = ref(""); |
| | | |
| | | // 转è¿åæ°æ® |
| | | const transports = ref([ |
| | | { |
| | | id: "T20241217001", |
| | | caseNo: "DON20241216001", |
| | | donorName: "å¼ ä¸", |
| | | gender: "ç·", |
| | | age: 38, |
| | | diagnosis: "èå¤ä¼¤å¯¼è´èæ»äº¡", |
| | | hospitalName: "éå²éæ¹å»é¢", |
| | | transportTime: "2024-12-17 14:30", |
| | | coordinator: "å¼ å»ç", |
| | | createTime: "2024-12-16 09:30", |
| | | status: "pending", |
| | | statusText: "å¾
åºå", |
| | | departureLocation: "éå²å¸ç«å»é¢æ¥è¯ç§", |
| | | destinationHospital: "éå²éæ¹å»é¢", |
| | | }, |
| | | { |
| | | id: "T20241217002", |
| | | caseNo: "DON20241216002", |
| | | donorName: "æå", |
| | | gender: "女", |
| | | age: 45, |
| | | diagnosis: "èæ¢æ»", |
| | | hospitalName: "éå²å¤§å¦éå±å»é¢", |
| | | transportTime: "2024-12-17 16:00", |
| | | coordinator: "æå»ç", |
| | | createTime: "2024-12-16 11:20", |
| | | status: "transporting", |
| | | statusText: "转è¿ä¸", |
| | | departureLocation: "éå²å¤§å¦éå±å»é¢ICU", |
| | | destinationHospital: "éå²å¨å®ç§»æ¤ä¸å¿", |
| | | }, |
| | | { |
| | | id: "T20241216003", |
| | | caseNo: "DON20241215001", |
| | | donorName: "çäº", |
| | | gender: "ç·", |
| | | age: 52, |
| | | diagnosis: "å¿è骤å", |
| | | hospitalName: "éå²å¸ç«å»é¢", |
| | | transportTime: "2024-12-16 10:15", |
| | | coordinator: "çå»ç", |
| | | createTime: "2024-12-15 14:45", |
| | | status: "completed", |
| | | statusText: "已宿", |
| | | departureLocation: "éå²å¸ç«å»é¢å¿å
ç§", |
| | | destinationHospital: "éå²å¨å®ç§»æ¤ä¸å¿", |
| | | }, |
| | | { |
| | | id: "T20241216004", |
| | | caseNo: "DON20241214001", |
| | | donorName: "èµµå
", |
| | | gender: "女", |
| | | age: 29, |
| | | diagnosis: "æ¥æ§èè¡°ç«", |
| | | hospitalName: "éå²ç§å¤§å»é¢", |
| | | transportTime: "2024-12-16 08:30", |
| | | coordinator: "èµµå»ç", |
| | | createTime: "2024-12-14 16:20", |
| | | status: "cancelled", |
| | | statusText: "已忶", |
| | | departureLocation: "éå²ç§å¤§å»é¢æ¶åç§", |
| | | destinationHospital: "éå²å¨å®ç§»æ¤ä¸å¿", |
| | | }, |
| | | ]); |
| | | onLoad(async (options) => { |
| | | // è·ååå
¸æ°æ® |
| | | dict.value = await useDict("sys_user_sex"); |
| | | // åå§åæ°æ® |
| | | loadTransports(); |
| | | // å è½½ç»è®¡æ°æ® |
| | | loadStats(); |
| | | }); |
| | | |
| | | onShow(() => { |
| | | // æ£æ¥æ¯å¦æè½¬è¿ç¶ææ´æ° |
| | | const update = uni.getStorageSync("transportStatusUpdate"); |
| | | if (update) { |
| | | handleStatusUpdate(update); |
| | | uni.removeStorageSync("transportStatusUpdate"); |
| | | } |
| | | }); |
| | | |
| | | // æ°æ®æ å°å½æ° |
| | | const mapApiDataToTransportItem = (apiData) => { |
| | | return { |
| | | id: apiData.id, |
| | | reportId: apiData.reportId, |
| | | caseNo: apiData.caseNo, |
| | | patName: apiData.patName, |
| | | sex: apiData.sex, |
| | | age: apiData.age, |
| | | diagnosisname: apiData.diagnosisname, |
| | | treatmentHospitalName: apiData.treatmentHospitalName, |
| | | transportStartTime: apiData.transportStartTime, |
| | | contactPerson: apiData.contactPerson, |
| | | createTime: apiData.createTime, |
| | | transitStatus: apiData.transitStatus, |
| | | // 廿¤äººåä¿¡æ¯ |
| | | doctor: apiData.doctor, |
| | | nurse: apiData.nurse, |
| | | driver: apiData.driver, |
| | | // å
¶ä»å段 |
| | | transportStartPlace: apiData.transportStartPlace, |
| | | remark: apiData.remark, |
| | | }; |
| | | }; |
| | | |
| | | // çéè®°å½ |
| | | const filteredTransports = computed(() => { |
| | | let result = transports.value; |
| | | |
| | | // ç¶æçé |
| | | if (currentType.value !== "all") { |
| | | result = result.filter((item) => item.status === currentType.value); |
| | | if (currentType.value !== "") { |
| | | result = result.filter((item) => item.transitStatus === currentType.value); |
| | | } |
| | | |
| | | // æ¥æçé |
| | | if (startDate.value && endDate.value) { |
| | | result = result.filter((item) => { |
| | | const transportDate = item.createTime.split(" ")[0]; |
| | | const transportDate = item.createTime |
| | | ? item.createTime.split(" ")[0] |
| | | : ""; |
| | | return transportDate >= startDate.value && transportDate <= endDate.value; |
| | | }); |
| | | } |
| | |
| | | return result; |
| | | }); |
| | | |
| | | // å页ç¸å
³ |
| | | const hasMore = ref(true); |
| | | const refreshing = ref(false); |
| | | // è·åç¶ææ ·å¼ |
| | | const getStatusClass = (status) => { |
| | | const map = { |
| | | 1: "pending", // å¾
è½¬è¿ |
| | | 2: "transporting", // 转è¿ä¸ |
| | | 3: "completed", // 已宿 |
| | | 4: "cancelled", // 已忶 |
| | | 5: "cancelled", // æå |
| | | }; |
| | | return map[status] || "pending"; |
| | | }; |
| | | |
| | | // è·åç¶æææ¬ |
| | | const getStatusText = (status) => { |
| | | const map = { |
| | | 1: "å¾
åºå", |
| | | 2: "转è¿ä¸", |
| | | 3: "已宿", |
| | | 4: "已忶", |
| | | 5: "æå", |
| | | }; |
| | | return map[status] || "æªç¥"; |
| | | }; |
| | | |
| | | // è·åæ§å«ææ¬ |
| | | const getGenderText = (gender) => { |
| | | if (!gender) return "æªç¥"; |
| | | if (!dict.value.sys_user_sex) return gender; |
| | | const genderItem = dict.value.sys_user_sex.find( |
| | | (item) => item.dictValue === gender, |
| | | ); |
| | | return genderItem ? genderItem.dictLabel : gender; |
| | | }; |
| | | |
| | | // æ ¼å¼åæ¶é´ |
| | | const formatTime = (timeStr) => { |
| | | if (!timeStr) return "æªè®¾ç½®"; |
| | | return timeStr.replace("T", " ").substring(0, 16); |
| | | }; |
| | | |
| | | // éæ©ç±»å |
| | | const selectType = (type) => { |
| | |
| | | |
| | | // æ¥ç详æ
|
| | | const viewDetail = (item) => { |
| | | viewDetails(item); |
| | | }; |
| | | |
| | | // æ¥ç详æ
|
| | | const viewDetails = (item) => { |
| | | uni.navigateTo({ |
| | | url: `/pages/transport/detail?id=${item.id}`, |
| | | }); |
| | | }; |
| | | |
| | | // ç¼è¾è½¬è¿å |
| | | const editTransport = (item) => { |
| | | uni.navigateTo({ |
| | | url: `/pages/transport/detail?id=${item.id}&edit=true`, |
| | | }); |
| | | }; |
| | | |
| | |
| | | }; |
| | | |
| | | // 确认æä½ |
| | | const confirmAction = () => { |
| | | const index = transports.value.findIndex( |
| | | (item) => item.id === currentTransport.value.id |
| | | ); |
| | | if (index !== -1) { |
| | | const confirmAction = async () => { |
| | | try { |
| | | if (modalAction.value === "å¼å§") { |
| | | transports.value[index].status = "transporting"; |
| | | transports.value[index].statusText = "转è¿ä¸"; |
| | | stats.value.pendingTransports -= 1; |
| | | await updateTransportStatus(2, "å¼å§è½¬è¿"); |
| | | } else if (modalAction.value === "宿") { |
| | | transports.value[index].status = "completed"; |
| | | transports.value[index].statusText = "已宿"; |
| | | stats.value.completedTransports += 1; |
| | | await updateTransportStatus(3, "å®æè½¬è¿"); |
| | | } |
| | | |
| | | uni.showToast({ |
| | | title: `${modalAction.value}æå`, |
| | | icon: "success", |
| | | }); |
| | | } catch (error) { |
| | | console.error(`${modalAction.value}失败:`, error); |
| | | uni.showToast({ |
| | | title: `${modalAction.value}失败ï¼è¯·éè¯`, |
| | | icon: "none", |
| | | }); |
| | | } finally { |
| | | showActionModal.value = false; |
| | | } |
| | | showActionModal.value = false; |
| | | }; |
| | | |
| | | // åæ¶æä½ |
| | |
| | | showActionModal.value = false; |
| | | }; |
| | | |
| | | // æ¥ç详æ
|
| | | const viewDetails = (item) => { |
| | | uni.navigateTo({ |
| | | url: `/pages/case/transferinfo?id=${item.id}`, |
| | | }); |
| | | }; |
| | | |
| | | // ç¼è¾è½¬è¿å |
| | | const editTransport = (item) => { |
| | | uni.navigateTo({ |
| | | url: `/pages/case/transferinfo?id=${item.id}`, |
| | | }); |
| | | }; |
| | | |
| | | // 䏿巿° |
| | | const onRefresh = () => { |
| | | refreshing.value = true; |
| | | pageNum.value = 1; |
| | | loadTransports(); |
| | | loadStats(); |
| | | setTimeout(() => { |
| | | refreshing.value = false; |
| | | }, 1000); |
| | |
| | | |
| | | // å è½½æ´å¤ |
| | | const onLoadMore = () => { |
| | | if (!hasMore.value) return; |
| | | if (!hasMore.value || loading.value) return; |
| | | pageNum.value++; |
| | | loadTransports(); |
| | | }; |
| | | |
| | | // å è½½è®°å½ |
| | | const loadTransports = async () => { |
| | | if (loading.value) return; |
| | | |
| | | // è¿éè°ç¨APIå è½½æ°æ® |
| | | setTimeout(() => { |
| | | hasMore.value = false; |
| | | }, 1000); |
| | | loading.value = true; |
| | | try { |
| | | const params = { |
| | | pageNum: pageNum.value, |
| | | pageSize: pageSize.value, |
| | | }; |
| | | |
| | | if (currentType.value) { |
| | | params.transitStatus = currentType.value; |
| | | } |
| | | |
| | | if (startDate.value && endDate.value) { |
| | | params.startDate = startDate.value; |
| | | params.endDate = endDate.value; |
| | | } |
| | | |
| | | const res = await uni.$uapi.post("/project/transport/list", params); |
| | | |
| | | if (res) { |
| | | const data = res || []; |
| | | const mappedData = data.map((item) => mapApiDataToTransportItem(item)); |
| | | |
| | | if (pageNum.value === 1) { |
| | | transports.value = mappedData; |
| | | } else { |
| | | transports.value = [...transports.value, ...mappedData]; |
| | | } |
| | | |
| | | hasMore.value = (res.rows || []).length >= pageSize.value; |
| | | } else { |
| | | throw new Error(res.msg || "å 载失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error("å 载转è¿åå表失败:", error); |
| | | uni.showToast({ |
| | | title: "ç½ç»è¯·æ±å¤±è´¥", |
| | | icon: "none", |
| | | }); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | }; |
| | | |
| | | // å è½½ç»è®¡æ°æ® |
| | | const loadStats = async () => { |
| | | try { |
| | | const res = await uni.$uapi.post("/api/totalServiceTransportState"); |
| | | if (res) { |
| | | stats.value = { |
| | | totalTransports: res.reduce((sum, item) => sum + item.count, 0) || 0, |
| | | pendingTransports: res[0].count || 0, |
| | | completedTransports: res[3].count || 0, |
| | | }; |
| | | } |
| | | } catch (error) { |
| | | console.error("å è½½ç»è®¡å¤±è´¥:", error); |
| | | } |
| | | }; |
| | | |
| | | // æ´æ°è½¬è¿ç¶æ |
| | | const updateTransportStatus = async (newStatus, actionName) => { |
| | | try { |
| | | const updateData = { |
| | | id: currentTransport.value.id, |
| | | transitStatus: newStatus, |
| | | }; |
| | | |
| | | const res = await uni.$uapi.post("/project/transport/edit", updateData); |
| | | |
| | | if (res.code === 200) { |
| | | // æ´æ°æ¬å°æ°æ® |
| | | const index = transports.value.findIndex( |
| | | (item) => item.id === currentTransport.value.id, |
| | | ); |
| | | if (index !== -1) { |
| | | transports.value[index].transitStatus = newStatus; |
| | | } |
| | | |
| | | // æ´æ°ç»è®¡æ°æ® |
| | | await loadStats(); |
| | | |
| | | // åå¨ç¶ææ´æ° |
| | | uni.setStorageSync("transportStatusUpdate", { |
| | | orderId: currentTransport.value.id, |
| | | status: newStatus, |
| | | }); |
| | | |
| | | return true; |
| | | } else { |
| | | throw new Error(res.msg || `${actionName}失败`); |
| | | } |
| | | } catch (error) { |
| | | console.error(`${actionName}失败:`, error); |
| | | throw error; |
| | | } |
| | | }; |
| | | |
| | | // å¤çç¶ææ´æ° |
| | | const handleStatusUpdate = (update) => { |
| | | const index = transports.value.findIndex( |
| | | (item) => item.id === update.orderId, |
| | | ); |
| | | if (index !== -1) { |
| | | transports.value[index].transitStatus = update.status; |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | /* ä¿æåææ ·å¼å®å
¨ä¸å */ |
| | | .transport-record { |
| | | min-height: 100vh; |
| | | background: linear-gradient(135deg, #fafdff 0%, #e3f0ff 100%); |
| | |
| | | <!-- 表åå
容 --> |
| | | <scroll-view scroll-y class="form-scroll" :show-scrollbar="false"> |
| | | <view class="form-content"> |
| | | <!-- æ¡ä¾ä¿¡æ¯å¡ç --> |
| | | <view class="form-section" v-if="transportData.caseNo"> |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title">å
³èæ¡ä¾ä¿¡æ¯</text> |
| | | </view> |
| | | |
| | | <view class="case-info"> |
| | | <view class="info-row"> |
| | | <text class="info-label">æ¡ä¾ç¼å·:</text> |
| | | <text class="info-value">{{ transportData.caseNo }}</text> |
| | | </view> |
| | | <view class="info-row"> |
| | | <text class="info-label">æ£è
å§å:</text> |
| | | <text class="info-value">{{ transportData.patName }}</text> |
| | | </view> |
| | | <view class="info-row"> |
| | | <text class="info-label">æ§å«/å¹´é¾:</text> |
| | | <text class="info-value" |
| | | >{{ getGenderText(transportData.sex) }} / |
| | | {{ transportData.age }}å²</text |
| | | > |
| | | </view> |
| | | <view class="info-row"> |
| | | <text class="info-label">ç¾ç
è¯æ:</text> |
| | | <text class="info-value">{{ transportData.diagnosisname }}</text> |
| | | </view> |
| | | <view class="info-row"> |
| | | <text class="info-label">æ²»çå»é¢:</text> |
| | | <text class="info-value">{{ |
| | | transportData.treatmentHospitalName |
| | | }}</text> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- åºç¡ä¿¡æ¯å¡ç --> |
| | | <view class="form-section"> |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title">åºç¡ä¿¡æ¯</text> |
| | | </view> |
| | | |
| | | <view class="form-grid"> |
| | | <view class="form-item"> |
| | | <text class="item-label required">æ¡ä¾éæ©</text> |
| | | <u-input |
| | | v-model="form.caseInfo.donorName" |
| | | placeholder="éæ©æ¡ä¾" |
| | | readonly |
| | | border="none" |
| | | @click="showCasePicker = true" |
| | | :customStyle="inputStyle(!form.caseInfo.caseId)" |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label required">æç®å»é¢</text> |
| | | <u-input |
| | | v-model="form.hospital" |
| | | placeholder="请è¾å
¥æç®å»é¢" |
| | | border="none" |
| | | :customStyle="inputStyle(!form.hospital)" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">ç§å®¤</text> |
| | | <u-input |
| | | v-model="form.department" |
| | | placeholder="请è¾å
¥ç§å®¤" |
| | | border="none" |
| | | /> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title">转è¿åä¿¡æ¯</text> |
| | | <!-- ç¶ææ ç¾ --> |
| | | <view |
| | | class="status-tag" |
| | | :class="getTransportStatusClass(transportData.transitStatus)" |
| | | > |
| | | {{ getTransportStatusText(transportData.transitStatus) }} |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 转è¿ä¿¡æ¯å¡ç --> |
| | | <view class="form-section"> |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title">转è¿ä¿¡æ¯</text> |
| | | </view> |
| | | |
| | | <view class="form-grid"> |
| | | <view class="form-item"> |
| | | <text class="item-label">转è¿åå·</text> |
| | | <u-input |
| | | v-model="transportData.reportId" |
| | | placeholder="èªå¨çæ" |
| | | disabled |
| | | :disabledColor="disabledColor" |
| | | border="none" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label required">åºåå°ç¹</text> |
| | | <u-input |
| | | v-model="transportData.transportStartPlace" |
| | | placeholder="请è¾å
¥åºåå°ç¹" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | :customStyle="inputStyle(!transportData.transportStartPlace)" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label required">åºåæ¶é´</text> |
| | | <u-input |
| | | v-model="form.departureTime" |
| | | v-model="transportData.transportStartTime" |
| | | placeholder="è¯·éæ©åºåæ¶é´" |
| | | readonly |
| | | border="none" |
| | | @click="showTimePicker = true" |
| | | :customStyle="inputStyle(!form.departureTime)" |
| | | :disabled="!isEdit" |
| | | @click="isEdit && (showTimePicker = true)" |
| | | :customStyle="inputStyle(!transportData.transportStartTime)" |
| | | > |
| | | <template #suffix> |
| | | <template #suffix v-if="isEdit"> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | </view> |
| | | |
| | | <view class="form-item full-width"> |
| | | <text class="item-label">åºåå°ç¹</text> |
| | | <u-textarea |
| | | v-model="form.departureLocation" |
| | | placeholder="请è¾å
¥åºåå°ç¹è¯¦ç»å°å" |
| | | count |
| | | maxlength="200" |
| | | height="120" |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">转è¿ç¶æ</text> |
| | | <u-select |
| | | v-model="statusSelectVisible" |
| | | :list="statusOptions" |
| | | :default-value="[statusIndex]" |
| | | :confirm-text="'ç¡®å®'" |
| | | :cancel-text="'åæ¶'" |
| | | @confirm="onStatusConfirm" |
| | | :disabled="!isEdit" |
| | | > |
| | | <template #default> |
| | | <view class="picker-trigger"> |
| | | <text>{{ |
| | | getTransportStatusText(transportData.transitStatus) |
| | | }}</text> |
| | | <u-icon |
| | | v-if="isEdit" |
| | | name="arrow-down" |
| | | size="16" |
| | | color="#999" |
| | | ></u-icon> |
| | | </view> |
| | | </template> |
| | | </u-select> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label required">è´è´£åè°å</text> |
| | | <u-input |
| | | v-model="transportData.contactPerson" |
| | | placeholder="请è¾å
¥åè°åå§å" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | :customStyle="inputStyle(!transportData.contactPerson)" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">æµè¾¾å»é¢</text> |
| | | |
| | | <view class="form-item" v-if="transportData.createTime"> |
| | | <text class="item-label">å建æ¶é´</text> |
| | | <u-input |
| | | v-model="form.destinationHospital" |
| | | placeholder="请è¾å
¥æµè¾¾å»é¢" |
| | | v-model="transportData.createTime" |
| | | placeholder="èªå¨çæ" |
| | | disabled |
| | | :disabledColor="disabledColor" |
| | | border="none" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item" v-if="transportData.createBy"> |
| | | <text class="item-label">å建人</text> |
| | | <u-input |
| | | v-model="transportData.createBy" |
| | | placeholder="èªå¨è·å" |
| | | disabled |
| | | :disabledColor="disabledColor" |
| | | border="none" |
| | | /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- å¢éæåå¡ç --> |
| | | <!-- 廿¤äººåä¿¡æ¯ --> |
| | | <view class="form-section"> |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð¥</view> |
| | | <text class="section-title">å¢éæå</text> |
| | | <text class="section-title">廿¤äººåä¿¡æ¯</text> |
| | | </view> |
| | | |
| | | |
| | | <view class="form-grid"> |
| | | <view class="form-item"> |
| | | <text class="item-label">åè°å</text> |
| | | <u-input |
| | | v-model="form.coordinator.name" |
| | | placeholder="éæ©åè°å" |
| | | readonly |
| | | border="none" |
| | | @click="showCoordinatorPicker = true" |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">æ¥è¯ç§å»ç</text> |
| | | <u-input |
| | | v-model="form.emergencyDoctor.name" |
| | | placeholder="éæ©æ¥è¯ç§å»ç" |
| | | readonly |
| | | v-model="transportData.doctor" |
| | | placeholder="请è¾å
¥æ¥è¯ç§å»ç" |
| | | border="none" |
| | | @click="showDoctorPicker = true" |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">å»ççµè¯</text> |
| | | <u-input |
| | | v-model="transportData.doctorPhone" |
| | | placeholder="请è¾å
¥å»çææºå·" |
| | | type="number" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">æ¤å£«</text> |
| | | <u-input |
| | | v-model="form.nurse.name" |
| | | placeholder="éæ©æ¤å£«" |
| | | readonly |
| | | v-model="transportData.nurse" |
| | | placeholder="请è¾å
¥æ¤å£«å§å" |
| | | border="none" |
| | | @click="showNursePicker = true" |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">叿º</text> |
| | | <text class="item-label">æ¤å£«çµè¯</text> |
| | | <u-input |
| | | v-model="form.driver.name" |
| | | placeholder="鿩叿º" |
| | | readonly |
| | | v-model="transportData.nursePhone" |
| | | placeholder="请è¾å
¥æ¤å£«ææºå·" |
| | | type="number" |
| | | border="none" |
| | | @click="showDriverPicker = true" |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">驾驶å</text> |
| | | <u-input |
| | | v-model="transportData.driver" |
| | | placeholder="请è¾å
¥é©¾é©¶åå§å" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">驾驶åçµè¯</text> |
| | | <u-input |
| | | v-model="transportData.driverPhone" |
| | | placeholder="请è¾å
¥é©¾é©¶åææºå·" |
| | | type="number" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | |
| | | <view class="form-item"> |
| | | <text class="item-label">ICUè¯ä¼°å»ç</text> |
| | | <u-input |
| | | v-model="form.icuDoctor.name" |
| | | placeholder="éæ©ICUè¯ä¼°å»ç" |
| | | readonly |
| | | v-model="transportData.icuDoctor" |
| | | placeholder="请è¾å
¥ICUè¯ä¼°å»ç" |
| | | border="none" |
| | | @click="showIcuDoctorPicker = true" |
| | | > |
| | | <template #suffix> |
| | | <u-icon name="arrow-down" color="#86868b"></u-icon> |
| | | </template> |
| | | </u-input> |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- èç³»æ¹å¼å¡ç --> |
| | | <view class="form-section"> |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title">èç³»æ¹å¼</text> |
| | | </view> |
| | | |
| | | <view class="form-grid"> |
| | | <view class="form-item" v-for="(contact, index) in form.contacts" :key="index"> |
| | | <text class="item-label">{{ contact.role }}</text> |
| | | <view class="form-item"> |
| | | <text class="item-label">ICUå»ççµè¯</text> |
| | | <u-input |
| | | v-model="contact.phone" |
| | | placeholder="请è¾å
¥èç³»çµè¯" |
| | | border="none" |
| | | v-model="transportData.icuDoctorPhone" |
| | | placeholder="请è¾å
¥ICUå»çææºå·" |
| | | type="number" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | /> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 夿³¨ä¿¡æ¯å¡ç --> |
| | | <!-- éä»¶ä¿¡æ¯ --> |
| | | <view |
| | | class="form-section" |
| | | v-if=" |
| | | transportData.annexfilesList && |
| | | transportData.annexfilesList.length > 0 |
| | | " |
| | | > |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title" |
| | | >éä»¶ä¿¡æ¯ ({{ transportData.annexfilesList.length }})</text |
| | | > |
| | | </view> |
| | | |
| | | <view class="attachment-list"> |
| | | <view |
| | | v-for="(file, index) in transportData.annexfilesList" |
| | | :key="index" |
| | | class="attachment-item" |
| | | @click="previewFile(file)" |
| | | > |
| | | <view class="file-info"> |
| | | <u-icon |
| | | name="file-text" |
| | | color="#409EFF" |
| | | size="20" |
| | | class="file-icon" |
| | | ></u-icon> |
| | | <view class="file-details"> |
| | | <text class="file-name">{{ file.fileName }}</text> |
| | | <text class="file-time">{{ |
| | | formatTime(file.createTime) |
| | | }}</text> |
| | | </view> |
| | | </view> |
| | | <u-icon name="arrow-right" color="#999" size="16"></u-icon> |
| | | </view> |
| | | </view> |
| | | </view> |
| | | |
| | | <!-- 夿³¨ä¿¡æ¯ --> |
| | | <view class="form-section"> |
| | | <view class="section-header"> |
| | | <view class="section-icon">ð</view> |
| | | <text class="section-title">夿³¨ä¿¡æ¯</text> |
| | | </view> |
| | | |
| | | |
| | | <view class="form-grid"> |
| | | <view class="form-item full-width"> |
| | | <u-textarea |
| | | v-model="form.remarks" |
| | | placeholder="请è¾å
¥ç¹æ®è¦æ±æå¤æ³¨ä¿¡æ¯" |
| | | count |
| | | v-model="transportData.remark" |
| | | placeholder="请è¾å
¥å¤æ³¨ä¿¡æ¯" |
| | | border="none" |
| | | :readonly="!isEdit" |
| | | :count="isEdit" |
| | | maxlength="500" |
| | | height="200" |
| | | height="150" |
| | | /> |
| | | </view> |
| | | </view> |
| | |
| | | |
| | | <!-- æä½æé® --> |
| | | <view class="action-buttons"> |
| | | <u-button class="btn secondary" @click="handleCancel">åæ¶</u-button> |
| | | <u-button class="btn primary" @click="handleSaveDraft">ä¿åè稿</u-button> |
| | | <u-button class="btn success" @click="handleSubmit" :disabled="!isFormValid">æäº¤ç³è¯·</u-button> |
| | | <!-- æ¥çæ¨¡å¼ --> |
| | | <template v-if="!isEdit"> |
| | | <u-button class="btn secondary" @click="goBack">è¿å</u-button> |
| | | <u-button v-if="canEdit" class="btn primary" @click="handleEdit"> |
| | | ç¼è¾ |
| | | </u-button> |
| | | <u-button |
| | | v-if="canStartTransport" |
| | | class="btn warning" |
| | | @click="handleStartTransport" |
| | | > |
| | | å¼å§è½¬è¿ |
| | | </u-button> |
| | | <u-button |
| | | v-if="canCompleteTransport" |
| | | class="btn success" |
| | | @click="handleCompleteTransport" |
| | | > |
| | | å®æè½¬è¿ |
| | | </u-button> |
| | | <u-button v-if="canDelete" class="btn error" @click="handleDelete"> |
| | | å é¤ |
| | | </u-button> |
| | | </template> |
| | | |
| | | <!-- ç¼è¾æ¨¡å¼ --> |
| | | <template v-else> |
| | | <u-button class="btn secondary" @click="cancelEdit">åæ¶</u-button> |
| | | <u-button |
| | | class="btn success" |
| | | @click="handleSave" |
| | | :disabled="!isFormValid" |
| | | :loading="saving" |
| | | > |
| | | ä¿å |
| | | </u-button> |
| | | </template> |
| | | </view> |
| | | </view> |
| | | </scroll-view> |
| | | |
| | | <!-- éæ©å¨ç»ä»¶ --> |
| | | <u-picker |
| | | :show="showCasePicker" |
| | | :columns="[caseOptions]" |
| | | keyName="label" |
| | | @confirm="onCaseConfirm" |
| | | @cancel="showCasePicker = false" |
| | | title="éæ©æ¡ä¾" |
| | | ></u-picker> |
| | | |
| | | <!-- æ¶é´éæ©å¨ --> |
| | | <u-datetime-picker |
| | | :show="showTimePicker" |
| | | v-model="departureTimeValue" |
| | |
| | | title="éæ©åºåæ¶é´" |
| | | ></u-datetime-picker> |
| | | |
| | | <u-picker |
| | | :show="showCoordinatorPicker" |
| | | :columns="[coordinatorOptions]" |
| | | keyName="label" |
| | | @confirm="onCoordinatorConfirm" |
| | | @cancel="showCoordinatorPicker = false" |
| | | title="éæ©åè°å" |
| | | ></u-picker> |
| | | |
| | | <u-picker |
| | | :show="showDoctorPicker" |
| | | :columns="[doctorOptions]" |
| | | keyName="label" |
| | | @confirm="onDoctorConfirm" |
| | | @cancel="showDoctorPicker = false" |
| | | title="éæ©æ¥è¯ç§å»ç" |
| | | ></u-picker> |
| | | |
| | | <u-picker |
| | | :show="showNursePicker" |
| | | :columns="[nurseOptions]" |
| | | keyName="label" |
| | | @confirm="onNurseConfirm" |
| | | @cancel="showNursePicker = false" |
| | | title="éæ©æ¤å£«" |
| | | ></u-picker> |
| | | |
| | | <u-picker |
| | | :show="showDriverPicker" |
| | | :columns="[driverOptions]" |
| | | keyName="label" |
| | | @confirm="onDriverConfirm" |
| | | @cancel="showDriverPicker = false" |
| | | title="鿩叿º" |
| | | ></u-picker> |
| | | |
| | | <u-picker |
| | | :show="showIcuDoctorPicker" |
| | | :columns="[icuDoctorOptions]" |
| | | keyName="label" |
| | | @confirm="onIcuDoctorConfirm" |
| | | @cancel="showIcuDoctorPicker = false" |
| | | title="éæ©ICUè¯ä¼°å»ç" |
| | | ></u-picker> |
| | | |
| | | <!-- å è½½ç¶æ --> |
| | | <u-loading-icon :show="loading" text="æäº¤ä¸..."></u-loading-icon> |
| | | <u-loading-icon :show="loading" :text="loadingText"></u-loading-icon> |
| | | </view> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, onMounted } from 'vue' |
| | | import { onLoad } from '@dcloudio/uni-app' |
| | | import { ref, computed, onMounted } from "vue"; |
| | | import { onLoad } from "@dcloudio/uni-app"; |
| | | |
| | | // è¡¨åæ°æ® |
| | | const form = reactive({ |
| | | caseInfo: { |
| | | caseId: '', |
| | | donorName: '', |
| | | gender: '', |
| | | age: '', |
| | | diagnosis: '' |
| | | }, |
| | | hospital: '', |
| | | department: '', |
| | | departureTime: '', |
| | | departureLocation: '', |
| | | destinationHospital: '', |
| | | coordinator: { id: '', name: '' }, |
| | | emergencyDoctor: { id: '', name: '' }, |
| | | nurse: { id: '', name: '' }, |
| | | driver: { id: '', name: '' }, |
| | | icuDoctor: { id: '', name: '' }, |
| | | contacts: [ |
| | | { role: 'åè°åçµè¯', phone: '' }, |
| | | { role: 'æ¥è¯å»ççµè¯', phone: '' }, |
| | | { role: 'æ¤å£«çµè¯', phone: '' }, |
| | | { role: '叿ºçµè¯', phone: '' }, |
| | | { role: 'ICUå»ççµè¯', phone: '' } |
| | | ], |
| | | remarks: '' |
| | | }) |
| | | // åå
¸æ°æ® |
| | | const dict = ref({}); |
| | | |
| | | // éæ©å¨ç¶æ |
| | | const showCasePicker = ref(false) |
| | | const showTimePicker = ref(false) |
| | | const showCoordinatorPicker = ref(false) |
| | | const showDoctorPicker = ref(false) |
| | | const showNursePicker = ref(false) |
| | | const showDriverPicker = ref(false) |
| | | const showIcuDoctorPicker = ref(false) |
| | | const departureTimeValue = ref(0) |
| | | // æ°æ® |
| | | const transportData = ref({}); |
| | | const loading = ref(false); |
| | | const saving = ref(false); |
| | | const isEdit = ref(false); |
| | | const transportId = ref(null); |
| | | const showTimePicker = ref(false); |
| | | const departureTimeValue = ref(0); |
| | | const statusSelectVisible = ref(false); |
| | | |
| | | // éé¡¹æ°æ® |
| | | const caseOptions = ref([ |
| | | { |
| | | label: 'å¼ ä¸ - èå¤ä¼¤å¯¼è´èæ»äº¡ - éå²éæ¹å»é¢', |
| | | value: 'DON20241216001', |
| | | data: { |
| | | donorName: 'å¼ ä¸', |
| | | gender: 'ç·', |
| | | age: '38', |
| | | diagnosis: 'èå¤ä¼¤å¯¼è´èæ»äº¡', |
| | | hospital: 'éå²éæ¹å»é¢' |
| | | } |
| | | }, |
| | | { |
| | | label: 'æå - èæ¢æ» - éå²å¤§å¦éå±å»é¢', |
| | | value: 'DON20241216002', |
| | | data: { |
| | | donorName: 'æå', |
| | | gender: '女', |
| | | age: '45', |
| | | diagnosis: 'èæ¢æ»', |
| | | hospital: 'éå²å¤§å¦éå±å»é¢' |
| | | } |
| | | } |
| | | ]) |
| | | // åå
¸é项 |
| | | const statusOptions = ref([ |
| | | { label: "å¾
转è¿", value: 1 }, |
| | | { label: "转è¿ä¸", value: 2 }, |
| | | { label: "转è¿å®æ", value: 3 }, |
| | | { label: "转è¿åæ¶", value: 4 }, |
| | | { label: "æå", value: 5 }, |
| | | ]); |
| | | |
| | | const coordinatorOptions = ref([ |
| | | { label: 'å¼ å»ç', value: '1' }, |
| | | { label: 'æå»ç', value: '2' }, |
| | | { label: 'çå»ç', value: '3' } |
| | | ]) |
| | | |
| | | const doctorOptions = ref([ |
| | | { label: 'èµµå»ç', value: '1' }, |
| | | { label: 'é±å»ç', value: '2' }, |
| | | { label: 'åå»ç', value: '3' } |
| | | ]) |
| | | |
| | | const nurseOptions = ref([ |
| | | { label: '卿¤å£«', value: '1' }, |
| | | { label: 'å´æ¤å£«', value: '2' }, |
| | | { label: '鿤士', value: '3' } |
| | | ]) |
| | | |
| | | const driverOptions = ref([ |
| | | { label: 'åå¸å
', value: '1' }, |
| | | { label: 'éå¸å
', value: '2' }, |
| | | { label: 'æ¨å¸å
', value: '3' } |
| | | ]) |
| | | |
| | | const icuDoctorOptions = ref([ |
| | | { label: 'æ±å»ç', value: '1' }, |
| | | { label: '秦å»ç', value: '2' }, |
| | | { label: 'å°¤å»ç', value: '3' } |
| | | ]) |
| | | |
| | | // ç¶æç®¡ç |
| | | const loading = ref(false) |
| | | const isEdit = ref(false) |
| | | const transportId = ref('') |
| | | const disabledColor = ref('#f5f5f7') |
| | | // æ ·å¼ |
| | | const disabledColor = ref("#f5f5f7"); |
| | | |
| | | // 计ç®å±æ§ |
| | | const loadingText = computed(() => { |
| | | return loading.value ? "å è½½ä¸..." : saving.value ? "ä¿åä¸..." : ""; |
| | | }); |
| | | |
| | | const isFormValid = computed(() => { |
| | | return form.caseInfo.caseId && form.hospital && form.departureTime |
| | | }) |
| | | return ( |
| | | transportData.value.transportStartPlace && |
| | | transportData.value.transportStartTime && |
| | | transportData.value.contactPerson |
| | | ); |
| | | }); |
| | | |
| | | // æ ·å¼æ¹æ³ |
| | | const inputStyle = (isError) => { |
| | | return isError ? |
| | | 'border: 2rpx solid #ff4757 !important; border-radius: 12rpx !important;' : |
| | | 'border: 2rpx solid #e5e5e7 !important; border-radius: 12rpx !important;' |
| | | } |
| | | // æé夿 |
| | | const canEdit = computed(() => { |
| | | if (loading.value) return false; |
| | | return ( |
| | | transportData.value.transitStatus === 1 || // å¾
è½¬è¿ |
| | | transportData.value.transitStatus === 5 |
| | | ); // æå |
| | | }); |
| | | |
| | | // æ¹æ³å®ä¹ |
| | | const onCaseConfirm = (e) => { |
| | | if (e.value && e.value[0]) { |
| | | const selectedCase = e.value[0] |
| | | form.caseInfo.caseId = selectedCase.value |
| | | form.caseInfo.donorName = selectedCase.data.donorName |
| | | form.caseInfo.gender = selectedCase.data.gender |
| | | form.caseInfo.age = selectedCase.data.age |
| | | form.caseInfo.diagnosis = selectedCase.data.diagnosis |
| | | form.hospital = selectedCase.data.hospital |
| | | const canStartTransport = computed(() => { |
| | | if (loading.value) return false; |
| | | return transportData.value.transitStatus === 1; // å¾
è½¬è¿ |
| | | }); |
| | | |
| | | const canCompleteTransport = computed(() => { |
| | | if (loading.value) return false; |
| | | return transportData.value.transitStatus === 2; // 转è¿ä¸ |
| | | }); |
| | | |
| | | const canDelete = computed(() => { |
| | | if (loading.value) return false; |
| | | return true; // æ ¹æ®å®é
æéæ§å¶ |
| | | }); |
| | | |
| | | // 计ç®ç´¢å¼ |
| | | const statusIndex = computed(() => { |
| | | if (!transportData.value.transitStatus) return 0; |
| | | return statusOptions.value.findIndex( |
| | | (item) => item.value === transportData.value.transitStatus, |
| | | ); |
| | | }); |
| | | |
| | | onLoad(async (options) => { |
| | | if (options.id) { |
| | | transportId.value = options.id; |
| | | await loadTransportData(options.id); |
| | | } else if (options.caseId) { |
| | | // æ°å¢æ¨¡å¼ |
| | | isEdit.value = true; |
| | | await initNewTransport(options.caseId, options.caseNo); |
| | | } |
| | | showCasePicker.value = false |
| | | } |
| | | }); |
| | | |
| | | const onTimeConfirm = (e) => { |
| | | const date = new Date(e.value) |
| | | form.departureTime = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}` |
| | | showTimePicker.value = false |
| | | } |
| | | |
| | | const onCoordinatorConfirm = (e) => { |
| | | if (e.value && e.value[0]) { |
| | | form.coordinator.name = e.value[0].label |
| | | form.coordinator.id = e.value[0].value |
| | | // èªå¨å¡«å
åè°åçµè¯ |
| | | const contact = form.contacts.find(item => item.role === 'åè°åçµè¯') |
| | | if (contact) { |
| | | contact.phone = '13800138000' // æ¨¡ææ°æ® |
| | | } |
| | | } |
| | | showCoordinatorPicker.value = false |
| | | } |
| | | |
| | | const onDoctorConfirm = (e) => { |
| | | if (e.value && e.value[0]) { |
| | | form.emergencyDoctor.name = e.value[0].label |
| | | form.emergencyDoctor.id = e.value[0].value |
| | | // èªå¨å¡«å
æ¥è¯å»ççµè¯ |
| | | const contact = form.contacts.find(item => item.role === 'æ¥è¯å»ççµè¯') |
| | | if (contact) { |
| | | contact.phone = '13800138001' // æ¨¡ææ°æ® |
| | | } |
| | | } |
| | | showDoctorPicker.value = false |
| | | } |
| | | |
| | | const onNurseConfirm = (e) => { |
| | | if (e.value && e.value[0]) { |
| | | form.nurse.name = e.value[0].label |
| | | form.nurse.id = e.value[0].value |
| | | // èªå¨å¡«å
æ¤å£«çµè¯ |
| | | const contact = form.contacts.find(item => item.role === 'æ¤å£«çµè¯') |
| | | if (contact) { |
| | | contact.phone = '13800138002' // æ¨¡ææ°æ® |
| | | } |
| | | } |
| | | showNursePicker.value = false |
| | | } |
| | | |
| | | const onDriverConfirm = (e) => { |
| | | if (e.value && e.value[0]) { |
| | | form.driver.name = e.value[0].label |
| | | form.driver.id = e.value[0].value |
| | | // èªå¨å¡«å
叿ºçµè¯ |
| | | const contact = form.contacts.find(item => item.role === '叿ºçµè¯') |
| | | if (contact) { |
| | | contact.phone = '13800138003' // æ¨¡ææ°æ® |
| | | } |
| | | } |
| | | showDriverPicker.value = false |
| | | } |
| | | |
| | | const onIcuDoctorConfirm = (e) => { |
| | | if (e.value && e.value[0]) { |
| | | form.icuDoctor.name = e.value[0].label |
| | | form.icuDoctor.id = e.value[0].value |
| | | // èªå¨å¡«å
ICUå»ççµè¯ |
| | | const contact = form.contacts.find(item => item.role === 'ICUå»ççµè¯') |
| | | if (contact) { |
| | | contact.phone = '13800138004' // æ¨¡ææ°æ® |
| | | } |
| | | } |
| | | showIcuDoctorPicker.value = false |
| | | } |
| | | |
| | | const handleCancel = () => { |
| | | uni.navigateBack() |
| | | } |
| | | |
| | | const validateForm = () => { |
| | | if (!form.caseInfo.caseId) { |
| | | uni.showToast({ title: 'è¯·éæ©æ¡ä¾', icon: 'none' }) |
| | | return false |
| | | } |
| | | if (!form.hospital) { |
| | | uni.showToast({ title: '请è¾å
¥æç®å»é¢', icon: 'none' }) |
| | | return false |
| | | } |
| | | if (!form.departureTime) { |
| | | uni.showToast({ title: 'è¯·éæ©åºåæ¶é´', icon: 'none' }) |
| | | return false |
| | | } |
| | | return true |
| | | } |
| | | |
| | | const handleSaveDraft = async () => { |
| | | if (!validateForm()) return |
| | | |
| | | loading.value = true |
| | | // å 载转è¿åæ°æ® |
| | | const loadTransportData = async (id) => { |
| | | loading.value = true; |
| | | try { |
| | | await new Promise(resolve => setTimeout(resolve, 1000)) |
| | | await saveTransport('draft') |
| | | uni.showToast({ title: 'ä¿åè稿æå', icon: 'success' }) |
| | | } catch (error) { |
| | | console.error('ä¿åè稿失败:', error) |
| | | uni.showToast({ title: 'ä¿å失败ï¼è¯·éè¯', icon: 'none' }) |
| | | } finally { |
| | | loading.value = false |
| | | } |
| | | } |
| | | const res = await uni.$uapi.post(`/project/transport/list`, { id: id }); |
| | | |
| | | const handleSubmit = async () => { |
| | | if (!validateForm()) return |
| | | |
| | | if (res) { |
| | | transportData.value = res[0]; |
| | | } else { |
| | | throw new Error(res.msg || "æ°æ®å 载失败"); |
| | | } |
| | | } catch (error) { |
| | | console.error("å 载转è¿å失败:", error); |
| | | uni.showToast({ |
| | | title: "æ°æ®å 载失败ï¼è¯·éè¯", |
| | | icon: "none", |
| | | }); |
| | | } finally { |
| | | loading.value = false; |
| | | } |
| | | }; |
| | | |
| | | // åå§åæ°ç转è¿å |
| | | const initNewTransport = async (caseId, caseNo) => { |
| | | try { |
| | | // å¦æææ¡ä¾IDï¼å è½½æ¡ä¾ä¿¡æ¯ |
| | | if (caseId) { |
| | | const res = await uni.$uapi.post( |
| | | `/project/transport/list`, |
| | | { id: caseId }, |
| | | ); |
| | | if (res) { |
| | | const caseData = res[0]; |
| | | transportData.value = { |
| | | ...transportData.value, |
| | | caseNo: caseNo || caseData.caseNo, |
| | | patName: caseData.patName, |
| | | sex: caseData.sex, |
| | | age: caseData.age, |
| | | diagnosisname: caseData.diagnosisname, |
| | | treatmentHospitalName: caseData.treatmenthospitalname, |
| | | transitStatus: 1, // å¾
è½¬è¿ |
| | | createTime: new Date() |
| | | .toISOString() |
| | | .replace("T", " ") |
| | | .substring(0, 19), |
| | | }; |
| | | } |
| | | } else { |
| | | transportData.value = { |
| | | transitStatus: 1, |
| | | createTime: new Date().toISOString().replace("T", " ").substring(0, 19), |
| | | }; |
| | | } |
| | | } catch (error) { |
| | | console.error("åå§å转è¿å失败:", error); |
| | | } |
| | | }; |
| | | |
| | | // è·å转è¿ç¶æææ¬ |
| | | const getTransportStatusText = (status) => { |
| | | const map = { |
| | | 1: "å¾
转è¿", |
| | | 2: "转è¿ä¸", |
| | | 3: "转è¿å®æ", |
| | | 4: "转è¿åæ¶", |
| | | 5: "æå", |
| | | }; |
| | | return map[status] || "æªç¥"; |
| | | }; |
| | | |
| | | // è·å转è¿ç¶ææ ·å¼ |
| | | const getTransportStatusClass = (status) => { |
| | | const map = { |
| | | 1: "pending", |
| | | 2: "transporting", |
| | | 3: "completed", |
| | | 4: "cancelled", |
| | | 5: "draft", |
| | | }; |
| | | return map[status] || "draft"; |
| | | }; |
| | | |
| | | // è·åæ§å«ææ¬ |
| | | const getGenderText = (gender) => { |
| | | if (!gender) return "æªç¥"; |
| | | return gender === "1" ? "ç·" : "女"; |
| | | }; |
| | | |
| | | // æ ¼å¼åæ¶é´ |
| | | const formatTime = (timeStr) => { |
| | | if (!timeStr) return ""; |
| | | return timeStr.replace("T", " ").substring(0, 16); |
| | | }; |
| | | |
| | | // è¾å
¥æ¡æ ·å¼ |
| | | const inputStyle = (isError) => { |
| | | return isError |
| | | ? "border: 2rpx solid #f56c6c !important; border-radius: 12rpx !important;" |
| | | : "border: 2rpx solid #e5e5e7 !important; border-radius: 12rpx !important;"; |
| | | }; |
| | | |
| | | // æ¶é´ç¡®è®¤ |
| | | const onTimeConfirm = (e) => { |
| | | const date = new Date(e.value); |
| | | transportData.value.transportStartTime = `${date.getFullYear()}-${( |
| | | date.getMonth() + 1 |
| | | ) |
| | | .toString() |
| | | .padStart(2, "0")}-${date.getDate().toString().padStart(2, "0")} ${date |
| | | .getHours() |
| | | .toString() |
| | | .padStart(2, "0")}:${date.getMinutes().toString().padStart(2, "0")}`; |
| | | showTimePicker.value = false; |
| | | }; |
| | | |
| | | // ç¶æç¡®è®¤ |
| | | const onStatusConfirm = (e) => { |
| | | if (e[0]) { |
| | | transportData.value.transitStatus = e[0].value; |
| | | } |
| | | statusSelectVisible.value = false; |
| | | }; |
| | | |
| | | // é¢è§æä»¶ |
| | | const previewFile = (file) => { |
| | | const fullUrl = file.path || file.fileUrl; |
| | | if (!fullUrl) { |
| | | uni.showToast({ title: "æä»¶è·¯å¾ä¸åå¨", icon: "none" }); |
| | | return; |
| | | } |
| | | |
| | | if (file.fileName && file.fileName.match(/\.(jpg|jpeg|png|gif|bmp|webp)$/i)) { |
| | | uni.previewImage({ |
| | | urls: [fullUrl], |
| | | current: 0, |
| | | }); |
| | | } else if (file.fileName && file.fileName.match(/\.pdf$/i)) { |
| | | uni.downloadFile({ |
| | | url: fullUrl, |
| | | success: (res) => { |
| | | uni.openDocument({ |
| | | filePath: res.tempFilePath, |
| | | fileType: "pdf", |
| | | showMenu: true, |
| | | }); |
| | | }, |
| | | fail: (err) => { |
| | | console.error("æå¼ææ¡£å¤±è´¥:", err); |
| | | uni.showToast({ title: "æå¼æä»¶å¤±è´¥", icon: "none" }); |
| | | }, |
| | | }); |
| | | } else { |
| | | uni.showToast({ title: "æä¸æ¯ææ¤æä»¶ç±»åé¢è§", icon: "none" }); |
| | | } |
| | | }; |
| | | |
| | | // è¿å |
| | | const goBack = () => { |
| | | uni.navigateBack(); |
| | | }; |
| | | |
| | | // ç¼è¾ |
| | | const handleEdit = () => { |
| | | isEdit.value = true; |
| | | }; |
| | | |
| | | // åæ¶ç¼è¾ |
| | | const cancelEdit = () => { |
| | | if (transportId.value) { |
| | | // éæ°å è½½æ°æ® |
| | | isEdit.value = false; |
| | | loadTransportData(transportId.value); |
| | | } else { |
| | | // æ°å¢æ¨¡å¼ï¼ç´æ¥è¿å |
| | | uni.navigateBack(); |
| | | } |
| | | }; |
| | | |
| | | // ä¿å |
| | | const handleSave = async () => { |
| | | if (!validateForm()) return; |
| | | |
| | | saving.value = true; |
| | | |
| | | try { |
| | | const submitData = { |
| | | ...transportData.value, |
| | | }; |
| | | |
| | | let res; |
| | | if (transportId.value) { |
| | | // ä¿®æ¹ |
| | | res = await uni.$uapi.post("/project/transport/edit", submitData); |
| | | } else { |
| | | // æ°å¢ |
| | | submitData.createBy = "ç§»å¨ç«¯ç¨æ·"; |
| | | res = await uni.$uapi.post("/project/transport/add", submitData); |
| | | } |
| | | |
| | | if (res.code === 200) { |
| | | uni.showToast({ |
| | | title: transportId.value ? "ä¿®æ¹æå" : "æ°å¢æå", |
| | | icon: "success", |
| | | }); |
| | | |
| | | if (transportId.value) { |
| | | // éæ°å è½½æ°æ® |
| | | isEdit.value = false; |
| | | await loadTransportData(transportId.value); |
| | | } else { |
| | | // æ°å¢æååè¿åå表 |
| | | setTimeout(() => { |
| | | uni.navigateBack(); |
| | | }, 1500); |
| | | } |
| | | } else { |
| | | throw new Error(res.msg || "æä½å¤±è´¥"); |
| | | } |
| | | } catch (error) { |
| | | console.error("ä¿å失败:", error); |
| | | uni.showToast({ |
| | | title: error.message || (transportId.value ? "ä¿®æ¹å¤±è´¥" : "æ°å¢å¤±è´¥"), |
| | | icon: "none", |
| | | }); |
| | | } finally { |
| | | saving.value = false; |
| | | } |
| | | }; |
| | | |
| | | // 表åéªè¯ |
| | | const validateForm = () => { |
| | | if (!transportData.value.transportStartPlace) { |
| | | uni.showToast({ title: "请è¾å
¥åºåå°ç¹", icon: "none" }); |
| | | return false; |
| | | } |
| | | |
| | | if (!transportData.value.transportStartTime) { |
| | | uni.showToast({ title: "è¯·éæ©åºåæ¶é´", icon: "none" }); |
| | | return false; |
| | | } |
| | | |
| | | if (!transportData.value.contactPerson) { |
| | | uni.showToast({ title: "请è¾å
¥è´è´£åè°å", icon: "none" }); |
| | | return false; |
| | | } |
| | | |
| | | return true; |
| | | }; |
| | | |
| | | // å¼å§è½¬è¿ |
| | | const handleStartTransport = () => { |
| | | uni.showModal({ |
| | | title: '确认æäº¤', |
| | | content: 'ç¡®å®è¦æäº¤è½¬è¿åç³è¯·åï¼', |
| | | title: "å¼å§è½¬è¿", |
| | | content: "ç¡®å®è¦å¼å§è½¬è¿åï¼", |
| | | success: async (res) => { |
| | | if (res.confirm) { |
| | | loading.value = true |
| | | await updateTransportStatus(2, "å¼å§è½¬è¿"); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // å®æè½¬è¿ |
| | | const handleCompleteTransport = () => { |
| | | uni.showModal({ |
| | | title: "å®æè½¬è¿", |
| | | content: "ç¡®å®è¦å®æè½¬è¿åï¼", |
| | | success: async (res) => { |
| | | if (res.confirm) { |
| | | await updateTransportStatus(3, "å®æè½¬è¿"); |
| | | } |
| | | }, |
| | | }); |
| | | }; |
| | | |
| | | // æ´æ°è½¬è¿ç¶æ |
| | | const updateTransportStatus = async (newStatus, actionName) => { |
| | | try { |
| | | const updateData = { |
| | | id: transportId.value, |
| | | transitStatus: newStatus, |
| | | }; |
| | | |
| | | const res = await uni.$uapi.post("/system/transport/edit", updateData); |
| | | |
| | | if (res.code === 200) { |
| | | uni.showToast({ title: `${actionName}æå`, icon: "success" }); |
| | | await loadTransportData(transportId.value); |
| | | } else { |
| | | throw new Error(res.msg || `${actionName}失败`); |
| | | } |
| | | } catch (error) { |
| | | console.error(`${actionName}失败:`, error); |
| | | uni.showToast({ title: `${actionName}失败`, icon: "none" }); |
| | | } |
| | | }; |
| | | |
| | | // å é¤è½¬è¿å |
| | | const handleDelete = () => { |
| | | uni.showModal({ |
| | | title: "确认å é¤", |
| | | content: `ç¡®å®è¦å é¤è½¬è¿å ${transportData.value.reportId} åï¼`, |
| | | success: async (res) => { |
| | | if (res.confirm) { |
| | | try { |
| | | await new Promise(resolve => setTimeout(resolve, 1500)) |
| | | await saveTransport('pending') |
| | | uni.showToast({ title: 'æäº¤æå', icon: 'success' }) |
| | | setTimeout(() => { |
| | | uni.navigateBack() |
| | | }, 1500) |
| | | const result = await uni.$uapi.delete( |
| | | `/system/transport/${transportId.value}`, |
| | | ); |
| | | if (result.code === 200) { |
| | | uni.showToast({ title: "å 餿å", icon: "success" }); |
| | | setTimeout(() => { |
| | | uni.navigateBack(); |
| | | }, 1500); |
| | | } else { |
| | | uni.showToast({ title: result.msg || "å é¤å¤±è´¥", icon: "none" }); |
| | | } |
| | | } catch (error) { |
| | | console.error('æäº¤å¤±è´¥:', error) |
| | | uni.showToast({ title: 'æäº¤å¤±è´¥ï¼è¯·éè¯', icon: 'none' }) |
| | | } finally { |
| | | loading.value = false |
| | | console.error("å é¤å¤±è´¥:", error); |
| | | uni.showToast({ title: "å é¤å¤±è´¥", icon: "none" }); |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | const saveTransport = async (status) => { |
| | | const submitData = { |
| | | ...form, |
| | | status: status, |
| | | id: isEdit.value ? transportId.value : generateTransportId(), |
| | | createTime: new Date().toISOString() |
| | | } |
| | | |
| | | console.log('ä¿å转è¿å:', submitData) |
| | | // å®é
项ç®ä¸è°ç¨APIæ¥å£ |
| | | } |
| | | |
| | | const generateTransportId = () => { |
| | | const date = new Date() |
| | | return `T${date.getFullYear()}${(date.getMonth() + 1).toString().padStart(2, '0')}${date.getDate().toString().padStart(2, '0')}${Math.random().toString().slice(-3)}` |
| | | } |
| | | |
| | | const loadTransportData = (id) => { |
| | | // 模æå è½½ç¼è¾æ°æ® |
| | | const mockData = { |
| | | caseInfo: { |
| | | caseId: 'DON20241216001', |
| | | donorName: 'å¼ ä¸', |
| | | gender: 'ç·', |
| | | age: '38', |
| | | diagnosis: 'èå¤ä¼¤å¯¼è´èæ»äº¡' |
| | | }, |
| | | hospital: 'éå²éæ¹å»é¢', |
| | | department: 'ç¥ç»å¤ç§', |
| | | departureTime: '2024-12-17 14:30:00', |
| | | departureLocation: 'éå²å¸ç«å»é¢æ¥è¯ç§', |
| | | destinationHospital: 'éå²éæ¹å»é¢', |
| | | coordinator: { id: '1', name: 'å¼ å»ç' }, |
| | | emergencyDoctor: { id: '2', name: 'çå»ç' }, |
| | | nurse: { id: '3', name: 'ææ¤å£«' }, |
| | | driver: { id: '4', name: 'åå¸å
' }, |
| | | icuDoctor: { id: '5', name: 'èµµå»ç' }, |
| | | contacts: [ |
| | | { role: 'åè°åçµè¯', phone: '13800138000' }, |
| | | { role: 'æ¥è¯å»ççµè¯', phone: '13800138001' }, |
| | | { role: 'æ¤å£«çµè¯', phone: '13800138002' }, |
| | | { role: '叿ºçµè¯', phone: '13800138003' }, |
| | | { role: 'ICUå»ççµè¯', phone: '13800138004' } |
| | | ], |
| | | remarks: 'éè¦åå¤å¼å¸æºçæ¥æè®¾å¤' |
| | | } |
| | | |
| | | Object.assign(form, mockData) |
| | | } |
| | | |
| | | // çå½å¨æ |
| | | onLoad((options) => { |
| | | if (options.id) { |
| | | isEdit.value = true |
| | | transportId.value = options.id |
| | | loadTransportData(options.id) |
| | | } |
| | | }) |
| | | }); |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .transport-edit-container { |
| | | min-height: 100vh; |
| | | background: linear-gradient(135deg, #f8fdff 0%, #e8f7f6 100%); |
| | | padding-bottom: 120rpx; /* 为æä½æ çåºç©ºé´ */ |
| | | } |
| | | |
| | | .form-scroll { |
| | |
| | | padding: 30rpx; |
| | | margin-bottom: 30rpx; |
| | | box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06); |
| | | |
| | | .section-header { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | margin-bottom: 30rpx; |
| | | padding-bottom: 20rpx; |
| | | border-bottom: 2rpx solid #f0f0f0; |
| | | } |
| | | |
| | | .section-icon { |
| | | font-size: 32rpx; |
| | | margin-right: 16rpx; |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 32rpx; |
| | | font-weight: 600; |
| | | color: #1d1d1f; |
| | | flex: 1; |
| | | } |
| | | |
| | | .status-tag { |
| | | padding: 6rpx 16rpx; |
| | | border-radius: 8rpx; |
| | | font-size: 24rpx; |
| | | font-weight: 500; |
| | | |
| | | &.pending { |
| | | background: rgba(240, 173, 78, 0.1); |
| | | color: #f0ad4e; |
| | | } |
| | | |
| | | &.transporting { |
| | | background: rgba(0, 122, 255, 0.1); |
| | | color: #007aff; |
| | | } |
| | | |
| | | &.completed { |
| | | background: rgba(76, 217, 100, 0.1); |
| | | color: #4cd964; |
| | | } |
| | | |
| | | &.cancelled { |
| | | background: rgba(220, 223, 230, 0.1); |
| | | color: #dcdfe6; |
| | | } |
| | | |
| | | &.draft { |
| | | background: rgba(144, 147, 153, 0.1); |
| | | color: #909399; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .section-header { |
| | | display: flex; |
| | | // align-items: center; |
| | | margin-bottom: 30rpx; |
| | | padding-bottom: 20rpx; |
| | | border-bottom: 2rpx solid #f0f0f0; |
| | | } |
| | | .case-info { |
| | | .info-row { |
| | | display: flex; |
| | | margin-bottom: 16rpx; |
| | | |
| | | .section-icon { |
| | | font-size: 32rpx; |
| | | margin-right: 16rpx; |
| | | } |
| | | &:last-child { |
| | | margin-bottom: 0; |
| | | } |
| | | |
| | | .section-title { |
| | | font-size: 32rpx; |
| | | font-weight: 600; |
| | | color: #1d1d1f; |
| | | .info-label { |
| | | font-size: 28rpx; |
| | | color: #606266; |
| | | min-width: 140rpx; |
| | | margin-right: 10rpx; |
| | | } |
| | | |
| | | .info-value { |
| | | font-size: 28rpx; |
| | | color: #303133; |
| | | flex: 1; |
| | | font-weight: 500; |
| | | } |
| | | } |
| | | } |
| | | |
| | | .form-grid { |
| | |
| | | .form-item { |
| | | display: flex; |
| | | flex-direction: column; |
| | | |
| | | |
| | | &.full-width { |
| | | grid-column: 1 / -1; |
| | | } |
| | | } |
| | | |
| | | .item-label { |
| | | font-size: 28rpx; |
| | | color: #1d1d1f; |
| | | font-weight: 500; |
| | | margin-bottom: 12rpx; |
| | | |
| | | &.required::after { |
| | | content: '*'; |
| | | color: #ff4757; |
| | | margin-left: 4rpx; |
| | | .item-label { |
| | | font-size: 28rpx; |
| | | color: #1d1d1f; |
| | | font-weight: 500; |
| | | margin-bottom: 12rpx; |
| | | |
| | | &.required::after { |
| | | content: "*"; |
| | | color: #f56c6c; |
| | | margin-left: 4rpx; |
| | | } |
| | | } |
| | | |
| | | .picker-trigger { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | height: 88rpx; |
| | | padding: 0 20rpx; |
| | | background: #f5f5f5; |
| | | border-radius: 8rpx; |
| | | border: 1rpx solid #dcdfe6; |
| | | |
| | | text { |
| | | font-size: 28rpx; |
| | | color: #303133; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | border-radius: 12rpx !important; |
| | | padding: 20rpx 24rpx !important; |
| | | background: #fff !important; |
| | | min-height: 150rpx; |
| | | } |
| | | |
| | | // éä»¶å表 |
| | | .attachment-list { |
| | | .attachment-item { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | padding: 20rpx 0; |
| | | border-bottom: 1rpx solid #f0f0f0; |
| | | |
| | | &:last-child { |
| | | border-bottom: none; |
| | | } |
| | | |
| | | &:active { |
| | | background: #f5f5f5; |
| | | } |
| | | |
| | | .file-info { |
| | | display: flex; |
| | | align-items: center; |
| | | flex: 1; |
| | | |
| | | .file-icon { |
| | | margin-right: 16rpx; |
| | | } |
| | | |
| | | .file-details { |
| | | display: flex; |
| | | flex-direction: column; |
| | | flex: 1; |
| | | |
| | | .file-name { |
| | | font-size: 28rpx; |
| | | color: #303133; |
| | | margin-bottom: 4rpx; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | white-space: nowrap; |
| | | max-width: 500rpx; |
| | | } |
| | | |
| | | .file-time { |
| | | font-size: 24rpx; |
| | | color: #909399; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | .action-buttons { |
| | | display: flex; |
| | | gap: 20rpx; |
| | | margin-top: 40rpx; |
| | | background: #fff; |
| | | padding: 20rpx 0; |
| | | position: fixed; |
| | | bottom: 0; |
| | | left: 0; |
| | | right: 0; |
| | | padding: 20rpx 30rpx; |
| | | padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); |
| | | box-shadow: 0 -2rpx 20rpx rgba(0, 0, 0, 0.08); |
| | | z-index: 100; |
| | | } |
| | | |
| | | .btn { |
| | | flex: 1; |
| | | height: 80rpx; |
| | | border-radius: 16rpx; |
| | | font-size: 32rpx; |
| | | font-weight: 500; |
| | | |
| | | border-radius: 20rpx; |
| | | font-size: 28rpx; |
| | | font-weight: 600; |
| | | border: none; |
| | | transition: all 0.3s ease; |
| | | |
| | | &.secondary { |
| | | background: #f5f5f7 !important; |
| | | color: #1d1d1f !important; |
| | | background: #f5f5f7; |
| | | color: #1d1d1f; |
| | | |
| | | &:active { |
| | | background: #e5e5e7; |
| | | } |
| | | } |
| | | |
| | | |
| | | &.primary { |
| | | background: #2979ff !important; |
| | | color: #fff !important; |
| | | background: linear-gradient(90deg, #0071e3 0%, #2997ff 100%); |
| | | color: #fff; |
| | | |
| | | &:active { |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | |
| | | |
| | | &.warning { |
| | | background: linear-gradient(90deg, #f0ad4e 0%, #f8b62d 100%); |
| | | color: #fff; |
| | | |
| | | &:active { |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | |
| | | &.success { |
| | | background: linear-gradient(135deg, #0f95b0, #89C4C1) !important; |
| | | color: #fff !important; |
| | | |
| | | background: linear-gradient(90deg, #34c759 0%, #4cd964 100%); |
| | | color: #fff; |
| | | |
| | | &:disabled { |
| | | background: #c0c0c0 !important; |
| | | background: #c0c4cc; |
| | | opacity: 0.6; |
| | | } |
| | | |
| | | &:active:not(:disabled) { |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | |
| | | &.error { |
| | | background: linear-gradient(90deg, #ff3b30 0%, #ff5a5a 100%); |
| | | color: #fff; |
| | | |
| | | &:active { |
| | | transform: scale(0.98); |
| | | } |
| | | } |
| | | } |
| | | </style> |
| | | </style> |
| | |
| | | { |
| | | "hash": "6bd4bfe4", |
| | | "hash": "02d31505", |
| | | "configHash": "878f8b71", |
| | | "lockfileHash": "91f3418f", |
| | | "browserHash": "376444c4", |
| | | "lockfileHash": "e59b7d0b", |
| | | "browserHash": "95fcf7a4", |
| | | "optimized": { |
| | | "dayjs/esm/index": { |
| | | "src": "../../../../../node_modules/dayjs/esm/index.js", |
| | | "file": "dayjs_esm_index.js", |
| | | "fileHash": "6282f232", |
| | | "fileHash": "318c5b84", |
| | | "needsInterop": false |
| | | } |
| | | }, |
| | |
| | | } |
| | | } |
| | | } |
| | | console.log(res.value.sys_user_sex,'2'); |
| | | // console.log(res.value.sys_user_sex,'2'); |
| | | |
| | | return toRefs(res.value); |
| | | } |
| | |
| | | } |
| | | |
| | | // 妿æªç»å½ä¸ä¸æ¯ç½å忥å£ï¼è·³è½¬ç»å½ |
| | | console.log(token,'token'); |
| | | // console.log(token,'token'); |
| | | |
| | | if (!token) { |
| | | navigateToLogin() |