fix-二期代码提交

develop
xiangcongshuai 12 months ago
parent e17f75d41a
commit 4bdd4d4d5c

@ -29,6 +29,7 @@
"not op_mini all"
],
"dependencies": {
"@antv/g6": "^4.8.24",
"@pureadmin/descriptions": "^1.1.1",
"@pureadmin/table": "^2.3.2",
"@pureadmin/utils": "^1.9.6",
@ -39,12 +40,12 @@
"animate.css": "^4.1.1",
"axios": "^1.4.0",
"dayjs": "^1.11.8",
"echarts": "^5.5.0",
"element-plus": "2.3.6",
"js-audio-recorder": "^1.0.7",
"js-cookie": "^3.0.5",
"lodash.debounce": "^4.0.8",
"mitt": "^3.0.0",
"mockjs": "^1.1.0",
"nprogress": "^0.2.0",
"path": "^0.12.7",
"pinia": "^2.1.4",
@ -56,6 +57,7 @@
"sortablejs": "^1.15.0",
"uuid": "^9.0.1",
"vue": "^3.3.4",
"vue-echarts": "^6.6.9",
"vue-router": "^4.2.2",
"vue-types": "^5.1.0",
"vue3-seamless-scroll": "^2.0.1",

@ -5,6 +5,9 @@ settings:
excludeLinksFromLockfile: false
dependencies:
"@antv/g6":
specifier: ^4.8.24
version: 4.8.24
"@pureadmin/descriptions":
specifier: ^1.1.1
version: 1.2.0(element-plus@2.3.6)(typescript@5.0.4)
@ -13,7 +16,7 @@ dependencies:
version: 2.3.4(element-plus@2.3.6)(typescript@5.0.4)
"@pureadmin/utils":
specifier: ^1.9.6
version: 1.9.10(vue@3.3.5)
version: 1.9.10(echarts@5.5.0)(vue@3.3.5)
"@vue/composition-api":
specifier: ^1.7.2
version: 1.7.2(vue@3.3.5)
@ -35,6 +38,9 @@ dependencies:
dayjs:
specifier: ^1.11.8
version: 1.11.10
echarts:
specifier: ^5.5.0
version: 5.5.0
element-plus:
specifier: 2.3.6
version: 2.3.6(@vue/composition-api@1.7.2)(vue@3.3.5)
@ -50,9 +56,6 @@ dependencies:
mitt:
specifier: ^3.0.0
version: 3.0.1
mockjs:
specifier: ^1.1.0
version: 1.1.0
nprogress:
specifier: ^0.2.0
version: 0.2.0
@ -86,6 +89,9 @@ dependencies:
vue:
specifier: ^3.3.4
version: 3.3.5(typescript@5.0.4)
vue-echarts:
specifier: ^6.6.9
version: 6.6.9(@vue/composition-api@1.7.2)(echarts@5.5.0)(vue@3.3.5)
vue-router:
specifier: ^4.2.2
version: 4.2.5(vue@3.3.5)
@ -314,6 +320,329 @@ packages:
"@jridgewell/gen-mapping": 0.3.3
"@jridgewell/trace-mapping": 0.3.20
/@ant-design/colors@4.0.5:
resolution:
{
integrity: sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q==
}
dependencies:
tinycolor2: 1.6.0
dev: false
/@antv/algorithm@0.1.26:
resolution:
{
integrity: sha512-DVhcFSQ8YQnMNW34Mk8BSsfc61iC1sAnmcfYoXTAshYHuU50p/6b7x3QYaGctDNKWGvi1ub7mPcSY0bK+aN0qg==
}
dependencies:
"@antv/util": 2.0.17
tslib: 2.6.2
dev: false
/@antv/dom-util@2.0.4:
resolution:
{
integrity: sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ==
}
dependencies:
tslib: 2.6.2
dev: false
/@antv/event-emitter@0.1.3:
resolution:
{
integrity: sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg==
}
dev: false
/@antv/g-base@0.5.15:
resolution:
{
integrity: sha512-QOtq50QpnKez9J75/Z8j2yZ7QDQdk8R8mVQJiHtaEO5eI7DM4ZbrsWff/Ew26JYmPWdq7nbRuARMAD4PX9uuLA==
}
dependencies:
"@antv/event-emitter": 0.1.3
"@antv/g-math": 0.1.9
"@antv/matrix-util": 3.1.0-beta.3
"@antv/path-util": 2.0.15
"@antv/util": 2.0.17
"@types/d3-timer": 2.0.3
d3-ease: 1.0.7
d3-interpolate: 3.0.1
d3-timer: 1.0.10
detect-browser: 5.3.0
tslib: 2.6.2
dev: false
/@antv/g-canvas@0.5.14:
resolution:
{
integrity: sha512-IUGLEMIMAUYgaBMT8h3FTmYQYz7sjQkKWwh6Psqx+UPK86fySa+G8fMRrh1EqAL07jVB+GRnn6Ym+3FoFUgeFg==
}
dependencies:
"@antv/g-base": 0.5.15
"@antv/g-math": 0.1.9
"@antv/matrix-util": 3.1.0-beta.3
"@antv/path-util": 2.0.15
"@antv/util": 2.0.17
gl-matrix: 3.4.3
tslib: 2.6.2
dev: false
/@antv/g-math@0.1.9:
resolution:
{
integrity: sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ==
}
dependencies:
"@antv/util": 2.0.17
gl-matrix: 3.4.3
dev: false
/@antv/g-svg@0.5.7:
resolution:
{
integrity: sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw==
}
dependencies:
"@antv/g-base": 0.5.15
"@antv/g-math": 0.1.9
"@antv/util": 2.0.17
detect-browser: 5.3.0
tslib: 2.6.2
dev: false
/@antv/g-webgpu-core@0.7.2:
resolution:
{
integrity: sha512-xUMmop7f3Rs34zFYKXLqHhDR1CQTeDl/7vI7Sn3X/73BqJc3X3HIIRvm83Fg2CjVACaOzw4WeLRXNaOCp9fz9w==
}
dependencies:
eventemitter3: 4.0.7
gl-matrix: 3.4.3
lodash: 4.17.21
probe.gl: 3.6.0
dev: false
/@antv/g-webgpu-engine@0.7.2:
resolution:
{
integrity: sha512-lx8Y93IW2cnJvdoDRKyMmTdYqSC1pOmF0nyG3PGGyA0NI9vBYVgO0KTF6hkyWjdTWVq7XDZyf/h8CJridLh3lg==
}
dependencies:
"@antv/g-webgpu-core": 0.7.2
gl-matrix: 3.4.3
lodash: 4.17.21
regl: 1.7.0
dev: false
/@antv/g-webgpu@0.7.2:
resolution:
{
integrity: sha512-kw+oYGsdvj5qeUfy5DPb/jztZBV+2fmqBd3Vv8NlKatfBmv8AirYX/CCW74AUSdWm99rEiLyxFB1VdRZ6b/wnQ==
}
dependencies:
"@antv/g-webgpu-core": 0.7.2
"@antv/g-webgpu-engine": 0.7.2
gl-matrix: 3.4.3
gl-vec2: 1.3.0
lodash: 4.17.21
dev: false
/@antv/g6-core@0.8.24:
resolution:
{
integrity: sha512-rgI3dArAD8uoSz2+skS4ctN4x/Of33ivTIKaEYYvClxgkLZWVz9zvocy+5AWcVPBHZsAXkZcdh9zndIoWY/33A==
}
dependencies:
"@antv/algorithm": 0.1.26
"@antv/dom-util": 2.0.4
"@antv/event-emitter": 0.1.3
"@antv/g-base": 0.5.15
"@antv/g-math": 0.1.9
"@antv/matrix-util": 3.1.0-beta.3
"@antv/path-util": 2.0.15
"@antv/util": 2.0.17
ml-matrix: 6.11.0
tslib: 2.6.2
dev: false
/@antv/g6-element@0.8.24(@antv/g6@4.8.24):
resolution:
{
integrity: sha512-61FXkt9LY+6EOUtSam1iFTOW2AM59sPVcV1BuPj4dXiD0dluLE+R7d8B/94g1tKDw9tsjhfUQGC7hTXscJRJFw==
}
peerDependencies:
"@antv/g6": 4.8.24
dependencies:
"@antv/g-base": 0.5.15
"@antv/g6": 4.8.24
"@antv/g6-core": 0.8.24
"@antv/util": 2.0.17
tslib: 2.6.2
dev: false
/@antv/g6-pc@0.8.24(@antv/g6@4.8.24):
resolution:
{
integrity: sha512-nf0y1lrp8J5DotqRryXd2S/J30COW8spVcLF9gUqywGqQAHfE00Ywkqr+PZBnsfCZXsXCi9o0+CE9NrkWs4SBQ==
}
dependencies:
"@ant-design/colors": 4.0.5
"@antv/algorithm": 0.1.26
"@antv/dom-util": 2.0.4
"@antv/event-emitter": 0.1.3
"@antv/g-base": 0.5.15
"@antv/g-canvas": 0.5.14
"@antv/g-math": 0.1.9
"@antv/g-svg": 0.5.7
"@antv/g6-core": 0.8.24
"@antv/g6-element": 0.8.24(@antv/g6@4.8.24)
"@antv/g6-plugin": 0.8.24(@antv/g6@4.8.24)
"@antv/hierarchy": 0.6.11
"@antv/layout": 0.3.25(dagre@0.8.5)
"@antv/matrix-util": 3.1.0-beta.3
"@antv/path-util": 2.0.15
"@antv/util": 2.0.17
color: 3.2.1
d3-force: 2.1.1
dagre: 0.8.5
insert-css: 2.0.0
ml-matrix: 6.11.0
tslib: 2.6.2
transitivePeerDependencies:
- "@antv/g6"
dev: false
/@antv/g6-plugin@0.8.24(@antv/g6@4.8.24):
resolution:
{
integrity: sha512-ZIOnwLTC7SM2bFiJZ3vYFWnkyOCWKqnU96i/fBh1qAoY5slDS3hatenZWEXUtOcqaKw1h+5A5f72MRXqBBVn0g==
}
peerDependencies:
"@antv/g6": 4.8.24
dependencies:
"@antv/dom-util": 2.0.4
"@antv/g-base": 0.5.15
"@antv/g-canvas": 0.5.14
"@antv/g-svg": 0.5.7
"@antv/g6": 4.8.24
"@antv/g6-core": 0.8.24
"@antv/g6-element": 0.8.24(@antv/g6@4.8.24)
"@antv/matrix-util": 3.1.0-beta.3
"@antv/path-util": 2.0.15
"@antv/scale": 0.3.18
"@antv/util": 2.0.17
insert-css: 2.0.0
dev: false
/@antv/g6@4.8.24:
resolution:
{
integrity: sha512-bgj7sZ+z45JmOngIpYpwmSIg7SboMLZBoAlX0+RoAETZB3/xvZO0MXT3lCSyAhIgm5Sb68pekKi7OStuo04NyQ==
}
dependencies:
"@antv/g6-pc": 0.8.24(@antv/g6@4.8.24)
dev: false
/@antv/graphlib@1.2.0:
resolution:
{
integrity: sha512-hhJOMThec51nU4Fe5p/viLlNIL71uDEgYFzKPajWjr2715SFG1HAgiP6AVylIeqBcAZ04u3Lw7usjl/TuI5RuQ==
}
dev: false
/@antv/hierarchy@0.6.11:
resolution:
{
integrity: sha512-RJVhEMCuu4vj+Dt25lXIiNdd7jaqm/fqWGYikiELha4S5tnzdJoTUaUvvpfWlxLx4B0RsS9XRwBs1bOKN71TKg==
}
dependencies:
"@antv/util": 2.0.17
dev: false
/@antv/layout@0.3.25(dagre@0.8.5):
resolution:
{
integrity: sha512-d29Aw1PXoAavMRZy7iTB9L5rMBeChFEX0BJ9ELP4TI35ySdCu07YbmPo9ju9OH/6sG2/NB3o85Ayxrre3iwX/g==
}
dependencies:
"@antv/g-webgpu": 0.7.2
"@antv/graphlib": 1.2.0
"@antv/util": 3.3.6
d3-force: 2.1.1
d3-quadtree: 2.0.0
dagre-compound: 0.0.11(dagre@0.8.5)
ml-matrix: 6.5.0
transitivePeerDependencies:
- dagre
dev: false
/@antv/matrix-util@3.0.4:
resolution:
{
integrity: sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ==
}
dependencies:
"@antv/util": 2.0.17
gl-matrix: 3.4.3
tslib: 2.6.2
dev: false
/@antv/matrix-util@3.1.0-beta.3:
resolution:
{
integrity: sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A==
}
dependencies:
"@antv/util": 2.0.17
gl-matrix: 3.4.3
tslib: 2.6.2
dev: false
/@antv/path-util@2.0.15:
resolution:
{
integrity: sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw==
}
dependencies:
"@antv/matrix-util": 3.0.4
"@antv/util": 2.0.17
tslib: 2.6.2
dev: false
/@antv/scale@0.3.18:
resolution:
{
integrity: sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w==
}
dependencies:
"@antv/util": 2.0.17
fecha: 4.2.3
tslib: 2.6.2
dev: false
/@antv/util@2.0.17:
resolution:
{
integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==
}
dependencies:
csstype: 3.1.2
tslib: 2.6.2
dev: false
/@antv/util@3.3.6:
resolution:
{
integrity: sha512-Oj2uAwBWEpEKbYcYgSJ/B6zv7t515L+JZzSpnkZeez/qwvDbS6s80lQRuzWzVhWCTHKSPLkgImxhkV9nzLmv4Q==
}
dependencies:
fast-deep-equal: 3.1.3
gl-matrix: 3.4.3
tslib: 2.6.2
dev: false
/@babel/code-frame@7.22.13:
resolution:
{
@ -1599,6 +1928,34 @@ packages:
dev: true
optional: true
/@probe.gl/env@3.6.0:
resolution:
{
integrity: sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ==
}
dependencies:
"@babel/runtime": 7.23.2
dev: false
/@probe.gl/log@3.6.0:
resolution:
{
integrity: sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA==
}
dependencies:
"@babel/runtime": 7.23.2
"@probe.gl/env": 3.6.0
dev: false
/@probe.gl/stats@3.6.0:
resolution:
{
integrity: sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ==
}
dependencies:
"@babel/runtime": 7.23.2
dev: false
/@pureadmin/descriptions@1.2.0(element-plus@2.3.6)(typescript@5.0.4):
resolution:
{
@ -1639,7 +1996,7 @@ packages:
string-hash: 1.1.3
dev: true
/@pureadmin/utils@1.9.10(vue@3.3.5):
/@pureadmin/utils@1.9.10(echarts@5.5.0)(vue@3.3.5):
resolution:
{
integrity: sha512-hNg6u6nltvvO9U+QEKbDbXzky2kP3rP9sw2yvQc0fCObq73/mZ+PfKEr5HLmuze/1LYEUnz3koqpgfuyWBswVw==
@ -1653,6 +2010,7 @@ packages:
vue:
optional: true
dependencies:
echarts: 5.5.0
vue: 3.3.5(typescript@5.0.4)
dev: false
@ -1773,6 +2131,13 @@ packages:
}
dev: true
/@types/d3-timer@2.0.3:
resolution:
{
integrity: sha512-jhAJzaanK5LqyLQ50jJNIrB8fjL9gwWZTgYjevPvkDLMU+kTAZkYsobI59nYoeSrH1PucuyJEi247Pb90t6XUg==
}
dev: false
/@types/estree@0.0.39:
resolution:
{
@ -3339,7 +3704,6 @@ packages:
{
integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
}
dev: true
/color-string@1.9.1:
resolution:
@ -3349,7 +3713,16 @@ packages:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.2
dev: true
/color@3.2.1:
resolution:
{
integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==
}
dependencies:
color-convert: 1.9.3
color-string: 1.9.1
dev: false
/color@4.2.3:
resolution:
@ -3399,6 +3772,7 @@ packages:
integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==
}
engines: { node: ">=16" }
dev: true
/commander@2.20.3:
resolution:
@ -3858,6 +4232,70 @@ packages:
integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
}
/d3-color@3.1.0:
resolution:
{
integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==
}
engines: { node: ">=12" }
dev: false
/d3-dispatch@2.0.0:
resolution:
{
integrity: sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==
}
dev: false
/d3-ease@1.0.7:
resolution:
{
integrity: sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ==
}
dev: false
/d3-force@2.1.1:
resolution:
{
integrity: sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==
}
dependencies:
d3-dispatch: 2.0.0
d3-quadtree: 2.0.0
d3-timer: 2.0.0
dev: false
/d3-interpolate@3.0.1:
resolution:
{
integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==
}
engines: { node: ">=12" }
dependencies:
d3-color: 3.1.0
dev: false
/d3-quadtree@2.0.0:
resolution:
{
integrity: sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==
}
dev: false
/d3-timer@1.0.10:
resolution:
{
integrity: sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==
}
dev: false
/d3-timer@2.0.0:
resolution:
{
integrity: sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==
}
dev: false
/d@1.0.1:
resolution:
{
@ -3868,6 +4306,28 @@ packages:
type: 1.2.0
dev: false
/dagre-compound@0.0.11(dagre@0.8.5):
resolution:
{
integrity: sha512-UrSgRP9LtOZCYb9e5doolZXpc7xayyszgyOs7uakTK4n4KsLegLVTRRtq01GpQd/iZjYw5fWMapx9ed+c80MAQ==
}
engines: { node: ">=6.0.0" }
peerDependencies:
dagre: ^0.8.5
dependencies:
dagre: 0.8.5
dev: false
/dagre@0.8.5:
resolution:
{
integrity: sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==
}
dependencies:
graphlib: 2.1.8
lodash: 4.17.21
dev: false
/dargs@7.0.0:
resolution:
{
@ -4006,6 +4466,13 @@ packages:
dev: false
optional: true
/detect-browser@5.3.0:
resolution:
{
integrity: sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==
}
dev: false
/didyoumean@1.2.2:
resolution:
{
@ -4154,6 +4621,16 @@ packages:
}
dev: true
/echarts@5.5.0:
resolution:
{
integrity: sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==
}
dependencies:
tslib: 2.3.0
zrender: 5.5.0
dev: false
/ee-first@1.1.1:
resolution:
{
@ -4612,6 +5089,13 @@ packages:
es5-ext: 0.10.62
dev: false
/eventemitter3@4.0.7:
resolution:
{
integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
}
dev: false
/eventemitter3@5.0.1:
resolution:
{
@ -4687,7 +5171,6 @@ packages:
{
integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
}
dev: true
/fast-diff@1.3.0:
resolution:
@ -4739,6 +5222,13 @@ packages:
dependencies:
reusify: 1.0.4
/fecha@4.2.3:
resolution:
{
integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==
}
dev: false
/file-entry-cache@6.0.1:
resolution:
{
@ -5029,6 +5519,20 @@ packages:
through2: 4.0.2
dev: true
/gl-matrix@3.4.3:
resolution:
{
integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==
}
dev: false
/gl-vec2@1.3.0:
resolution:
{
integrity: sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A==
}
dev: false
/glob-parent@5.1.2:
resolution:
{
@ -5200,6 +5704,15 @@ packages:
}
dev: true
/graphlib@2.1.8:
resolution:
{
integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==
}
dependencies:
lodash: 4.17.21
dev: false
/hard-rejection@2.1.0:
resolution:
{
@ -5490,6 +6003,20 @@ packages:
}
dev: false
/insert-css@2.0.0:
resolution:
{
integrity: sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA==
}
dev: false
/is-any-array@2.0.1:
resolution:
{
integrity: sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==
}
dev: false
/is-arrayish@0.2.1:
resolution:
{
@ -5502,7 +6029,6 @@ packages:
{
integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
}
dev: true
/is-binary-path@2.1.0:
resolution:
@ -6464,6 +6990,54 @@ packages:
dev: false
optional: true
/ml-array-max@1.2.4:
resolution:
{
integrity: sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==
}
dependencies:
is-any-array: 2.0.1
dev: false
/ml-array-min@1.2.3:
resolution:
{
integrity: sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==
}
dependencies:
is-any-array: 2.0.1
dev: false
/ml-array-rescale@1.3.7:
resolution:
{
integrity: sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==
}
dependencies:
is-any-array: 2.0.1
ml-array-max: 1.2.4
ml-array-min: 1.2.3
dev: false
/ml-matrix@6.11.0:
resolution:
{
integrity: sha512-7jr9NmFRkaUxbKslfRu3aZOjJd2LkSitCGv+QH9PF0eJoEG7jIpjXra1Vw8/kgao8+kHCSsJONG6vfWmXQ+/Eg==
}
dependencies:
is-any-array: 2.0.1
ml-array-rescale: 1.3.7
dev: false
/ml-matrix@6.5.0:
resolution:
{
integrity: sha512-sms732Dge+rs5dU4mnjE0oqLWm1WujvR2fr38LgUHRG2cjXjWlO3WJupLYaSz3++2iYr0UrGDK72OAivr3J8dg==
}
dependencies:
ml-array-rescale: 1.3.7
dev: false
/mlly@1.4.2:
resolution:
{
@ -6486,6 +7060,7 @@ packages:
hasBin: true
dependencies:
commander: 11.1.0
dev: true
/mri@1.2.0:
resolution:
@ -8000,6 +8575,18 @@ packages:
engines: { node: ">=6" }
dev: false
/probe.gl@3.6.0:
resolution:
{
integrity: sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g==
}
dependencies:
"@babel/runtime": 7.23.2
"@probe.gl/env": 3.6.0
"@probe.gl/log": 3.6.0
"@probe.gl/stats": 3.6.0
dev: false
/process-nextick-args@2.0.1:
resolution:
{
@ -8240,6 +8827,13 @@ packages:
}
dev: false
/regl@1.7.0:
resolution:
{
integrity: sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w==
}
dev: false
/require-directory@2.1.1:
resolution:
{
@ -8256,6 +8850,13 @@ packages:
engines: { node: ">=0.10.0" }
dev: true
/resize-detector@0.3.0:
resolution:
{
integrity: sha512-R/tCuvuOHQ8o2boRP6vgx8hXCCy87H1eY9V5imBYeVNyNVpuL9ciReSccLj2gDcax9+2weXy3bc8Vv+NRXeEvQ==
}
dev: false
/resolve-from@4.0.0:
resolution:
{
@ -8566,7 +9167,6 @@ packages:
}
dependencies:
is-arrayish: 0.3.2
dev: true
/slash@3.0.0:
resolution:
@ -9425,6 +10025,13 @@ packages:
}
dev: false
/tinycolor2@1.6.0:
resolution:
{
integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==
}
dev: false
/to-fast-properties@2.0.0:
resolution:
{
@ -9505,6 +10112,13 @@ packages:
}
dev: true
/tslib@2.3.0:
resolution:
{
integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==
}
dev: false
/tslib@2.4.0:
resolution:
{
@ -9512,6 +10126,13 @@ packages:
}
dev: false
/tslib@2.6.2:
resolution:
{
integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==
}
dev: false
/tsutils@3.21.0(typescript@5.0.4):
resolution:
{
@ -9889,6 +10510,25 @@ packages:
fsevents: 2.3.3
dev: true
/vue-demi@0.13.11(@vue/composition-api@1.7.2)(vue@3.3.5):
resolution:
{
integrity: sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A==
}
engines: { node: ">=12" }
hasBin: true
requiresBuild: true
peerDependencies:
"@vue/composition-api": ^1.0.0-rc.1
vue: ^3.0.0-0 || ^2.6.0
peerDependenciesMeta:
"@vue/composition-api":
optional: true
dependencies:
"@vue/composition-api": 1.7.2(vue@3.3.5)
vue: 3.3.5(typescript@5.0.4)
dev: false
/vue-demi@0.14.6(@vue/composition-api@1.7.2)(vue@3.3.5):
resolution:
{
@ -9908,6 +10548,30 @@ packages:
vue: 3.3.5(typescript@5.0.4)
dev: false
/vue-echarts@6.6.9(@vue/composition-api@1.7.2)(echarts@5.5.0)(vue@3.3.5):
resolution:
{
integrity: sha512-mojIq3ZvsjabeVmDthhAUDV8Kgf2Rr/X4lV4da7gEFd1fP05gcSJ0j7wa7HQkW5LlFmF2gdCJ8p4Chas6NNIQQ==
}
requiresBuild: true
peerDependencies:
"@vue/composition-api": ^1.0.5
"@vue/runtime-core": ^3.0.0
echarts: ^5.4.1
vue: ^2.6.12 || ^3.1.1
peerDependenciesMeta:
"@vue/composition-api":
optional: true
"@vue/runtime-core":
optional: true
dependencies:
"@vue/composition-api": 1.7.2(vue@3.3.5)
echarts: 5.5.0
resize-detector: 0.3.0
vue: 3.3.5(typescript@5.0.4)
vue-demi: 0.13.11(@vue/composition-api@1.7.2)(vue@3.3.5)
dev: false
/vue-eslint-parser@9.3.2(eslint@8.51.0):
resolution:
{
@ -10208,3 +10872,12 @@ packages:
}
engines: { node: ">=10" }
dev: true
/zrender@5.5.0:
resolution:
{
integrity: sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==
}
dependencies:
tslib: 2.3.0
dev: false

@ -187,3 +187,34 @@ export const talkByVideo = (data?: object) => {
data
});
};
/**
*/
export const queryRadarChart = (data?: object) => {
return http.request(
"get",
"/virtual-patient/askDiagnosisResult/queryRadarChart",
{
params: data
}
);
};
/**
*/
export const queryTreeGraph = (data?: object) => {
return http.request("get", "/virtual-patient-graph/queryTreeGraph", {
params: data
});
};
/**
*/
export const queryGraph = (data?: object) => {
return http.request("get", "/virtual-patient-graph/queryGraph", {
params: data
});
};
// 删除问诊实例;
export const deleteProcess = (data?: object) => {
return http.request("delete", "/virtual-patient/askProcess/delete", {
params: data
});
};

@ -213,3 +213,24 @@ export const querySupportLsit = (data?: object) => {
}
);
};
/** 保存处置信息 */
export const saveDiseaseTreatmentPlan = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/diseaseTreatmentPlan/save",
{
data
}
);
};
/**
*/
export const updateDiseaseTreatmentPlann = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/diseaseTreatmentPlan/update",
{
data
}
);
};

@ -0,0 +1,129 @@
import { http } from "@/utils/http";
/** 分页查询问题库列表 */
export const queryPageList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/aqLibrary/queryPageList",
{
params: data
}
);
};
/** 保存问题库信息 */
export const saveQuestionLibrary = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/aqLibrary/saveQuestionLibrary",
{
data
}
);
};
/** 更新问题库信息 */
export const updateQuestionLibrary = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/aqLibrary/updateQuestionLibrary",
{
data
}
);
};
/** 删除问题库信息 */
export const deleteQuestionLibrary = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/aqLibrary/deleteQuestionLibrary",
{
data
}
);
};
/** 新增文件目录 */
export const addDirectory = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/directoryManage/addDirectory",
{
data
}
);
};
/** 修改文件目录 */
export const updateDirectory = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/directoryManage/updateDirectory",
{
data
}
);
};
/** 查询文件目录 */
export const getFileDirectory = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/directoryManage/getFileDirectory",
{
params: data
}
);
};
/** 上传素材 */
export const uploadMaterial = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/materialLibrary/uploadMaterial",
{
data
}
);
};
/** 素材管理分页查询 */
export const queryMedicalRecPage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/materialLibrary/queryMedicalRecPage",
{
params: data
}
);
};
/** 修改素材 */
export const updateMaterial = (data?: object) => {
return http.request(
"put",
"/virtual-patient-manage/materialLibrary/updateMaterial",
{
data
}
);
};
/** 删除素材 */
export const deleteMaterial = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/materialLibrary/deleteMaterial",
{
params: data
}
);
};
/** 查询病例默认问题 */
export const queryMedicalDefaultAnswer = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/queryMedicalDefaultAnswer",
{
params: data
}
);
};
/** 对话服务 */
export const talkRasa = (data?: object) => {
return http.request("post", "/virtual-patient-rasa/rasaCmd/deploy", {
data
});
};

@ -0,0 +1,52 @@
import { http } from "@/utils/http";
/** 分页查询病案管理 */
export const queryProcessRecordPage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/processRecord/queryProcessRecordPage",
{
params: data
}
);
};
/** 电子病例视图 */
export const queryViewDetails = (data?: object) => {
return http.request(
"get",
"/virtual-patient/medicalRecord/queryViewDetails",
{
params: data
}
);
};
/** 保存或更新考核病案评估 */
export const saveProcessEvaluation = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/processRecord/saveProcessEvaluation",
{
data
}
);
};
/** 查询考核病案评估 */
export const queryProcessEvaluation = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/processRecord/queryProcessEvaluation",
{
params: data
}
);
};
export const querySingleDiseaseListByDropList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/medicalRecManage/querySingleDiseaseListByDropList",
{
params: data
}
);
};

@ -0,0 +1,175 @@
import { http } from "@/utils/http";
/** 分页查询药物信息 */
export const queryDrugManagePageList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/drugManage/queryPageList",
{
params: data
}
);
};
/** 新增药物信息 */
export const addDrugManage = (data?: object) => {
return http.request("post", "/virtual-patient-manage/drugManage/save", {
data
});
};
/** 修改药物信息 */
export const edtDrugManage = (data?: object) => {
return http.request("put", "/virtual-patient-manage/drugManage/update", {
data
});
};
/** 删除药物信息 */
export const delDrugManage = (data?: object) => {
return http.request("delete", "/virtual-patient-manage/drugManage/delete", {
params: data
});
};
/** 保存处置计划 */
export const saveTreatmentPlan = (data?: object) => {
return http.request("post", "/virtual-patient-manage/treatmentPlan/save", {
data
});
};
/** 分页查询处置计划列表 */
export const queryTreatmentPlanList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/treatmentPlan/queryPageList",
{
params: data
}
);
};
/** 修改 */
export const updateTreatmentPlan = (data?: object) => {
return http.request("put", "/virtual-patient-manage/treatmentPlan/update", {
data
});
};
/** 删除处置计划 */
export const delTreatmentPlan = (data?: object) => {
return http.request(
"delete",
"/virtual-patient-manage/treatmentPlan/delete",
{
params: data
}
);
};
/** 体格检查分页查询 */
export const queryPhysicalPage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/physicalTool/queryPhysicalPage",
{
params: data
}
);
};
/** 删除体格工具 */
export const deleteConfigPhysicalTool = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/physicalTool/deleteConfigPhysicalTool",
{
params: data
}
);
};
/** 保存体格工具 */
export const saveConfigPhysicalTool = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/physicalTool/saveConfigPhysicalTool",
{
data
}
);
};
/** 修改体格工具 */
export const modifyConfigPhysicalTool = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/physicalTool/modifyConfigPhysicalTool",
{
data
}
);
};
/** 查询身体部位树 */
export const queryPhysicalLocation = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/physicalLocation/queryTree",
{
params: data
}
);
};
export const queryConfigPhysicalToolDetail = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/physicalTool/queryConfigPhysicalToolDetail",
{
params: data
}
);
};
/** 查询辅助检查项目列表 */
export const queryAncillaryItemList = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/ancillaryItem/queryAncillaryItemList",
{
params: data
}
);
};
/** 分页查询辅助检查 */
export const queryAncillaryPage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/ancillaryItem/queryAncillaryPage",
{
params: data
}
);
};
/** 保存辅助检查项 */
export const saveAncillaryItem = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/ancillaryItem/saveAncillaryItem",
{
data
}
);
};
/** 修改辅助检查项 */
export const modifyAncillaryItem = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/ancillaryItem/modifyAncillaryItem",
{
data
}
);
};
/** 删除辅助检查项 */
export const deleteAncillaryItem = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/ancillaryItem/deleteAncillaryItem",
{
params: data
}
);
};

@ -0,0 +1,34 @@
import { http } from "@/utils/http";
/** 查询用户列表 */
export const queryUserPage = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/userManage/queryUserPage",
{
params: data
}
);
};
/** 停用用户 */
export const deactivateUser = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/userManage/deactivateUser",
{
params: data
}
);
};
/** 保存用户 */
export const saveUser = (data?: object) => {
return http.request("post", "/virtual-patient-manage/userManage/saveUser", {
data
});
};
/** 更新用户 */
export const updateUser = (data?: object) => {
return http.request("post", "/virtual-patient-manage/userManage/updateUser", {
data
});
};

@ -0,0 +1,22 @@
import { http } from "@/utils/http";
/** 查询字典树 */
export const queryCommonDictTree = (data?: object) => {
return http.request(
"get",
"/virtual-patient-manage/commonDic/queryCommonDictTree",
{
params: data
}
);
};
/** 上传文件*/
export const uploadFile = (data?: object) => {
return http.request(
"post",
"/virtual-patient-manage/fileManage/uploadFile",
{ data },
{ headers: { "Content-Type": "multipart/form-data" } }
);
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 667 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 970 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 591 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 713 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 601 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 638 B

@ -0,0 +1,13 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="xiazai" clip-path="url(#clip0_1507_5683)">
<path id="Vector" d="M16.375 2.5H3.625C3.00368 2.5 2.5 3.00368 2.5 3.625V16.375C2.5 16.9963 3.00368 17.5 3.625 17.5H16.375C16.9963 17.5 17.5 16.9963 17.5 16.375V3.625C17.5 3.00368 16.9963 2.5 16.375 2.5Z" stroke="#333333" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M13.3333 2.5V10H6.25V2.5H13.3333Z" stroke="#333333" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_3" d="M10.833 5.41602V7.08268" stroke="#333333" stroke-width="1.5" stroke-linecap="round"/>
<path id="Vector_4" d="M4.58203 2.5H14.9993" stroke="#333333" stroke-width="1.5" stroke-linecap="round"/>
</g>
<defs>
<clipPath id="clip0_1507_5683">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 863 B

@ -0,0 +1,8 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="gengduo">
<rect id="Rectangle 1973" width="30" height="30" rx="4" fill="#666666"/>
<circle id="Ellipse 357" cx="7" cy="15" r="2" fill="white"/>
<circle id="Ellipse 358" cx="15" cy="15" r="2" fill="white"/>
<circle id="Ellipse 359" cx="23" cy="15" r="2" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 383 B

@ -0,0 +1,13 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="tishi" clip-path="url(#clip0_1492_1598)">
<path id="Vector" d="M7 0C3.1 0 0 3.1 0 7C0 10.9 3.1 14 7 14C10.9 14 14 10.9 14 7C14 3.1 10.9 0 7 0Z" fill="#00975E"/>
<g id="&#229;&#175;&#185;&#229;&#143;&#183; 2">
<path id="Vector_2" d="M4.14564 6.15296C3.8463 5.85206 3.36038 5.85226 3.06059 6.15282L3.06046 6.15296C2.76162 6.45335 2.76162 6.9404 3.06046 7.24079L3.06052 7.24085L5.52864 9.71898L5.52886 9.71919L4.0393 6.25875M4.14564 6.15296L4.0393 6.25875M4.14564 6.15296L4.14557 6.1529L4.0393 6.25875M4.14564 6.15296L6.07117 8.08619M4.0393 6.25875L5.96532 8.19247L6.07117 8.08619M6.07117 8.08619L6.17703 8.19247L6.07117 8.29875L9.84735 4.29481L9.84739 4.29477L9.95367 4.40062L9.8472 4.29497L6.07117 8.08619Z" fill="white" stroke="white" stroke-width="0.3"/>
</g>
</g>
<defs>
<clipPath id="clip0_1492_1598">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 979 B

@ -0,0 +1,10 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="tishi" clip-path="url(#clip0_1507_5706)">
<path id="Vector" d="M7 0C3.1 0 0 3.1 0 7C0 10.9 3.1 14 7 14C10.9 14 14 10.9 14 7C14 3.1 10.9 0 7 0ZM7.8 11.2C7.8 11.7 7.5 12 7 12C6.5 12 6.2 11.7 6.2 11.2V6.6C6.2 6.1 6.5 5.8 7 5.8C7.5 5.8 7.8 6.1 7.8 6.6V11.2ZM8.2 3.6C8.2 4.3 7.6 4.8 7 4.8C6.4 4.8 5.8 4.3 5.8 3.6C5.8 2.9 6.3 2.3 7 2.3C7.7 2.3 8.2 2.9 8.2 3.6Z" fill="#FFA700"/>
</g>
<defs>
<clipPath id="clip0_1507_5706">
<rect width="14" height="14" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 591 B

@ -0,0 +1,13 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="zhengshi" clip-path="url(#clip0_200_661)">
<path id="Vector" d="M3.5 2.8C3.5 2.35817 3.91572 2 4.42857 2H15.5714C16.0843 2 16.5 2.35817 16.5 2.8V18L13.25 16L10 18L6.75 16L3.5 18V2.8Z" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M7.5 9.16699H12.5" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M7.5 12.5H12.5" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M7.5 5.83301H12.5" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_661">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 863 B

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="jianbie" clip-path="url(#clip0_200_697)">
<path id="Vector" d="M3.3335 18.3332V2.49984C3.3335 2.0396 3.70659 1.6665 4.16683 1.6665H15.8335C16.2937 1.6665 16.6668 2.0396 16.6668 2.49984V18.3332L10.0002 14.8862L3.3335 18.3332Z" stroke="#4287FF" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M6.6665 7.5H13.3332" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_697">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 633 B

@ -0,0 +1,15 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="chuzhi" clip-path="url(#clip0_200_746)">
<path id="Vector" d="M16.25 2.5H3.75C3.05964 2.5 2.5 3.05964 2.5 3.75V16.25C2.5 16.9404 3.05964 17.5 3.75 17.5H16.25C16.9404 17.5 17.5 16.9404 17.5 16.25V3.75C17.5 3.05964 16.9404 2.5 16.25 2.5Z" stroke="#4287FF" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.66699 12.9165H6.25033L7.08366 14.5832H12.917L13.7503 12.9165H18.3337" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M17.5 15.0002V10.8335" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M2.5 15.0002V10.8335" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_5" d="M7.08301 6.25H12.9163" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_6" d="M7.08301 9.5835H12.9163" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_746">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,12 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="wenzhenlishi" clip-path="url(#clip0_200_804)">
<path id="Vector" d="M2.4248 2.80322V5.83352H5.45511" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.66699 9.99984C1.66699 14.6022 5.39795 18.3332 10.0003 18.3332C14.6027 18.3332 18.3337 14.6022 18.3337 9.99984C18.3337 5.39746 14.6027 1.6665 10.0003 1.6665C6.91616 1.6665 4.22328 3.34197 2.78231 5.83238" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M10.0025 5L10.002 10.0037L13.535 13.5368" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_804">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 867 B

@ -0,0 +1,12 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="biaozhun" clip-path="url(#clip0_200_809)">
<path id="Vector" d="M7.93163 18.3332C7.52334 17.0017 6.90738 16.009 6.08375 15.3553C4.84829 14.3747 2.88531 14.9841 2.1602 13.9726C1.4351 12.9612 2.66822 11.101 3.10094 10.0035C3.53365 8.906 1.44237 8.51792 1.68653 8.20638C1.8493 7.99863 2.90609 7.39925 4.85692 6.40817C5.41121 3.24705 7.45863 1.6665 10.9992 1.6665C16.31 1.6665 18.3333 6.16896 18.3333 9.03271C18.3333 11.8964 15.8833 14.9816 12.3933 15.6468C12.0813 16.1013 12.5314 16.9968 13.7436 18.3332" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M8.75904 1.9126C8.26408 4.09118 8.26408 5.78629 8.75904 6.998C9.50154 8.8155 12.7836 8.53625 12.7836 10.232C12.7836 11.9277 10.8712 12.2537 11.1264 13.4301C11.2965 14.2144 11.675 15.2316 12.2616 16.4817" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round"/>
<path id="Vector_3" d="M7.08337 12.7293C7.18146 12.7293 8.08354 12.6717 8.73292 11.9995C9.16583 11.5514 9.38225 11.0237 9.38225 10.4165" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round"/>
</g>
<defs>
<clipPath id="clip0_200_809">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@ -0,0 +1,12 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="chubu" clip-path="url(#clip0_200_616)">
<path id="Vector" d="M4.16659 18.3332C3.70635 18.3332 3.33325 17.9601 3.33325 17.4998V2.49984C3.33325 2.0396 3.70635 1.6665 4.16659 1.6665H15.8333C16.2935 1.6665 16.6666 2.0396 16.6666 2.49984V17.4998C16.6666 17.9601 16.2935 18.3332 15.8333 18.3332H4.16659Z" stroke="#4287FF" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M8.75 9.1665V1.6665H13.75V9.1665L11.25 6.55288L8.75 9.1665Z" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M4.16675 1.6665H15.8334" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_616">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 919 B

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="pingfen" clip-path="url(#clip0_200_527)">
<path id="Vector" d="M3.33337 18.3332V1.6665H12.9167L16.6667 6.0415V18.3332H3.33337Z" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M9.99999 6.25L11.285 9.06463L14.359 9.417L12.0792 11.5089L12.694 14.5413L9.99999 13.0196L7.30599 14.5413L7.92074 11.5089L5.64099 9.417L8.71495 9.06463L9.99999 6.25Z" stroke="#4287FF" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_527">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 703 B

@ -0,0 +1,13 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="fangda" clip-path="url(#clip0_371_98)">
<path id="Vector" d="M8.75 15.8332C12.662 15.8332 15.8333 12.6618 15.8333 8.74984C15.8333 4.83784 12.662 1.6665 8.75 1.6665C4.838 1.6665 1.66667 4.83784 1.66667 8.74984C1.66667 12.6618 4.838 15.8332 8.75 15.8332Z" stroke="#333333" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M8.75 6.25V11.25" stroke="#333333" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M6.2565 8.7565L11.25 8.75" stroke="#333333" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M13.8423 13.8423L17.3779 17.3778" stroke="#333333" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_371_98">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 934 B

@ -0,0 +1,13 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="zhengshi" clip-path="url(#clip0_200_621)">
<path id="Vector" d="M3.5 2.8C3.5 2.35817 3.91572 2 4.42857 2H15.5714C16.0843 2 16.5 2.35817 16.5 2.8V18L13.25 16L10 18L6.75 16L3.5 18V2.8Z" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M7.5 9.16699H12.5" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M7.5 12.5H12.5" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M7.5 5.83301H12.5" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_621">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 863 B

@ -0,0 +1,12 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="shanchu" clip-path="url(#clip0_200_899)">
<path id="Vector" d="M4.66666 3.66699L1.33333 8.00033L4.66666 12.3337H14.6667V3.66699H4.66666Z" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M7 6.33301L10.3333 9.66634" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M10.3333 6.33301L7 9.66634" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_899">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 711 B

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="jianbie" clip-path="url(#clip0_200_667)">
<path id="Vector" d="M3.3335 18.3332V2.49984C3.3335 2.0396 3.70659 1.6665 4.16683 1.6665H15.8335C16.2937 1.6665 16.6668 2.0396 16.6668 2.49984V18.3332L10.0002 14.8862L3.3335 18.3332Z" stroke="#2B3F54" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M6.6665 7.5H13.3332" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_667">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 633 B

@ -0,0 +1,15 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="chuzhi" clip-path="url(#clip0_200_689)">
<path id="Vector" d="M16.25 2.5H3.75C3.05964 2.5 2.5 3.05964 2.5 3.75V16.25C2.5 16.9404 3.05964 17.5 3.75 17.5H16.25C16.9404 17.5 17.5 16.9404 17.5 16.25V3.75C17.5 3.05964 16.9404 2.5 16.25 2.5Z" stroke="#2B3F54" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.66699 12.9165H6.25033L7.08366 14.5832H12.917L13.7503 12.9165H18.3337" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M17.5 15.0002V10.8335" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M2.5 15.0002V10.8335" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_5" d="M7.08301 6.25H12.9163" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_6" d="M7.08301 9.5835H12.9163" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_689">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@ -0,0 +1,12 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="shouqi" clip-path="url(#clip0_200_894)">
<path id="Vector" d="M2 3H14" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M2 6.33301H14" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M2 8.66699L8 13.3337L14 8.66699" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_894">
<rect width="16" height="16" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 636 B

@ -0,0 +1,12 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="wenzhenlishi" clip-path="url(#clip0_200_741)">
<path id="Vector" d="M2.4248 2.80322V5.83352H5.45511" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M1.66699 9.99984C1.66699 14.6022 5.39795 18.3332 10.0003 18.3332C14.6027 18.3332 18.3337 14.6022 18.3337 9.99984C18.3337 5.39746 14.6027 1.6665 10.0003 1.6665C6.91616 1.6665 4.22328 3.34197 2.78231 5.83238" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M10.0025 5L10.002 10.0037L13.535 13.5368" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_741">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 867 B

@ -0,0 +1,14 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="wenzhen" clip-path="url(#clip0_200_814)">
<path id="Vector" fill-rule="evenodd" clip-rule="evenodd" d="M3.33337 3.33333C3.33337 2.8731 3.70647 2.5 4.16671 2.5H11.25V7.5H16.6667V16.6667C16.6667 17.1269 16.2936 17.5 15.8334 17.5H4.16671C3.70647 17.5 3.33337 17.1269 3.33337 16.6667V3.33333Z" stroke="#2B3F54" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M11.25 2.5L16.6667 7.5" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M11.2601 2.5V7.53408H16.6665" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_4" d="M5.83337 12.5H10.8334" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round"/>
<path id="Vector_5" d="M8.33337 10V15" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round"/>
</g>
<defs>
<clipPath id="clip0_200_814">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1,12 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="suoxiao" clip-path="url(#clip0_371_104)">
<path id="Vector" d="M8.75 15.8332C12.662 15.8332 15.8333 12.6618 15.8333 8.74984C15.8333 4.83784 12.662 1.6665 8.75 1.6665C4.838 1.6665 1.66667 4.83784 1.66667 8.74984C1.66667 12.6618 4.838 15.8332 8.75 15.8332Z" stroke="#333333" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" d="M6.25 8.75H11.25" stroke="#333333" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M13.8423 13.8423L17.3779 17.3778" stroke="#333333" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_371_104">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 802 B

@ -0,0 +1,12 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="yuqi" clip-path="url(#clip0_200_531)">
<path id="Vector" d="M4.16671 18.3332C3.70647 18.3332 3.33337 17.9601 3.33337 17.4998V2.49984C3.33337 2.0396 3.70647 1.6665 4.16671 1.6665H15.8334C16.2936 1.6665 16.6667 2.0396 16.6667 2.49984V17.4998C16.6667 17.9601 16.2936 18.3332 15.8334 18.3332H4.16671Z" stroke="#2B3F54" stroke-width="1.5" stroke-linejoin="round"/>
<path id="Vector_2" fill-rule="evenodd" clip-rule="evenodd" d="M8.75 9.1665V1.6665H13.75V9.1665L11.25 6.55288L8.75 9.1665Z" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M4.16663 1.6665H15.8333" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_531">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 918 B

@ -0,0 +1,11 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="pingfen" clip-path="url(#clip0_200_607)">
<path id="Vector" d="M3.33325 18.3332V1.6665H12.9166L16.6666 6.0415V18.3332H3.33325Z" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M10.0001 6.25L11.2852 9.06463L14.3591 9.417L12.0794 11.5089L12.6941 14.5413L10.0001 13.0196L7.30611 14.5413L7.92086 11.5089L5.64111 9.417L8.71507 9.06463L10.0001 6.25Z" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_607">
<rect width="20" height="20" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 706 B

@ -0,0 +1,5 @@
<svg width="16" height="10" viewBox="0 0 16 10" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="xiala">
<path id="xiala_2" d="M7.26545 9.20482C7.66137 9.63342 8.33863 9.63342 8.73455 9.20482L13.3776 4.17855C13.9693 3.53807 13.515 2.5 12.6431 2.5H3.35693C2.485 2.5 2.03073 3.53807 2.62238 4.17855L7.26545 9.20482Z" fill="#2B3F54"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 350 B

@ -0,0 +1,12 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="zhankai" clip-path="url(#clip0_200_919)">
<path id="Vector" d="M2 13H14" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_2" d="M2 9.66699H14" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
<path id="Vector_3" d="M2 7.33301L8 2.66634L14 7.33301" stroke="#2B3F54" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_200_919">
<rect width="16" height="16" fill="white" transform="matrix(1 0 0 -1 0 16)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 672 B

@ -0,0 +1,14 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="xinjianwenjian" clip-path="url(#clip0_1507_5744)">
<path id="Vector" d="M22.0311 22H1.96886C1.43305 22 1 21.561 1 21.0179V4.98208C1 4.43896 1.43305 4 1.96886 4H22.0311C22.5669 4 23 4.43896 23 4.98208V21.0179C23 21.5586 22.5645 22 22.0311 22Z" fill="#FFE9B4"/>
<path id="Vector_2" d="M12.429 8.13636H1V3.00662C1 2.44992 1.44995 2 2.00664 2H9.82846C10.2733 2 10.6648 2.28979 10.7919 2.71683L12.429 8.13636Z" fill="#FFB02C"/>
<path id="Vector_3" d="M22.0311 22H1.96886C1.43305 22 1 21.4909 1 20.8609V6.13909C1 5.50913 1.43305 5 1.96886 5H22.0311C22.5669 5 23 5.50913 23 6.13909V20.8609C23 21.488 22.5645 22 22.0311 22Z" fill="#FFCA28"/>
<rect id="Rectangle 1968" x="7.25" y="12.5" width="9" height="1.5" fill="#FFAA0F"/>
<rect id="Rectangle 1969" x="11" y="17.75" width="9" height="1.5" transform="rotate(-90 11 17.75)" fill="#FFAA0F"/>
</g>
<defs>
<clipPath id="clip0_1507_5744">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1,511 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import emptyImg from "@/assets/newInquiry/empty.png";
import videoImg from "@/assets/newInquiry/viedo.png";
import playImg from "@/assets/newInquiry/play.png";
import { downLoadUrl } from "@/utils/auth";
import folderImg from "@/assets/newInquiry/folder.png";
import { getFileDirectory, queryMedicalRecPage } from "@/api/generalRules";
import { ArrowLeft } from "@element-plus/icons-vue";
import PlayVideo from "@/components/PlayVideo/index.vue";
import router from "@/router";
defineOptions({
name: "MaterialLibrary"
});
const dialogVisible = ref(false);
const seachName = ref("");
const type = ref(1);
const fileList = ref([]);
const selectFileId = ref("");
const selectId = ref("");
const detailFlag = ref(false);
const tableList = ref([]);
const selectName = ref("");
const selectFileName = ref("");
const fileId = ref("");
const PlayVideoRef = ref();
defineExpose({
async open(val) {
dialogVisible.value = true;
type.value = val;
if (val === 1) {
getTableData();
} else {
search();
}
}
});
const page = reactive<any>({
total: 0,
pageSize: 999,
pageNum: 1
});
const getTableData = async () => {
const res: any = await getFileDirectory({
fileName: seachName.value
});
tableList.value = res.data;
};
const getData = async () => {
const res: any = await queryMedicalRecPage({
materialName: seachName.value,
materialType: type.value,
pageNum: page.pageNum,
pageSize: page.pageSize,
directoryId: type.value === 1 ? selectId.value : ""
});
fileList.value = res.data.records;
page.total = res.data.total;
};
const resetForm = () => {
seachName.value = "";
selectFileId.value = "";
detailFlag.value = false;
selectName.value = "";
fileId.value = "";
selectId.value = "";
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
};
const emit = defineEmits(["select"]);
const search = () => {
page.pageNum = 1;
if (type.value === 1 && !detailFlag.value) {
getTableData();
} else {
getData();
}
};
const selectImg = item => {
selectFileId.value = item.fileResourceId;
fileId.value = item.id;
};
const selectVideo = item => {
selectFileId.value = item.fileResourceId;
fileId.value = item.id;
selectFileName.value = item.materialName;
};
const openDetail = item => {
selectName.value = item.directoryName;
detailFlag.value = true;
selectId.value = item.id;
getData();
};
const submit = () => {
emit("select", selectFileId.value, selectFileName.value);
dialogVisible.value = false;
resetForm();
};
const goBack = () => {
selectName.value = "";
detailFlag.value = false;
};
const openVideo = id => {
PlayVideoRef.value.open(id, 1);
};
const goMaterialCenter = () => {
router.push("/generalRules/materialCenter");
};
</script>
<template>
<div>
<el-drawer
:size="800"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>素材库</span>
</div>
<div class="line" />
<div>
<el-input
style="width: 600px"
v-model="seachName"
clearable
size="large"
placeholder="请输入"
>
<template #prepend>
<el-select
disabled
size="large"
v-model="type"
placeholder="Select"
style="width: 85px"
>
<el-option label="图片" :value="0" />
<el-option label="视频" :value="1" />
<el-option label="音频" :value="2" />
</el-select>
</template>
</el-input>
<el-button class="ml-8" size="large" @click="search" type="primary"
>搜索</el-button
>
</div>
<!-- 图片列表 -->
<div v-show="fileList.length > 0 && type === 0" class="img_card_list">
<div
class="img_card_item"
v-for="(item, index) in fileList"
:key="index"
@click="selectImg(item)"
:class="fileId === item.id ? 'actived' : ''"
>
<img :src="downLoadUrl(item.fileResourceId)" alt="" />
<div class="name">{{ item.materialName }}</div>
</div>
</div>
<!-- 文件夹列表 -->
<div
v-show="tableList.length > 0 && !detailFlag"
class="folder_card_list"
>
<div
class="folder_card_item"
v-for="(item, index) in tableList"
:key="index"
@click="openDetail(item)"
>
<div class="folder_img">
<img :src="folderImg" alt="" />
</div>
<div class="name">{{ item.directoryName }}</div>
</div>
</div>
<!-- 视频列表 -->
<div class="video_top" v-show="detailFlag">
<div @click="goBack" class="back_icon">
<el-icon><ArrowLeft /></el-icon>
<span>返回</span>
</div>
<span style="margin-left: 24px" class="name">{{ selectName }}</span>
</div>
<div class="video_list" v-show="detailFlag">
<div
v-for="(item, index) in fileList"
class="video_list_item"
@click="selectVideo(item)"
:class="fileId === item.id ? 'actived' : ''"
:key="index"
>
<div class="left">
<img :src="videoImg" alt="" />
<span>{{ item.materialName }}</span>
</div>
<div @click="openVideo(item.fileResourceId)" class="right">
<img :src="playImg" alt="" />
<span>点击播放</span>
</div>
</div>
</div>
<div
v-show="fileList.length === 0 && tableList.length === 0"
class="empty_list"
>
<img :src="emptyImg" alt="" />
<div @click="goMaterialCenter">
<span>暂无可用素材可前往</span>
<span style="color: #4287ff">通用规则-素材中心</span>
<span>进行设置</span>
</div>
</div>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="resetForm()"></div>
<div class="main" @click="submit()"></div>
</div>
</template>
</el-drawer>
<PlayVideo ref="PlayVideoRef" />
</div>
</template>
<style lang="scss" scoped>
.AddEdit {
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.back_icon {
display: flex;
align-items: center;
color: #999;
cursor: pointer;
}
.video_list {
display: flex;
flex-direction: column;
.actived {
border: 2px solid #4287ff;
}
.video_list_item {
display: flex;
align-items: center;
justify-content: space-between;
height: 56px;
padding: 0 16px;
margin-top: 8px;
cursor: pointer;
border-radius: 6px;
.left {
display: flex;
img {
width: 24px;
height: 24px;
margin-right: 12px;
}
span {
width: 400px;
overflow: hidden;
color: #666;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.right {
display: flex;
align-items: center;
color: #4287ff;
cursor: pointer;
img {
width: 16px;
height: 16px;
margin-right: 12px;
}
}
}
.video_list_item:hover {
border: 2px solid #4287ff;
}
}
.video_top {
display: flex;
margin-top: 16px;
}
.folder_card_list {
display: flex;
flex-wrap: wrap;
margin-top: 16px;
.folder_card_item {
width: 190px;
height: 230px;
margin-right: 16px;
margin-bottom: 16px;
cursor: pointer;
background: #fff;
border-radius: 0 0 12px 12px;
box-shadow: 0 2px 4px 0 rgb(0 0 0 / 8%);
.folder_img {
display: flex;
align-items: center;
justify-content: center;
height: 190px;
background: #f5f5f5;
img {
width: 130px;
height: 130px;
}
}
.name {
width: 200px;
padding: 8px 16px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
}
.img_card_list {
display: flex;
flex-wrap: wrap;
margin-top: 24px;
.actived {
border: 2px solid #4287ff;
}
.img_card_item {
width: 190px;
height: 230px;
margin-right: 16px;
cursor: pointer;
background: #fff;
border-radius: 12px;
box-shadow: 0 2px 4px 0 rgb(0 0 0 / 8%);
img {
width: 190px;
height: 190px;
border-radius: 12px 12px 0 0;
}
.name {
width: 200px;
padding: 8px 16px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
.img_card_item:hover {
border: 2px solid #4287ff;
}
}
.empty_list {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
margin-top: 200px;
img {
width: 200px;
height: 120px;
}
span {
cursor: pointer;
}
}
.line {
position: relative;
left: -20px;
width: 755px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
.normal_list {
display: flex;
flex-direction: column;
width: 100%;
.normal_list_item {
margin-bottom: 12px;
border: 1px solid #d9d9d9;
.top {
display: flex;
align-items: center;
justify-content: space-between;
height: 36px;
padding: 0 12px;
font-size: 14px;
font-weight: 400;
line-height: 36px;
color: #333;
background: #f5f7f9;
.icon {
font-size: 16px;
cursor: pointer;
}
}
}
:deep(.el-textarea__inner) {
box-shadow: none;
}
}
.add_btn {
width: 76px;
height: 32px;
margin-left: 16px;
font-size: 14px;
font-weight: 400;
line-height: 32px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
opacity: 1;
}
}
</style>

@ -0,0 +1,45 @@
<script setup lang="ts">
import { ref, nextTick } from "vue";
defineOptions({
name: "PlayVideo"
});
const videoUrl = ref("");
const type = ref(1);
const titleList = ["图片", "播放视频", "播放音频"];
defineExpose({
async open(id, val) {
videoUrl.value = "";
type.value = val;
dialogVisible.value = true;
await nextTick;
videoUrl.value = `/virtual-patient-manage/fileManage/downloadFile?fileId=${id}`;
}
});
const closed = () => {
videoUrl.value = "";
dialogVisible.value = false;
};
const dialogVisible = ref(false);
</script>
<template>
<div>
<el-dialog
width="600"
:title="titleList[type]"
append-to-body
v-model="dialogVisible"
:before-close="closed"
custom-class="PlayVideo"
>
<div v-if="videoUrl && type === 1">
<video ref="videoPlayer" :src="videoUrl" type="video/mp4" controls />
</div>
<audio v-if="videoUrl && type === 2" id="myAudio" controls>
<source :src="videoUrl" type="audio/mpeg" />
</audio>
</el-dialog>
</div>
</template>

@ -16,6 +16,8 @@ import WeixinFavorites from "@iconify-icons/icon-park-outline/weixin-favorites";
import BuildingOne from "@iconify-icons/icon-park-outline/building-one";
import Alarm from "@iconify-icons/icon-park-outline/alarm";
import Camera from "@iconify-icons/icon-park-outline/camera";
import BarChartOutlined from "@iconify-icons/ant-design/bar-chart-outlined";
import UserOutlined from "@iconify-icons/ant-design/user-outlined";
addIcon("homeFilled", HomeFilled);
addIcon("informationLine", InformationLine);
@ -28,3 +30,5 @@ addIcon("weixinFavorites", WeixinFavorites);
addIcon("buildingOne", BuildingOne);
addIcon("alarm", Alarm);
addIcon("camera", Camera);
addIcon("barChartOutlined", BarChartOutlined);
addIcon("userOutlined", UserOutlined);

@ -28,9 +28,10 @@
import "@wangeditor/editor/dist/css/style.css";
import { onBeforeUnmount, ref, shallowRef, onMounted, nextTick } from "vue";
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { uploadFile } from "@/api/utils";
export default {
components: { Editor, Toolbar },
setup() {
// shallowRef
const editorRef = shallowRef();
@ -41,15 +42,76 @@ export default {
// ajax
onMounted(() => {
nextTick(() => {
const editor = editorRef.value;
console.log("12121", editor);
// const editor = editorRef.value;
});
});
//
const toolbarConfig = {
excludeKeys: ["headerSelect", "italic", "group-more-style"]
toolbarKeys: [
// key
"headerSelect",
"bold", //
"italic", //
"through", // 线
"underline", // 线
"bulletedList", //
"numberedList", //
"color", //
"insertLink", //
"fontSize", //
"lineHeight", //
"uploadImage", //
"delIndent", //
"indent", //
"deleteImage", //
"divider", // 线
"insertTable", //
"justifyCenter", //
"justifyJustify", //
"justifyLeft", //
"justifyRight", //
"undo", //
"redo", //
"clearStyle", //
"fullScreen" //
]
};
const editorConfig = {
placeholder: "请输入内容...",
MENU_CONF: {
uploadImage: {
// server: "/virtual-patient-manage/fileManage/uploadFile",
// headers: { token: getToken() },
// fieldName: "file", //
// customInsert(res, insertFn) {
// if (res.code == 200) {
// insertFn(
// `/virtual-patient-manage/fileManage/downloadFile?fileId=${res.data}`,
// "",
// ""
// );
// }
// }
async customUpload(file, insertFn) {
// file
// url alt href
const form = new FormData();
form.append("file", file);
uploadFile(form).then(res => {
if (res.code === 200) {
insertFn(
`/virtual-patient-manage/fileManage/downloadFile?fileId=${res.data.id}`,
"",
""
);
}
});
}
}
}
};
const editorConfig = { placeholder: "请输入内容..." };
//
onBeforeUnmount(() => {
@ -106,10 +168,14 @@ export default {
if (editor == null) return;
editor.disable();
};
const initText = val => {
const editor = editorRef.value;
if (editor == null) return;
valueHtml.value = val;
};
return {
editorRef,
mode: "default",
mode: "simple",
valueHtml,
toolbarConfig,
editorConfig,
@ -122,7 +188,8 @@ export default {
customPaste,
insertText,
printHtml,
disable
disable,
initText
};
}
};

@ -134,7 +134,8 @@ const transitionMain = defineComponent({
width: 100%;
height: 100vh;
overflow-x: hidden;
background: #fff;
/* background: #fff; */
}
.app-main-nofixed-header {
@ -144,6 +145,8 @@ const transitionMain = defineComponent({
}
.main-content {
margin: 24px;
display: flex;
flex-direction: column;
margin: 16px;
}
</style>

@ -1,6 +1,6 @@
<script setup lang="ts">
import Search from "./search/index.vue";
import Notice from "./notice/index.vue";
// import Search from "./search/index.vue";
// import Notice from "./notice/index.vue";
import mixNav from "./sidebar/mixNav.vue";
import { useNav } from "@/layout/hooks/useNav";
import Breadcrumb from "./sidebar/breadCrumb.vue";
@ -42,11 +42,11 @@ const {
<div v-if="layout === 'vertical'" class="vertical-header-right">
<!-- 菜单搜索 -->
<Search />
<!-- <Search /> -->
<!-- 通知 -->
<Notice id="header-notice" />
<!-- <Notice id="header-notice" /> -->
<!-- 退出登录 -->
<el-dropdown trigger="click" class="mr-6">
<el-dropdown style="width: 50px" trigger="click" class="mr-6">
<span class="el-dropdown-link navbar-bg-hover select-none">
<img :src="userAvatar" :style="avatarsStyle" />
<p v-if="username" class="dark:text-white">{{ username }}</p>
@ -121,7 +121,7 @@ const {
}
.logout {
max-width: 120px;
// max-width: 120px;
::v-deep(.el-dropdown-menu__item) {
display: inline-flex;

@ -29,7 +29,8 @@ const getBreadcrumb = (): void => {
// });
// } else {
// }
// currentRoute = findRouteByPath(router.currentRoute.value.path, routes);
// eslint-disable-next-line prefer-const
currentRoute = findRouteByPath(router.currentRoute.value.path, routes);
//
const parentRoutes = getParentPaths(

@ -1,5 +1,4 @@
<script setup lang="ts">
import Logo from "./logo.vue";
import { useRoute } from "vue-router";
import { emitter } from "@/utils/mitt";
import SidebarItem from "./sidebarItem.vue";
@ -80,7 +79,7 @@ onBeforeUnmount(() => {
v-loading="loading"
:class="['sidebar-container', showLogo ? 'has-logo' : '']"
>
<Logo v-if="showLogo" :collapse="isCollapse" />
<!-- <Logo v-if="showLogo" :collapse="isCollapse" /> -->
<el-scrollbar wrap-class="scrollbar-wrapper" class="pc">
<el-menu
router

@ -124,7 +124,7 @@ router.beforeEach((to: ToRouteType, _from, next) => {
function toCorrectRoute() {
whiteList.includes(to.fullPath) ? next(_from.fullPath) : next();
}
if (userInfo?.roleCode === "1") {
if (userInfo?.roleCode) {
// 无权限跳转403页面
if (to.meta?.roles && !isOneOfArray(to.meta?.roles, userInfo?.roles)) {
next({ path: "/error/403" });

@ -3,8 +3,8 @@ export default {
redirect: "/caseManagement/diseaseType",
meta: {
title: "病例管理",
icon: "projectIcon",
rank: 11
icon: "barChartOutlined",
rank: 12
},
children: [
{

@ -0,0 +1,34 @@
export default {
path: "/generalRules",
redirect: "/generalRules/responseStrategy",
meta: {
title: "通用规则",
icon: "weixinFavorites",
rank: 14
},
children: [
{
path: "/generalRules/responseStrategy",
name: "ResponseStrategy",
component: () =>
import("@/views/generalRules/responseStrategy/index.vue"),
meta: {
title: "应答策略 ",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/generalRules/materialCenter",
name: "MaterialCenter",
component: () => import("@/views/generalRules/materialCenter/index.vue"),
meta: {
title: "素材中心 ",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
}
]
} as RouteConfigsTable;

@ -0,0 +1,35 @@
export default {
path: "/inquiryCase",
redirect: "/inquiryCase/list",
meta: {
title: "问诊病历",
icon: "terminal",
rank: 13
},
children: [
{
path: "/inquiryCase/list",
name: "InquiryCase",
component: () => import("@/views/inquiryCase/list/index.vue"),
meta: {
title: "问诊病历 ",
showLink: true,
showParent: true,
roles: ["admin", "common"]
},
children: [
{
path: "/inquiryCase/estimate",
name: "Estimate",
component: () => import("@/views/inquiryCase/estimate/index.vue"),
meta: {
title: "评估",
showLink: false,
activePath: "/inquiryCase/list",
roles: ["admin", "common"]
}
}
]
}
]
} as RouteConfigsTable;

@ -20,39 +20,66 @@ export default {
}
// children: [
// {
// path: "/project/details",
// name: "ProjectDetails",
// component: () => import("@/views/project/details/index.vue"),
// meta: {
// title: "项目详情",
// // showLink: false,
// showParent: true,
// roles: ["admin", "common"]
// }
// }
// ]
}
// {
// path: "/inquiryManagement/supportInspect",
// name: "SupportInspect",
// path: "/inquiryManagement/bodyInspect/add",
// name: "BodyInspectAdd",
// component: () =>
// import("@/views/inquiryManagement/supportInspect/list/index.vue"),
// import("@/views/inquiryManagement/bodyInspect/list/add.vue"),
// meta: {
// title: "辅助检查",
// title: "新建体格检查",
// showLink: false,
// activePath: "/inquiryManagement/list",
// roles: ["admin", "common"]
// }
// },
// {
// path: "/inquiryManagement/disposalPlan",
// name: "DisposalPlan",
// path: "/inquiryManagement/bodyInspect/edit",
// name: "BodyInspectEdit",
// component: () =>
// import("@/views/inquiryManagement/disposalPlan/list/index.vue"),
// import("@/views/inquiryManagement/bodyInspect/list/edit.vue"),
// meta: {
// title: "处置计划",
// title: "编辑体格检查",
// showLink: false,
// activePath: "/inquiryManagement/list",
// roles: ["admin", "common"]
// }
// }
// ]
},
{
path: "/inquiryManagement/disposalPlan",
name: "DisposalPlan",
component: () =>
import("@/views/inquiryManagement/disposalPlan/list/index.vue"),
meta: {
title: "处置计划",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/inquiryManagement/medicationManagement",
name: "MedicationManagement",
component: () =>
import("@/views/inquiryManagement/medicationManagement/list/index.vue"),
meta: {
title: "药物管理",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/inquiryManagement/supportInspect",
name: "InquiryManagementSupportInspect",
component: () =>
import("@/views/inquiryManagement/supportInspect/list/index.vue"),
meta: {
title: "辅助检查",
showLink: true,
showParent: true,
roles: ["admin", "common"]
}
}
]
} as RouteConfigsTable;

@ -46,26 +46,5 @@ export default [
showLink: false,
rank: 103
}
},
{
path: "/inquiry",
name: "Inquiry",
meta: {
title: "问诊",
icon: "computer",
// showLink: true,
rank: 1
},
children: [
{
path: "/inquiry",
name: "Inquiry",
component: () => import("@/views/inquiry/index.vue"),
meta: {
title: "问诊",
roles: ["admin"]
}
}
]
}
] as Array<RouteConfigsTable>;

@ -3,8 +3,8 @@ export default {
redirect: "/systemManagement/accountManagement",
meta: {
title: "系统管理",
icon: "projectIcon",
rank: 12
icon: "userOutlined",
rank: 15
},
children: [
{
@ -18,16 +18,16 @@ export default {
showParent: true,
roles: ["admin", "common"]
}
},
{
path: "/systemManagement/loginStatus",
name: "LoginStatus",
component: () => import("@/views/systemManagement/loginStatus/index.vue"),
meta: {
title: "登录状态",
showLink: true,
roles: ["admin", "common"]
}
}
// {
// path: "/systemManagement/loginStatus",
// name: "LoginStatus",
// component: () => import("@/views/systemManagement/loginStatus/index.vue"),
// meta: {
// title: "登录状态",
// showLink: true,
// roles: ["admin", "common"]
// }
// }
]
} as RouteConfigsTable;

@ -5,13 +5,20 @@ export const useCaseStore = defineStore({
state: () => ({
activedStep: 0, // 当前步骤
basicInfo: {
name: "",
gender: "",
age: "",
patientName: "",
patientGender: "",
patientAge: "",
diseaseName: "",
diseaseId: "",
patientSelfDesc: "",
address: ""
address: "",
nativePlace: "",
patientNation: "",
patientPostcode: "",
patientBirthplace: "",
patientPhone: "",
digitalHumanType: "",
patientHeadPic: ""
},
diagnosticBasisInfo: {
primarilyDiagnosisCriteria: "",
@ -20,6 +27,7 @@ export const useCaseStore = defineStore({
fullCheck: ""
},
qaList: [],
defaultQaList: [],
patientId: "",
isEditFlag: false
}),
@ -36,6 +44,9 @@ export const useCaseStore = defineStore({
changeQaList(data) {
this.qaList = data;
},
changeDefaultQaList(data) {
this.defaultQaList = data;
},
changeIsEditFlag(data) {
this.isEditFlag = data;
}

@ -274,10 +274,10 @@ div:focus {
width: 100%;
display: flex;
justify-content: center;
margin-top: 36px;
margin-top: 24px;
}
.el-form-item__label {
font-weight: 700;
// font-weight: 700;
}
.header_title {
display: flex;
@ -300,3 +300,113 @@ div:focus {
.el-table__row {
cursor: pointer;
}
.app-main-content {
.el-table__row {
height: 75px !important;
}
}
.app-main-content {
// background-color: #fff;
height: calc(100vh - 80px);
.seach {
margin-bottom: 16px;
padding: 24px;
background-color: #fff;
}
}
.el-drawer__title {
font-weight: bold;
color: #666;
}
.main-table {
background-color: #fff;
padding: 24px;
height: calc(100vh - 85px);
.main-table-title {
.title {
display: flex;
margin-bottom: 24px;
.line {
width: 6px;
height: 20px;
background: #4287ff;
position: relative;
top: 5px;
margin-right: 12px;
}
span {
font-size: 20px;
}
}
}
}
.el-form-item {
align-items: center;
}
.seach {
.el-form-item {
margin-bottom: 0;
}
}
.AddEdit {
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 755px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}

@ -35,6 +35,7 @@
.main-container {
position: relative;
min-width: 1500px;
height: 100vh;
min-height: 100%;
margin-left: $sideBarWidth;

@ -60,3 +60,6 @@ export function clearObject(obj) {
obj[key] = null; // 或者 obj[key] = undefined;
});
}
export function downLoadUrl(id) {
return `/virtual-patient-manage/fileManage/downloadFile?fileId=${id}`;
}

@ -19,7 +19,7 @@ import router from "@/router";
// 相关配置请参考www.axios-js.com/zh-cn/docs/#axios-request-config-1
const defaultConfig: AxiosRequestConfig = {
// 请求超时时间
timeout: 10000,
timeout: 100000,
headers: {
Accept: "application/json, text/plain, */*",
"Content-Type": "application/json",
@ -129,7 +129,7 @@ class PureHttp {
return;
}
if (response.data.code !== 200) {
message(response.data.msg, { type: "error" });
message(response.data.data, { type: "error" });
}
const $config = response.config;

@ -0,0 +1,376 @@
<script setup lang="ts">
import { nextTick, reactive, ref } from "vue";
import {
addBodyInspect,
queryPhysicalToolList,
queryTreeDiseasePhysical,
updateBodyInspect
} from "@/api/disease";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { useRoute } from "vue-router";
defineOptions({
name: "AddEdit"
});
const props = {
value: "id",
label: "toolName",
children: "toolList",
disabled: "flag",
expandTrigger: "hover" as const
};
const bodyProps = {
value: "id",
checkStrictly: true,
label: "locationName",
children: "child",
disabled: "flag"
};
const bodyTreeList = ref([]);
const route = useRoute();
const isEditFlag = ref(false);
const requireLocationFlag = ref(false);
const id = ref("");
const dialogVisible = ref(false);
const formData = reactive({
toolIdPath: [],
diagnosticCriteria: [],
locationId: "",
locationIdPath: [],
expectedDiagnosisResult: undefined,
diagnosticRes: "",
result: "",
requireCheckFlag: "",
toolId: "",
normalResult: ""
});
const ruleFormRef = ref<FormInstance>();
const bodyToolList = ref([]);
const cascaderRef = ref();
const locationIdPathRef = ref();
const handleChange = item => {
const dataInfo = cascaderRef.value.getCheckedNodes();
if (dataInfo && dataInfo.length > 0) {
if (dataInfo[0].data.requireLocation === 1) {
requireLocationFlag.value = true;
} else {
requireLocationFlag.value = false;
}
}
formData.toolId = item[item.length - 1];
getBodyTree();
formData.locationIdPath = [];
formData.locationId = "";
formData.result = "";
formData.normalResult = "";
formData.expectedDiagnosisResult = undefined;
};
const handleLocationChange = item => {
formData.locationId = item[item.length - 1];
formData.result = "";
formData.expectedDiagnosisResult = undefined;
const dataInfo = locationIdPathRef.value.getCheckedNodes();
if (dataInfo && dataInfo.length > 0 && dataInfo[0].data.indicatorValue) {
formData.normalResult = dataInfo[0].data.indicatorValue;
}
};
const rules = {
toolIdPath: [
{ required: true, message: "请选择体格检查项", trigger: "change" }
],
requireCheckFlag: [
{ required: true, message: "请选择是否必查", trigger: "change" }
],
expectedDiagnosisResult: [
{ required: true, message: "请选择预期诊断结果", trigger: "change" }
],
result: [{ required: true, message: "请输入异常结果", trigger: "change" }]
};
const getPhysicalToolList = async () => {
const res: any = await queryPhysicalToolList();
bodyToolList.value = res.data;
};
defineExpose({
async open(item) {
getPhysicalToolList();
dialogVisible.value = true;
await nextTick;
isEditFlag.value = false;
if (item) {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
if (item.locationIdPath && item.locationIdPath.length > 0) {
requireLocationFlag.value = true;
} else {
requireLocationFlag.value = false;
}
getBodyTree();
isEditFlag.value = true;
id.value = item.id;
}
}
});
const resetForm = () => {
ruleFormRef.value.resetFields();
formData.result = "";
formData.expectedDiagnosisResult = "";
};
const reset = () => {
if (isEditFlag.value) {
ruleFormRef.value.resetFields([
"expectedDiagnosisResult",
"normalResult",
"result",
"diagnosticCriteria",
"requireCheckFlag"
]);
} else {
ruleFormRef.value.resetFields();
}
formData.result = "";
formData.expectedDiagnosisResult = "";
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
};
const emit = defineEmits(["update"]);
//
const getBodyTree = async () => {
const res: any = await queryTreeDiseasePhysical({
diseaseId: route.query.id,
toolId: formData.toolId
});
bodyTreeList.value = res.data;
};
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
const params = {
...formData,
diseaseId: route.query.id
};
if (isEditFlag.value) {
const res: any = await updateBodyInspect({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
dialogVisible.value = false;
id.value = "";
emit("update");
}
} else {
const res: any = await addBodyInspect(params);
if (res.code === 200) {
dialogVisible.value = false;
message("新增成功", { type: "success" });
emit("update");
}
}
} else {
return fields;
}
});
};
</script>
<template>
<div>
<el-drawer
:size="800"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>体格检查</span>
</div>
<div class="line" />
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="100px"
>
<el-form-item label="疾病名称:" prop="code">
<!-- <span>{{ route.query.diseaseName }}</span> -->
<el-input size="large" readonly v-model="route.query.diseaseName" />
</el-form-item>
<el-row>
<el-col :span="24">
<el-form-item label="体格检查项:" prop="toolIdPath">
<el-cascader
:disabled="isEditFlag"
ref="cascaderRef"
style="width: 100%"
size="large"
v-model="formData.toolIdPath"
:options="bodyToolList"
:props="props"
@change="handleChange"
/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="requireLocationFlag">
<el-col :span="24">
<el-form-item label="检查部位:" prop="locationIdPath">
<el-cascader
:disabled="isEditFlag"
ref="locationIdPathRef"
size="large"
style="width: 100%"
v-model="formData.locationIdPath"
:options="bodyTreeList"
:props="bodyProps"
@change="handleLocationChange"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="预期结果:" prop="expectedDiagnosisResult">
<el-radio-group
@change="formData.result = ''"
v-model="formData.expectedDiagnosisResult"
>
<el-radio :label="0" size="large">正常</el-radio>
<el-radio :label="1" size="large">异常</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="正常结果:" prop="normalResult">
<el-input
size="large"
v-model="formData.normalResult"
placeholder="请输入正常结果"
/>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.expectedDiagnosisResult === 1">
<el-col :span="24">
<el-form-item label="异常结果:" prop="result">
<el-input
size="large"
v-model="formData.result"
placeholder="请输入异常结果"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="诊断依据:" prop="diagnosticCriteria">
<el-checkbox-group v-model="formData.diagnosticCriteria">
<el-checkbox :label="0">初步诊断依据</el-checkbox>
<el-checkbox :label="1">证实诊断依据</el-checkbox>
<el-checkbox :label="2">鉴别依据</el-checkbox>
<el-checkbox :label="3">全面依据</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-row>
<el-form-item label="是否必查:" prop="requireCheckFlag">
<el-radio-group v-model="formData.requireCheckFlag">
<el-radio :label="0" size="large"></el-radio>
<el-radio :label="1" size="large"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<!-- <el-form-item label="诊断结果:" prop="trait">
<WangEditor ref="refWangEditor" />
</el-form-item> -->
</el-form>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="reset()"></div>
<div class="main" @click="save(ruleFormRef)"></div>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.AddEdit {
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 755px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}
</style>

@ -1,50 +1,15 @@
<script setup lang="ts">
import { onMounted, ref, reactive } from "vue";
import WangEditor from "@/components/WangEditor/index.vue";
import {
queryPhysicalToolList,
queryBodyListByDiseaseId,
deleteBodyItem,
queryTreeDiseasePhysical,
addBodyInspect,
updateBodyInspect
} from "@/api/disease";
import { ElMessageBox, FormInstance } from "element-plus";
import { onMounted, ref } from "vue";
import { queryBodyListByDiseaseId, deleteBodyItem } from "@/api/disease";
import { ElMessageBox } from "element-plus";
import { message } from "@/utils/message";
import { useRoute } from "vue-router";
const isEditFlag = ref(false);
const id = ref("");
const formData = reactive({
toolIdPath: [],
diagnosticCriteria: [],
locationId: "",
locationIdPath: [],
locationDiagnosisFlag: "",
trait: "",
diagnosticRes: "",
result: "",
requireCheckFlag: "",
diagnosisAssessmentFlag: "",
expectedDiagnosisResult: "",
toolId: ""
});
const props = {
value: "id",
label: "toolName",
children: "toolList",
disabled: "flag",
expandTrigger: "hover" as const
};
const bodyProps = {
value: "id",
label: "locationName",
children: "child",
disabled: "flag"
};
import AddEdit from "./addEdit.vue";
const route = useRoute();
const selectBodyInspectList = ref([]);
const bodyTreeList = ref([]);
const refWangEditor = ref(null);
const AddEditRef = ref();
const columns: TableColumnList = [
{
label: "体格检查项目",
@ -54,13 +19,13 @@ const columns: TableColumnList = [
label: "固定检查位",
prop: "locationName"
},
{
label: "诊断判读",
prop: "diagnosisAssessmentFlag",
formatter: ({ diagnosisAssessmentFlag }) => {
return diagnosisAssessmentFlag === 0 ? "不需要" : "需要";
}
},
// {
// label: "",
// prop: "diagnosisAssessmentFlag",
// formatter: ({ diagnosisAssessmentFlag }) => {
// return diagnosisAssessmentFlag === 0 ? "" : "";
// }
// },
{
label: "是否必查",
prop: "requireCheckFlag",
@ -84,61 +49,11 @@ const columns: TableColumnList = [
defineOptions({
name: "BodyInspect"
});
const diagnosticResList = [
{
label: "正常",
value: 0
},
{
label: "异常",
value: 1
}
];
const rules = {
toolIdPath: [
{ required: true, message: "请选择体格检查项", trigger: "change" }
],
diagnosisAssessmentFlag: [
{ required: true, message: "请选择诊断判读", trigger: "change" }
],
requireCheckFlag: [
{ required: true, message: "请选择是否必查", trigger: "change" }
],
expectedDiagnosisResult: [
{ required: true, message: "请选择预期诊断结果", trigger: "change" }
]
};
const ruleFormRef = ref<FormInstance>();
const bodyToolList = ref([]);
const handleChange = item => {
formData.toolId = item[item.length - 1];
getBodyTree();
formData.locationIdPath = [];
formData.locationId = "";
formData.result = "";
formData.locationDiagnosisFlag = "";
};
const handleLocationChange = item => {
formData.locationId = item[item.length - 1];
formData.result = "";
formData.locationDiagnosisFlag = "";
};
const getPhysicalToolList = async () => {
const res: any = await queryPhysicalToolList();
bodyToolList.value = res.data;
};
onMounted(() => {
getPhysicalToolList();
getBodyListByDiseaseId();
});
//
const getBodyTree = async () => {
const res: any = await queryTreeDiseasePhysical({
diseaseId: route.query.id,
toolId: formData.toolId
});
bodyTreeList.value = res.data;
};
const getBodyListByDiseaseId = async () => {
const res: any = await queryBodyListByDiseaseId({
diseaseId: route.query.id
@ -146,18 +61,6 @@ const getBodyListByDiseaseId = async () => {
selectBodyInspectList.value = res.data;
};
const edit = item => {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
getBodyTree();
isEditFlag.value = true;
id.value = item.id;
refWangEditor.value.valueHtml = item.trait;
};
const del = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
type: "warning"
@ -171,148 +74,33 @@ const del = item => {
})
.catch(() => {});
};
const reset = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
formData.result = "";
formData.locationDiagnosisFlag = "";
isEditFlag.value = false;
refWangEditor.value.valueHtml = "";
const add = () => {
AddEditRef.value.open();
};
const save = (formEl: FormInstance | undefined) => {
console.log(refWangEditor.value.valueHtml);
formEl.validate(async (valid, fields) => {
if (valid) {
formData.trait = refWangEditor.value.valueHtml;
const params = {
...formData,
diseaseId: route.query.id
};
if (isEditFlag.value) {
const res: any = await updateBodyInspect({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
reset(ruleFormRef.value);
id.value = "";
getBodyListByDiseaseId();
}
} else {
const res: any = await addBodyInspect(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
reset(ruleFormRef.value);
getBodyListByDiseaseId();
}
}
} else {
return fields;
}
});
const edit = row => {
AddEditRef.value.open(row);
};
</script>
<template>
<div class="body-inspect">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
>
<el-form-item label="疾病名称:" prop="code">
<span>{{ route.query.diseaseName }}</span>
</el-form-item>
<el-form-item label="体格检查项:" prop="toolIdPath">
<el-cascader
size="large"
v-model="formData.toolIdPath"
:options="bodyToolList"
:props="props"
@change="handleChange"
/>
</el-form-item>
<el-row>
<el-form-item label="部位检查结果:" prop="locationIdPath">
<el-cascader
size="large"
v-model="formData.locationIdPath"
:options="bodyTreeList"
:props="bodyProps"
@change="handleLocationChange"
/>
</el-form-item>
<el-select
size="large"
filterable
v-model="formData.locationDiagnosisFlag"
style="width: 150px"
placeholder="诊断结果"
<div class="body-inspect main-table">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>
{{ `已选体格检查项目【${selectBodyInspectList.length}个】` }}
</span>
</div>
<el-row class="mb-6">
<el-button size="large" class="btn" @click="add" type="primary"
>新建</el-button
>
<el-option
v-for="item in diagnosticResList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input
size="large"
style="width: 800px; height: 40px"
v-model="formData.result"
placeholder="请输入诊断部位结果"
/>
</el-row>
<el-form-item label="诊断依据:" prop="diagnosticCriteria">
<el-checkbox-group v-model="formData.diagnosticCriteria">
<el-checkbox :label="0">初步诊断依据</el-checkbox>
<el-checkbox :label="1">证实诊断依据</el-checkbox>
<el-checkbox :label="2">鉴别依据</el-checkbox>
<el-checkbox :label="3">全面依据</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-row>
<el-form-item label="诊断判读:" prop="diagnosisAssessmentFlag">
<el-radio-group v-model="formData.diagnosisAssessmentFlag">
<el-radio :label="0" size="large">不需要</el-radio>
<el-radio :label="1" size="large">需要</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否必查:" prop="requireCheckFlag">
<el-radio-group v-model="formData.requireCheckFlag">
<el-radio :label="0" size="large"></el-radio>
<el-radio :label="1" size="large"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-form-item label="预期诊断结果:" prop="expectedDiagnosisResult">
<el-radio-group v-model="formData.expectedDiagnosisResult">
<el-radio :label="0" size="large">正常</el-radio>
<el-radio :label="1" size="large">异常</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="诊断结果:" prop="trait">
<WangEditor ref="refWangEditor" />
</el-form-item>
</el-form>
<div class="btn-list">
<el-button size="large" @click="save(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="reset(ruleFormRef)"></el-button>
</div>
<div class="footer">
<div class="top">
{{ `已选体格检查项目【${selectBodyInspectList.length}个】` }}
</div>
<pure-table
border
adaptive
ref="tableRef"
style="width: 1600px"
align-whole="center"
showOverflowTooltip
:data="selectBodyInspectList"
@ -327,7 +115,7 @@ const save = (formEl: FormInstance | undefined) => {
<el-button link type="danger" @click="del(row)"> </el-button>
</template></pure-table
>
</div>
<AddEdit @update="getBodyListByDiseaseId" ref="AddEditRef" />
</div>
</template>
<style lang="scss" scoped>

@ -0,0 +1,197 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { addSave, update, queryPageList } from "@/api/disease";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { nextTick } from "vue";
defineOptions({
name: "AddComplexDiseases"
});
const dialogVisible = ref(false);
const title = ref("");
const formData = reactive({
diseaseName: "",
diseaseNameAlias: "",
symptom: "",
containDiseaseIds: [],
id: undefined
});
const ruleFormRef = ref<FormInstance>();
const rules = {
diseaseNameAlias: [{ required: true, message: "请选择", trigger: "change" }],
diseaseName: [
{ required: true, message: "请输入疾病分类名称", trigger: "change" }
]
};
const diseaseList = ref([]);
defineExpose({
async open(type, item) {
dialogVisible.value = true;
await nextTick();
getDiseaseList();
if (type === "add") {
title.value = "新增复合疾病";
} else {
title.value = "编辑复合疾病";
// formData = JSON.parse(JSON.stringify(item));
formData.diseaseNameAlias = item.diseaseNameAlias;
formData.diseaseName = item.diseaseName;
formData.containDiseaseIds = item.containDiseaseIds;
formData.symptom = item.symptom;
formData.id = item.id;
}
}
});
const getDiseaseList = async () => {
const params = {
pageNum: 1,
pageSize: 99999,
diseaseName: ""
};
const res: any = await queryPageList(params);
diseaseList.value = res.data.records;
};
const resetForm = () => {
ruleFormRef.value.resetFields();
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
};
const selectDisease = val => {
const list = [];
for (const item of val) {
diseaseList.value.forEach(res => {
if (res.id === item) {
list.push(res.diseaseNameAlias);
}
});
}
formData.diseaseNameAlias = list.join(",");
};
const emit = defineEmits(["update"]);
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
if (title.value === "编辑复合疾病") {
const {
containDiseaseIds,
diseaseName,
diseaseNameAlias,
symptom,
id
} = formData;
const res: any = await update({
containDiseaseIds,
diseaseName,
diseaseNameAlias,
symptom,
id
});
if (res.code === 200) {
closeDialog();
emit("update");
message("编辑成功", { type: "success" });
}
} else {
const { containDiseaseIds, diseaseName, diseaseNameAlias, symptom } =
formData;
const res: any = await addSave({
containDiseaseIds,
diseaseName,
diseaseNameAlias,
symptom
});
if (res.code === 200) {
closeDialog();
emit("update");
message("新增成功", { type: "success" });
}
}
} else {
return fields;
}
});
};
</script>
<template>
<div>
<el-drawer
width="800"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>{{ title }}</span>
</div>
<div class="line" />
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="120px"
>
<el-form-item label="疾病分类:" prop="containDiseaseIds">
<el-select
style="width: 100%"
size="large"
filterable
multiple
v-model="formData.containDiseaseIds"
placeholder="请选择"
@change="selectDisease"
>
<el-option
v-for="item in diseaseList"
:key="item.id"
:label="item.diseaseName"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="疾病分类别名:" prop="diseaseNameAlias">
<el-input
readonly
v-model="formData.diseaseNameAlias"
size="large"
placeholder="请输入疾病分类别名"
/>
</el-form-item>
<el-form-item label="疾病分类名称:" prop="diseaseName">
<el-input
size="large"
maxlength="20"
show-word-limit
v-model="formData.diseaseName"
placeholder="请输入疾病分类名称"
/>
</el-form-item>
<el-form-item label="症状:" prop="symptom">
<el-input
size="large"
maxlength="20"
show-word-limit
v-model="formData.symptom"
placeholder="请输入症状"
/>
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="resetForm()"></div>
<div class="main" @click="save(ruleFormRef)"></div>
</div>
</template>
</el-drawer>
</div>
</template>

@ -3,6 +3,7 @@ import { reactive, ref } from "vue";
import { addSave, update } from "@/api/disease";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { nextTick } from "vue";
defineOptions({
name: "AddEdit"
});
@ -26,12 +27,13 @@ const rules = {
]
};
defineExpose({
open(type, item) {
resetForm();
async open(type, item) {
dialogVisible.value = true;
await nextTick();
if (type === "add") {
title.value = "新增疾病";
title.value = "新增单一疾病";
} else {
title.value = "编辑疾病";
title.value = "编辑单一疾病";
// formData = JSON.parse(JSON.stringify(item));
formData.diseaseName = item.diseaseName;
formData.diseaseNameAlias = item.diseaseNameAlias;
@ -39,11 +41,9 @@ defineExpose({
formData.symptom = item.symptom;
formData.id = item.id;
}
dialogVisible.value = true;
}
});
const resetForm = () => {
if (!ruleFormRef.value) return;
ruleFormRef.value.resetFields();
};
const closeDialog = () => {
@ -54,7 +54,7 @@ const emit = defineEmits(["update"]);
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
if (title.value === "编辑疾病") {
if (title.value === "编辑单一疾病") {
const { code, diseaseName, diseaseNameAlias, symptom, id } = formData;
const res: any = await update({
@ -92,31 +92,38 @@ const save = (formEl: FormInstance | undefined) => {
<template>
<div>
<el-dialog
<el-drawer
width="800"
append-to-body
:title="title"
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>{{ title }}</span>
</div>
<div class="line" />
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
label-width="120px"
>
<el-form-item label="类目编码:" prop="code">
<el-input
size="large"
v-model="formData.code"
maxlength="20"
placeholder="请输入类目编码"
/>
</el-form-item>
<el-form-item label="疾病分类别名:" prop="diseaseNameAlias">
<el-input
maxlength="20"
v-model="formData.diseaseNameAlias"
size="large"
placeholder="请输入疾病分类别名"
@ -125,6 +132,7 @@ const save = (formEl: FormInstance | undefined) => {
<el-form-item label="疾病分类名称:" prop="diseaseName">
<el-input
size="large"
maxlength="20"
v-model="formData.diseaseName"
placeholder="请输入疾病分类名称"
/>
@ -132,6 +140,7 @@ const save = (formEl: FormInstance | undefined) => {
<el-form-item label="症状:" prop="symptom">
<el-input
size="large"
maxlength="20"
v-model="formData.symptom"
placeholder="请输入症状"
/>
@ -139,17 +148,11 @@ const save = (formEl: FormInstance | undefined) => {
</el-form>
</div>
<template #footer>
<el-button
size="large"
@click="save(ruleFormRef)"
class="footer-btn"
type="primary"
>确定</el-button
>
<el-button size="large" class="footer-btn" @click="closeDialog"
>取消</el-button
>
<div class="footer_btn">
<div class="reset" @click="resetForm()"></div>
<div class="main" @click="save(ruleFormRef)"></div>
</div>
</template>
</el-dialog>
</el-drawer>
</div>
</template>

@ -1,14 +1,16 @@
<script setup lang="ts">
import { reactive, ref } from "vue";
import { PaginationProps } from "@pureadmin/table";
import { queryListAqLibrary, queryItemList } from "@/api/disease";
import { queryListAqLibrary } from "@/api/disease";
import { message } from "@/utils/message";
import { queryCommonDictTree } from "@/api/utils";
defineOptions({
name: "ProblemBase"
});
const dialogVisible = ref(false);
const seachForm = reactive({
code: ""
dictId: "",
dicIdPath: []
});
const multipleSelection = ref([]);
const pagination = reactive<PaginationProps>({
@ -17,6 +19,15 @@ const pagination = reactive<PaginationProps>({
currentPage: 1,
background: true
});
const props = {
value: "id",
label: "nameZh",
children: "childDictTreeList",
expandTrigger: "hover" as const
};
const handleChange = item => {
seachForm.dictId = item[item.length - 1];
};
const selectColumns: TableColumnList = [
{
type: "selection",
@ -44,21 +55,24 @@ const dataList = ref([
question: "dsdsdsdsd"
}
]);
const codeList = ref([]);
const getItemList = async () => {
const res: any = await queryItemList();
codeList.value = res.data;
const dictList = ref([]);
const getCommonDictTree = async () => {
const res: any = await queryCommonDictTree({
groupCode: "AQT"
});
dictList.value = res.data;
};
defineExpose({
open() {
dialogVisible.value = true;
getData();
getItemList();
getCommonDictTree();
}
});
const getData = async () => {
const res: any = await queryListAqLibrary({
code: seachForm.code,
dictId: seachForm.dictId,
pageNum: pagination.currentPage,
pageSize: pagination.pageSize
});
@ -84,7 +98,8 @@ const search = () => {
};
const reset = () => {
seachForm.code = "";
seachForm.dictId = "";
seachForm.dicIdPath = [];
search();
};
const emit = defineEmits(["select"]);
@ -109,37 +124,35 @@ const save = () => {
>
<div>
<div class="seach">
<el-form :model="seachForm" label-width="120px">
<el-row>
<el-form :model="seachForm">
<el-row class="mb-4">
<el-form-item label="类目:">
<el-select
<el-cascader
style="width: 100%"
size="large"
filterable
v-model="seachForm.code"
placeholder="请选择"
>
<el-option
v-for="item in codeList"
:key="item.code"
:label="item.nameZh"
:value="item.code"
v-model="seachForm.dicIdPath"
:options="dictList"
:props="props"
@change="handleChange"
/>
</el-select>
</el-form-item>
<el-button size="large" @click="search" type="primary"
<el-button
size="large"
class="ml-4"
@click="search"
type="primary"
>搜索</el-button
>
<el-button size="large" @click="reset"></el-button>
</el-row>
<el-row>
<!-- <el-row class="mb-4">
<el-button size="large" @click="save" type="primary"
>保存</el-button
>
</el-row>
</el-row> -->
</el-form>
</div>
<pure-table
border
align-whole="center"
showOverflowTooltip
table-layout="auto"
@ -157,6 +170,17 @@ const save = () => {
@page-current-change="handleCurrentChange"
/>
</div>
<template #footer>
<el-button
size="large"
class="footer-btn"
@click="dialogVisible = false"
>取消</el-button
>
<el-button size="large" @click="save" class="footer-btn" type="primary"
>确定</el-button
>
</template>
</el-dialog>
</div>
</template>

@ -0,0 +1,371 @@
<script setup lang="ts">
import { nextTick, reactive, ref } from "vue";
import {
saveDiseaseTreatmentPlan,
updateDiseaseTreatmentPlann,
queryTreeTreatmentPlan
} from "@/api/disease";
import { queryDrugManagePageList } from "@/api/inquiryManagement";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import { useRoute } from "vue-router";
defineOptions({
name: "AddEdit"
});
import { queryCommonDictTree } from "@/api/utils";
const route = useRoute();
const isEditFlag = ref(false);
const id = ref("");
const dialogVisible = ref(false);
const formData = reactive({
id: "",
disposalPlanId: "",
firstMeasuresId: "",
disposalMethod: "",
drugIds: []
});
const dosageFormList = ref([]);
const ruleFormRef = ref<FormInstance>();
const firstMeasuresList = ref([]);
const medicationList = ref([]);
const rules = {
disposalMethod: [{ required: true, message: "请选择", trigger: "change" }],
disposalPlanId: [{ required: true, message: "请选择", trigger: "change" }],
drugIds: [{ required: true, message: "请选择", trigger: "change" }]
};
const disposalMethodFlag = ref(false);
defineExpose({
async add(val) {
dialogVisible.value = true;
await nextTick;
isEditFlag.value = false;
getDosageFormList();
if (val !== null) {
formData.disposalMethod = val;
getTree(val);
disposalMethodFlag.value = true;
} else {
disposalMethodFlag.value = false;
}
},
async edit(item) {
getDosageFormList();
disposalMethodFlag.value = true;
dialogVisible.value = true;
await nextTick;
if (item) {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
isEditFlag.value = true;
id.value = item.id;
}
getDrugList(formData.firstMeasuresId);
const res: any = await queryTreeTreatmentPlan({
diseaseId: route.query.id,
disposalMethod: formData.disposalMethod
});
disposalPlanList.value = res.data;
if (formData.disposalPlanId) {
disposalPlanList.value.forEach(res => {
if (res.id === formData.disposalPlanId) {
firstMeasuresList.value = res.child;
}
});
}
}
});
const resetForm = () => {
if (disposalMethodFlag.value) {
ruleFormRef.value.resetFields([
"disposalPlanId",
"firstMeasuresId",
"drugIds"
]);
} else {
ruleFormRef.value.resetFields();
}
firstMeasuresList.value = [];
formData.firstMeasuresId = "";
isEditFlag.value = false;
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
};
const emit = defineEmits(["update"]);
const disposalPlanList = ref([]);
const handleChange = val => {
disposalPlanList.value.forEach(res => {
if (res.id === val) {
firstMeasuresList.value = res.child;
}
});
formData.drugIds = [];
formData.firstMeasuresId = "";
};
const getDosageFormList = async () => {
const res: any = await queryCommonDictTree({ groupCode: "DOSE" });
dosageFormList.value = res.data;
};
const submit = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
if (isEditFlag.value) {
const res: any = await updateDiseaseTreatmentPlann({
...formData,
diseaseId: route.query.id
});
if (res.code === 200) {
message("提交成功", { type: "success" });
formData.disposalMethod = "";
emit("update");
dialogVisible.value = false;
}
} else {
const res: any = await saveDiseaseTreatmentPlan({
...formData,
diseaseId: route.query.id,
id: undefined
});
if (res.code === 200) {
message("提交成功", { type: "success" });
formData.disposalMethod = "";
emit("update");
dialogVisible.value = false;
}
}
} else {
return fields;
}
});
};
const selectType = val => {
getTree(val);
};
const getDrugList = async val => {
if (formData.disposalPlanId === "8") {
const res: any = await queryDrugManagePageList({
pageNum: 1,
pageSize: 99999,
dosageForm: val
});
medicationList.value = res.data.records;
}
};
const getTree = async val => {
const res: any = await queryTreeTreatmentPlan({
diseaseId: route.query.id,
disposalMethod: val
});
disposalPlanList.value = res.data;
};
</script>
<template>
<div>
<el-drawer
:size="800"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>处置计划</span>
</div>
<div class="line" />
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="100px"
>
<el-form-item
label="处置方式:"
style="margin-bottom: 0"
prop="disposalMethod"
>
<el-radio-group
:disabled="disposalMethodFlag"
v-model="formData.disposalMethod"
@change="selectType"
>
<el-radio :label="0" size="large">门诊收治</el-radio>
<el-radio :label="1" size="large">入院治疗</el-radio>
</el-radio-group>
</el-form-item>
<div class="add_tip">该疾病处置方式配置后不支持修改</div>
<el-form-item label="处置计划:" prop="disposalPlanId">
<el-select
filterable
size="large"
v-model="formData.disposalPlanId"
style="width: 100%"
placeholder="请选择"
@change="handleChange"
>
<el-option
v-for="item in disposalPlanList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="formData.disposalPlanId !== '8'"
label="一级措施"
prop="firstMeasuresId"
>
<el-select
filterable
size="large"
v-model="formData.firstMeasuresId"
style="width: 100%"
placeholder="请选择"
>
<el-option
v-for="item in firstMeasuresList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="formData.disposalPlanId === '8'"
label="一级措施"
prop="firstMeasuresId"
>
<el-select
filterable
size="large"
v-model="formData.firstMeasuresId"
style="width: 100%"
placeholder="请选择"
@change="getDrugList"
>
<el-option
v-for="item in dosageFormList"
:key="item.code"
:label="item.nameZh"
:value="item.code"
/>
</el-select>
</el-form-item>
<el-form-item
v-if="formData.disposalPlanId === '8'"
label="选择药品"
prop="drugIds"
>
<el-select
filterable
size="large"
multiple
v-model="formData.drugIds"
style="width: 100%"
placeholder="请选择"
>
<el-option
v-for="item in medicationList"
:key="item.id"
:label="item.drugName"
:value="item.id"
/>
</el-select>
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="resetForm()"></div>
<div class="main" @click="submit(ruleFormRef)"></div>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.AddEdit {
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.add_tip {
margin-bottom: 12px;
margin-left: 100px;
font-size: 12px;
color: #999;
}
.line {
position: relative;
left: -20px;
width: 755px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}
</style>

@ -1,32 +1,25 @@
<script setup lang="ts">
import { onMounted, ref, reactive } from "vue";
import CustomDialogHeader from "@/components/CustomDialogHeader/index.vue";
import { onMounted, ref } from "vue";
import {
queryTreeTreatmentPlan,
queryListBiseaseTreatmentPlan,
addDiseaseTreatmentPlan,
deleteTreatmentPlan
} from "@/api/disease";
import { useRoute } from "vue-router";
import { ElMessageBox, FormInstance } from "element-plus";
import { ElMessageBox } from "element-plus";
import { message } from "@/utils/message";
const formData = reactive({
id: "",
planId: [],
disposalMethod: ""
});
const visible = ref(false);
import AddEdit from "./addEdit.vue";
const route = useRoute();
const props = {
multiple: true,
value: "id",
label: "name",
children: "child",
disabled: "flag"
};
const selectDisposalPlanList = ref([]);
const ruleFormRef = ref<FormInstance>();
const AddEditRef = ref();
const columns: TableColumnList = [
{
label: "处置方式",
prop: "disposalMethod",
formatter: ({ disposalMethod }) => {
return disposalMethod === 0 ? "门诊收治" : "入院治疗";
}
},
{
label: "处置计划",
prop: "disposalPlan"
@ -35,17 +28,7 @@ const columns: TableColumnList = [
label: "一级措施",
prop: "firstMeasures"
},
{
label: "二级措施",
prop: "secondMeasures"
},
{
label: "处置方式",
prop: "disposalMethod",
formatter: ({ disposalMethod }) => {
return disposalMethod === 0 ? "门诊收治" : "入院治疗";
}
},
{
label: "操作",
width: 150,
@ -55,68 +38,32 @@ const columns: TableColumnList = [
defineOptions({
name: "DisposalPlan"
});
const getTree = async val => {
const res: any = await queryTreeTreatmentPlan({
diseaseId: route.query.id,
disposalMethod: val
});
disposalPlanList.value = res.data;
};
let disposalPlanInfo = reactive({
disposalPlan: "",
firstMeasures: "",
secondMeasures: "",
disposalMethod: 0,
description: ""
});
const rules = {
disposalMethod: [{ required: true, message: "请选择", trigger: "change" }],
planId: [{ required: true, message: "请选择", trigger: "change" }]
};
const disposalPlanList = ref([]);
const handleChange = () => {};
const selectDisposalPlanList = ref([]);
const getData = async () => {
const res: any = await queryListBiseaseTreatmentPlan({
diseaseId: route.query.id
});
selectDisposalPlanList.value = res.data;
};
const selectType = val => {
getTree(val);
};
onMounted(() => {
getData();
});
const submit = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
const arry = [];
formData.planId.forEach(res => {
arry.push({
diseaseId: route.query.id,
planId: res[res.length - 1]
});
});
const res: any = await addDiseaseTreatmentPlan(arry);
if (res.code === 200) {
message("提交成功", { type: "success" });
formData.disposalMethod = "";
formData.planId = [];
resetForm(ruleFormRef.value);
getData();
const add = () => {
let flag = true;
if (selectDisposalPlanList.value.length === 0) {
flag = true;
} else {
flag = false;
}
if (flag) {
AddEditRef.value.add(null);
} else {
return fields;
AddEditRef.value.add(selectDisposalPlanList.value[0].disposalMethod);
}
});
};
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
};
const openDetail = item => {
visible.value = true;
disposalPlanInfo = item;
const edit = row => {
AddEditRef.value.edit(row);
};
const del = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
@ -126,7 +73,7 @@ const del = item => {
const res = await deleteTreatmentPlan({ id: item.id });
if (res.code === 200) {
getData();
getTree(formData.disposalMethod);
// getTree(formData.disposalMethod);
message("删除成功", { type: "success" });
}
})
@ -135,38 +82,23 @@ const del = item => {
</script>
<template>
<div class="disposal-plan">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
>
<el-form-item label="处置方式:" prop="disposalMethod">
<el-radio-group v-model="formData.disposalMethod" @change="selectType">
<el-radio :label="0" size="large">门诊收治</el-radio>
<el-radio :label="1" size="large">入院治疗</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="处置计划:" prop="planId">
<el-cascader
size="large"
style="width: 800px"
v-model="formData.planId"
:options="disposalPlanList"
:props="props"
@change="handleChange"
/>
</el-form-item>
</el-form>
<div>
<div class="top">
<div class="disposal-plan main-table">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>
{{ `已选处置计划【${selectDisposalPlanList.length}个】` }}
</span>
</div>
<el-row class="mb-6">
<el-button size="large" class="btn" @click="add" type="primary"
>新建</el-button
>
</el-row>
</div>
<div>
<pure-table
border
style="width: 1600px"
align-whole="center"
showOverflowTooltip
:data="selectDisposalPlanList"
@ -177,28 +109,27 @@ const del = item => {
}"
>
<template #operation="{ row }">
<el-button link type="primary" @click="openDetail(row)"
>详情</el-button
>
<el-button link type="primary" @click="edit(row)"></el-button>
<el-button link type="danger" @click="del(row)"> </el-button>
</template></pure-table
>
</div>
<div class="btn-list">
<AddEdit @update="getData" ref="AddEditRef" />
<!-- <div class="btn-list">
<el-button size="large" @click="submit(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="resetForm(ruleFormRef)"></el-button>
</div>
</div> -->
<!-- 处置计划详情 -->
<el-dialog
<!-- <el-dialog
width="800"
append-to-body
v-model="visible"
:center="true"
:show-close="false"
custom-class="disposal-plan-dialog"
><!-- 使用自定义头部组件 -->
>
<template v-slot:header>
<custom-dialog-header title="处置计划详情" />
</template>
@ -237,7 +168,7 @@ const del = item => {
>
</div>
</div>
</el-dialog>
</el-dialog> -->
</div>
</template>
<style lang="scss" scoped>

@ -8,6 +8,7 @@ import { queryPageList, deleteItem } from "@/api/disease";
import { onMounted } from "vue";
import { message } from "@/utils/message";
import { ElMessageBox } from "element-plus";
import AddComplexDiseases from "./compontents/addComplexDiseases.vue";
defineOptions({
name: "DiseaseType"
});
@ -15,9 +16,11 @@ defineOptions({
const dataList = ref([{}]);
const loading = ref(false);
const addEditRef = ref(null);
const AddComplexDiseasesRef = ref();
const problemBaseRef = ref(null);
const seachForm = reactive({
diseaseName: ""
diseaseName: "",
diseaseType: ""
});
const pagination = reactive<PaginationProps>({
total: 0,
@ -47,7 +50,8 @@ const getData = async () => {
const params = {
pageNum: pagination.currentPage,
pageSize: pagination.pageSize,
diseaseName: seachForm.diseaseName
diseaseName: seachForm.diseaseName,
diseaseType: seachForm.diseaseType
};
const res: any = await queryPageList(params);
dataList.value = res.data.records;
@ -70,23 +74,31 @@ const search = () => {
const reset = () => {
seachForm.diseaseName = "";
seachForm.diseaseType = "";
search();
};
const add = () => {
addEditRef.value.open("add");
};
const addComplex = () => {
AddComplexDiseasesRef.value.open("add");
};
const edit = item => {
if (item.diseaseType === 0) {
addEditRef.value.open("edit", JSON.parse(JSON.stringify(item)));
};
//
const inspect = item => {
router.push({
name: "diseaseTypeInquiry",
query: {
id: item.id
} else {
AddComplexDiseasesRef.value.open("edit", JSON.parse(JSON.stringify(item)));
}
});
};
//
// const inspect = item => {
// router.push({
// name: "diseaseTypeInquiry",
// query: {
// id: item.id
// }
// });
// };
const openBodyInspect = item => {
router.push({
path: "/caseManagement/diseaseType/bodyInspect",
@ -136,25 +148,48 @@ onMounted(() => {
</script>
<template>
<div class="diseaseType">
<div class="diseaseType app-main-content">
<div class="seach">
<el-form :model="seachForm" label-width="120px">
<el-form :model="seachForm">
<el-row>
<el-form-item label="疾病分类:">
<el-input size="large" v-model="seachForm.diseaseName" />
</el-form-item>
<el-form-item class="ml-4" label="类型:">
<el-select
size="large"
clearable
v-model="seachForm.diseaseType"
placeholder="请选择性别"
>
<el-option label="全部" value="" />
<el-option label="单一" :value="0" />
<el-option label="复合" :value="1" />
</el-select>
</el-form-item>
<el-button class="ml-8" size="large" @click="search" type="primary"
>搜索</el-button
>
<el-button size="large" @click="reset"></el-button>
</el-row>
<el-row class="mb-10">
<el-button size="large" @click="add" type="primary">新增</el-button>
</el-row>
</el-form>
</div>
<div class="main-table">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>疾病分类列表</span>
</div>
<el-row class="mb-6">
<el-button size="large" @click="add" type="primary"
>新增单一疾病</el-button
>
<el-button size="large" @click="addComplex" type="primary"
>新增复合疾病</el-button
>
</el-row>
</div>
<pure-table
border
align-whole="center"
showOverflowTooltip
table-layout="auto"
@ -171,7 +206,9 @@ onMounted(() => {
@page-current-change="handleCurrentChange"
><template #operation="{ row }">
<el-button link type="primary" @click="edit(row)"> </el-button>
<el-button link type="primary" @click="inspect(row)"> </el-button>
<!-- <el-button link type="primary" @click="inspect(row)">
问诊
</el-button> -->
<el-button link type="primary" @click="openBodyInspect(row)">
体格检查
</el-button>
@ -181,12 +218,15 @@ onMounted(() => {
<el-button link type="primary" @click="openDisposalPlan(row)">
处置计划
</el-button>
<el-button link type="primary" @click="handleDelete(row)">
<el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</template>
</pure-table>
</div>
<AddEdit @update="getData" ref="addEditRef" />
<ProblemBase ref="problemBaseRef" />
<AddComplexDiseases @update="getData" ref="AddComplexDiseasesRef" />
</div>
</template>

@ -79,11 +79,19 @@ const selectOk = async (data: any) => {
</script>
<template>
<div class="diseaseType-inquiry">
<el-button size="large" @click="add" type="primary">问题库</el-button>
<div class="diseaseType-inquiry main-table">
<div class="main-table-title">
<div class="title">
{{ `已选疾病补充问题【${selectDataList.length}` }}
<div class="line" />
<span>{{ `已选疾病补充问题【${selectDataList.length}` }}</span>
</div>
<el-row class="mb-6">
<el-button size="large" class="btn" @click="add" type="primary"
>问题库</el-button
>
</el-row>
</div>
<pure-table
border
align-whole="center"
@ -104,3 +112,11 @@ const selectOk = async (data: any) => {
<ProblemBase @select="selectOk" ref="problemBaseRef" />
</div>
</template>
<style lang="scss" scoped>
.diseaseType-inquiry {
// height: calc(100vh - 85px);
.btn {
width: 150px;
}
}
</style>

@ -0,0 +1,316 @@
<script setup lang="ts">
import { nextTick, reactive, ref } from "vue";
import {
addSupportInspect,
queryAncillaryItemList,
updateSupportInspect
} from "@/api/disease";
import { FormInstance } from "element-plus";
import { message } from "@/utils/message";
import WangEditor from "@/components/WangEditor/index.vue";
import { useRoute } from "vue-router";
defineOptions({
name: "AddEdit"
});
const props = {
value: "id",
label: "itemName",
children: "itemList",
disabled: "flag",
expandTrigger: "hover" as const
};
const refWangEditor = ref();
const route = useRoute();
const isEditFlag = ref(false);
const id = ref("");
const dialogVisible = ref(false);
const formData = reactive({
itemIdPath: [],
diagnosticCriteria: [],
locationDiagnosisFlag: "",
result: "",
requireCheckFlag: "",
diagnosisAssessmentFlag: "",
expectedDiagnosisResult: null,
itemId: "",
normalResult: ""
});
const ruleFormRef = ref<FormInstance>();
const supportToolList = ref([]);
const handleChange = item => {
formData.itemId = item[item.length - 1];
};
const rules = {
itemIdPath: [
{ required: true, message: "请选择辅助检查项", trigger: "change" }
],
diagnosisAssessmentFlag: [
{ required: true, message: "请选择诊断判读", trigger: "change" }
],
requireCheckFlag: [
{ required: true, message: "请选择是否必查", trigger: "change" }
],
expectedDiagnosisResult: [
{ required: true, message: "请选择预期诊断结果", trigger: "change" }
]
};
const getPhysicalToolList = async () => {
const res: any = await queryAncillaryItemList({
diseaseId: route.query.id
});
supportToolList.value = res.data;
};
defineExpose({
async open(item) {
getPhysicalToolList();
dialogVisible.value = true;
await nextTick();
if (item) {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
isEditFlag.value = true;
id.value = item.id;
nextTick(() => {
setTimeout(() => {
refWangEditor.value.initText(item.result);
}, 200);
});
}
}
});
const resetForm = () => {
ruleFormRef.value.resetFields();
};
const closeDialog = () => {
dialogVisible.value = false;
isEditFlag.value = false;
resetForm();
};
const emit = defineEmits(["update"]);
const reset = () => {
if (isEditFlag.value) {
ruleFormRef.value.resetFields([
"diagnosticCriteria",
"diagnosisAssessmentFlag",
"requireCheckFlag",
"expectedDiagnosisResult",
"normalResult"
]);
} else {
ruleFormRef.value.resetFields();
}
// refWangEditor.value.valueHtml = "";
};
const changeResult = val => {
if (val === 0) {
formData.normalResult = "";
}
};
const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
// formData.result = refWangEditor.value.valueHtml;
const params = {
...formData,
result: refWangEditor.value.valueHtml,
diseaseId: route.query.id
};
if (isEditFlag.value) {
const res: any = await updateSupportInspect({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
id.value = "";
}
} else {
const res: any = await addSupportInspect(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
}
}
dialogVisible.value = false;
emit("update");
} else {
return fields;
}
});
};
</script>
<template>
<div>
<el-drawer
:size="800"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>辅助检查</span>
</div>
<div class="line" />
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="120px"
>
<el-form-item label="疾病名称:" prop="code">
<span>{{ route.query.diseaseName }}</span>
</el-form-item>
<el-row>
<el-col :span="24">
<el-form-item label="辅助查项:" prop="itemIdPath">
<el-cascader
:disabled="isEditFlag"
style="width: 100%"
size="large"
v-model="formData.itemIdPath"
:options="supportToolList"
:props="props"
@change="handleChange"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="诊断依据:" prop="diagnosticCriteria">
<el-checkbox-group v-model="formData.diagnosticCriteria">
<el-checkbox :label="0">初步诊断依据</el-checkbox>
<el-checkbox :label="1">证实诊断依据</el-checkbox>
<el-checkbox :label="2">鉴别依据</el-checkbox>
<el-checkbox :label="3">全面依据</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="诊断判读:" prop="diagnosisAssessmentFlag">
<el-radio-group v-model="formData.diagnosisAssessmentFlag">
<el-radio :label="0" size="large">不需要</el-radio>
<el-radio :label="1" size="large">需要</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否必查:" prop="requireCheckFlag">
<el-radio-group v-model="formData.requireCheckFlag">
<el-radio :label="0" size="large"></el-radio>
<el-radio :label="1" size="large"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="预期诊断结果:" prop="expectedDiagnosisResult">
<el-radio-group
@change="changeResult"
v-model="formData.expectedDiagnosisResult"
>
<el-radio :label="0" size="large">正常</el-radio>
<el-radio :label="1" size="large">异常</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item
v-if="formData.expectedDiagnosisResult === 1"
label="正常结果:"
prop="normalResult"
>
<el-input
size="large"
v-model="formData.normalResult"
placeholder="请输入"
/>
</el-form-item>
<el-form-item label="诊断结果:" prop="result">
<WangEditor v-if="dialogVisible" ref="refWangEditor" />
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="reset()"></div>
<div class="main" @click="save(ruleFormRef)"></div>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.AddEdit {
:deep(.el-form-item__label) {
font-weight: 700;
}
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 755px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}
</style>

@ -1,48 +1,18 @@
<script setup lang="ts">
import { onMounted, ref, reactive } from "vue";
import WangEditor from "@/components/WangEditor/index.vue";
import {
querySupportLsit,
queryAncillaryItemList,
deleteSupportItem,
addSupportInspect,
updateSupportInspect
} from "@/api/disease";
import { ElMessageBox, FormInstance } from "element-plus";
import { onMounted, ref } from "vue";
import { querySupportLsit, deleteSupportItem } from "@/api/disease";
import { ElMessageBox } from "element-plus";
import { message } from "@/utils/message";
import { useRoute } from "vue-router";
const isEditFlag = ref(false);
const id = ref("");
const formData = reactive({
itemIdPath: [],
diagnosticCriteria: [],
locationDiagnosisFlag: "",
result: "",
requireCheckFlag: "",
diagnosisAssessmentFlag: "",
expectedDiagnosisResult: "",
itemId: ""
});
const props = {
value: "id",
label: "itemName",
children: "itemList",
disabled: "flag",
expandTrigger: "hover" as const
};
import AddEdit from "./addEdit.vue";
const route = useRoute();
const selectSupportInspectList = ref([]);
const refWangEditor = ref(null);
const columns: TableColumnList = [
{
label: "辅助检查项目",
prop: "itemName"
},
{
label: "固定检查位",
prop: "locationName",
formatter: () => `不需要`
},
{
label: "诊断判读",
prop: "diagnosisAssessmentFlag",
@ -73,33 +43,8 @@ const columns: TableColumnList = [
defineOptions({
name: "SupportInspect"
});
const rules = {
itemIdPath: [
{ required: true, message: "请选择辅助检查项", trigger: "change" }
],
diagnosisAssessmentFlag: [
{ required: true, message: "请选择诊断判读", trigger: "change" }
],
requireCheckFlag: [
{ required: true, message: "请选择是否必查", trigger: "change" }
],
expectedDiagnosisResult: [
{ required: true, message: "请选择预期诊断结果", trigger: "change" }
]
};
const ruleFormRef = ref<FormInstance>();
const supportToolList = ref([]);
const handleChange = item => {
formData.itemId = item[item.length - 1];
};
const getPhysicalToolList = async () => {
const res: any = await queryAncillaryItemList({
diseaseId: route.query.id
});
supportToolList.value = res.data;
};
const AddEditRef = ref();
onMounted(() => {
getPhysicalToolList();
getsupportListByDiseaseId();
});
const getsupportListByDiseaseId = async () => {
@ -109,16 +54,11 @@ const getsupportListByDiseaseId = async () => {
selectSupportInspectList.value = res.data;
};
const edit = item => {
for (const key in item) {
// eslint-disable-next-line no-prototype-builtins
if (formData.hasOwnProperty(key)) {
formData[key] = item[key];
}
}
isEditFlag.value = true;
id.value = item.id;
refWangEditor.value.valueHtml = item.result;
const add = () => {
AddEditRef.value.open();
};
const edit = row => {
AddEditRef.value.open(row);
};
const del = item => {
ElMessageBox.confirm(item ? `是否删除` : "", "提示", {
@ -133,113 +73,26 @@ const del = item => {
})
.catch(() => {});
};
const reset = (formEl: FormInstance | undefined) => {
if (!formEl) return;
formEl.resetFields();
isEditFlag.value = false;
refWangEditor.value.valueHtml = "";
};
const save = (formEl: FormInstance | undefined) => {
console.log(refWangEditor.value.valueHtml);
formEl.validate(async (valid, fields) => {
if (valid) {
formData.result = refWangEditor.value.valueHtml;
const params = {
...formData,
diseaseId: route.query.id
};
if (isEditFlag.value) {
const res: any = await updateSupportInspect({
...params,
id: id.value
});
if (res.code === 200) {
message("修改成功", { type: "success" });
reset(ruleFormRef.value);
id.value = "";
}
} else {
const res: any = await addSupportInspect(params);
if (res.code === 200) {
message("新增成功", { type: "success" });
reset(ruleFormRef.value);
}
}
getsupportListByDiseaseId();
getPhysicalToolList();
} else {
return fields;
}
});
};
</script>
<template>
<div class="support-inspect">
<el-form
ref="ruleFormRef"
:model="formData"
:rules="rules"
label-width="150px"
<div class="support-inspect main-table">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>
{{ `已选辅助检查项目【${selectSupportInspectList.length}个】` }}
</span>
</div>
<el-row class="mb-6">
<el-button size="large" class="btn" @click="add" type="primary"
>新建</el-button
>
<el-form-item label="疾病名称:" prop="code">
<span>{{ route.query.diseaseName }}</span>
</el-form-item>
<el-form-item label="辅助查项:" prop="itemIdPath">
<el-cascader
size="large"
v-model="formData.itemIdPath"
:options="supportToolList"
:props="props"
@change="handleChange"
/>
</el-form-item>
<el-form-item label="诊断依据:" prop="diagnosticCriteria">
<el-checkbox-group v-model="formData.diagnosticCriteria">
<el-checkbox :label="0">初步诊断依据</el-checkbox>
<el-checkbox :label="1">证实诊断依据</el-checkbox>
<el-checkbox :label="2">鉴别依据</el-checkbox>
<el-checkbox :label="3">全面依据</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-row>
<el-form-item label="诊断判读:" prop="diagnosisAssessmentFlag">
<el-radio-group v-model="formData.diagnosisAssessmentFlag">
<el-radio :label="0" size="large">不需要</el-radio>
<el-radio :label="1" size="large">需要</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否必查:" prop="requireCheckFlag">
<el-radio-group v-model="formData.requireCheckFlag">
<el-radio :label="0" size="large"></el-radio>
<el-radio :label="1" size="large"></el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-form-item label="预期诊断结果:" prop="expectedDiagnosisResult">
<el-radio-group v-model="formData.expectedDiagnosisResult">
<el-radio :label="0" size="large">正常</el-radio>
<el-radio :label="1" size="large">异常</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="诊断结果:" prop="result">
<WangEditor ref="refWangEditor" />
</el-form-item>
</el-form>
<div class="btn-list">
<el-button size="large" @click="save(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="reset(ruleFormRef)"></el-button>
</div>
<div class="footer">
<div class="top">
{{ `已选体格检查项目【${selectSupportInspectList.length}个】` }}
</div>
<pure-table
border
adaptive
style="width: 1600px"
align-whole="center"
showOverflowTooltip
:data="selectSupportInspectList"
@ -254,7 +107,7 @@ const save = (formEl: FormInstance | undefined) => {
<el-button link type="danger" @click="del(row)"> </el-button>
</template></pure-table
>
</div>
<AddEdit @update="getsupportListByDiseaseId" ref="AddEditRef" />
</div>
</template>
<style lang="scss" scoped>

@ -36,10 +36,9 @@ const columns: TableColumnList = [
<div class="title">{{ `处置计划【${dataList.length}` }}</div>
<pure-table
border
style="width: 1000px; height: 500px"
style="width: 1000px"
align-whole="center"
showOverflowTooltip
adaptive
:data="dataList"
:columns="columns"
/>

@ -6,15 +6,15 @@ defineProps({
dataInfo: {
type: Object,
default: () => ({
name: "",
gender: "",
age: "",
profession: "",
patientName: "",
patientGender: "",
patientAge: "",
patientProfession: "",
patientSelfDesc: "",
marriage: "",
patientMarriage: "",
diseaseId: "",
diseaseName: "",
address: ""
patientHabitation: ""
})
},
diseaseName: {
@ -25,56 +25,99 @@ defineProps({
</script>
<template>
<div class="BasicInfo">
<el-form :model="dataInfo" label-width="280px">
<div class="basicInfo-detail">
<el-form :model="dataInfo" label-width="100px">
<el-row>
<el-col :span="12">
<el-form-item label="姓名:" prop="name">
<span>{{ dataInfo.name }}</span>
<el-col :span="3">
<el-form-item label="姓名:" prop="patientName">
<span>{{ dataInfo.patientName }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="性别:" prop="gender">
<span>{{ dataInfo.gender }}</span>
<el-col :span="3">
<el-form-item label="年龄:" prop="patientAge">
<span>{{ dataInfo.patientAge }}</span>
</el-form-item>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="年龄:" prop="age">
<span>{{ dataInfo.age }}</span>
</el-col>
<el-col :span="3">
<el-form-item label="婚姻状态:" prop="patientMarriage">
<span>{{ dataInfo.patientMarriage }}</span>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="邮编:" prop="patientPostcode">
<span>{{ dataInfo.patientPostcode }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职业:" prop="profession">
<span>{{ dataInfo.profession }}</span>
<el-form-item label="初步诊断:" prop="diseaseName">
<span>{{ diseaseName }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-col :span="3">
<el-form-item label="性别:" prop="patientGender">
<span>{{ dataInfo.patientGender }}</span>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="职业:" prop="patientProfession">
<span>{{ dataInfo.patientProfession }}</span>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="主诉:" prop="patientSelfDesc">
<span>{{ dataInfo.patientSelfDesc }}</span>
<span :title="dataInfo.patientSelfDesc" class="longText">{{
dataInfo.patientSelfDesc
}}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="婚姻状态:" prop="marriage">
<span>{{ dataInfo.marriage }}</span>
<el-form-item label="现住址:" prop="patientHabitation">
<span>{{ dataInfo.patientHabitation }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="地址:" prop="address">
<span>{{ dataInfo.address }}</span>
<el-col :span="3">
<el-form-item label="电话:" prop="patientPhone">
<span>{{ dataInfo.patientPhone }}</span>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="籍贯:" prop="nativePlace">
<span>{{ dataInfo.nativePlace }}</span>
</el-form-item>
</el-col>
<el-col :span="3">
<el-form-item label="民族:" prop="patientNation">
<span>{{ dataInfo.patientNation }}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病分类:" prop="diseaseName">
<span>{{ diseaseName }}</span>
<el-form-item label="出生地:" prop="patientBirthplace">
<span>{{ dataInfo.patientBirthplace }}</span>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<style lang="scss" scoped>
.basicInfo-detail {
:deep(.el-form-item__label) {
font-size: 14px;
font-weight: 400;
color: #333;
}
.longText {
width: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
</style>

@ -2,29 +2,59 @@
import { queryMedicalRecInfo } from "@/api/medicalRecord";
import BasicInfo from "./compontents/basicInfo.vue";
import AskInquiry from "./compontents/askInquiry.vue";
import DisposalPlan from "./compontents/DisposalPlan.vue";
import { ref } from "vue";
import { reactive, onMounted } from "vue";
import { useRoute } from "vue-router";
const activeName = ref(["1", "2"]);
const showFlag = ref(false);
let detailInfo = reactive({
patient: {},
patient: {
patientSelfDesc: ""
},
physicalList: [],
ancillaryList: [],
qaList: [],
diseaseName: "",
treatmentPlanList: [],
patientSelfDesc: ""
patientSelfDesc: "",
primarilyDiagnosisCriteria: "",
confirmDiagnosisCriteria: "",
differentialDiagnosisCriteria: "",
fullCheck: ""
});
const columns: TableColumnList = [
{
label: "问题类目",
prop: "dictNamePath"
},
{
label: "问题",
prop: "questionList",
formatter: ({ questionList }) => `${questionList[0]}`
},
{
label: "回复",
prop: "defaultAnswer"
}
];
const planColumns: TableColumnList = [
{
label: "处置计划",
prop: "disposalPlan"
},
{
label: "一级措施",
prop: "firstMeasures"
}
];
const route = useRoute();
const getDetail = async () => {
const res: any = await queryMedicalRecInfo({
id: route.query.id
});
detailInfo = res.data;
detailInfo.patient.patientSelfDesc = detailInfo.patientSelfDesc;
// detailInfo.patient.patientSelfDesc = detailInfo.patientSelfDesc;
showFlag.value = true;
};
onMounted(() => {
@ -33,18 +63,100 @@ onMounted(() => {
</script>
<template>
<div class="case_detail">
<el-collapse v-if="showFlag" class="case_detail_main" v-model="activeName">
<div v-if="showFlag" class="case_detail">
<div class="case_detail_card">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>基础信息</span>
</div>
</div>
<BasicInfo :dataInfo="detailInfo" :diseaseName="detailInfo.diseaseName" />
</div>
<div class="case_detail_card">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>临床诊断</span>
</div>
</div>
<AskInquiry
:bodyList="detailInfo?.physicalList"
:supportList="detailInfo?.ancillaryList"
/>
</div>
<div class="case_detail_card">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>诊断依据</span>
</div>
</div>
<div class="text_item">
<div class="left">初步诊断依据</div>
<div class="right">{{ detailInfo.primarilyDiagnosisCriteria }}</div>
</div>
<div class="text_item">
<div class="left">证实诊断依据</div>
<div class="right">{{ detailInfo.confirmDiagnosisCriteria }}</div>
</div>
<div class="text_item">
<div class="left">鉴别依据</div>
<div class="right">{{ detailInfo.differentialDiagnosisCriteria }}</div>
</div>
<div class="text_item">
<div class="left">全面检查</div>
<div class="right">{{ detailInfo.fullCheck }}</div>
</div>
</div>
<div class="case_detail_card">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>应答策略</span>
</div>
</div>
<pure-table
style="width: 100%; max-height: 500px"
align-whole="center"
showOverflowTooltip
adaptive
:data="detailInfo.qaList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
/>
</div>
<div class="case_detail_card">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>处置计划</span>
</div>
</div>
<pure-table
style="width: 100%; max-height: 500px"
align-whole="center"
showOverflowTooltip
adaptive
:data="detailInfo.treatmentPlanList"
:columns="planColumns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
/>
</div>
<!-- <el-collapse v-if="showFlag" class="case_detail_main" v-model="activeName">
<el-collapse-item name="1">
<template #title>
<div class="title">
<span>病历信息</span>
</div>
</template>
<BasicInfo
:dataInfo="detailInfo.patient"
:diseaseName="detailInfo.diseaseName"
/>
</el-collapse-item>
<el-collapse-item name="2">
<template #title>
@ -77,7 +189,7 @@ onMounted(() => {
</template>
<DisposalPlan :dataList="detailInfo.treatmentPlanList" />
</el-collapse-item>
</el-collapse>
</el-collapse> -->
</div>
</template>
<style lang="scss" scoped>
@ -94,7 +206,56 @@ onMounted(() => {
.title {
width: 100%;
padding-left: 16px;
// padding-left: 16px;
}
.case_detail_card {
padding: 24px;
margin-bottom: 16px;
background-color: #fff;
.main-table-title {
.title {
display: flex;
margin-bottom: 24px;
.line {
position: relative;
top: 5px;
width: 6px;
height: 20px;
margin-right: 12px;
background: #4287ff;
}
span {
font-size: 20px;
}
}
}
.text_item {
display: flex;
margin-bottom: 24px;
font-size: 14px;
font-weight: 400;
color: #333;
.left {
width: 100px;
text-align: right;
}
.right {
flex: 1;
// line-height: 32px;
padding: 2px 12px;
margin-left: 16px;
// height: 32px;
background: #f8f8f8;
border-radius: 6px;
}
}
}
}
</style>

@ -6,19 +6,32 @@ import { useRoute } from "vue-router";
import { useCaseStoreHooks } from "@/store/modules/caseManagement";
let detailInfo = reactive({
patient: {},
patientName: "",
patientGender: "",
patientAge: "",
patientProfession: "",
patientSelfDesc: "",
patientMarriage: "",
diseaseId: "",
diseaseName: "",
patientHabitation: "",
physicalList: [],
ancillaryList: [],
qaList: [],
diseaseName: "",
defaultQaList: [],
treatmentPlanList: [],
primarilyDiagnosisCriteria: "",
confirmDiagnosisCriteria: "",
differentialDiagnosisCriteria: "",
fullCheck: "",
patientSelfDesc: "",
diseaseId: "",
patientId: ""
patientId: "",
nativePlace: "",
patientNation: "",
patientPostcode: "",
patientBirthplace: "",
patientPhone: "",
digitalHumanType: "",
patientHeadPic: ""
});
const route = useRoute();
const showFlag = ref(false);
@ -29,10 +42,22 @@ const getDetail = async () => {
detailInfo = res.data;
useCaseStoreHooks().changeBasicInfo({
...detailInfo.patient,
patientName: detailInfo.patientName,
patientGender: detailInfo.patientGender,
patientAge: detailInfo.patientAge,
patientProfession: detailInfo.patientProfession,
patientMarriage: detailInfo.patientMarriage,
patientHabitation: detailInfo.patientHabitation,
diseaseName: detailInfo.diseaseName,
patientSelfDesc: detailInfo.patientSelfDesc,
diseaseId: detailInfo.diseaseId
diseaseId: detailInfo.diseaseId,
nativePlace: detailInfo.nativePlace,
patientNation: detailInfo.patientNation,
patientPostcode: detailInfo.patientPostcode,
patientBirthplace: detailInfo.patientBirthplace,
patientPhone: detailInfo.patientPhone,
digitalHumanType: detailInfo.digitalHumanType,
patientHeadPic: detailInfo.patientHeadPic
});
const {
primarilyDiagnosisCriteria,
@ -47,6 +72,7 @@ const getDetail = async () => {
fullCheck
});
useCaseStoreHooks().changeQaList(detailInfo.qaList);
useCaseStoreHooks().changeDefaultQaList(detailInfo.defaultQaList);
useCaseStoreHooks().patientId = detailInfo.patientId;
showFlag.value = true;
};

@ -3,15 +3,12 @@ import router from "@/router";
import { PaginationProps } from "@pureadmin/table";
import { reactive, ref } from "vue";
import {
deleteMedicalRec,
queryDiseaseListByDropList,
queryMedicalRecPage
} from "@/api/medicalRecord";
import { onMounted } from "vue";
import { clearObject } from "@/utils/auth";
import { useCaseStoreHooks } from "@/store/modules/caseManagement";
import { message } from "@/utils/message";
import { ElMessageBox } from "element-plus";
defineOptions({
name: "CaseManagement"
@ -94,6 +91,7 @@ const reset = () => {
};
const add = () => {
router.push("/caseManagement/add");
useCaseStoreHooks().changeIsEditFlag(false);
};
const getDiseaseListByDropList = async () => {
const res: any = await queryDiseaseListByDropList();
@ -125,23 +123,23 @@ const handleEdit = item => {
}
});
};
const handleDelete = item => {
ElMessageBox.confirm(
item ? `确认删除后所有信息将被清空, 且无法恢复` : "",
"提示",
{
type: "warning"
}
)
.then(async () => {
const res = await deleteMedicalRec({ id: item.medicalId });
if (res.code === 200) {
getData();
message("删除成功", { type: "success" });
}
})
.catch(() => {});
};
// const handleDelete = item => {
// ElMessageBox.confirm(
// item ? `, ` : "",
// "",
// {
// type: "warning"
// }
// )
// .then(async () => {
// const res = await deleteMedicalRec({ id: item.medicalId });
// if (res.code === 200) {
// getData();
// message("", { type: "success" });
// }
// })
// .catch(() => {});
// };
onMounted(() => {
getDiseaseListByDropList();
getData();
@ -150,14 +148,14 @@ onMounted(() => {
</script>
<template>
<div class="caseManagement">
<div class="caseManagement app-main-content">
<div class="seach">
<el-form :model="seachForm" label-width="120px">
<el-form :model="seachForm">
<el-row>
<el-form-item label="主诉:">
<!-- <el-form-item label="主诉:">
<el-input size="large" v-model="seachForm.selfDescKeyword" />
</el-form-item>
<el-form-item label="性别:" prop="gender">
<el-form-item label="性别:" class="ml-4" prop="gender">
<el-select
size="large"
clearable
@ -167,8 +165,8 @@ onMounted(() => {
<el-option label="男" value="男" />
<el-option label="女" value="女" />
</el-select>
</el-form-item>
<el-form-item label="初步诊断:" prop="diseaseId">
</el-form-item> -->
<el-form-item label="初步诊断:" class="ml-4" prop="diseaseId">
<el-select
size="large"
filterable
@ -190,13 +188,19 @@ onMounted(() => {
>
<el-button size="large" @click="reset"></el-button>
</el-row>
<el-row class="mb-8">
</el-form>
</div>
<div class="main-table">
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>病历列表</span>
</div>
<el-row class="mb-6">
<el-button size="large" @click="add" type="primary">新增</el-button>
</el-row>
</el-form>
</div>
<pure-table
border
align-whole="center"
showOverflowTooltip
table-layout="auto"
@ -218,10 +222,11 @@ onMounted(() => {
<el-button link type="primary" @click="handleEdit(row)">
编辑
</el-button>
<el-button link type="danger" @click="handleDelete(row)">
<!-- <el-button link type="danger" @click="handleDelete(row)">
删除
</el-button>
</el-button> -->
</template>
</pure-table>
</div>
</div>
</template>

@ -24,10 +24,7 @@ const columns: TableColumnList = [
label: "一级措施",
prop: "firstMeasures"
},
{
label: "二级措施",
prop: "secondMeasures"
},
{
label: "处置方式",
prop: "disposalMethod",
@ -41,23 +38,37 @@ const isEditFlag = computed(() => {
});
const save = async () => {
const qaList = [];
const defaultQaList = [];
useCaseStoreHooks().qaList.forEach(e => {
qaList.push({
id: e.id,
answerResourceId: e.answerResourceId,
libraryQuestionId: e.libraryQuestionId,
questionList: e.questionList,
medicalRecAnswer: e.medicalRecAnswer
});
});
useCaseStoreHooks().defaultQaList.forEach(e => {
defaultQaList.push({
id: e.id,
answerResourceId: e.answerResourceId,
libraryQuestionId: e.libraryQuestionId,
medicalRecAnswer: e.medicalRecAnswer
});
});
const params = {
patient: {
// patient: {
// ...useCaseStoreHooks().basicInfo,
// id: isEditFlag.value ? useCaseStoreHooks().patientId : undefined
// },
id: isEditFlag.value ? useCaseStoreHooks().patientId : undefined,
...useCaseStoreHooks().basicInfo,
id: isEditFlag.value ? useCaseStoreHooks().patientId : undefined
},
...useCaseStoreHooks().diagnosticBasisInfo,
diseaseId: useCaseStoreHooks().basicInfo.diseaseId,
patientSelfDesc: useCaseStoreHooks().basicInfo.patientSelfDesc,
// symptoms: useCaseStoreHooks().basicInfo.symptoms,
qaList
qaList,
defaultQaList
};
if (isEditFlag.value) {
const res: any = await modifyMedicalRec({
@ -94,15 +105,24 @@ const goBack = () => {
<template>
<div class="DisposalPlan">
<Header />
<div class="title">{{ `处置计划【${dataList.length}` }}</div>
<div class="main-table-title">
<div class="title">
<div class="line" />
<span>{{ `处置计划【${dataList.length}` }}</span>
</div>
</div>
<pure-table
border
style="width: 1000px; height: 500px"
align-whole="center"
showOverflowTooltip
adaptive
:data="dataList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
/>
<div class="step-footer-btn">
<el-button size="large" @click="goBack"></el-button>

@ -4,7 +4,9 @@ import { useCaseStoreHooks } from "@/store/modules/caseManagement";
import router from "@/router";
import { FormInstance } from "element-plus";
import { queryDiseaseListByCreat } from "@/api/medicalRecord";
import MaterialLibrary from "@/components/MaterialLibrary/index.vue";
import { Plus } from "@element-plus/icons-vue";
import { downLoadUrl } from "@/utils/auth";
defineOptions({
name: "BasicInfo"
});
@ -16,22 +18,30 @@ defineProps({
});
const marriageList = ref(["已婚", "未婚"]);
const diseaseList = ref([]);
const MaterialLibraryRef = ref();
const dataInfo = reactive({
name: "",
gender: "",
age: "",
profession: "",
patientName: "",
patientGender: "",
patientAge: "",
patientProfession: "",
patientSelfDesc: "",
marriage: "",
patientMarriage: "",
diseaseId: "",
diseaseName: "",
address: ""
patientHabitation: "",
nativePlace: "",
patientNation: "",
patientPostcode: "",
patientBirthplace: "",
patientPhone: "",
digitalHumanType: "",
patientHeadPic: ""
});
const ruleFormRef = ref<FormInstance>();
const rules = {
name: [{ required: true, message: "请输入姓名", trigger: "change" }],
gender: [{ required: true, message: "请选择性别", trigger: "change" }],
age: [
patientName: [{ required: true, message: "请输入姓名", trigger: "change" }],
patientGender: [{ required: true, message: "请选择性别", trigger: "change" }],
patientAge: [
{ required: true, message: "请输入年龄", trigger: "change" },
{
pattern: /(^((1[0-5])|[1-9])?\d$)/,
@ -39,13 +49,40 @@ const rules = {
trigger: "change"
}
],
profession: [{ required: true, message: "请输入职业", trigger: "change" }],
patientProfession: [
{ required: true, message: "请输入职业", trigger: "change" }
],
patientSelfDesc: [
{ required: true, message: "请输入主诉", trigger: "change" }
],
address: [{ required: true, message: "请输入地址", trigger: "change" }],
marriage: [{ required: true, message: "请选择", trigger: "change" }],
diseaseId: [{ required: true, message: "请选择", trigger: "change" }]
patientHabitation: [
{ required: true, message: "请输入地址", trigger: "change" }
],
nativePlace: [{ required: true, message: "请输入籍贯", trigger: "change" }],
patientNation: [{ required: true, message: "请输入民族", trigger: "change" }],
patientPostcode: [
{ required: true, message: "请输入邮编", trigger: "change" },
{
pattern: /^\d{6}$/,
message: "请输入正确格式",
trigger: "blur"
}
],
patientBirthplace: [
{ required: true, message: "请输入出生地", trigger: "change" }
],
patientPhone: [
{ required: true, message: "请输入电话", trigger: "change" },
{
pattern: /^1[3456789]\d{9}$/,
message: "请输入正确格式",
trigger: "blur"
}
],
patientMarriage: [{ required: true, message: "请选择", trigger: "change" }],
diseaseId: [{ required: true, message: "请选择", trigger: "change" }],
digitalHumanType: [{ required: true, message: "请选择", trigger: "change" }],
patientHeadPic: [{ required: true, message: "请选择", trigger: "change" }]
};
const isEditFlag = computed(() => {
return useCaseStoreHooks().isEditFlag;
@ -84,6 +121,13 @@ const selectDisease = val => {
const selectedOption = diseaseList.value.find(option => option.id === val);
dataInfo.diseaseName = selectedOption.diseaseName;
};
//
const uploadImg = () => {
MaterialLibraryRef.value.open(0);
};
const getImg = id => {
dataInfo.patientHeadPic = id;
};
</script>
<template>
@ -91,33 +135,88 @@ const selectDisease = val => {
<el-form
:model="dataInfo"
ref="ruleFormRef"
style="display: flex; justify-content: center; width: 100%"
:rules="rules"
label-width="280px"
>
<div class="content">
<el-row>
<el-col :span="12">
<el-form-item label="姓名:" prop="name">
<el-input size="large" maxLength="10" v-model="dataInfo.name" />
<el-form-item
label="虚拟人:"
style="font-weight: 700"
prop="patientHeadPic"
>
<div v-if="dataInfo.patientHeadPic" class="uoloadImg">
<img :src="downLoadUrl(dataInfo.patientHeadPic)" alt="" />
</div>
<div @click="uploadImg" class="uoloadImg">
<el-icon><Plus /></el-icon>
<span>点击选择虚拟人</span>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="性别:" prop="gender">
<el-radio-group v-model="dataInfo.gender">
<el-col :span="12">
<el-form-item label="类型:" prop="digitalHumanType">
<el-radio-group v-model="dataInfo.digitalHumanType">
<el-radio :label="0">离线</el-radio>
<el-radio :label="1">在线</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话:" prop="patientPhone">
<el-input size="large" v-model="dataInfo.patientPhone" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="姓名:" prop="patientName">
<el-input
size="large"
maxLength="5"
v-model="dataInfo.patientName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别:" prop="patientGender">
<el-radio-group v-model="dataInfo.patientGender">
<el-radio label="男" />
<el-radio label="女" />
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="年龄:" prop="age">
<el-input size="large" v-model="dataInfo.age" />
<el-form-item label="年龄:" prop="patientAge">
<el-input
size="large"
maxLength="3"
v-model="dataInfo.patientAge"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职业:" prop="profession">
<el-input size="large" v-model="dataInfo.profession" />
<el-form-item label="职业:" prop="patientProfession">
<el-input size="large" v-model="dataInfo.patientProfession" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="籍贯:" prop="nativePlace">
<el-input size="large" v-model="dataInfo.nativePlace" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="民族:" prop="patientNation">
<el-input size="large" v-model="dataInfo.patientNation" />
</el-form-item>
</el-col>
</el-row>
@ -128,11 +227,12 @@ const selectDisease = val => {
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="婚姻状态:" prop="marriage">
<el-form-item label="婚姻状态:" prop="patientMarriage">
<el-select
size="large"
style="width: 100%"
filterable
v-model="dataInfo.marriage"
v-model="dataInfo.patientMarriage"
placeholder="请选择"
>
<el-option
@ -147,13 +247,14 @@ const selectDisease = val => {
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="地址:" prop="address">
<el-input size="large" v-model="dataInfo.address" />
<el-form-item label="邮编:" prop="patientPostcode">
<el-input size="large" v-model="dataInfo.patientPostcode" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病分类" prop="diseaseId">
<el-form-item label="初步诊断" prop="diseaseId">
<el-select
style="width: 100%"
size="large"
filterable
v-model="dataInfo.diseaseId"
@ -170,6 +271,19 @@ const selectDisease = val => {
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="出生地:" prop="patientBirthplace">
<el-input size="large" v-model="dataInfo.patientBirthplace" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="现住地:" prop="patientHabitation">
<el-input size="large" v-model="dataInfo.patientHabitation" />
</el-form-item>
</el-col>
</el-row>
</div>
</el-form>
<div class="step-footer-btn">
<el-button size="large" @click="goBack"></el-button>
@ -177,5 +291,43 @@ const selectDisease = val => {
>下一步</el-button
>
</div>
<MaterialLibrary @select="getImg" ref="MaterialLibraryRef" />
</div>
</template>
<style lang="scss" scoped>
.BasicInfo {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
.content {
width: 80%;
}
.uoloadImg {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 120px;
height: 120px;
margin-right: 8px;
cursor: pointer;
background: #fff;
border: 1px solid #d9d9d9;
border-radius: 6px;
img {
width: 118px;
height: 118px;
}
span {
font-size: 12px;
font-weight: 400;
color: #666;
}
}
}
</style>

@ -23,7 +23,7 @@ const next = () => {
useCaseStoreHooks().changeActivedStep(2);
};
const goBack = () => {
useCaseStoreHooks().changeActivedStep(1);
useCaseStoreHooks().changeActivedStep(0);
};
const getBodyList = async () => {
const res: any = await queryDiseasePhysicalByCreat({
@ -104,7 +104,7 @@ onMounted(() => {
</script>
<template>
<div class="CollarbedDiagnosis">
<div class="CollarbedDiagnosis" style="padding-bottom: 16px">
<Header />
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="体格检查" name="body">
@ -114,7 +114,7 @@ onMounted(() => {
<InspectTable :columns="supportColumns" :dataList="supportList" />
</el-tab-pane>
</el-tabs>
<div class="step-footer-btn">
<div class="step-footer-btn" style="position: relative; top: -12px">
<el-button size="large" @click="goBack"></el-button>
<el-button size="large" @click="next" type="primary">下一步</el-button>
</div>

@ -20,7 +20,7 @@ const next = () => {
useCaseStoreHooks().changeActivedStep(3);
};
const goBack = () => {
useCaseStoreHooks().changeActivedStep(2);
useCaseStoreHooks().changeActivedStep(1);
};
onMounted(() => {
if (isEditFlag.value) {
@ -38,7 +38,7 @@ onMounted(() => {
<template>
<div class="diagnosticBasis">
<Header />
<el-form :model="diagnosticBasisInfo" label-width="180px">
<el-form class="mt-4" :model="diagnosticBasisInfo" label-width="180px">
<el-row>
<el-form-item label="初步诊断依据:" prop="primarilyDiagnosisCriteria">
<el-input

@ -10,27 +10,46 @@ const basicInfo = computed(() => {
<template>
<div class="Header">
<label>姓名:</label>
<span>{{ basicInfo.name }}</span>
<span>{{ basicInfo.patientName }}</span>
<label>性别:</label>
<span>{{ basicInfo.gender }}</span>
<span>{{ basicInfo.patientGender }}</span>
<label>年龄:</label>
<span>{{ basicInfo.age }}</span>
<label>疾病分类:</label>
<span>{{ basicInfo.diseaseName }}</span>
<span>{{ basicInfo.patientAge }}</span>
<label>初步诊断:</label>
<span :title="basicInfo.diseaseName" class="text" style="width: 150px">{{
basicInfo.diseaseName
}}</span>
<label>主诉:</label>
<span>{{ basicInfo.patientSelfDesc }}</span>
<span :title="basicInfo.patientSelfDesc" class="text">{{
basicInfo.patientSelfDesc
}}</span>
</div>
</template>
<style lang="scss" scoped>
.Header {
display: flex;
height: 40px;
width: 1500px;
height: 53px;
margin: 0 auto;
margin-bottom: 24px;
line-height: 40px;
font-size: 16px;
font-weight: 400;
line-height: 53px;
color: #4287ff;
background: rgb(66 135 255 / 6%);
border-radius: 6px;
label {
margin: 0 16px;
font-weight: bold;
margin-right: 12px;
margin-left: 110px;
font-weight: 400;
}
.text {
width: 400px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
</style>

@ -17,13 +17,15 @@ defineProps({
<template>
<div>
<pure-table
border
style="width: 1000px; height: 500px"
align-whole="center"
showOverflowTooltip
adaptive
:data="dataList"
:columns="columns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
><template #requireCheckFlag="{ row }">
<el-checkbox
disabled

@ -8,20 +8,29 @@ import { onMounted } from "vue";
import { computed } from "vue";
import { FormInstance } from "element-plus";
import ProblemBase from "../../../diseaseType/compontents/problemBase.vue";
import UploadFile from "./uploadFile.vue";
import videoImg from "@/assets/newInquiry/video_icon.png";
import { queryMedicalDefaultAnswer } from "@/api/generalRules";
import MaterialLibrary from "@/components/MaterialLibrary/index.vue";
import PlayVideo from "@/components/PlayVideo/index.vue";
import { message } from "@/utils/message";
defineOptions({
name: "ResponseStrategy"
});
const next = () => {
useCaseStoreHooks().changeQaList(dataList);
useCaseStoreHooks().changeDefaultQaList(defaultQaList);
useCaseStoreHooks().changeActivedStep(4);
};
const activeName = ref("1");
const goBack = () => {
useCaseStoreHooks().changeActivedStep(2);
};
const MaterialLibraryRef = ref();
const dataList = ref([]);
const defaultQaList = ref([]);
const answerVisible = ref(false);
const visible = ref(false);
const PlayVideoRef = ref();
const selectIndex = ref<number>(0);
const selectColumns: TableColumnList = [
{
@ -37,32 +46,33 @@ const selectColumns: TableColumnList = [
{
label: "问题",
prop: "questionList",
formatter: ({ questionList }) => `${questionList[0]}`
formatter: ({ questionList }) =>
questionList?.length > 0 ? `${questionList[0]}` : ""
},
{
label: "回复",
prop: "medicalRecAnswer"
},
{
label: "视频",
slot: "video"
},
{
label: "操作",
width: 150,
width: 200,
slot: "operation"
}
];
const ruleFormRef = ref<FormInstance>();
const problemBaseRef = ref(null);
const UploadFileRef = ref();
const rules = {
answer: [{ required: true, message: "请输入回答", trigger: "change" }]
};
const seachForm = reactive({
question: ""
});
const answerForm = reactive({
answer: ""
});
const search = () => {};
const reset = () => {};
const selectQuestion = () => {
problemBaseRef.value.open();
};
@ -88,44 +98,129 @@ const save = (formEl: FormInstance | undefined) => {
formEl.validate(async (valid, fields) => {
if (valid) {
answerVisible.value = false;
if (activeName.value === "1") {
dataList.value[selectIndex.value].medicalRecAnswer = answerForm.answer;
} else {
defaultQaList.value[selectIndex.value].medicalRecAnswer =
answerForm.answer;
}
} else {
return fields;
}
});
};
const selectOk = async (data: any) => {
let flag = true;
data.forEach(e => {
for (const item of dataList.value) {
if (item.libraryQuestionId === e.libraryQuestionId) {
message("不能选择重复数据", { type: "error" });
flag = false;
return;
}
}
if (flag) {
dataList.value.push({
defaultAnswer: e.defaultAnswer,
dictNamePath: e.nameZhPath,
libraryQuestionId: e.id,
questionList: e.question
medicalRecAnswer: e.defaultAnswer,
libraryQuestionId: e.libraryQuestionId,
questionList: e.question,
answerResourceId: e.answerResourceId
});
}
});
};
const resetForm = () => {
ruleFormRef.value.resetFields();
};
onMounted(() => {
if (isEditFlag.value) {
dataList.value = useCaseStoreHooks().qaList;
defaultQaList.value = useCaseStoreHooks().defaultQaList;
} else {
getData();
getMedicalDefaultAnswer();
}
});
const del = () => {};
const del = index => {
dataList.value.splice(index, 1);
};
const upload = () => {
UploadFileRef.value.open();
};
const getMedicalDefaultAnswer = async () => {
const res: any = await queryMedicalDefaultAnswer();
defaultQaList.value = res.data;
};
const getFileList = async (data: any) => {
if (data.length > 0) {
dataList.value = [];
data.forEach(e => {
dataList.value.push({
libraryQuestionId: e.libraryQuestionId,
defaultAnswer: e.defaultAnswer,
dictNamePath: e.dictNamePath,
medicalRecAnswer: e.medicalRecAnswer,
questionList: e.questionList,
answerResourceId: e.answerResourceId,
answerResourceName: e.answerResourceName
});
});
}
};
//
const selectVideo = index => {
selectIndex.value = index;
MaterialLibraryRef.value.open(1);
};
const changeTab = val => {
activeName.value = val;
};
const getVideo = (id, name) => {
if (activeName.value === "1") {
dataList.value[selectIndex.value].answerResourceId = id;
dataList.value[selectIndex.value].answerResourceName = name;
} else {
defaultQaList.value[selectIndex.value].answerResourceId = id;
defaultQaList.value[selectIndex.value].answerResourceName = name;
}
};
const openVideo = id => {
PlayVideoRef.value.open(id, 1);
};
</script>
<template>
<div class="responseStrategy">
<Header />
<div>
<el-button size="large" @click="selectQuestion" type="primary"
<!-- <div class="main-table-title">
<div class="title">
<div class="line" />
<span>{{ `病历问诊问题【${dataList.length}` }}</span>
</div>
<el-row class="mb-6">
<el-button
size="large"
class="btn"
@click="selectQuestion"
type="primary"
>选择问题</el-button
>
</div>
<div class="desc">{{ `病历问诊问题【${dataList.length}` }}</div>
</el-row>
</div> -->
<el-tabs
style="width: 80%"
v-model="activeName"
class="demo-tabs"
@tab-change="changeTab"
>
<el-tab-pane label="疾病问题" name="1">
<pure-table
border
align-whole="center"
adaptive
style="height: calc(100vh - 400px)"
showOverflowTooltip
:data="dataList"
:columns="selectColumns"
@ -134,28 +229,93 @@ const del = () => {};
color: 'var(--el-text-color-primary)'
}"
>
<template #video="{ row }">
<div
@click="openVideo(row.answerResourceId)"
v-if="row.answerResourceName"
class="video_item"
>
<img :src="videoImg" alt="" />
<span>{{ row.answerResourceName }}</span>
</div>
<div v-if="!row.answerResourceName" style="color: #b4b4b4">
未上传
</div>
</template>
<template #operation="{ row, index }">
<el-button link type="primary" @click="answer(row, index)">
回答
</el-button>
<el-button link type="primary" @click="selectVideo(index)">
视频
</el-button>
<el-button link type="danger" @click="del(index)"> </el-button>
</template></pure-table
>
</el-tab-pane>
<el-tab-pane label="默认问题" name="2">
<pure-table
align-whole="center"
showOverflowTooltip
:data="defaultQaList"
:columns="selectColumns"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
>
<template #video="{ row }">
<div
@click="openVideo(row.answerResourceId)"
v-if="row.answerResourceId"
class="video_item"
>
<img :src="videoImg" alt="" />
<span>{{ row.answerResourceName }}</span>
</div>
<div v-if="!row.answerResourceName" style="color: #b4b4b4">
未上传
</div>
</template>
<template #operation="{ row, index }">
<el-button link type="primary" @click="answer(row, index)">
回答
</el-button>
<el-button link type="danger" @click="del(row)"> </el-button>
<el-button link type="primary" @click="selectVideo(index)">
视频
</el-button>
</template></pure-table
>
<div class="step-footer-btn">
</el-tab-pane>
</el-tabs>
<div class="btn_list" v-if="activeName === '1'">
<el-button size="large" class="btn" @click="selectQuestion" type="primary"
>选择问题</el-button
>
<el-button size="large" class="btn" @click="upload" type="primary"
>上传数据</el-button
>
</div>
<div class="step-footer-btn mb-4">
<el-button size="large" @click="goBack"></el-button>
<el-button size="large" @click="next" type="primary">下一步</el-button>
</div>
<!-- 回答问题 -->
<el-dialog
width="800"
<el-drawer
:size="800"
title="回答问题"
append-to-body
v-model="answerVisible"
:center="true"
:show-close="false"
custom-class="body"
:with-header="false"
custom-class="AddEdit"
>
<div>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>回答问题</span>
</div>
<div class="line" />
<div class="seach">
<el-form
:rules="rules"
@ -163,24 +323,24 @@ const del = () => {};
:model="answerForm"
label-width="120px"
>
<el-row>
<el-row class="mt-4">
<el-col :span="8">
<el-form-item label="姓名:">
<span>{{ basicInfo.name }}</span>
<span>{{ basicInfo.patientName }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="性别:">
<span>{{ basicInfo.gender }}</span>
<span>{{ basicInfo.patientGender }}</span>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="年龄:">
<span>{{ basicInfo.age }}</span>
<span>{{ basicInfo.patientAge }}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row class="mt-4">
<!-- <el-col :span="12">
<el-form-item label="疾病分类:">
<span>{{ basicInfo.name }}</span>
@ -192,15 +352,23 @@ const del = () => {};
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-row class="mt-4">
<el-col :span="12">
<el-form-item label="问题:">
<span>{{ dataList[selectIndex].questionList[0] }}</span>
<span>{{
activeName === "1"
? dataList[selectIndex].questionList[0]
: defaultQaList[selectIndex].questionList[0]
}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="回答:" prop="answer">
<el-row class="mt-4">
<el-form-item
style="font-weight: 400"
label="回答:"
prop="answer"
>
<el-input
:rows="4"
style="width: 500px"
@ -213,60 +381,114 @@ const del = () => {};
</el-row>
</el-form>
</div>
<div class="step-footer-btn">
<el-button size="large" @click="save(ruleFormRef)" type="primary"
>确定</el-button
>
<el-button size="large" @click="answerVisible = false"
>取消</el-button
>
</div>
<template #footer>
<div class="footer_btn">
<div class="reset" @click="resetForm()"></div>
<div class="main" @click="save(ruleFormRef)"></div>
</div>
</el-dialog>
</template>
</el-drawer>
<ProblemBase @select="selectOk" ref="problemBaseRef" />
<!-- 选择问题 -->
<el-dialog
width="800"
title="选择问题"
append-to-body
v-model="visible"
:center="true"
:show-close="false"
custom-class="body"
>
<div>
<div class="seach">
<el-form :model="seachForm" label-width="120px">
<el-row>
<el-form-item label="问题:">
<el-input size="large" v-model="seachForm.question" />
</el-form-item>
<el-button size="large" @click="search" type="primary"
>搜索</el-button
>
<el-button size="large" @click="reset"></el-button>
</el-row>
</el-form>
</div>
<pure-table
border
align-whole="center"
showOverflowTooltip
table-layout="auto"
adaptive
:data="dataList"
:columns="selectColumns"
:pagination="pagination"
:header-cell-style="{
background: 'var(--el-table-row-hover-bg-color)',
color: 'var(--el-text-color-primary)'
}"
@selection-change="handleSelectionChange"
@page-size-change="handleSizeChange"
@page-current-change="handleCurrentChange"
/>
</div>
</el-dialog>
<UploadFile @update="getFileList" ref="UploadFileRef" />
<MaterialLibrary @select="getVideo" ref="MaterialLibraryRef" />
<PlayVideo ref="PlayVideoRef" />
</div>
</template>
<style lang="scss" scoped>
.responseStrategy {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
:deep(.el-form-item__label) {
font-weight: 700;
}
:deep(.el-tabs__item) {
height: 60px;
font-size: 18px;
}
.btn_list {
position: absolute;
top: 183px;
right: 12%;
}
.video_item {
display: flex;
align-items: center;
justify-content: center;
img {
width: 16px;
height: 16px;
margin-right: 6px;
}
}
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 755px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
}
</style>

@ -0,0 +1,362 @@
<script setup lang="ts">
import { nextTick, ref } from "vue";
import { ElMessage, UploadProps } from "element-plus";
import UploadImg from "@/assets/newInquiry/upload.png";
import fileImg from "@/assets/newInquiry/file.png";
import { getToken, downLoadUrl } from "@/utils/auth";
import downloadIcon from "@/assets/svg/consultation/download.svg?component";
import warnIcon from "@/assets/svg/consultation/warn.svg?component";
import successIcon from "@/assets/newInquiry/success.png";
import { message } from "@/utils/message";
import { reactive } from "vue";
defineOptions({
name: "UploadFile"
});
const dialogVisible = ref(false);
const fileList = ref([]);
const fileInfo = reactive({
failCount: 0,
fileId: "",
totalCount: 0,
fileName: ""
});
defineExpose({
async open() {
dialogVisible.value = true;
await nextTick;
}
});
const resetForm = () => {
fileInfo.fileId = "";
fileInfo.fileName = "";
};
const closeDialog = () => {
dialogVisible.value = false;
resetForm();
emit("update");
};
const emit = defineEmits(["update"]);
const handleSuccess: UploadProps["onSuccess"] = response => {
if (response.code === 200) {
fileInfo.failCount = response.data.failCount;
fileInfo.fileId = response.data.fileId;
fileInfo.totalCount = response.data.totalCount;
fileList.value = response.data.qaList;
} else {
message(response.data, { type: "error" });
}
};
const downloadFile = (url, fileName) => {
const link = document.createElement("a");
link.href = url;
link.download = fileName;
link.click();
};
const download = () => {
downloadFile(
"/virtual-patient-manage/medicalRecManage/downloadMedicalAnswerTemplate",
"导入模版"
);
};
const beforeUpload: UploadProps["beforeUpload"] = async rawFile => {
// png|jpg 10M
const type = rawFile.name.split(".")[rawFile.name.split(".").length - 1];
if (!["xls", "xlsx"].includes(type)) {
ElMessage.error("上传文件格式不正确");
return false;
} else if (rawFile.size / 1024 / 1024 > 10) {
ElMessage.error("大小不能大于10M");
return false;
}
fileInfo.fileName = rawFile.name;
return true;
};
const downErrorFile = () => {
downloadFile(downLoadUrl(fileInfo.fileId), "错误报告");
};
const submit = () => {
dialogVisible.value = false;
emit("update", fileList.value);
};
</script>
<template>
<div>
<el-drawer
:size="820"
append-to-body
v-model="dialogVisible"
:show-close="false"
:with-header="false"
:before-close="closeDialog"
custom-class="AddEdit"
>
<div class="AddEdit">
<div class="header-title">
<div class="tip" />
<span>上传数据</span>
</div>
<div class="line" />
<div class="download_card">
<p>1.下载导入模板根据模板提示完善内容</p>
<div @click="download" class="download_btn">
<downloadIcon />
<span>下载模板</span>
</div>
</div>
<div class="upload_card">
<span class="title">2.上传完善好的表格</span>
<div class="main">
<img v-if="!fileInfo.fileName" :src="UploadImg" alt="" />
<img v-if="fileInfo.fileName" :src="fileImg" alt="" />
<span v-if="fileInfo.fileName">{{ fileInfo.fileName }}</span>
<el-upload
:limit="5"
multiple
:show-file-list="false"
:headers="{
token: getToken()
}"
action="/virtual-patient-manage/medicalRecManage/preUploadMedicalAnswer"
:on-success="handleSuccess"
:before-upload="beforeUpload"
>
<div
style="
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
"
>
<div class="upload_btn">
{{ fileInfo.fileName ? "重新选择" : "选择文件" }}
</div>
<p>
按下载模板完善信息后可直接点击选择文件选取本地文件进行上传支持格式:
xlsxlsx
</p>
</div>
</el-upload>
</div>
<div v-if="fileInfo.failCount > 0" class="tip">
<warnIcon class="mr-2" />
<span>{{
`共导入数据${fileInfo.totalCount}条,失败${fileInfo.failCount}条。可`
}}</span>
<span @click="downErrorFile" style="color: #6196cc; cursor: pointer"
>下载错误报告</span
>
<span>,修改后重新导入</span>
</div>
<div
class="tip"
v-if="fileInfo.failCount == 0 && fileList.length > 0"
>
<img :src="successIcon" alt="" class="mr-2" />
<span>数据格式正确无错误数据</span>
</div>
</div>
</div>
<template #footer>
<div class="footer_btn">
<!-- <div class="reset" @click="resetForm()"></div> -->
<div class="main" @click="submit()"></div>
</div>
</template>
</el-drawer>
</div>
</template>
<style lang="scss" scoped>
.AddEdit {
.header-title {
display: flex;
align-items: center;
// border-left: 6px solid #4287ff;
font-size: 20px;
font-weight: bold;
color: #2b3f54;
.tip {
width: 6px;
height: 20px;
margin-right: 10px;
line-height: 20px;
background: #4287ff;
}
}
.line {
position: relative;
left: -20px;
width: 800px;
height: 1px;
margin: 24px 0;
background: rgb(91 139 255 / 30%);
}
.footer_btn {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 16px;
.reset {
width: 188px;
height: 48px;
margin-right: 24px;
font-size: 16px;
font-weight: 400;
line-height: 48px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
}
.main {
width: 188px;
height: 48px;
font-size: 16px;
line-height: 48px;
color: #fff;
text-align: center;
cursor: pointer;
background: #4287ff;
border: 1px solid #4287ff;
border-radius: 6px;
}
}
.add_btn {
width: 76px;
height: 32px;
margin-left: 16px;
font-size: 14px;
font-weight: 400;
line-height: 32px;
color: #4287ff;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #4287ff;
border-radius: 6px;
opacity: 1;
}
.download_card {
display: flex;
flex-direction: column;
justify-content: center;
width: 100%;
padding: 24px;
margin-bottom: 24px;
font-size: 16px;
font-weight: 400;
color: #333;
background: #f8f9fa;
border: 1px solid #ebedee;
border-radius: 6px;
.download_btn {
display: flex;
align-items: center;
justify-content: center;
width: 140px;
height: 40px;
margin-top: 24px;
line-height: 40px;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #d1d3d6;
border-radius: 6px;
opacity: 1;
span {
margin-left: 8px;
}
}
}
.upload_card {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
padding: 24px;
margin-bottom: 24px;
background: #f8f9fa;
border: 1px solid #ebedee;
border-radius: 6px;
opacity: 1;
.tip {
display: flex;
align-items: center;
width: 100%;
margin-top: 24px;
font-size: 14px;
color: #333;
img {
width: 14px;
height: 14px;
}
}
.main {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
width: 100%;
padding: 32px;
background: #fff;
border: 1px dashed #bcbfc3;
}
.title {
width: 100%;
margin-bottom: 24px;
font-size: 16px;
font-weight: 400;
color: #333 !important;
}
img {
width: 76px;
height: 76px;
}
.upload_btn {
width: 112px;
height: 40px;
margin-top: 16px;
font-size: 16px;
line-height: 40px;
color: #333;
text-align: center;
cursor: pointer;
background: #fff;
border: 1px solid #d1d3d6;
border-radius: 6px;
opacity: 1;
}
p {
margin-top: 16px;
font-size: 14px;
font-weight: 400;
color: #b4b4b4;
}
}
}
</style>

@ -12,7 +12,7 @@ const active = computed(() => {
</script>
<template>
<div>
<div class="main-table">
<el-steps
class="head_step"
:active="active"

@ -102,8 +102,22 @@ const selectItem = item => {
formData.intervalDay = "";
formData.intervalHour = "";
};
const getTree = async () => {
const res: any = await queryTree();
const clearData = () => {
formData.firstMeasures = "";
formData.drugId = "";
formData.drugRoute = "";
formData.intervalDay = "";
formData.intervalHour = "";
formData.guide = "";
formData.treatmentPlanId = "";
formData.disposalPlan = "";
};
const getTree = async val => {
clearData();
const res: any = await queryTree({
disposalMethod: val
});
planList.value = res.data;
};
const queryDrugList = async () => {
@ -213,8 +227,10 @@ const cancal = () => {
emit("save");
};
onMounted(() => {
getTree();
queryDrugList();
if (formData.disposalMethod) {
getTree(formData.disposalMethod);
}
});
</script>
@ -237,6 +253,7 @@ onMounted(() => {
<el-radio-group
:disabled="useConsultationStoreHooks().planTypeFlag !== ''"
v-model="formData.disposalMethod"
@change="getTree"
class="ml-2"
>
<el-radio :label="0">门诊治疗</el-radio>

@ -106,7 +106,7 @@ const saveOk = () => {
}
.tab_plan_img {
background-image: url("@/assets/newInquiry/tab/act_plan.png");
background-image: url("@/assets/newInquiry/tab/plan.png");
}
.actived .tab_plan_img {

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save