fix(database): 修复数据库字典重复和表结构缺失问题

- 删除手术状态下拉框的重复字典数据,保留每组中dict_code最小的记录
- 修复HisBaseEntity列缺失问题,为多个表添加create_by、update_by、update_time等基础字段
- 为adm_patient表添加邮政编码、户籍地址、监护人信息、患者来源等缺失字段
- 添加文化程度字典类型和相关字典数据,补充3919到3914等10个学历级别选项
- 为adm_patient_identifier表创建tenant_id和patient_id的联合索引以提升查询性能
- 修复prescription_intercept_log和clinical_pathway_execution表的基础实体字段缺失
- 为wor_device_request表增加医嘱退回相关的back_reason、performer_check_id等字段
- 创建EMPI核心表empi_person和empi_person_id_mapping用于全局患者主
This commit is contained in:
2026-06-17 14:25:32 +08:00
parent de6d6a2b51
commit 73aa812544
321 changed files with 36390 additions and 7997 deletions

View File

@@ -47,7 +47,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**
@@ -184,7 +184,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**

View File

@@ -40,7 +40,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**

View File

@@ -40,7 +40,7 @@
**铁律2: Flyway 数据库迁移**
- 凡是新建表、新增字段,必须创建 Flyway 迁移脚本
- 路径:`healthlink-his-domain/src/main/resources/db/migration/`
- 路径:`healthlink-his-application/src/main/resources/db/migration/`
- 命名:`V{版本号}__{描述}.sql`(双下划线)
**铁律3: 测试通过后才提交**

View File

@@ -6,3 +6,9 @@ export function getDefects(encounterId) { return request({ url: "/api/v1/emr-qua
export function getDefectStatistics() { return request({ url: "/api/v1/emr-quality/defect-statistics", method: "get" }) }
export function getCompletionRate() { return request({ url: "/api/v1/emr-quality/completion-rate", method: "get" }) }
export function getQualityStatistics(params) { return request({ url: "/api/v1/emr-quality/defect-statistics", method: "get", params }) }
// 终末质控
export function runTerminalCheck(encounterId) { return request({ url: "/api/v1/quality/terminal/check/" + encounterId, method: "post" }) }
export function getTerminalResults(encounterId) { return request({ url: "/api/v1/quality/terminal/results/" + encounterId, method: "get" }) }
export function startDefectRectify(defectId) { return request({ url: "/api/v1/emr-quality/defect/rectify/" + defectId, method: "post" }) }
export function completeDefectRectify(defectId) { return request({ url: "/api/v1/emr-quality/defect/complete/" + defectId, method: "post" }) }

View File

@@ -1,4 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M768 192H256c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-64 576H320V320h384v448z" fill="currentColor"/>
<path d="M384 384h256v64H384z m0 128h192v64H384z m0 128h128v64H384z" fill="currentColor"/>
</svg>
<path d="M768 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m0 64v64H256V192h512z" fill="currentColor"/>
<path d="M320 320h384v64H320z" fill="currentColor"/>
<path d="M320 448h384v64H320z" fill="currentColor"/>
<path d="M320 576h384v64H320z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 416 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M640 128H384c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h256c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m-64 640H448V256h128v512z" fill="currentColor"/>
<path d="M480 320h64v128h-64z m-64 192h192v64H416z" fill="currentColor"/>
</svg>
<path d="M768 128H256c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m0 64v64H256V192h512z" fill="currentColor"/>
<path d="M320 320h384v64H320z" fill="currentColor"/>
<path d="M320 448h384v64H320z" fill="currentColor"/>
<path d="M320 576h384v64H320z" fill="currentColor"/>
<path d="M320 704h384v64H320z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 332 B

After

Width:  |  Height:  |  Size: 471 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M832 192H192c-35.2 0-64 28.8-64 64v512c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-64 512H256V320h512v384z" fill="currentColor"/>
<path d="M320 384h128v128H320z m256 0h128v128H576z m-256 192h128v64H320z m256 0h128v64H576z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 373 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1 +1,7 @@
<svg width="128" height="96" xmlns="http://www.w3.org/2000/svg"><path d="M64.125 56.975L120.188.912A12.476 12.476 0 0 0 115.5 0h-103c-1.588 0-3.113.3-4.513.838l56.138 56.137z"/><path d="M64.125 68.287l-62.3-62.3A12.42 12.42 0 0 0 0 12.5v71C0 90.4 5.6 96 12.5 96h103c6.9 0 12.5-5.6 12.5-12.5v-71a12.47 12.47 0 0 0-1.737-6.35L64.125 68.287z"/></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 64C262.4 64 64 262.4 64 512s198.4 448 448 448 448-198.4 448-448S761.6 64 512 64z m0 768c-176.8 0-320-143.2-320-320s143.2-320 320-320 320 143.2 320 320-143.2 320-320 320z" fill="currentColor"/>
<path d="M480 352h64v192h-64z m0 256h64v64h-64z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 64L128 256v256c0 224 144 416 384 448 240-32 384-224 384-448V256L512 64z m0 832c-176-32-288-192-288-384V288l288-160 288 160v224c0 192-112 352-288 384z" fill="currentColor"/>
<path d="M480 320h64v256h-64z m0 320h64v64h-64z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M832 256H192c-35.2 0-64 28.8-64 64v512c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64V320c0-35.2-28.8-64-64-64z m-64 512H256V384h512v384z" fill="currentColor"/>
<path d="M320 416h128v64H320z m256 0h128v64H576z m-256 128h128v64H320z m256 0h128v64H576z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 371 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,4 +1,5 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M768 192H256c-35.2 0-64 28.8-64 64v512c0 35.2 28.8 64 64 64h512c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-64 512H320V320h384v384z" fill="currentColor"/>
<path d="M384 416h256v64H384z m0 128h192v64H384z m0 128h128v64H384z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M448 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h192v64h-192z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 481 B

View File

@@ -1 +1,7 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M119.88 49.674h-7.987V39.52C111.893 17.738 90.45.08 63.996.08 37.543.08 16.1 17.738 16.1 39.52v10.154H8.113c-4.408 0-7.987 2.94-7.987 6.577v65.13c0 3.637 3.57 6.577 7.987 6.577H119.88c4.407 0 7.987-2.94 7.987-6.577v-65.13c-.008-3.636-3.58-6.577-7.987-6.577zm-23.953 0H32.065V39.52c0-14.524 14.301-26.295 31.931-26.295 17.63 0 31.932 11.777 31.932 26.295v10.153z"/></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 444 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,3 +1,7 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1566035943711" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4805"
width="200" height="200"><defs><style type="text/css"></style></defs><path d="M208.736 566.336H64.384v59.328h144.352v-59.328z m0-336.096H165.44V74.592c0-7.968 4.896-14.848 10.464-14.848h502.016V0.448H175.936c-38.72 1.248-69.248 34.368-68.192 74.144v155.648H64.384V289.6h144.352V230.24z m0 168.096H64.384v59.328h144.352v-59.328z m714.656 76.576h-57.76v474.496c0 7.936-4.896 14.848-10.464 14.848H175.936c-5.568 0-10.464-6.912-10.464-14.848v-155.68h43.296v-59.296H64.384v59.296h43.328v155.68c-1.024 39.776 29.472 72.896 68.192 74.144h679.232c38.72-1.184 69.248-34.368 68.256-74.144V474.912z m14.944-290.336l-83.072-85.312a71.264 71.264 0 0 0-52.544-21.728 71.52 71.52 0 0 0-51.616 23.872L386.528 507.264a30.496 30.496 0 0 0-6.176 10.72L308.16 740.512a30.016 30.016 0 0 0 6.976 30.24c7.712 7.968 19.2 10.752 29.568 7.2l216.544-74.112a28.736 28.736 0 0 0 12.128-7.936L940.448 287.456a75.552 75.552 0 0 0-2.112-102.88z m-557.12 518.272l39.104-120.64 78.336 80.416-117.44 40.224z m170.048-70.016l-103.552-106.016 200.16-222.4 103.52 106.304-200.128 222.112zM897.952 247.072l-0.256 0.224-107.136 119.168-103.52-106.528 106.432-118.624a14.144 14.144 0 0 1 10.304-4.736 13.44 13.44 0 0 1 10.464 4.288l83.264 85.696c5.472 5.6 5.664 14.72 0.448 20.512z" p-id="4806"></path></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1 +1,6 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 20.967v59.59c0 11.59 8.537 20.966 19.075 20.966h28.613l1 26.477L76.8 101.523h32.125c10.538 0 19.075-9.377 19.075-20.966v-59.59C128 9.377 119.463 0 108.925 0h-89.85C8.538 0 0 9.377 0 20.967zm82.325 33.1c0-5.524 4.013-9.935 9.037-9.935 5.026 0 9.038 4.41 9.038 9.934 0 5.524-4.025 9.934-9.038 9.934-5.024 0-9.037-4.41-9.037-9.934zm-27.613 0c0-5.524 4.013-9.935 9.038-9.935s9.037 4.41 9.037 9.934c0 5.524-4.025 9.934-9.037 9.934-5.025 0-9.038-4.41-9.038-9.934zm-27.1 0c0-5.524 4.013-9.935 9.038-9.935s9.038 4.41 9.038 9.934c0 5.524-4.026 9.934-9.05 9.934-5.013 0-9.025-4.41-9.025-9.934z"/></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 669 B

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1,3 +1,6 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1575802846045" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2750"
width="200" height="200"><defs><style type="text/css"></style></defs><path d="M868.593046 403.832442c-30.081109-28.844955-70.037123-44.753273-112.624057-44.753273L265.949606 359.079168c-42.554188 0-82.510202 15.908318-112.469538 44.690852-30.236652 28.782533-46.857191 67.222007-46.857191 108.198258l0 294.079782c0 40.977273 16.619516 79.414701 46.702672 108.136859 29.959336 28.844955 70.069869 44.814672 112.624057 44.814672l490.019383 0c42.585911 0 82.696444-15.969717 112.624057-44.814672 30.082132-28.844955 46.579875-67.222007 46.579875-108.136859L915.172921 511.968278C915.171897 471.053426 898.675178 432.677397 868.593046 403.832442zM841.821309 806.049083c0 22.098297-8.882298 42.772152-25.099654 58.306964-16.154935 15.661701-37.81935 24.203238-60.752666 24.203238L265.949606 888.559285c-22.934339 0-44.567032-8.54256-60.877509-24.264637-16.186657-15.474436-25.067932-36.148291-25.067932-58.246589L180.004165 511.968278c0-22.035876 8.881274-42.772152 25.192775-58.307987 16.186657-15.536858 37.81935-24.139793 60.753689-24.139793l490.019383 0c22.933315 0 44.597731 8.602935 60.752666 24.139793 16.21838 15.535835 25.099654 36.272112 25.099654 58.307987L841.822332 806.049083zM510.974136 135.440715c114.914216 0 208.318536 89.75214 208.318536 200.055338l73.350588 0c0-149.113109-126.366036-270.496667-281.669124-270.496667-155.333788 0-281.699824 121.383558-281.699824 270.496667l73.350588 0C302.623877 225.193879 396.059919 135.440715 510.974136 135.440715zM474.299865 747.244792l73.350588 0L547.650453 629.576859l-73.350588 0L474.299865 747.244792z" p-id="2751"></path></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1,5 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M736 288H288c-17.68 0-32 14.32-32 32v416c0 17.68 14.32 32 32 32h448c17.68 0 32-14.32 32-32v-416c0-17.68-14.32-32-32-32z m-64 384H352V384h320v288z" fill="currentColor"/>
<path d="M480 192h64v224h-64z m-128 0h64v224h-64z m256 0h64v224h-64z" fill="currentColor"/>
<path d="M544 64h-64c-17.68 0-32 14.32-32 32v64h-64c-17.68 0-32 14.32-32 32v64h320v-64c0-17.68-14.32-32-32-32h-64v-64c0-17.68-14.32-32-32-32z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 526 B

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1,3 +1,7 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1567417214476" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2266"
width="200" height="200"><defs><style type="text/css"></style></defs><path d="M761.503029 2.90619 242.121921 2.90619c-32.405037 0-58.932204 26.060539-58.932204 58.527998l0 902.302287c0 32.156374 26.217105 58.216913 58.932204 58.216913l519.381108 0c32.344662 0 58.591443-26.060539 58.591443-58.216913L820.094472 61.123103C820.094472 28.966729 793.847691 2.90619 761.503029 2.90619M452.878996 61.123103l98.147344 0c6.780427 0 12.31549 5.536087 12.31549 12.253068 0 6.748704-5.535063 12.253068-12.31549 12.253068l-98.147344 0c-6.779404 0-12.345166-5.504364-12.345166-12.253068C440.532807 66.659189 446.099592 61.123103 452.878996 61.123103M501.641583 980.593398c-29.636994 0-53.987588-23.946388-53.987588-53.677527 0-29.356608 24.039509-53.614082 53.987588-53.614082 29.91738 0 53.987588 23.883967 53.987588 53.614082C555.629171 956.647009 531.559986 980.593398 501.641583 980.593398M766.35657 803.142893c0 16.23373-13.186324 29.107945-29.233811 29.107945l-470.618521 0c-16.35755 0-29.325909-13.186324-29.325909-29.107945L237.178329 163.500794c0-16.232706 13.279445-29.138644 29.325909-29.138644l470.246037 0c16.420995 0 29.357632 13.1853 29.357632 29.138644l0 639.642099L766.35657 803.142893zM766.35657 803.142893" p-id="2267"></path></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -1,4 +1,8 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M704 128H320c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h384c35.2 0 64-28.8 64-64V192c0-35.2-28.8-64-64-64z m-64 640H384V256h256v512z" fill="currentColor"/>
<path d="M416 320h192v64H416z m0 128h192v64H416z m0 128h128v64H416z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
<path d="M384 640h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 648 B

View File

@@ -1,4 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M704 64H320c-35.2 0-64 28.8-64 64v768c0 35.2 28.8 64 64 64h384c35.2 0 64-28.8 64-64V128c0-35.2-28.8-64-64-64z m-64 768H384V192h256v640z" fill="currentColor"/>
<path d="M416 256h192v64H416z m0 128h192v64H416z m0 128h128v64H416z m0 128h128v64H416z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 367 B

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg t="1547360688278" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
p-id="6717"
width="200" height="200"><defs><style type="text/css"></style></defs><path d="M890 120H134a70 70 0 0 0-70 70v500a70 70 0 0 0 70 70h756a70 70 0 0 0 70-70V190a70 70 0 0 0-70-70z m-10 520a40 40 0 0 1-40 40H712V448a40 40 0 0 0-80 0v232h-80V368a40 40 0 0 0-80 0v312h-80V512a40 40 0 0 0-80 0v168H184a40 40 0 0 1-40-40V240a40 40 0 0 1 40-40h656a40 40 0 0 1 40 40zM696 824H328a40 40 0 0 0 0 80h368a40 40 0 0 0 0-80z" p-id="6718"></path></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 710 B

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1 +1,6 @@
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M70.66 4.328l14.01 29.693c1.088 2.29 3.177 3.882 5.603 4.25l31.347 4.76c6.087.926 8.528 8.756 4.117 13.247L103.05 79.395c-1.75 1.78-2.544 4.352-2.132 6.867l5.352 32.641c1.043 6.337-5.33 11.182-10.778 8.19l-28.039-15.409a7.13 7.13 0 0 0-6.91 0l-28.039 15.41c-5.448 2.99-11.821-1.854-10.777-8.19l5.352-32.642c.415-2.515-.387-5.088-2.136-6.867L2.264 56.278C-2.146 51.787.286 43.957 6.38 43.031l31.343-4.76c2.419-.368 4.51-1.96 5.595-4.25L57.334 4.328c2.728-5.77 10.605-5.77 13.325 0z"/></svg>
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h256v64h-256z" fill="currentColor"/>
<path d="M384 448h256v64h-256z" fill="currentColor"/>
<path d="M384 576h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 563 B

After

Width:  |  Height:  |  Size: 538 B

View File

@@ -1,4 +1,6 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M736 256H288c-35.2 0-64 28.8-64 64v416c0 35.2 28.8 64 64 64h448c35.2 0 32-28.8 32-64V320c0-35.2-3.2-64-32-64z m-64 384H352V384h320v256z" fill="currentColor"/>
<path d="M384 416h256v64H384z m0 128h192v64H384z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 329 B

After

Width:  |  Height:  |  Size: 536 B

View File

@@ -1,4 +1,7 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
<path d="M896 192H128c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V256c0-35.2-28.8-64-64-64z m-64 576H192V320h640v448z" fill="currentColor"/>
<path d="M320 416h128v64h-128z m256 0h128v64h-128z m-256 128h128v64h-128z m256 0h128v64h-128z m-256 128h128v64h-128z m256 0h128v64h-128z" fill="currentColor"/>
</svg>
<path d="M512 128c-211.2 0-384 172.8-384 384 0 106.24 43.52 202.24 113.92 271.36L256 896h512l-85.33-112.64C769.28 714.24 812.8 618.24 812.8 512c0-211.2-172.8-384-384-384z m0 576c-106.24 0-192-85.76-192-192s85.76-192 192-192 192 85.76 192 192-85.76 192-192 192z" fill="currentColor"/>
<path d="M384 320h64v384h-64z" fill="currentColor"/>
<path d="M576 320h64v384h-64z" fill="currentColor"/>
<path d="M384 384h256v64h-256z" fill="currentColor"/>
<path d="M384 512h256v64h-256z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 418 B

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
允许的通配符[, - * ? / L W]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
不指定
</el-radio>
@@ -18,7 +20,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
周期从
<el-input-number
@@ -36,7 +39,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
<el-input-number
@@ -54,7 +58,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="5"
v-model="radioValue"
:value="5"
>
每月
<el-input-number
@@ -67,7 +72,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="6"
v-model="radioValue"
:value="6"
>
本月最后一天
</el-radio>
@@ -75,7 +81,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="7"
v-model="radioValue"
:value="7"
>
指定
<el-select
@@ -101,7 +108,7 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
@@ -109,7 +116,7 @@ const props = defineProps({
month: "*",
week: "?",
year: "",
}
})
},
check: {
type: Function,

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
小时允许的通配符[, - * /]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
周期从
<el-input-number
@@ -28,7 +30,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
<el-input-number
@@ -46,7 +49,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
指定
<el-select
@@ -73,7 +77,7 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
@@ -81,7 +85,7 @@ const props = defineProps({
month: "*",
week: "?",
year: "",
}
})
},
check: {
type: Function,

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
分钟允许的通配符[, - * /]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
周期从
<el-input-number
@@ -28,7 +30,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
<el-input-number
@@ -46,7 +49,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
指定
<el-select
@@ -72,7 +76,7 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
@@ -80,7 +84,7 @@ const props = defineProps({
month: "*",
week: "?",
year: "",
}
})
},
check: {
type: Function,

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
允许的通配符[, - * /]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
周期从
<el-input-number
@@ -28,7 +30,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
<el-input-number
@@ -46,7 +49,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
指定
<el-select
@@ -73,7 +77,7 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
@@ -81,7 +85,7 @@ const props = defineProps({
month: "*",
week: "?",
year: "",
}
})
},
check: {
type: Function,

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
允许的通配符[, - * /]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
周期从
<el-input-number
@@ -28,7 +30,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
<el-input-number
@@ -46,7 +49,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
指定
<el-select
@@ -73,7 +77,7 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
@@ -81,7 +85,7 @@ const props = defineProps({
month: "*",
week: "?",
year: "",
}
})
},
check: {
type: Function,

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
允许的通配符[, - * ? / L #]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
不指定
</el-radio>
@@ -18,7 +20,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
周期从
<el-select
@@ -55,7 +58,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
<el-input-number
@@ -79,7 +83,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="5"
v-model="radioValue"
:value="5"
>
本月最后一个
<el-select
@@ -98,7 +103,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="6"
v-model="radioValue"
:value="6"
>
指定
<el-select
@@ -126,15 +132,15 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
day: "*",
month: "*",
week: "?",
year: ""
}
year: "",
})
},
check: {
type: Function,

View File

@@ -2,7 +2,8 @@
<el-form>
<el-form-item>
<el-radio
v-model="radioValue" :value="1"
v-model="radioValue"
:value="1"
>
不填允许的通配符[, - * /]
</el-radio>
@@ -10,7 +11,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="2"
v-model="radioValue"
:value="2"
>
每年
</el-radio>
@@ -18,7 +20,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="3"
v-model="radioValue"
:value="3"
>
周期从
<el-input-number
@@ -36,7 +39,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="4"
v-model="radioValue"
:value="4"
>
<el-input-number
@@ -54,7 +58,8 @@
<el-form-item>
<el-radio
v-model="radioValue" :value="5"
v-model="radioValue"
:value="5"
>
指定
<el-select
@@ -81,15 +86,15 @@ const emit = defineEmits(['update'])
const props = defineProps({
cron: {
type: Object,
default: {
default: () => ({
second: "*",
min: "*",
hour: "*",
day: "*",
month: "*",
week: "?",
year: ""
}
year: "",
})
},
check: {
type: Function,

View File

@@ -1,22 +1,61 @@
<template>
<el-dialog :title="title" v-model="visible" :width="width" teleported @close="handleClose">
<el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="headers" :action="uploadUrl" :disabled="isUploading" :on-progress="handleProgress" :on-change="handleFileChange" :on-remove="handleFileRemove" :on-success="handleSuccess" :auto-upload="false" drag>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<el-dialog
v-model="visible"
:title="title"
:width="width"
teleported
@close="handleClose"
>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="headers"
:action="uploadUrl"
:disabled="isUploading"
:on-progress="handleProgress"
:on-change="handleFileChange"
:on-remove="handleFileRemove"
:on-success="handleSuccess"
:auto-upload="false" drag
>
<el-icon class="el-icon--upload">
<upload-filled />
</el-icon>
<div class="el-upload__text">
将文件拖到此处<em>点击上传</em>
</div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="updateSupport"> {{ updateSupportLabel }} </el-checkbox>
<el-checkbox v-model="updateSupport">
{{ updateSupportLabel }}
</el-checkbox>
</div>
<span>仅允许导入xlsxlsx格式文件</span>
<el-link v-if="templateUrl" type="primary" underline="never" style="font-size: 12px; vertical-align: baseline" @click="handleDownloadTemplate">下载模板</el-link>
<el-link
v-if="templateUrl"
type="primary"
underline="never"
style="font-size: 12px; vertical-align: baseline"
@click="handleDownloadTemplate"
>
下载模板
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleSubmit"> </el-button>
<el-button @click="visible = false"> </el-button>
<el-button
type="primary"
@click="handleSubmit"
>
</el-button>
<el-button @click="visible = false">
</el-button>
</div>
</template>
</el-dialog>

View File

@@ -1,8 +1,8 @@
<template>
<div class="upload-file">
<el-upload
multiple
ref="fileUpload"
multiple
:action="uploadFileUrl"
:before-upload="handleBeforeUpload"
:file-list="fileList"

View File

@@ -1,42 +1,72 @@
<template>
<div class="patientList-container" :class="{ 'patientList-container-unexpand': !currentExpand }">
<div
class="patientList-container"
:class="{ 'patientList-container-unexpand': !currentExpand }"
>
<div
v-if="currentExpand"
class="patientList-operate"
:class="{ 'patientList-operate-unexpand': !currentExpand }"
v-if="currentExpand"
>
<el-input
v-model="searchKeyword"
class="patientList-search-input"
placeholder="床号/住院号/姓名"
v-model="searchKeyword"
@keyup.enter="handleSearch"
:prefix-icon="Search"
@keyup.enter="handleSearch"
/>
<el-button class="icon-btn" circle @click="handleRefresh" link plain>
<el-icon icon-class="Refresh" size="24" :class="{ 'is-rotating': refreshing }">
<el-button
class="icon-btn"
circle
link
plain
@click="handleRefresh"
>
<el-icon
icon-class="Refresh"
size="24"
:class="{ 'is-rotating': refreshing }"
>
<Refresh />
</el-icon>
</el-button>
</div>
<transition name="patient-list-toggle" mode="out-in">
<div key="expanded" class="patientList-list" v-if="currentExpand">
<div class="patient-cards" v-loading="isLoading">
<transition
name="patient-list-toggle"
mode="out-in"
>
<div
v-if="currentExpand"
key="expanded"
class="patientList-list"
>
<div
v-loading="isLoading"
class="patient-cards"
>
<template v-if="filteredCardData && filteredCardData.length > 0">
<el-scrollbar ref="expandScrollbarRef" class="patient-cards-scrollbar">
<el-scrollbar
ref="expandScrollbarRef"
class="patient-cards-scrollbar"
>
<div
class="patient-card"
v-for="item in filteredCardData"
:key="item.encounterId"
:id="item.encounterId"
@click="handleItemClick(item)"
:key="item.encounterId"
class="patient-card"
:class="{ actived: activeCardId === item.encounterId }"
@click="handleItemClick(item)"
>
<div class="patient-card-header">
<!-- 第1行姓名 -->
<div class="info-row name-row">
<div class="name">
<el-text :text="item.patientName" class="name" :truncated="true">
<el-text
:text="item.patientName"
class="name"
:truncated="true"
>
{{ item.patientName || '-' }}
</el-text>
</div>
@@ -57,7 +87,10 @@
</div>
<!-- 入院状态放在性别年龄旁边 -->
<div class="status-inline" v-if="item.statusEnum_enumText">
<div
v-if="item.statusEnum_enumText"
class="status-inline"
>
<el-tag
size="small"
class="payer-tag-status"
@@ -72,8 +105,15 @@
<!-- 第3行房间号-分床状态 -->
<div class="info-row room-bed-row">
<div class="bed-info">
<div v-if="item.houseName" class="house-name">{{ item.houseName }}</div>
<div class="bed-name">{{ item.bedName || '未分床' }}</div>
<div
v-if="item.houseName"
class="house-name"
>
{{ item.houseName }}
</div>
<div class="bed-name">
{{ item.bedName || '未分床' }}
</div>
</div>
</div>
@@ -83,7 +123,10 @@
</div>
<!-- 第5行居民保险类型 -->
<div class="info-row insurance-row" v-if="item.contractName">
<div
v-if="item.contractName"
class="info-row insurance-row"
>
<el-tag
size="small"
class="payer-tag"
@@ -100,7 +143,11 @@
<div class="personal-info-container">
<div class="name-container">
<div class="name">
<el-text :text="item.patientName" tclass="name" width="auto">
<el-text
:text="item.patientName"
tclass="name"
width="auto"
>
{{ item.patientName || '-' }}
</el-text>
</div>
@@ -118,12 +165,18 @@
</div>
<!-- 添加入院日期等关键信息 -->
<div class="admission-info" v-if="item.admissionDate">
<div
v-if="item.admissionDate"
class="admission-info"
>
<span class="admission-date">入院日期{{ item.admissionDate }}</span>
</div>
<!-- 添加主治医生信息 -->
<div class="attending-doctor" v-if="item.attendingDoctorName">
<div
v-if="item.attendingDoctorName"
class="attending-doctor"
>
<span class="doctor-name">主管医生{{ item.attendingDoctorName }}</span>
</div>
</div>
@@ -131,22 +184,28 @@
</div>
</el-scrollbar>
</template>
<el-empty v-else description="暂无数据" />
<el-empty
v-else
description="暂无数据"
/>
</div>
</div>
<div
key="collapsed"
class="patientList-list"
v-else
key="collapsed"
v-loading="isLoading"
class="patientList-list"
:class="{ 'patientList-list-unexpand': !currentExpand }"
>
<el-scrollbar ref="contractScrollbarRef" class="patient-cards-scrollbar">
<el-scrollbar
ref="contractScrollbarRef"
class="patient-cards-scrollbar"
>
<template v-if="filteredCardData && filteredCardData.length > 0">
<el-tooltip
v-for="item in filteredCardData"
:show-after="200"
:key="item.encounterId"
:show-after="200"
:show-arrow="true"
placement="right"
effect="light"
@@ -169,18 +228,22 @@
<div>
<div
:key="item.encounterId"
class="card-small"
:class="{ 'patient-active': activeCardId === item.encounterId }"
@click="handleSmallCardClick(item)"
:key="item.encounterId"
>
{{ item.bedName }}
</div>
<div class="patient-card-small-border"></div>
<div class="patient-card-small-border" />
</div>
</el-tooltip>
</template>
<el-empty v-else description="暂无数据" :image-size="50" />
<el-empty
v-else
description="暂无数据"
:image-size="50"
/>
</el-scrollbar>
</div>
</transition>
@@ -189,8 +252,15 @@
class="patientList-toggle-btn-wrap"
:class="{ 'patientList-toggle-btn-wrap-unexpand': !currentExpand }"
>
<el-button class="icon-btn" circle @click="updateExpand">
<el-icon class="svg-sty-menu" size="24">
<el-button
class="icon-btn"
circle
@click="updateExpand"
>
<el-icon
class="svg-sty-menu"
size="24"
>
<Expand v-if="!currentExpand" />
<Fold v-if="currentExpand" />
</el-icon>

View File

@@ -1,12 +1,15 @@
<template>
<div class="pending-patient-list">
<div class="patient-cards" v-loading="loading">
<div
v-loading="loading"
class="patient-cards"
>
<template v-if="list && list.length > 0">
<el-scrollbar class="patient-cards-scrollbar">
<div
class="patient-card"
v-for="(item, index) in list"
:key="item[idKey] ?? index"
class="patient-card"
:class="{ actived: !!item.active || activeId === item[idKey] }"
draggable="true"
@click="emit('item-click', item, index)"
@@ -18,13 +21,22 @@
<div class="header-top">
<div class="bed-container">
<div class="bed">
<el-text truncated tclass="bed-font" width="auto">
<el-text
truncated
tclass="bed-font"
width="auto"
>
{{ item.bedName || '-' }}
</el-text>
</div>
</div>
<div class="header-tags">
<el-tag v-if="item.contractName" size="small" class="payer-tag" effect="light">
<el-tag
v-if="item.contractName"
size="small"
class="payer-tag"
effect="light"
>
{{ item.contractName }}
</el-tag>
<el-tag
@@ -64,7 +76,11 @@
<div class="personal-info-container">
<div class="name-container">
<div class="name">
<el-text :text="item.patientName" tclass="name" width="auto">
<el-text
:text="item.patientName"
tclass="name"
width="auto"
>
{{ item.patientName || '-' }}
</el-text>
</div>
@@ -81,19 +97,21 @@
{{ item.genderEnum_enumText || '-' }}
<span v-if="item.age"> · {{ item.age }}</span>
<span v-if="item.priorityEnum_enumText">
· {{ item.priorityEnum_enumText }}</span
>
· {{ item.priorityEnum_enumText }}</span>
</el-tag>
</div>
</div>
</div>
<div class="meta"></div>
<div class="meta" />
</div>
</div>
</el-scrollbar>
</template>
<el-empty v-else description="暂无数据" />
<el-empty
v-else
description="暂无数据"
/>
</div>
</div>
</template>

View File

@@ -1,11 +1,21 @@
<template>
<el-form ref="formRef" :model="{ tableData }" :rules="rules" class="editable-table-form">
<el-form
ref="formRef"
:model="{ tableData }"
:rules="rules"
class="editable-table-form"
>
<div
v-if="showAddButton || showDeleteButton || searchFields.length > 0"
class="editable-table-toolbar"
>
<div class="toolbar-left">
<el-button v-if="showAddButton" type="primary" icon="Plus" @click="handleToolbarAdd">
<el-button
v-if="showAddButton"
type="primary"
icon="Plus"
@click="handleToolbarAdd"
>
添加行
</el-button>
<el-button
@@ -46,11 +56,16 @@
:scroll-y="{ enabled: true }"
show-overflow="title"
v-bind="$attrs"
class="editable-table-inner"
@checkbox-change="handleSelectionChange"
@checkbox-all="handleSelectionChange"
class="editable-table-inner"
>
<vxe-column v-if="showSelection" type="checkbox" width="55" align="center" />
<vxe-column
v-if="showSelection"
type="checkbox"
width="55"
align="center"
/>
<vxe-column
v-if="showRowActions"
:width="rowActionsColumnWidth"
@@ -62,11 +77,17 @@
v-if="showSelection && selectedRows.length > 0 && !showDeleteButton"
style="display: flex; align-items: center; justify-content: center; gap: 4px"
>
<el-button type="danger" size="small" icon="Delete" link @click="handleDeleteSelected">
<el-button
type="danger"
size="small"
icon="Delete"
link
@click="handleDeleteSelected"
>
删除选中({{ selectedRows.length }})
</el-button>
</div>
<span v-else></span>
<span v-else />
</template>
<template #default="{ row, rowIndex }">
<el-button
@@ -75,8 +96,8 @@
link
icon="CirclePlus"
class="action-btn"
@click="handleAdd(rowIndex)"
title="增加"
@click="handleAdd(rowIndex)"
/>
<el-button
v-if="showRowDeleteButton"
@@ -84,8 +105,8 @@
link
icon="Delete"
class="action-btn"
@click="handleDelete(rowIndex)"
title="删除"
@click="handleDelete(rowIndex)"
/>
</template>
</vxe-column>
@@ -116,7 +137,12 @@
@input="col.onInput && col.onInput(row, rowIndex)"
@change="col.onChange && col.onChange(row, rowIndex)"
>
<template v-if="col.suffix" #suffix>{{ col.suffix }}</template>
<template
v-if="col.suffix"
#suffix
>
{{ col.suffix }}
</template>
</el-input>
</el-form-item>
</template>
@@ -209,7 +235,11 @@
:rules="col.rules"
style="margin-bottom: 0"
>
<slot :name="col.slot || col.prop" :row="row" :index="rowIndex" />
<slot
:name="col.slot || col.prop"
:row="row"
:index="rowIndex"
/>
</el-form-item>
</template>
@@ -223,8 +253,14 @@
</template>
</vxe-column>
</vxe-table>
<div v-if="$slots.footer" class="editable-table-footer">
<slot name="footer" :tableData="tableData" />
<div
v-if="$slots.footer"
class="editable-table-footer"
>
<slot
name="footer"
:table-data="tableData"
/>
</div>
</el-form>
</template>

View File

@@ -1,5 +1,8 @@
<template>
<div v-if="show" class="query-form-wrapper">
<div
v-if="show"
class="query-form-wrapper"
>
<el-form
ref="queryFormRef"
:model="queryParams"
@@ -7,7 +10,10 @@
class="query-form"
:label-width="labelWidth"
>
<template v-for="item in displayedFormItems" :key="item.prop">
<template
v-for="item in displayedFormItems"
:key="item.prop"
>
<FormItem
:item="item"
:model-value="queryParams[item.prop]"
@@ -15,19 +21,51 @@
@update:model-value="(value) => (queryParams[item.prop] = value)"
@change="(value) => item.onChange && item.onChange(value)"
>
<template v-for="(_, slotName) in $slots" :key="slotName" #[slotName]="slotProps">
<slot :name="slotName" v-bind="slotProps" />
<template
v-for="(_, slotName) in $slots"
:key="slotName"
#[slotName]="slotProps"
>
<slot
:name="slotName"
v-bind="slotProps"
/>
</template>
</FormItem>
</template>
<el-form-item v-if="showDefaultButtons" style="margin-left: 20px">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button v-if="needCollapse" link @click="toggleExpand" style="margin-left: 16px">
<el-form-item
v-if="showDefaultButtons"
style="margin-left: 20px"
>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
</el-button>
<el-button
v-if="needCollapse"
link
style="margin-left: 16px"
@click="toggleExpand"
>
{{ isExpanded ? '收起' : '展开' }}
<el-icon class="el-icon--right">
<DArrowLeft v-if="isExpanded" class="collapse-arrow collapse-arrow--up" />
<DArrowRight v-else class="collapse-arrow collapse-arrow--down" />
<DArrowLeft
v-if="isExpanded"
class="collapse-arrow collapse-arrow--up"
/>
<DArrowRight
v-else
class="collapse-arrow collapse-arrow--down"
/>
</el-icon>
</el-button>
</el-form-item>

View File

@@ -8,15 +8,25 @@
:label-position="labelPosition"
class="table-layout-form"
>
<template v-for="item in normalizedFormItems" :key="item.prop">
<template
v-for="item in normalizedFormItems"
:key="item.prop"
>
<FormItem
:item="item"
:model-value="model[item.prop]"
@update:model-value="(value) => (model[item.prop] = value)"
@change="(value) => item.onChange && item.onChange(value)"
>
<template v-for="(_, slotName) in $slots" :key="slotName" #[slotName]="slotProps">
<slot :name="slotName" v-bind="slotProps" />
<template
v-for="(_, slotName) in $slots"
:key="slotName"
#[slotName]="slotProps"
>
<slot
:name="slotName"
v-bind="slotProps"
/>
</template>
</FormItem>
</template>

View File

@@ -43,7 +43,11 @@
@change="handleChange"
@update:model-value="handleUpdate"
>
<el-radio v-for="option in item.options || []" :key="option.value" :value="option.value">
<el-radio
v-for="option in item.options || []"
:key="option.value"
:value="option.value"
>
{{ option.label }}
</el-radio>
</el-radio-group>
@@ -86,8 +90,8 @@
v-else-if="item.type === 'custom'"
:name="item.slot || item.prop"
:item="item"
:modelValue="modelValue"
:updateModelValue="handleUpdate"
:model-value="modelValue"
:update-model-value="handleUpdate"
/>
</el-form-item>
</template>

View File

@@ -7,8 +7,14 @@
:label-position="labelPosition"
class="form-layout-form"
>
<div class="form-items-container" :class="columns > 0 ? `form-layout-${columns}col` : ''">
<template v-for="(item, index) in normalizedFormItems" :key="item.prop">
<div
class="form-items-container"
:class="columns > 0 ? `form-layout-${columns}col` : ''"
>
<template
v-for="(item, index) in normalizedFormItems"
:key="item.prop"
>
<FormItem
:item="item"
:model-value="model[item.prop]"
@@ -24,16 +30,23 @@
}
"
>
<template v-for="(_, slotName) in $slots" :key="slotName" #[slotName]="slotProps">
<slot :name="slotName" v-bind="slotProps" />
<template
v-for="(_, slotName) in $slots"
:key="slotName"
#[slotName]="slotProps"
>
<slot
:name="slotName"
v-bind="slotProps"
/>
</template>
</FormItem>
<span
v-if="
columns > 0 &&
index > 0 &&
(index + 1) % columns === 0 &&
index < normalizedFormItems.length - 1
index > 0 &&
(index + 1) % columns === 0 &&
index < normalizedFormItems.length - 1
"
class="form-item-break"
/>

View File

@@ -1,12 +1,34 @@
<template>
<div class="quick-date-range">
<el-select v-model="quickType" class="quick-select" @change="handleQuickChange">
<el-option label="自定义时间段" value="custom" />
<el-option label="今天" value="today" />
<el-option label="昨天" value="yesterday" />
<el-option label="本周" value="thisWeek" />
<el-option label="上周" value="lastWeek" />
<el-option label="最近30日" value="last30Days" />
<el-select
v-model="quickType"
class="quick-select"
@change="handleQuickChange"
>
<el-option
label="自定义时间段"
value="custom"
/>
<el-option
label="今天"
value="today"
/>
<el-option
label="昨天"
value="yesterday"
/>
<el-option
label="本周"
value="thisWeek"
/>
<el-option
label="上周"
value="lastWeek"
/>
<el-option
label="最近30日"
value="last30Days"
/>
</el-select>
<el-date-picker
v-model="innerValue"

View File

@@ -1,6 +1,9 @@
<template>
<div class="table-container">
<div ref="tableWrapperRef" class="table-wrapper">
<div
ref="tableWrapperRef"
class="table-wrapper"
>
<vxe-table
ref="tableRef"
v-loading="loading"
@@ -15,14 +18,17 @@
:auto-resize="true"
:scroll-x="{ enabled: true, gt: 20 }"
:scroll-y="{ enabled: true, gt: 50 }"
style="width: 100%; height: 100%"
@cell-click="handleRowClick"
@checkbox-change="handleSelectionChange"
@checkbox-all="handleSelectionAll"
@sort-change="handleSortChange"
style="width: 100%; height: 100%"
>
<!-- 通过配置数组生成的列 -->
<template v-for="column in tableColumns" :key="column.prop || column.type">
<template
v-for="column in tableColumns"
:key="column.prop || column.type"
>
<!-- 选择列 -->
<vxe-column
v-if="column.type === 'selection'"
@@ -51,7 +57,11 @@
:fixed="column.fixed"
>
<template #content="{ row }">
<slot :name="column.slot || 'expand'" :row="row" :scope="{ row }" />
<slot
:name="column.slot || 'expand'"
:row="row"
:scope="{ row }"
/>
</template>
</vxe-column>
<!-- 普通数据列 -->
@@ -65,10 +75,20 @@
:fixed="column.fixed"
:show-overflow="column.showOverflowTooltip !== false"
>
<template v-if="column.slot" #default="{ row }">
<slot :name="column.slot" :row="row" :scope="{ row }" />
<template
v-if="column.slot"
#default="{ row }"
>
<slot
:name="column.slot"
:row="row"
:scope="{ row }"
/>
</template>
<template v-else-if="column.formatter" #default="{ row }">
<template
v-else-if="column.formatter"
#default="{ row }"
>
{{ column.formatter(row, { property: column.prop }, column.prop ? row[column.prop] : undefined, 0) }}
</template>
</vxe-column>
@@ -77,12 +97,19 @@
<slot name="table" />
</vxe-table>
</div>
<div v-if="showPagination" ref="paginationWrapperRef" class="pagination-wrapper">
<div
v-if="showPagination"
ref="paginationWrapperRef"
class="pagination-wrapper"
>
<div
class="pagination-content"
:class="{ 'has-left-content': paginationLeftText || $slots.paginationLeft }"
>
<div v-if="paginationLeftText || $slots.paginationLeft" class="pagination-left">
<div
v-if="paginationLeftText || $slots.paginationLeft"
class="pagination-left"
>
<slot name="paginationLeft">
{{ paginationLeftText }}
</slot>

View File

@@ -6,14 +6,25 @@
class="side-query-wrapper"
:class="{ collapsed: sideQueryCollapsed }"
>
<div v-if="!sideQueryCollapsed" class="side-query-header">
<el-input v-model="sideSearchKeyword" placeholder="搜索树节点" clearable size="small">
<div
v-if="!sideQueryCollapsed"
class="side-query-header"
>
<el-input
v-model="sideSearchKeyword"
placeholder="搜索树节点"
clearable
size="small"
>
<template #prefix>
<el-icon><Search /></el-icon>
</template>
</el-input>
</div>
<div v-if="!sideQueryCollapsed" class="side-query-content">
<div
v-if="!sideQueryCollapsed"
class="side-query-content"
>
<el-tree
ref="treeRef"
:data="treeDataWithAll"
@@ -24,11 +35,14 @@
highlight-current
@node-click="handleNodeClick"
@current-change="handleCurrentChange"
></el-tree>
/>
</div>
</div>
<div v-if="showSideQuery" class="collapse-divider">
<div
v-if="showSideQuery"
class="collapse-divider"
>
<el-button
circle
size="small"
@@ -59,16 +73,20 @@
<template
v-for="item in customFormItems"
:key="item.prop"
v-slot:[item.slotName]="slotProps"
#[item.slotName]="slotProps"
>
<slot :name="item.slotName" :item="slotProps.item" :queryParams="props.queryParams" />
<slot
:name="item.slotName"
:item="slotProps.item"
:query-params="props.queryParams"
/>
</template>
<template #default="{ queryParams, handleQuery, resetQuery }">
<slot
name="topQuery"
:queryParams="queryParams"
:handleQuery="handleQuery"
:resetQuery="resetQuery"
:query-params="queryParams"
:handle-query="handleQuery"
:reset-query="resetQuery"
/>
</template>
</Filter>
@@ -99,8 +117,15 @@
@sort-change="handleSortChange"
@pagination="handlePagination"
>
<template v-for="(_, slotName) in $slots" :key="slotName" #[slotName]="slotProps">
<slot :name="slotName" v-bind="slotProps" />
<template
v-for="(_, slotName) in $slots"
:key="slotName"
#[slotName]="slotProps"
>
<slot
:name="slotName"
v-bind="slotProps"
/>
</template>
</Table>
</div>

View File

@@ -1,44 +1,91 @@
<template>
<div class="tree-sidebar" :class="{ collapsed: collapsed, resizing: isResizing, 'no-initial-transition': isLoadingFromStorage}" :style="{ width: sidebarWidth + 'px' }">
<div
class="tree-sidebar"
:class="{ collapsed: collapsed, resizing: isResizing, 'no-initial-transition': isLoadingFromStorage}"
:style="{ width: sidebarWidth + 'px' }"
>
<!-- 右侧拖动条 -->
<div v-if="!collapsed" class="resize-handle" @mousedown="startResize" @touchstart="startResize" :class="{ active: isResizing }" />
<div
v-if="!collapsed"
class="resize-handle"
:class="{ active: isResizing }"
@mousedown="startResize"
@touchstart="startResize"
/>
<div class="tree-header">
<span class="tree-title" v-show="!collapsed">
<span
v-show="!collapsed"
class="tree-title"
>
<el-icon><component :is="titleIcon" /></el-icon> {{ title }}
</span>
<div class="tree-actions" v-show="!collapsed">
<el-tooltip :content="isExpandedAll ? '收起全部' : '展开全部'" placement="right">
<el-icon class="tree-action-icon" @click="toggleExpandAll">
<div
v-show="!collapsed"
class="tree-actions"
>
<el-tooltip
:content="isExpandedAll ? '收起全部' : '展开全部'"
placement="right"
>
<el-icon
class="tree-action-icon"
@click="toggleExpandAll"
>
<ArrowDown v-if="isExpandedAll" />
<ArrowUp v-else />
</el-icon>
</el-tooltip>
<el-tooltip content="刷新" placement="right">
<el-icon class="tree-action-icon" @click="handleRefresh"><Refresh /></el-icon>
<el-tooltip
content="刷新"
placement="right"
>
<el-icon
class="tree-action-icon"
@click="handleRefresh"
>
<Refresh />
</el-icon>
</el-tooltip>
<slot name="actions"></slot>
<slot name="actions" />
</div>
</div>
<!-- 侧边栏展开/收起按钮 -->
<div class="collapse-button-container">
<el-tooltip :content="collapsed ? '展开' : '收起'" placement="right">
<el-icon class="collapse-button" @click="toggleCollapsed">
<el-tooltip
:content="collapsed ? '展开' : '收起'"
placement="right"
>
<el-icon
class="collapse-button"
@click="toggleCollapsed"
>
<DArrowRight v-if="collapsed" />
<DArrowLeft v-else />
</el-icon>
</el-tooltip>
</div>
<div class="tree-search" v-show="!collapsed" v-if="showSearch">
<el-input v-model="searchKeyword" :placeholder="searchPlaceholder" clearable>
<div
v-show="!collapsed"
v-if="showSearch"
class="tree-search"
>
<el-input
v-model="searchKeyword"
:placeholder="searchPlaceholder"
clearable
>
<template #prefix>
<el-icon><Search /></el-icon>
</template>
</el-input>
</div>
<div class="tree-wrap" v-show="!collapsed">
<div
v-show="!collapsed"
class="tree-wrap"
>
<el-tree
ref="treeRef"
:data="treeData"
@@ -56,13 +103,20 @@
@node-collapse="onNodeCollapse"
>
<template #default="{ node, data }">
<slot name="node" :node="node" :data="data">
<slot
name="node"
:node="node"
:data="data"
>
<span class="tree-node">
<el-icon class="node-icon">
<Folder v-if="data.children && data.children.length" />
<Document v-else />
</el-icon>
<span class="node-label" :title="node.label">{{ node.label }}</span>
<span
class="node-label"
:title="node.label"
>{{ node.label }}</span>
</span>
</slot>
</template>

View File

@@ -10,34 +10,52 @@
{{ formatSexAge(patientInfo?.sexName, patientInfo?.age) }}
</span>
</label>
<div class="tag-list" v-if="patientInfo?.list && patientInfo.list.length > 0">
<div
v-if="patientInfo?.list && patientInfo.list.length > 0"
class="tag-list"
>
<ball-tag
v-for="item in patientInfo.list"
:key="item"
:tagId="item"
:tag-id="item"
class="tag-item"
></ball-tag>
/>
</div>
<div class="gray-border" v-if="patientInfo?.feeTypeName">
<div
v-if="patientInfo?.feeTypeName"
class="gray-border"
>
{{ patientInfo.feeTypeName }}
</div>
<label class="info-label">
<span class="label-text-color">住院</span>
<span class="content-text-color">{{ formatDays(patientInfo?.inHospitalDays) }}</span>
</label>
<label class="info-label" v-if="patientInfo?.inOrgTime">
<label
v-if="patientInfo?.inOrgTime"
class="info-label"
>
<span class="label-text-color">入科</span>
<span class="content-text-color">{{ patientInfo.inOrgTime }}</span>
</label>
<label class="info-label" v-if="patientInfo?.inHospitalTime">
<label
v-if="patientInfo?.inHospitalTime"
class="info-label"
>
<span class="label-text-color">入院时间</span>
<span class="content-text-color">{{ patientInfo.inHospitalTime }}</span>
</label>
<label class="info-label" v-if="patientInfo?.busNo">
<label
v-if="patientInfo?.busNo"
class="info-label"
>
<span class="label-text-color">住院号</span>
<span class="content-text-color">{{ patientInfo.busNo }}</span>
</label>
<label class="info-label diagnosis-label" v-if="patientInfo?.regDiagnosisName">
<label
v-if="patientInfo?.regDiagnosisName"
class="info-label diagnosis-label"
>
<span class="label-text-color">诊断</span>
<span class="content-text-color">{{ patientInfo.regDiagnosisName }}</span>
</label>
@@ -52,18 +70,27 @@
</div>
</div>
</div>
<div v-if="expand" class="expand_more">
<div
v-if="expand"
class="expand_more"
>
<div class="expand-content">
<div class="expand-section">
<label class="expand-label">
<span class="primary-text">过敏</span>
<span class="primary-text">{{ patientInfo?.allergies || '无过敏史' }}</span>
</label>
<label class="expand-label" v-if="patientInfo?.insuplcAdmdvsName">
<label
v-if="patientInfo?.insuplcAdmdvsName"
class="expand-label"
>
<span class="primary-text">医保统筹区</span>
<span class="primary-text">{{ patientInfo.insuplcAdmdvsName }}</span>
</label>
<label class="expand-label" v-if="patientInfo?.ciType">
<label
v-if="patientInfo?.ciType"
class="expand-label"
>
<span class="primary-text">商保信息</span>
<span class="primary-text">{{ patientInfo.ciType }}</span>
</label>
@@ -73,14 +100,23 @@
{{ formatHeightWeight(patientInfo?.height, patientInfo?.weight) }}
</span>
</div>
<div class="blue-bg" v-if="patientInfo?.postoperativeDays">
<div
v-if="patientInfo?.postoperativeDays"
class="blue-bg"
>
<span class="content-text-color">术后{{ patientInfo.postoperativeDays }}</span>
</div>
<div class="blue-bg" v-if="patientInfo?.poorTypeName">
<div
v-if="patientInfo?.poorTypeName"
class="blue-bg"
>
<span class="label-text-color">贫困类型</span>
<span class="content-text-color">{{ patientInfo.poorTypeName }}</span>
</div>
<div class="blue-bg" v-if="patientInfo?.pathwayName">
<div
v-if="patientInfo?.pathwayName"
class="blue-bg"
>
<span class="label-text-color">路径情况</span>
<span class="content-text-color">{{ patientInfo.pathwayName }}</span>
</div>

View File

@@ -1,5 +1,8 @@
<template>
<footer v-if="visible" class="copyright">
<footer
v-if="visible"
class="copyright"
>
<span>{{ content }}</span>
</footer>
</template>

View File

@@ -1,24 +1,52 @@
<template>
<el-drawer v-model="visible" title="公告详情" direction="rtl" size="50%" teleported :before-close="handleClose" class="notice-detail-drawer">
<div v-loading="loading" class="notice-detail-drawer__body">
<div v-if="!detail" class="notice-empty">
<el-drawer
v-model="visible"
title="公告详情"
direction="rtl"
size="50%"
teleported
:before-close="handleClose"
class="notice-detail-drawer"
>
<div
v-loading="loading"
class="notice-detail-drawer__body"
>
<div
v-if="!detail"
class="notice-empty"
>
<el-icon><Document /></el-icon>
<span>暂无数据</span>
</div>
<div v-else class="notice-page">
<div
v-else
class="notice-page"
>
<div class="notice-type-wrap">
<span v-if="detail.noticeType === '1'" class="notice-type-tag type-notify">
<span
v-if="detail.noticeType === '1'"
class="notice-type-tag type-notify"
>
<el-icon><Bell /></el-icon> 通知
</span>
<span v-else-if="detail.noticeType === '2'" class="notice-type-tag type-announce">
<span
v-else-if="detail.noticeType === '2'"
class="notice-type-tag type-announce"
>
<el-icon><Message /></el-icon> 公告
</span>
<span v-else class="notice-type-tag type-notify">
<span
v-else
class="notice-type-tag type-notify"
>
<el-icon><Document /></el-icon> 消息
</span>
</div>
<h1 class="notice-title">{{ detail.noticeTitle }}</h1>
<h1 class="notice-title">
{{ detail.noticeTitle }}
</h1>
<div class="notice-meta">
<span class="meta-item">
@@ -30,20 +58,27 @@
<span>{{ detail.createTime || '—' }}</span>
</span>
<span class="meta-item">
<span :class="['status-dot', isStatusNormal ? 'status-ok' : 'status-off']"></span>
<span :class="['status-dot', isStatusNormal ? 'status-ok' : 'status-off']" />
<span>{{ isStatusNormal ? '正常' : '已关闭' }}</span>
</span>
</div>
<div class="notice-divider">
<span class="notice-divider-dot"></span>
<span class="notice-divider-dot"></span>
<span class="notice-divider-dot"></span>
<span class="notice-divider-dot" />
<span class="notice-divider-dot" />
<span class="notice-divider-dot" />
</div>
<div class="notice-body">
<div v-if="hasContent" class="notice-content" v-html="detail.noticeContent" />
<div v-else class="notice-empty notice-empty--inner">
<div
v-if="hasContent"
class="notice-content"
v-html="detail.noticeContent"
/>
<div
v-else
class="notice-empty notice-empty--inner"
>
<el-icon><Document /></el-icon> 暂无内容
</div>
</div>

View File

@@ -1,34 +1,73 @@
<template>
<div class="header-notice-trigger">
<el-popover
v-model:visible="noticeVisible"
placement="bottom-end"
:width="380"
trigger="click"
v-model:visible="noticeVisible"
popper-class="notice-popover"
:show-arrow="false"
:offset="8"
>
<!-- 列表视图 -->
<div v-if="!activeNotice" class="notice-popover-content">
<div
v-if="!activeNotice"
class="notice-popover-content"
>
<div class="notice-header">
<span class="notice-header-title">消息中心</span>
<span class="notice-header-action" @click="handleReadAll">全部已读</span>
<span
class="notice-header-action"
@click="handleReadAll"
>全部已读</span>
</div>
<el-tabs v-model="activeTab" class="notice-tabs">
<el-tabs
v-model="activeTab"
class="notice-tabs"
>
<el-tab-pane name="all">
<template #label>全部<el-badge v-if="noticeStore.unreadCount > 0" :value="noticeStore.unreadCount" :max="99" class="tab-badge" /></template>
<template #label>
全部<el-badge
v-if="noticeStore.unreadCount > 0"
:value="noticeStore.unreadCount"
:max="99"
class="tab-badge"
/>
</template>
</el-tab-pane>
<el-tab-pane name="notice">
<template #label>通知<el-badge v-if="noticeUnread > 0" :value="noticeUnread" :max="99" class="tab-badge" /></template>
<template #label>
通知<el-badge
v-if="noticeUnread > 0"
:value="noticeUnread"
:max="99"
class="tab-badge"
/>
</template>
</el-tab-pane>
<el-tab-pane name="announce">
<template #label>公告<el-badge v-if="announceUnread > 0" :value="announceUnread" :max="99" class="tab-badge" /></template>
<template #label>
公告<el-badge
v-if="announceUnread > 0"
:value="announceUnread"
:max="99"
class="tab-badge"
/>
</template>
</el-tab-pane>
</el-tabs>
<el-scrollbar max-height="380px" class="notice-scroll">
<div v-if="filteredList.length === 0" class="notice-empty">
<el-empty description="暂无消息" :image-size="60" />
<el-scrollbar
max-height="380px"
class="notice-scroll"
>
<div
v-if="filteredList.length === 0"
class="notice-empty"
>
<el-empty
description="暂无消息"
:image-size="60"
/>
</div>
<div
v-for="item in filteredList"
@@ -38,54 +77,115 @@
@click="openDetail(item)"
>
<div class="notice-item-icon">
<el-icon v-if="item.noticeType === '1'" class="icon-notice"><Bell /></el-icon>
<el-icon v-else class="icon-announce"><Notification /></el-icon>
<el-icon
v-if="item.noticeType === '1'"
class="icon-notice"
>
<Bell />
</el-icon>
<el-icon
v-else
class="icon-announce"
>
<Notification />
</el-icon>
</div>
<div class="notice-item-body">
<div class="notice-item-title">
<span>{{ item.noticeTitle }}</span>
<el-tag v-if="!isRead(item)" type="danger" size="small" effect="dark" class="unread-tag">未读</el-tag>
<el-tag
v-if="!isRead(item)"
type="danger"
size="small"
effect="dark"
class="unread-tag"
>
未读
</el-tag>
</div>
<div
v-if="item.noticeContent"
class="notice-item-desc"
>
{{ stripHtml(item.noticeContent) }}
</div>
<div class="notice-item-time">
{{ formatTime(item.createTime) }}
</div>
<div class="notice-item-desc" v-if="item.noticeContent">{{ stripHtml(item.noticeContent) }}</div>
<div class="notice-item-time">{{ formatTime(item.createTime) }}</div>
</div>
<el-icon class="notice-item-arrow"><ArrowRight /></el-icon>
<el-icon class="notice-item-arrow">
<ArrowRight />
</el-icon>
</div>
</el-scrollbar>
</div>
<!-- 详情视图 -->
<div v-else class="notice-detail-content">
<div
v-else
class="notice-detail-content"
>
<div class="detail-header">
<div class="detail-back" @click="closeDetail">
<div
class="detail-back"
@click="closeDetail"
>
<el-icon><ArrowLeft /></el-icon>
<span>返回</span>
</div>
<el-tag v-if="!isRead(activeNotice)" type="danger" size="small" effect="dark">未读</el-tag>
<el-tag
v-if="!isRead(activeNotice)"
type="danger"
size="small"
effect="dark"
>
未读
</el-tag>
</div>
<div class="detail-type-bar">
<span v-if="activeNotice.noticeType === '1'" class="detail-type-tag type-notify">
<span
v-if="activeNotice.noticeType === '1'"
class="detail-type-tag type-notify"
>
<el-icon><Bell /></el-icon> 通知
</span>
<span v-else class="detail-type-tag type-announce">
<span
v-else
class="detail-type-tag type-announce"
>
<el-icon><Notification /></el-icon> 公告
</span>
<span class="detail-priority" :class="'priority-' + (activeNotice.priority || '2')">
<span
class="detail-priority"
:class="'priority-' + (activeNotice.priority || '2')"
>
{{ priorityText(activeNotice.priority) }}
</span>
</div>
<h3 class="detail-title">{{ activeNotice.noticeTitle }}</h3>
<h3 class="detail-title">
{{ activeNotice.noticeTitle }}
</h3>
<div class="detail-meta">
<span><el-icon><User /></el-icon> {{ activeNotice.createBy || '系统' }}</span>
<span><el-icon><Clock /></el-icon> {{ activeNotice.createTime }}</span>
</div>
<el-scrollbar max-height="320px" class="detail-body-scroll">
<div class="detail-body" v-html="activeNotice.noticeContent" />
<el-scrollbar
max-height="320px"
class="detail-body-scroll"
>
<div
class="detail-body"
v-html="activeNotice.noticeContent"
/>
</el-scrollbar>
</div>
<template #reference>
<el-badge :value="noticeStore.unreadCount" :hidden="noticeStore.unreadCount === 0" :max="99">
<el-badge
:value="noticeStore.unreadCount"
:hidden="noticeStore.unreadCount === 0"
:max="99"
>
<el-icon><Bell /></el-icon>
</el-badge>
</template>

View File

@@ -152,8 +152,6 @@
</div>
</template>
</el-dialog>
</div>
</template>

View File

@@ -1,45 +1,120 @@
<template>
<el-drawer v-model="showSettings" :withHeader="false" :lock-scroll="false" direction="rtl" size="300px">
<el-drawer
v-model="showSettings"
:with-header="false"
:lock-scroll="false"
direction="rtl"
size="300px"
>
<div class="setting-drawer-title">
<h3 class="drawer-title">菜单导航设置</h3>
<h3 class="drawer-title">
菜单导航设置
</h3>
</div>
<div class="nav-wrap">
<el-tooltip content="左侧菜单" placement="bottom">
<div class="item left" @click="handleNavType(1)" :class="{ activeItem: navType == 1 }">
<b></b><b></b>
<el-tooltip
content="左侧菜单"
placement="bottom"
>
<div
class="item left"
:class="{ activeItem: navType == 1 }"
@click="handleNavType(1)"
>
<b /><b />
</div>
</el-tooltip>
<el-tooltip content="混合菜单" placement="bottom">
<div class="item mix" @click="handleNavType(2)" :class="{ activeItem: navType == 2 }">
<b></b><b></b>
<el-tooltip
content="混合菜单"
placement="bottom"
>
<div
class="item mix"
:class="{ activeItem: navType == 2 }"
@click="handleNavType(2)"
>
<b /><b />
</div>
</el-tooltip>
<el-tooltip content="顶部菜单" placement="bottom">
<div class="item top" @click="handleNavType(3)" :class="{ activeItem: navType == 3 }">
<b></b><b></b>
<el-tooltip
content="顶部菜单"
placement="bottom"
>
<div
class="item top"
:class="{ activeItem: navType == 3 }"
@click="handleNavType(3)"
>
<b /><b />
</div>
</el-tooltip>
</div>
<div class="setting-drawer-title">
<h3 class="drawer-title">主题风格设置</h3>
<h3 class="drawer-title">
主题风格设置
</h3>
</div>
<div class="setting-drawer-block-checbox">
<div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-dark')">
<img src="@/assets/images/dark.svg" alt="dark" />
<div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
<i aria-label="图标: check" class="anticon anticon-check">
<svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class>
<div
class="setting-drawer-block-checbox-item"
@click="handleTheme('theme-dark')"
>
<img
src="@/assets/images/dark.svg"
alt="dark"
>
<div
v-if="sideTheme === 'theme-dark'"
class="setting-drawer-block-checbox-selectIcon"
style="display: block;"
>
<i
aria-label="图标: check"
class="anticon anticon-check"
>
<svg
viewBox="64 64 896 896"
data-icon="check"
width="1em"
height="1em"
:fill="theme"
aria-hidden="true"
focusable="false"
class
>
<path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" />
</svg>
</i>
</div>
</div>
<div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-light')">
<img src="@/assets/images/light.svg" alt="light" />
<div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block;">
<i aria-label="图标: check" class="anticon anticon-check">
<svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class>
<div
class="setting-drawer-block-checbox-item"
@click="handleTheme('theme-light')"
>
<img
src="@/assets/images/light.svg"
alt="light"
>
<div
v-if="sideTheme === 'theme-light'"
class="setting-drawer-block-checbox-selectIcon"
style="display: block;"
>
<i
aria-label="图标: check"
class="anticon anticon-check"
>
<svg
viewBox="64 64 896 896"
data-icon="check"
width="1em"
height="1em"
:fill="theme"
aria-hidden="true"
focusable="false"
class
>
<path d="M912 190h-69.9c-9.8 0-19.1 4.5-25.1 12.2L404.7 724.5 207 474a32 32 0 0 0-25.1-12.2H112c-6.7 0-10.4 7.7-6.3 12.9l273.9 347c12.8 16.2 37.4 16.2 50.3 0l488.4-618.9c4.1-5.1.4-12.8-6.3-12.8z" />
</svg>
</i>
@@ -49,38 +124,60 @@
<div class="drawer-item">
<span>主题颜色</span>
<span class="comp-style">
<el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange"/>
<el-color-picker
v-model="theme"
:predefine="predefineColors"
@change="themeChange"
/>
</span>
</div>
<el-divider />
<h3 class="drawer-title">系统布局配置</h3>
<h3 class="drawer-title">
系统布局配置
</h3>
<div class="drawer-item">
<span>开启页签</span>
<span class="comp-style">
<el-switch v-model="settingsStore.tagsView" class="drawer-switch" />
<el-switch
v-model="settingsStore.tagsView"
class="drawer-switch"
/>
</span>
</div>
<div class="drawer-item">
<span>持久化标签页</span>
<span class="comp-style">
<el-switch v-model="settingsStore.tagsViewPersist" :disabled="!settingsStore.tagsView" @change="tagsViewPersistChange" class="drawer-switch" />
<el-switch
v-model="settingsStore.tagsViewPersist"
:disabled="!settingsStore.tagsView"
class="drawer-switch"
@change="tagsViewPersistChange"
/>
</span>
</div>
<div class="drawer-item">
<span>显示页签图标</span>
<span class="comp-style">
<el-switch v-model="settingsStore.tagsIcon" :disabled="!settingsStore.tagsView" class="drawer-switch" />
<el-switch
v-model="settingsStore.tagsIcon"
:disabled="!settingsStore.tagsView"
class="drawer-switch"
/>
</span>
</div>
<div class="drawer-item">
<span>标签页样式</span>
<span class="comp-style">
<el-radio-group v-model="settingsStore.tagsViewStyle" :disabled="!settingsStore.tagsView" size="small">
<el-radio-group
v-model="settingsStore.tagsViewStyle"
:disabled="!settingsStore.tagsView"
size="small"
>
<el-radio-button>卡片</el-radio-button>
<el-radio-button value="chrome">谷歌</el-radio-button>
</el-radio-group>
@@ -90,37 +187,62 @@
<div class="drawer-item">
<span>固定 Header</span>
<span class="comp-style">
<el-switch v-model="settingsStore.fixedHeader" class="drawer-switch" />
<el-switch
v-model="settingsStore.fixedHeader"
class="drawer-switch"
/>
</span>
</div>
<div class="drawer-item">
<span>显示 Logo</span>
<span class="comp-style">
<el-switch v-model="settingsStore.sidebarLogo" class="drawer-switch" />
<el-switch
v-model="settingsStore.sidebarLogo"
class="drawer-switch"
/>
</span>
</div>
<div class="drawer-item">
<span>动态标题</span>
<span class="comp-style">
<el-switch v-model="settingsStore.dynamicTitle" @change="dynamicTitleChange" class="drawer-switch" />
<el-switch
v-model="settingsStore.dynamicTitle"
class="drawer-switch"
@change="dynamicTitleChange"
/>
</span>
</div>
<div class="drawer-item">
<span>底部版权</span>
<span class="comp-style">
<el-switch v-model="settingsStore.footerVisible" class="drawer-switch" />
<el-switch
v-model="settingsStore.footerVisible"
class="drawer-switch"
/>
</span>
</div>
<el-divider />
<el-button type="primary" plain icon="DocumentAdd" @click="saveSetting">保存配置</el-button>
<el-button plain icon="Refresh" @click="resetSetting">重置配置</el-button>
<el-button
type="primary"
plain
icon="DocumentAdd"
@click="saveSetting"
>
保存配置
</el-button>
<el-button
plain
icon="Refresh"
@click="resetSetting"
>
重置配置
</el-button>
</el-drawer>
</template>
<script setup>

View File

@@ -119,15 +119,26 @@ defineExpose({ patientInfo, firstRecordTime, firstRecordIntro, caseFeatures, chi
<div class="medical-record-container">
<!-- 打印按钮固定在顶部非打印内容 -->
<div class="print-btn-container no-print">
<el-button type="primary" @click="handlePrint">打印病历</el-button>
<el-button
type="primary"
@click="handlePrint"
>
打印病历
</el-button>
</div>
<!-- 病历主体打印核心内容 -->
<div class="medical-record">
<!-- 1. 医院头部每一页PDF均包含复用已有样式 -->
<div class="hospital-header">
<img src="./imgs/logo.png" :alt="userStore.hospitalName + 'Logo'" class="header-logo" />
<h1 class="hospital-name">{{ userStore.hospitalName }}</h1>
<img
src="./imgs/logo.png"
:alt="userStore.hospitalName + 'Logo'"
class="header-logo"
>
<h1 class="hospital-name">
{{ userStore.hospitalName }}
</h1>
</div>
<!-- 2. 患者信息栏每一页PDF均包含下划线样式 -->
@@ -140,38 +151,85 @@ defineExpose({ patientInfo, firstRecordTime, firstRecordIntro, caseFeatures, chi
<!-- 3. 首次病程记录 -->
<div class="record-section">
<h2 class="section-main-title"> </h2>
<div class="record-time">{{ firstRecordTime }}</div>
<el-input v-model="firstRecordIntro" autosize type="textarea" class="clean-textarea" />
<h2 class="section-main-title">
</h2>
<div class="record-time">
{{ firstRecordTime }}
</div>
<el-input
v-model="firstRecordIntro"
autosize
type="textarea"
class="clean-textarea"
/>
<!-- 病例特点 -->
<h3 class="section-sub-title">病例特点</h3>
<el-input v-model="caseFeatures" autosize type="textarea" class="clean-textarea" />
<h3 class="section-sub-title">
病例特点
</h3>
<el-input
v-model="caseFeatures"
autosize
type="textarea"
class="clean-textarea"
/>
<!-- 拟诊讨论 -->
<h3 class="section-sub-title">拟诊讨论</h3>
<el-input v-model="chinaDiscussion" autosize type="textarea" class="clean-textarea" />
<el-input v-model="westDiscussion" autosize type="textarea" class="clean-textarea" />
<h3 class="section-sub-title">
拟诊讨论
</h3>
<el-input
v-model="chinaDiscussion"
autosize
type="textarea"
class="clean-textarea"
/>
<el-input
v-model="westDiscussion"
autosize
type="textarea"
class="clean-textarea"
/>
<!-- 初步诊断 -->
<el-input v-model="preliminaryDiagnosis" autosize type="textarea" class="clean-textarea" />
<el-input
v-model="preliminaryDiagnosis"
autosize
type="textarea"
class="clean-textarea"
/>
<!-- 诊疗计划 -->
<el-input v-model="treatmentPlan" autosize type="textarea" class="clean-textarea" />
<el-input
v-model="treatmentPlan"
autosize
type="textarea"
class="clean-textarea"
/>
<!-- 首次病程记录签名 -->
<div class="signature-group">
<span class="signature-label">医师签名:</span>
<el-input v-model="signatures.firstDoctor" autosize type="textarea" class="clean-textarea signature-input"
:rows="1" />
<el-input
v-model="signatures.firstDoctor"
autosize
type="textarea"
class="clean-textarea signature-input"
:rows="1"
/>
</div>
</div>
<!-- 4. 分页分隔线模拟PDF分页打印时自动分页 -->
<div class="page-break"></div>
<div class="page-break" />
<!-- 5. 后续查房/会诊记录按时间顺序 -->
<div v-for="(record, index) in roundRecords" :key="index" class="record-section">
<div
v-for="(record, index) in roundRecords"
:key="index"
class="record-section"
>
<!-- 重复患者信息与PDF一致 -->
<div class="patient-info page-repeated-info">
<span class="info-item">姓名:{{ patientInfo.name }}</span>
@@ -181,27 +239,53 @@ defineExpose({ patientInfo, firstRecordTime, firstRecordIntro, caseFeatures, chi
</div>
<!-- 查房标题+时间 -->
<h2 class="section-main-title">{{ record.title }}</h2>
<div class="record-time">{{ record.time }}</div>
<h2 class="section-main-title">
{{ record.title }}
</h2>
<div class="record-time">
{{ record.time }}
</div>
<!-- 查房内容 -->
<el-input v-model="record.content" autosize type="textarea" class="clean-textarea" />
<el-input
v-model="record.content"
autosize
type="textarea"
class="clean-textarea"
/>
<!-- 查房签名区分普通医师/上级医师 -->
<div class="signature-group">
<span class="signature-label">医师签名:</span>
<el-input v-model="signatures[`round${index}Doctor`]" autosize type="textarea"
class="clean-textarea signature-input" :rows="1" />
<el-input
v-model="signatures[`round${index}Doctor`]"
autosize
type="textarea"
class="clean-textarea signature-input"
:rows="1"
/>
<span v-if="record.signature.physician" class="signature-label ml-20">
<span
v-if="record.signature.physician"
class="signature-label ml-20"
>
{{ record.signature.physician }}
</span>
<el-input v-if="record.signature.physician" v-model="signatures[`round${index}Physician`]" autosize
type="textarea" class="clean-textarea signature-input" :rows="1" />
<el-input
v-if="record.signature.physician"
v-model="signatures[`round${index}Physician`]"
autosize
type="textarea"
class="clean-textarea signature-input"
:rows="1"
/>
</div>
<!-- 分页分隔线最后一条记录无需分页 -->
<div v-if="index !== roundRecords.length - 1" class="page-break"></div>
<div
v-if="index !== roundRecords.length - 1"
class="page-break"
/>
</div>
</div>
</div>

View File

@@ -130,7 +130,8 @@
<el-radio-group v-model="state.formData.surgeryMark">
<el-radio
v-for="item in getStatisticsOptionList('surgeryMark')"
:key="item.dictValue" :value="item.dictValue"
:key="item.dictValue"
:value="item.dictValue"
>
{{ item.dictLabel }}
</el-radio>

View File

@@ -6,23 +6,44 @@
:rules="rules"
label-width="auto"
>
<el-form-item label="Activity name" prop="name">
<el-form-item
label="Activity name"
prop="name"
>
<el-input v-model="ruleForm.name" />
</el-form-item>
<el-form-item label="Activity zone" prop="region">
<el-select v-model="ruleForm.region" placeholder="Activity zone">
<el-option label="Zone one" value="shanghai" />
<el-option label="Zone two" value="beijing" />
<el-form-item
label="Activity zone"
prop="region"
>
<el-select
v-model="ruleForm.region"
placeholder="Activity zone"
>
<el-option
label="Zone one"
value="shanghai"
/>
<el-option
label="Zone two"
value="beijing"
/>
</el-select>
</el-form-item>
<el-form-item label="Activity count" prop="count">
<el-form-item
label="Activity count"
prop="count"
>
<el-select-v2
v-model="ruleForm.count"
placeholder="Activity count"
:options="options"
/>
</el-form-item>
<el-form-item label="Activity time" required>
<el-form-item
label="Activity time"
required
>
<el-col :span="11">
<el-form-item prop="date1">
<el-date-picker
@@ -34,7 +55,10 @@
/>
</el-form-item>
</el-col>
<el-col class="text-center" :span="2">
<el-col
class="text-center"
:span="2"
>
<span class="text-gray-500">-</span>
</el-col>
<el-col :span="11">
@@ -48,42 +72,82 @@
</el-form-item>
</el-col>
</el-form-item>
<el-form-item label="Instant delivery" prop="delivery">
<el-form-item
label="Instant delivery"
prop="delivery"
>
<el-switch v-model="ruleForm.delivery" />
</el-form-item>
<el-form-item label="Activity location" prop="location">
<el-segmented v-model="ruleForm.location" :options="locationOptions" />
<el-form-item
label="Activity location"
prop="location"
>
<el-segmented
v-model="ruleForm.location"
:options="locationOptions"
/>
</el-form-item>
<el-form-item label="Activity type" prop="type">
<el-form-item
label="Activity type"
prop="type"
>
<el-checkbox-group v-model="ruleForm.type">
<el-checkbox value="Online activities" name="type">
<el-checkbox
value="Online activities"
name="type"
>
Online activities
</el-checkbox>
<el-checkbox value="Promotion activities" name="type">
<el-checkbox
value="Promotion activities"
name="type"
>
Promotion activities
</el-checkbox>
<el-checkbox value="Offline activities" name="type">
<el-checkbox
value="Offline activities"
name="type"
>
Offline activities
</el-checkbox>
<el-checkbox value="Simple brand exposure" name="type">
<el-checkbox
value="Simple brand exposure"
name="type"
>
Simple brand exposure
</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="Resources" prop="resource">
<el-form-item
label="Resources"
prop="resource"
>
<el-radio-group v-model="ruleForm.resource">
<el-radio>Sponsorship</el-radio>
<el-radio value="Venue">Venue</el-radio>
<el-radio value="Venue">
Venue
</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="Activity form" prop="desc">
<el-input v-model="ruleForm.desc" type="textarea" />
<el-form-item
label="Activity form"
prop="desc"
>
<el-input
v-model="ruleForm.desc"
type="textarea"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm(ruleFormRef)">
<el-button
type="primary"
@click="submitForm(ruleFormRef)"
>
Create
</el-button>
<el-button @click="resetForm(ruleFormRef)">Reset</el-button>
<el-button @click="resetForm(ruleFormRef)">
Reset
</el-button>
</el-form-item>
</el-form>
</template>

View File

@@ -1,83 +1,290 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
<el-form-item label="就诊号" prop="encounterId">
<el-input v-model="queryParams.encounterId" placeholder="就诊号" clearable />
<el-form
v-show="showSearch"
ref="queryForm"
:model="queryParams"
:inline="true"
>
<el-form-item
label="就诊号"
prop="encounterId"
>
<el-input
v-model="queryParams.encounterId"
placeholder="就诊号"
clearable
/>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="queryParams.status" placeholder="全部" clearable>
<el-option label="草稿" value="DRAFT" /><el-option label="进行中" value="IN_PROGRESS" /><el-option label="已完成" value="COMPLETED" />
<el-select
v-model="queryParams.status"
placeholder="全部"
clearable
>
<el-option
label="草稿"
value="DRAFT"
/><el-option
label="进行中"
value="IN_PROGRESS"
/><el-option
label="已完成"
value="COMPLETED"
/>
</el-select>
</el-form-item>
<el-form-item><el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button></el-form-item>
<el-form-item>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="dataList">
<el-table-column label="患者" prop="patientName" width="120" />
<el-table-column label="麻醉类型" prop="anesthesiaType" width="120" />
<el-table-column label="ASA分级" prop="asaGrade" width="80" />
<el-table-column label="麻醉医生" prop="anesthetistName" width="120" />
<el-table-column label="开始时间" prop="startTime" width="170" />
<el-table-column label="结束时间" prop="endTime" width="170" />
<el-table-column label="状态" prop="status" width="100">
<el-table
v-loading="loading"
:data="dataList"
>
<el-table-column
label="患者"
prop="patientName"
width="120"
/>
<el-table-column
label="麻醉类型"
prop="anesthesiaType"
width="120"
/>
<el-table-column
label="ASA分级"
prop="asaGrade"
width="80"
/>
<el-table-column
label="麻醉医生"
prop="anesthetistName"
width="120"
/>
<el-table-column
label="开始时间"
prop="startTime"
width="170"
/>
<el-table-column
label="结束时间"
prop="endTime"
width="170"
/>
<el-table-column
label="状态"
prop="status"
width="100"
>
<template #default="scope">
<el-tag :type="scope.row.status === 'COMPLETED' ? 'success' : scope.row.status === 'DRAFT' ? 'info' : ''">{{ { DRAFT: '草稿', IN_PROGRESS: '进行中', COMPLETED: '已完成' }[scope.row.status] }}</el-tag>
<el-tag :type="scope.row.status === 'COMPLETED' ? 'success' : scope.row.status === 'DRAFT' ? 'info' : ''">
{{ { DRAFT: '草稿', IN_PROGRESS: '进行中', COMPLETED: '已完成' }[scope.row.status] }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="150" align="center">
<el-table-column
label="操作"
width="150"
align="center"
>
<template #default="scope">
<el-button link type="primary" @click="handleDetail(scope.row)">详情</el-button>
<el-button link type="primary" v-if="scope.row.status !== 'COMPLETED'" @click="handleComplete(scope.row)">完成</el-button>
<el-button
link
type="primary"
@click="handleDetail(scope.row)"
>
详情
</el-button>
<el-button
v-if="scope.row.status !== 'COMPLETED'"
link
type="primary"
@click="handleComplete(scope.row)"
>
完成
</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="麻醉记录详情" v-model="detailVisible" width="800px" top="5vh">
<el-dialog
v-model="detailVisible"
title="麻醉记录详情"
width="800px"
top="5vh"
>
<el-tabs v-model="activeTab">
<el-tab-pane label="基本信息" name="basic">
<el-descriptions :column="2" border>
<el-descriptions-item label="ASA分级">{{ recordDetail.asaGrade }}</el-descriptions-item>
<el-descriptions-item label="麻醉类型">{{ recordDetail.anesthesiaType }}</el-descriptions-item>
<el-descriptions-item label="麻醉方式">{{ recordDetail.anesthesiaMethod }}</el-descriptions-item>
<el-descriptions-item label="气道评估">{{ recordDetail.airwayAssessment }}</el-descriptions-item>
<el-descriptions-item label="禁食确认">{{ recordDetail.fastingConfirmed ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="知情同意">{{ recordDetail.consentSigned ? '已签署' : '未签署' }}</el-descriptions-item>
<el-descriptions-item label="摘要" :span="2">{{ recordDetail.summary }}</el-descriptions-item>
<el-tab-pane
label="基本信息"
name="basic"
>
<el-descriptions
:column="2"
border
>
<el-descriptions-item label="ASA分级">
{{ recordDetail.asaGrade }}
</el-descriptions-item>
<el-descriptions-item label="麻醉类型">
{{ recordDetail.anesthesiaType }}
</el-descriptions-item>
<el-descriptions-item label="麻醉方式">
{{ recordDetail.anesthesiaMethod }}
</el-descriptions-item>
<el-descriptions-item label="气道评估">
{{ recordDetail.airwayAssessment }}
</el-descriptions-item>
<el-descriptions-item label="禁食确认">
{{ recordDetail.fastingConfirmed ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item label="知情同意">
{{ recordDetail.consentSigned ? '已签署' : '未签署' }}
</el-descriptions-item>
<el-descriptions-item
label="摘要"
:span="2"
>
{{ recordDetail.summary }}
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="生命体征" name="vital">
<el-table :data="vitalSigns" size="small">
<el-table-column label="时间" prop="recordTime" width="170" />
<el-table-column label="心率" prop="heartRate" width="80" />
<el-table-column label="收缩压" prop="bloodPressureSys" width="80" />
<el-table-column label="舒张压" prop="bloodPressureDia" width="80" />
<el-table-column label="血氧" prop="spo2" width="80" />
<el-table-column label="体温" prop="temperature" width="80" />
<el-table-column label="呼吸" prop="respiratoryRate" width="80" />
<el-tab-pane
label="生命体征"
name="vital"
>
<el-table
:data="vitalSigns"
size="small"
>
<el-table-column
label="时间"
prop="recordTime"
width="170"
/>
<el-table-column
label="心率"
prop="heartRate"
width="80"
/>
<el-table-column
label="收缩压"
prop="bloodPressureSys"
width="80"
/>
<el-table-column
label="舒张压"
prop="bloodPressureDia"
width="80"
/>
<el-table-column
label="血氧"
prop="spo2"
width="80"
/>
<el-table-column
label="体温"
prop="temperature"
width="80"
/>
<el-table-column
label="呼吸"
prop="respiratoryRate"
width="80"
/>
</el-table>
</el-tab-pane>
<el-tab-pane label="用药记录" name="medication">
<el-table :data="medications" size="small">
<el-table-column label="药品" prop="drugName" width="150" />
<el-table-column label="剂量" prop="dosage" width="100" />
<el-table-column label="途径" prop="route" width="100" />
<el-table-column label="开始" prop="startTime" width="170" />
<el-table-column label="结束" prop="endTime" width="170" />
<el-tab-pane
label="用药记录"
name="medication"
>
<el-table
:data="medications"
size="small"
>
<el-table-column
label="药品"
prop="drugName"
width="150"
/>
<el-table-column
label="剂量"
prop="dosage"
width="100"
/>
<el-table-column
label="途径"
prop="route"
width="100"
/>
<el-table-column
label="开始"
prop="startTime"
width="170"
/>
<el-table-column
label="结束"
prop="endTime"
width="170"
/>
</el-table>
</el-tab-pane>
<el-tab-pane label="出入量" name="io">
<el-descriptions :column="2" border v-if="ioSummary">
<el-descriptions-item label="总入量">{{ ioSummary.totalInput }} ml</el-descriptions-item>
<el-descriptions-item label="总出量">{{ ioSummary.totalOutput }} ml</el-descriptions-item>
<el-descriptions-item label="出入平衡">{{ ioSummary.balance }} ml</el-descriptions-item>
<el-tab-pane
label="出入量"
name="io"
>
<el-descriptions
v-if="ioSummary"
:column="2"
border
>
<el-descriptions-item label="总入量">
{{ ioSummary.totalInput }} ml
</el-descriptions-item>
<el-descriptions-item label="总出量">
{{ ioSummary.totalOutput }} ml
</el-descriptions-item>
<el-descriptions-item label="出入平衡">
{{ ioSummary.balance }} ml
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="术后随访" name="followup">
<el-table :data="followups" size="small">
<el-table-column label="随访日期" prop="followupDate" width="120" />
<el-table-column label="疼痛评分" prop="painScore" width="100" />
<el-table-column label="恶心呕吐" width="100">
<template #default="scope">{{ scope.row.nauseaVomiting ? '有' : '无' }}</template>
<el-tab-pane
label="术后随访"
name="followup"
>
<el-table
:data="followups"
size="small"
>
<el-table-column
label="随访日期"
prop="followupDate"
width="120"
/>
<el-table-column
label="疼痛评分"
prop="painScore"
width="100"
/>
<el-table-column
label="恶心呕吐"
width="100"
>
<template #default="scope">
{{ scope.row.nauseaVomiting ? '有' : '无' }}
</template>
</el-table-column>
<el-table-column label="备注" prop="notes" show-overflow-tooltip />
<el-table-column
label="备注"
prop="notes"
show-overflow-tooltip
/>
</el-table>
</el-tab-pane>
</el-tabs>

View File

@@ -1,64 +1,245 @@
<template>
<div style="padding:16px">
<div style="margin-bottom:16px"><span style="font-size:18px;font-weight:bold">麻醉系统增强</span></div>
<el-tabs v-model="tab" type="border-card">
<el-tab-pane label="标本管理" name="specimen">
<div style="margin-bottom:12px"><el-button type="success" @click="showSpec=true">新增标本</el-button></div>
<el-table :data="specData" border stripe>
<el-table-column prop="patientName" label="患者" width="90"/>
<el-table-column prop="specimenType" label="标本类型" width="100"/>
<el-table-column prop="specimenName" label="标本名称" width="150"/>
<el-table-column prop="collectorName" label="采集人" width="90"/>
<el-table-column prop="pathologyStatus" label="病理状态" width="100">
<template #default="{row}"><el-tag :type="row.pathologyStatus==='REPORTED'?'success':'warning'" size="small">{{ row.pathologyStatus==='PENDING'?'送检中':'已出报告' }}</el-tag></template>
</el-table-column>
<el-table-column label="操作" width="120">
<div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">麻醉系统增强</span>
</div>
<el-tabs
v-model="tab"
type="border-card"
>
<el-tab-pane
label="标本管理"
name="specimen"
>
<div style="margin-bottom:12px">
<el-button
type="success"
@click="showSpec=true"
>
新增标本
</el-button>
</div>
<el-table
:data="specData"
border
stripe
>
<el-table-column
prop="patientName"
label="患者"
width="90"
/>
<el-table-column
prop="specimenType"
label="标本类型"
width="100"
/>
<el-table-column
prop="specimenName"
label="标本名称"
width="150"
/>
<el-table-column
prop="collectorName"
label="采集人"
width="90"
/>
<el-table-column
prop="pathologyStatus"
label="病理状态"
width="100"
>
<template #default="{row}">
<el-button v-if="row.pathologyStatus==='PENDING'" type="primary" link size="small" @click="reportAction(row)">出报告</el-button>
<el-tag
:type="row.pathologyStatus==='REPORTED'?'success':'warning'"
size="small"
>
{{ row.pathologyStatus==='PENDING'?'送检中':'已出报告' }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="操作"
width="120"
>
<template #default="{row}">
<el-button
v-if="row.pathologyStatus==='PENDING'"
type="primary"
link
size="small"
@click="reportAction(row)"
>
出报告
</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="术后随访" name="followup">
<div style="margin-bottom:12px"><el-button type="success" @click="showFu=true">新增随访</el-button></div>
<el-table :data="fuData" border stripe>
<el-table-column prop="patientName" label="患者" width="90"/>
<el-table-column prop="followupType" label="随访类型" width="90"/>
<el-table-column prop="painScore" label="疼痛评分" width="90" align="center"/>
<el-table-column prop="nauseaVomiting" label="恶心呕吐" width="90">
<template #default="{row}"><el-tag :type="row.nauseaVomiting?'danger':'success'" size="small">{{ row.nauseaVomiting?'是':'否' }}</el-tag></template>
<el-tab-pane
label="术后随访"
name="followup"
>
<div style="margin-bottom:12px">
<el-button
type="success"
@click="showFu=true"
>
新增随访
</el-button>
</div>
<el-table
:data="fuData"
border
stripe
>
<el-table-column
prop="patientName"
label="患者"
width="90"
/>
<el-table-column
prop="followupType"
label="随访类型"
width="90"
/>
<el-table-column
prop="painScore"
label="疼痛评分"
width="90"
align="center"
/>
<el-table-column
prop="nauseaVomiting"
label="恶心呕吐"
width="90"
>
<template #default="{row}">
<el-tag
:type="row.nauseaVomiting?'danger':'success'"
size="small"
>
{{ row.nauseaVomiting?'是':'否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="complications" label="并发症" min-width="150" show-overflow-tooltip/>
<el-table-column prop="followupDoctorName" label="随访医生" width="100"/>
<el-table-column
prop="complications"
label="并发症"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
prop="followupDoctorName"
label="随访医生"
width="100"
/>
</el-table>
</el-tab-pane>
<el-tab-pane label="麻醉质控" name="qc">
<el-card shadow="never" style="margin-bottom:12px">
<el-tab-pane
label="麻醉质控"
name="qc"
>
<el-card
shadow="never"
style="margin-bottom:12px"
>
<div style="display:flex;gap:40px;text-align:center">
<div><div style="font-size:28px;font-weight:bold;color:#409eff">{{ qcStats.total||0 }}</div><div>总记录</div></div>
<div><div style="font-size:28px;font-weight:bold;color:#f56c6c">{{ qcStats.withComplications||0 }}</div><div>有并发症</div></div>
<div>
<div style="font-size:28px;font-weight:bold;color:#409eff">
{{ qcStats.total||0 }}
</div><div>总记录</div>
</div>
<div>
<div style="font-size:28px;font-weight:bold;color:#f56c6c">
{{ qcStats.withComplications||0 }}
</div><div>有并发症</div>
</div>
</div>
</el-card>
<div style="margin-bottom:12px"><el-button type="success" @click="showQc=true">新增记录</el-button></div>
<el-table :data="qcData" border stripe>
<el-table-column prop="patientName" label="患者" width="90"/>
<el-table-column prop="anesthesiaType" label="麻醉方式" width="100"/>
<el-table-column prop="totalDurationMin" label="时长(分)" width="80" align="center"/>
<el-table-column prop="bloodLossMl" label="出血量(ml)" width="90" align="center"/>
<el-table-column prop="complications" label="并发症" min-width="150" show-overflow-tooltip/>
<el-table-column prop="asaGrade" label="ASA分级" width="80" align="center"/>
<div style="margin-bottom:12px">
<el-button
type="success"
@click="showQc=true"
>
新增记录
</el-button>
</div>
<el-table
:data="qcData"
border
stripe
>
<el-table-column
prop="patientName"
label="患者"
width="90"
/>
<el-table-column
prop="anesthesiaType"
label="麻醉方式"
width="100"
/>
<el-table-column
prop="totalDurationMin"
label="时长(分)"
width="80"
align="center"
/>
<el-table-column
prop="bloodLossMl"
label="出血量(ml)"
width="90"
align="center"
/>
<el-table-column
prop="complications"
label="并发症"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
prop="asaGrade"
label="ASA分级"
width="80"
align="center"
/>
</el-table>
</el-tab-pane>
</el-tabs>
<el-dialog v-model="showSpec" title="新增标本" width="500px">
<el-form :model="specForm" label-width="100px">
<el-form-item label="患者"><el-input v-model="specForm.patientName"/></el-form-item>
<el-form-item label="标本类型"><el-input v-model="specForm.specimenType"/></el-form-item>
<el-form-item label="标本名称"><el-input v-model="specForm.specimenName"/></el-form-item>
<el-form-item label="采集人"><el-input v-model="specForm.collectorName"/></el-form-item>
<el-dialog
v-model="showSpec"
title="新增标本"
width="500px"
>
<el-form
:model="specForm"
label-width="100px"
>
<el-form-item label="患者">
<el-input v-model="specForm.patientName" />
</el-form-item>
<el-form-item label="标本类型">
<el-input v-model="specForm.specimenType" />
</el-form-item>
<el-form-item label="标本名称">
<el-input v-model="specForm.specimenName" />
</el-form-item>
<el-form-item label="采集人">
<el-input v-model="specForm.collectorName" />
</el-form-item>
</el-form>
<template #footer><el-button @click="showSpec=false">取消</el-button><el-button type="primary" @click="submitSpec">保存</el-button></template>
<template #footer>
<el-button @click="showSpec=false">
取消
</el-button><el-button
type="primary"
@click="submitSpec"
>
保存
</el-button>
</template>
</el-dialog>
</div>
</template>

View File

@@ -3,135 +3,370 @@
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
<span style="font-size:18px;font-weight:bold">抗菌药物管理规则</span>
<div>
<el-button type="primary" @click="getList">刷新</el-button>
<el-button type="success" @click="showAdd = true">新增规则</el-button>
<el-button
type="primary"
@click="getList"
>
刷新
</el-button>
<el-button
type="success"
@click="showAdd = true"
>
新增规则
</el-button>
</div>
</div>
<!-- 统计卡片 -->
<el-row :gutter="16" style="margin-bottom:16px">
<el-row
:gutter="16"
style="margin-bottom:16px"
>
<el-col :span="6">
<el-card shadow="hover" :body-style="{padding:'12px'}">
<el-card
shadow="hover"
:body-style="{padding:'12px'}"
>
<div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#409eff">{{ stats.total || 0 }}</div>
<div style="color:#999">总规则数</div>
<div style="font-size:24px;font-weight:bold;color:#409eff">
{{ stats.total || 0 }}
</div>
<div style="color:#999">
总规则数
</div>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover" :body-style="{padding:'12px'}">
<el-card
shadow="hover"
:body-style="{padding:'12px'}"
>
<div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#67c23a">{{ stats.nonRestricted || 0 }}</div>
<div style="color:#999">非限制使用</div>
<div style="font-size:24px;font-weight:bold;color:#67c23a">
{{ stats.nonRestricted || 0 }}
</div>
<div style="color:#999">
非限制使用
</div>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover" :body-style="{padding:'12px'}">
<el-card
shadow="hover"
:body-style="{padding:'12px'}"
>
<div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#e6a23c">{{ stats.restricted || 0 }}</div>
<div style="color:#999">限制使用</div>
<div style="font-size:24px;font-weight:bold;color:#e6a23c">
{{ stats.restricted || 0 }}
</div>
<div style="color:#999">
限制使用
</div>
</div>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover" :body-style="{padding:'12px'}">
<el-card
shadow="hover"
:body-style="{padding:'12px'}"
>
<div style="text-align:center">
<div style="font-size:24px;font-weight:bold;color:#f56c6c">{{ stats.special || 0 }}</div>
<div style="color:#999">特殊使用</div>
<div style="font-size:24px;font-weight:bold;color:#f56c6c">
{{ stats.special || 0 }}
</div>
<div style="color:#999">
特殊使用
</div>
</div>
</el-card>
</el-col>
</el-row>
<!-- 筛选 -->
<el-form :model="q" :inline="true" style="margin-bottom:16px">
<el-form-item label="药品编码"><el-input v-model="q.drugCode" clearable placeholder="请输入药品编码" style="width:180px"/></el-form-item>
<el-form
:model="q"
:inline="true"
style="margin-bottom:16px"
>
<el-form-item label="药品编码">
<el-input
v-model="q.drugCode"
clearable
placeholder="请输入药品编码"
style="width:180px"
/>
</el-form-item>
<el-form-item label="抗菌类别">
<el-select v-model="q.antibioticClass" clearable placeholder="请选择" style="width:140px">
<el-option label="非限制使用" value="NONRESTRICTED"/>
<el-option label="限制使用" value="RESTRICTED"/>
<el-option label="特殊使用" value="SPECIAL"/>
<el-select
v-model="q.antibioticClass"
clearable
placeholder="请选择"
style="width:140px"
>
<el-option
label="非限制使用"
value="NONRESTRICTED"
/>
<el-option
label="限制使用"
value="RESTRICTED"
/>
<el-option
label="特殊使用"
value="SPECIAL"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getList">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<el-button
type="primary"
@click="getList"
>
查询
</el-button>
<el-button @click="resetQuery">
重置
</el-button>
</el-form-item>
</el-form>
<!-- 数据表格 -->
<el-table v-loading="loading" :data="list" border stripe>
<el-table-column label="药品编码" prop="drugCode" width="120"/>
<el-table-column label="药品名称" prop="drugName" width="160" show-overflow-tooltip/>
<el-table-column label="抗菌类别" prop="antibioticClass" width="120" align="center">
<el-table
v-loading="loading"
:data="list"
border
stripe
>
<el-table-column
label="药品编码"
prop="drugCode"
width="120"
/>
<el-table-column
label="药品名称"
prop="drugName"
width="160"
show-overflow-tooltip
/>
<el-table-column
label="抗菌类别"
prop="antibioticClass"
width="120"
align="center"
>
<template #default="s">
<el-tag :type="s.row.antibioticClass==='SPECIAL'?'danger':s.row.antibioticClass==='RESTRICTED'?'warning':'success'" size="small">
<el-tag
:type="s.row.antibioticClass==='SPECIAL'?'danger':s.row.antibioticClass==='RESTRICTED'?'warning':'success'"
size="small"
>
{{ {RESTRICTED:'限制使用',NONRESTRICTED:'非限制使用',SPECIAL:'特殊使用'}[s.row.antibioticClass] || s.row.antibioticClass }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="限制级别" prop="restrictionLevel" width="120" align="center"/>
<el-table-column label="最大疗程(天)" prop="maxDurationDays" width="120" align="center"/>
<el-table-column label="需审批" width="80" align="center">
<el-table-column
label="限制级别"
prop="restrictionLevel"
width="120"
align="center"
/>
<el-table-column
label="最大疗程(天)"
prop="maxDurationDays"
width="120"
align="center"
/>
<el-table-column
label="需审批"
width="80"
align="center"
>
<template #default="s">
<el-tag :type="s.row.requireApproval?'danger':'success'" size="small">
<el-tag
:type="s.row.requireApproval?'danger':'success'"
size="small"
>
{{ s.row.requireApproval?'是':'否' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="适应症" prop="indications" min-width="150" show-overflow-tooltip/>
<el-table-column label="禁忌症" prop="contraindications" min-width="150" show-overflow-tooltip/>
<el-table-column label="操作" width="100" fixed="right">
<el-table-column
label="适应症"
prop="indications"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
label="禁忌症"
prop="contraindications"
min-width="150"
show-overflow-tooltip
/>
<el-table-column
label="操作"
width="100"
fixed="right"
>
<template #default="s">
<el-button link type="primary" @click="handleDetail(s.row)">详情</el-button>
<el-button
link
type="primary"
@click="handleDetail(s.row)"
>
详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 新增弹窗 -->
<el-dialog title="新增抗菌药物规则" v-model="showAdd" width="600px" append-to-body>
<el-form :model="formData" label-width="110px">
<el-form-item label="药品编码" required><el-input v-model="formData.drugCode" placeholder="请输入药品编码"/></el-form-item>
<el-form-item label="药品名称" required><el-input v-model="formData.drugName" placeholder="请输入药品名称"/></el-form-item>
<el-form-item label="抗菌类别" required>
<el-select v-model="formData.antibioticClass" placeholder="请选择">
<el-option label="非限制使用" value="NONRESTRICTED"/>
<el-option label="限制使用" value="RESTRICTED"/>
<el-option label="特殊使用" value="SPECIAL"/>
<el-dialog
v-model="showAdd"
title="新增抗菌药物规则"
width="600px"
append-to-body
>
<el-form
:model="formData"
label-width="110px"
>
<el-form-item
label="药品编码"
required
>
<el-input
v-model="formData.drugCode"
placeholder="请输入药品编码"
/>
</el-form-item>
<el-form-item
label="药品名称"
required
>
<el-input
v-model="formData.drugName"
placeholder="请输入药品名称"
/>
</el-form-item>
<el-form-item
label="抗菌类别"
required
>
<el-select
v-model="formData.antibioticClass"
placeholder="请选择"
>
<el-option
label="非限制使用"
value="NONRESTRICTED"
/>
<el-option
label="限制使用"
value="RESTRICTED"
/>
<el-option
label="特殊使用"
value="SPECIAL"
/>
</el-select>
</el-form-item>
<el-form-item label="限制级别"><el-input v-model="formData.restrictionLevel" placeholder="如: 副主任医师以上"/></el-form-item>
<el-form-item label="最大疗程(天)"><el-input-number v-model="formData.maxDurationDays" :min="1" :max="365"/></el-form-item>
<el-form-item label="需审批">
<el-switch v-model="formData.requireApproval"/>
<el-form-item label="限制级别">
<el-input
v-model="formData.restrictionLevel"
placeholder="如: 副主任医师以上"
/>
</el-form-item>
<el-form-item label="最大疗程(天)">
<el-input-number
v-model="formData.maxDurationDays"
:min="1"
:max="365"
/>
</el-form-item>
<el-form-item label="需审批">
<el-switch v-model="formData.requireApproval" />
</el-form-item>
<el-form-item label="适应症">
<el-input
v-model="formData.indications"
type="textarea"
:rows="2"
placeholder="请输入适应症"
/>
</el-form-item>
<el-form-item label="禁忌症">
<el-input
v-model="formData.contraindications"
type="textarea"
:rows="2"
placeholder="请输入禁忌症"
/>
</el-form-item>
<el-form-item label="适应症"><el-input v-model="formData.indications" type="textarea" :rows="2" placeholder="请输入适应症"/></el-form-item>
<el-form-item label="禁忌症"><el-input v-model="formData.contraindications" type="textarea" :rows="2" placeholder="请输入禁忌症"/></el-form-item>
</el-form>
<template #footer>
<el-button @click="showAdd = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="showAdd = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
<!-- 详情弹窗 -->
<el-dialog title="抗菌药物规则详情" v-model="detailVisible" width="600px" append-to-body>
<el-descriptions :column="2" border>
<el-descriptions-item label="药品编码">{{ detailData.drugCode }}</el-descriptions-item>
<el-descriptions-item label="药品名称">{{ detailData.drugName }}</el-descriptions-item>
<el-dialog
v-model="detailVisible"
title="抗菌药物规则详情"
width="600px"
append-to-body
>
<el-descriptions
:column="2"
border
>
<el-descriptions-item label="药品编码">
{{ detailData.drugCode }}
</el-descriptions-item>
<el-descriptions-item label="药品名称">
{{ detailData.drugName }}
</el-descriptions-item>
<el-descriptions-item label="抗菌类别">
<el-tag :type="detailData.antibioticClass==='SPECIAL'?'danger':detailData.antibioticClass==='RESTRICTED'?'warning':'success'">
{{ {RESTRICTED:'限制使用',NONRESTRICTED:'非限制使用',SPECIAL:'特殊使用'}[detailData.antibioticClass] }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="限制级别">{{ detailData.restrictionLevel }}</el-descriptions-item>
<el-descriptions-item label="最大疗程">{{ detailData.maxDurationDays }}</el-descriptions-item>
<el-descriptions-item label="需审批">{{ detailData.requireApproval ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="适应症" :span="2">{{ detailData.indications || '-' }}</el-descriptions-item>
<el-descriptions-item label="禁忌症" :span="2">{{ detailData.contraindications || '-' }}</el-descriptions-item>
<el-descriptions-item label="限制级别">
{{ detailData.restrictionLevel }}
</el-descriptions-item>
<el-descriptions-item label="最大疗程">
{{ detailData.maxDurationDays }}
</el-descriptions-item>
<el-descriptions-item label="需审批">
{{ detailData.requireApproval ? '是' : '否' }}
</el-descriptions-item>
<el-descriptions-item
label="适应症"
:span="2"
>
{{ detailData.indications || '-' }}
</el-descriptions-item>
<el-descriptions-item
label="禁忌症"
:span="2"
>
{{ detailData.contraindications || '-' }}
</el-descriptions-item>
</el-descriptions>
<template #footer><el-button @click="detailVisible = false">关闭</el-button></template>
<template #footer>
<el-button @click="detailVisible = false">
关闭
</el-button>
</template>
</el-dialog>
</div>
</template>

View File

@@ -3,18 +3,45 @@
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
<span style="font-size:18px;font-weight:bold">接口安全认证管理</span>
<div>
<el-button type="primary" @click="loadData">刷新</el-button>
<el-button type="success" @click="showAdd = true">新增应用</el-button>
<el-button
type="primary"
@click="loadData"
>
刷新
</el-button>
<el-button
type="success"
@click="showAdd = true"
>
新增应用
</el-button>
</div>
</div>
<!-- 统计卡片 -->
<el-row :gutter="16" style="margin-bottom:16px">
<el-col :span="4" v-for="item in statCards" :key="item.label">
<el-card shadow="hover" :body-style="{padding:'10px'}">
<el-row
:gutter="16"
style="margin-bottom:16px"
>
<el-col
v-for="item in statCards"
:key="item.label"
:span="4"
>
<el-card
shadow="hover"
:body-style="{padding:'10px'}"
>
<div style="text-align:center">
<div style="font-size:20px;font-weight:bold" :style="{color:item.color}">{{ item.value }}</div>
<div style="font-size:12px;color:#999">{{ item.label }}</div>
<div
style="font-size:20px;font-weight:bold"
:style="{color:item.color}"
>
{{ item.value }}
</div>
<div style="font-size:12px;color:#999">
{{ item.label }}
</div>
</div>
</el-card>
</el-col>
@@ -22,85 +49,256 @@
<!-- 筛选 -->
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
<el-select v-model="q.status" placeholder="状态" clearable style="width:100px">
<el-option label="启用" :value="0"/>
<el-option label="禁用" :value="1"/>
<el-select
v-model="q.status"
placeholder="状态"
clearable
style="width:100px"
>
<el-option
label="启用"
:value="0"
/>
<el-option
label="禁用"
:value="1"
/>
</el-select>
<el-button type="primary" @click="loadData">查询</el-button>
<el-button @click="q.status='';loadData()">重置</el-button>
<el-button
type="primary"
@click="loadData"
>
查询
</el-button>
<el-button @click="q.status='';loadData()">
重置
</el-button>
</div>
<!-- 数据表格 -->
<el-table :data="authData" border stripe v-loading="loading">
<el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column prop="appName" label="应用名称" width="150"/>
<el-table-column prop="appKey" label="AppKey" width="200" show-overflow-tooltip>
<el-table
v-loading="loading"
:data="authData"
border
stripe
>
<el-table-column
type="index"
label="序号"
width="60"
align="center"
/>
<el-table-column
prop="appName"
label="应用名称"
width="150"
/>
<el-table-column
prop="appKey"
label="AppKey"
width="200"
show-overflow-tooltip
>
<template #default="{row}">
<span style="font-family:monospace;font-size:12px">{{ row.appKey }}</span>
</template>
</el-table-column>
<el-table-column prop="appSecret" label="AppSecret" width="180" show-overflow-tooltip>
<el-table-column
prop="appSecret"
label="AppSecret"
width="180"
show-overflow-tooltip
>
<template #default="{row}">
<span style="font-family:monospace;font-size:12px"></span>
</template>
</el-table-column>
<el-table-column prop="rateLimit" label="限流(次/分)" width="110" align="center"/>
<el-table-column prop="status" label="状态" width="80" align="center">
<el-table-column
prop="rateLimit"
label="限流(次/分)"
width="110"
align="center"
/>
<el-table-column
prop="status"
label="状态"
width="80"
align="center"
>
<template #default="{row}">
<el-tag :type="row.status===0?'success':'danger'" size="small">
<el-tag
:type="row.status===0?'success':'danger'"
size="small"
>
{{ row.status===0?'启用':'禁用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="lastAccessTime" label="最后访问" width="170"/>
<el-table-column prop="createTime" label="创建时间" width="170"/>
<el-table-column label="操作" width="120" fixed="right">
<el-table-column
prop="lastAccessTime"
label="最后访问"
width="170"
/>
<el-table-column
prop="createTime"
label="创建时间"
width="170"
/>
<el-table-column
label="操作"
width="120"
fixed="right"
>
<template #default="{row}">
<el-button link type="primary" @click="handleDetail(row)">详情</el-button>
<el-button v-if="row.status===0" type="danger" link size="small" @click="handleDisable(row)">禁用</el-button>
<el-button v-else type="success" link size="small" @click="handleEnable(row)">启用</el-button>
<el-button
link
type="primary"
@click="handleDetail(row)"
>
详情
</el-button>
<el-button
v-if="row.status===0"
type="danger"
link
size="small"
@click="handleDisable(row)"
>
禁用
</el-button>
<el-button
v-else
type="success"
link
size="small"
@click="handleEnable(row)"
>
启用
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination style="margin-top:12px;justify-content:flex-end" v-model:current-page="q.pageNo" v-model:page-size="q.pageSize" :total="total" layout="total, sizes, prev, pager, next, jumper" @size-change="loadData" @current-change="loadData"/>
<el-pagination
v-model:current-page="q.pageNo"
v-model:page-size="q.pageSize"
style="margin-top:12px;justify-content:flex-end"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="loadData"
@current-change="loadData"
/>
<!-- 新增弹窗 -->
<el-dialog title="新增API应用" v-model="showAdd" width="600px" append-to-body>
<el-form :model="formData" label-width="110px">
<el-form-item label="应用名称" required><el-input v-model="formData.appName" placeholder="请输入应用名称"/></el-form-item>
<el-form-item label="应用描述"><el-input v-model="formData.description" type="textarea" :rows="2" placeholder="请输入应用描述"/></el-form-item>
<el-form-item label="限流(次/分)"><el-input-number v-model="formData.rateLimit" :min="1" :max="10000"/></el-form-item>
<el-form-item label="IP白名单"><el-input v-model="formData.ipWhitelist" type="textarea" :rows="2" placeholder="多个IP用逗号分隔留空不限制"/></el-form-item>
<el-dialog
v-model="showAdd"
title="新增API应用"
width="600px"
append-to-body
>
<el-form
:model="formData"
label-width="110px"
>
<el-form-item
label="应用名称"
required
>
<el-input
v-model="formData.appName"
placeholder="请输入应用名称"
/>
</el-form-item>
<el-form-item label="应用描述">
<el-input
v-model="formData.description"
type="textarea"
:rows="2"
placeholder="请输入应用描述"
/>
</el-form-item>
<el-form-item label="限流(次/分)">
<el-input-number
v-model="formData.rateLimit"
:min="1"
:max="10000"
/>
</el-form-item>
<el-form-item label="IP白名单">
<el-input
v-model="formData.ipWhitelist"
type="textarea"
:rows="2"
placeholder="多个IP用逗号分隔留空不限制"
/>
</el-form-item>
<el-form-item label="权限范围">
<el-checkbox-group v-model="formData.permissions">
<el-checkbox value="read">只读</el-checkbox>
<el-checkbox value="write">读写</el-checkbox>
<el-checkbox value="admin">管理</el-checkbox>
<el-checkbox value="read">
只读
</el-checkbox>
<el-checkbox value="write">
读写
</el-checkbox>
<el-checkbox value="admin">
管理
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="showAdd = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="showAdd = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
<!-- 详情弹窗 -->
<el-dialog title="API应用详情" v-model="detailVisible" width="600px" append-to-body>
<el-descriptions :column="2" border>
<el-descriptions-item label="应用名称">{{ detailData.appName }}</el-descriptions-item>
<el-descriptions-item label="状态">
<el-tag :type="detailData.status===0?'success':'danger'">{{ detailData.status===0?'启用':'禁用' }}</el-tag>
<el-dialog
v-model="detailVisible"
title="API应用详情"
width="600px"
append-to-body
>
<el-descriptions
:column="2"
border
>
<el-descriptions-item label="应用名称">
{{ detailData.appName }}
</el-descriptions-item>
<el-descriptions-item label="AppKey" :span="2">
<el-descriptions-item label="状态">
<el-tag :type="detailData.status===0?'success':'danger'">
{{ detailData.status===0?'启用':'禁用' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item
label="AppKey"
:span="2"
>
<span style="font-family:monospace">{{ detailData.appKey }}</span>
</el-descriptions-item>
<el-descriptions-item label="限流">{{ detailData.rateLimit }} /分钟</el-descriptions-item>
<el-descriptions-item label="最后访问">{{ detailData.lastAccessTime }}</el-descriptions-item>
<el-descriptions-item label="创建时间">{{ detailData.createTime }}</el-descriptions-item>
<el-descriptions-item label="限流">
{{ detailData.rateLimit }} /分钟
</el-descriptions-item>
<el-descriptions-item label="最后访问">
{{ detailData.lastAccessTime }}
</el-descriptions-item>
<el-descriptions-item label="创建时间">
{{ detailData.createTime }}
</el-descriptions-item>
</el-descriptions>
<template #footer><el-button @click="detailVisible = false">关闭</el-button></template>
<template #footer>
<el-button @click="detailVisible = false">
关闭
</el-button>
</template>
</el-dialog>
</div>
</template>

View File

@@ -3,69 +3,158 @@
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
<span style="font-size:18px;font-weight:bold">护理评估趋势分析</span>
<div>
<el-button type="primary" @click="loadData">查询</el-button>
<el-button type="warning" @click="exportReport">导出报告</el-button>
<el-button
type="primary"
@click="loadData"
>
查询
</el-button>
<el-button
type="warning"
@click="exportReport"
>
导出报告
</el-button>
</div>
</div>
<!-- 查询表单 -->
<el-card shadow="never" style="margin-bottom:16px">
<el-card
shadow="never"
style="margin-bottom:16px"
>
<el-form inline>
<el-form-item label="就诊号"><el-input v-model="encounterId" placeholder="请输入就诊号" style="width:180px"/></el-form-item>
<el-form-item label="就诊号">
<el-input
v-model="encounterId"
placeholder="请输入就诊号"
style="width:180px"
/>
</el-form-item>
<el-form-item label="评估类型">
<el-select v-model="assessmentType" clearable placeholder="请选择" style="width:140px">
<el-option label="压疮评估(Braden)" value="BRADEN"/>
<el-option label="跌倒评估(Morse)" value="MORSE"/>
<el-option label="营养筛查(NRS2002)" value="NRS2002"/>
<el-option label="疼痛评估" value="PAIN"/>
<el-option label="管道风险" value="TUBE"/>
<el-select
v-model="assessmentType"
clearable
placeholder="请选择"
style="width:140px"
>
<el-option
label="压疮评估(Braden)"
value="BRADEN"
/>
<el-option
label="跌倒评估(Morse)"
value="MORSE"
/>
<el-option
label="营养筛查(NRS2002)"
value="NRS2002"
/>
<el-option
label="疼痛评估"
value="PAIN"
/>
<el-option
label="管道风险"
value="TUBE"
/>
</el-select>
</el-form-item>
<el-form-item label="日期范围">
<el-date-picker v-model="dateRange" type="daterange" start-placeholder="开始" end-placeholder="结束" style="width:240px"/>
<el-date-picker
v-model="dateRange"
type="daterange"
start-placeholder="开始"
end-placeholder="结束"
style="width:240px"
/>
</el-form-item>
</el-form>
</el-card>
<!-- 统计卡片 -->
<el-row :gutter="16" style="margin-bottom:16px">
<el-col :span="4" v-for="item in statCards" :key="item.label">
<el-card shadow="hover" :body-style="{padding:'10px'}">
<el-row
:gutter="16"
style="margin-bottom:16px"
>
<el-col
v-for="item in statCards"
:key="item.label"
:span="4"
>
<el-card
shadow="hover"
:body-style="{padding:'10px'}"
>
<div style="text-align:center">
<div style="font-size:20px;font-weight:bold" :style="{color:item.color}">{{ item.value }}</div>
<div style="font-size:12px;color:#999">{{ item.label }}</div>
<div
style="font-size:20px;font-weight:bold"
:style="{color:item.color}"
>
{{ item.value }}
</div>
<div style="font-size:12px;color:#999">
{{ item.label }}
</div>
</div>
</el-card>
</el-col>
</el-row>
<!-- 趋势图表区域 -->
<el-row :gutter="16" style="margin-bottom:16px">
<el-row
:gutter="16"
style="margin-bottom:16px"
>
<el-col :span="12">
<el-card shadow="never">
<template #header>评估评分趋势</template>
<template #header>
评估评分趋势
</template>
<div style="height:300px;display:flex;align-items:center;justify-content:center;flex-direction:column">
<div v-if="trendData.length > 0" style="width:100%;padding:20px">
<div v-for="(item, index) in trendData.slice(0, 10)" :key="index" style="display:flex;align-items:center;margin-bottom:8px">
<div
v-if="trendData.length > 0"
style="width:100%;padding:20px"
>
<div
v-for="(item, index) in trendData.slice(0, 10)"
:key="index"
style="display:flex;align-items:center;margin-bottom:8px"
>
<span style="width:80px;font-size:12px;color:#666">{{ item.assessmentType }}</span>
<div style="flex:1;background:#f0f0f0;border-radius:4px;height:20px">
<div :style="{width: Math.min(item.score * 10, 100) + '%', background: item.riskLevel === 'HIGH' ? '#F56C6C' : item.riskLevel === 'MEDIUM' ? '#E6A23C' : '#67C23A', height: '100%', borderRadius: '4px'}"></div>
<div :style="{width: Math.min(item.score * 10, 100) + '%', background: item.riskLevel === 'HIGH' ? '#F56C6C' : item.riskLevel === 'MEDIUM' ? '#E6A23C' : '#67C23A', height: '100%', borderRadius: '4px'}" />
</div>
<span style="width:40px;text-align:right;font-size:12px;font-weight:bold">{{ item.score }}</span>
</div>
</div>
<el-empty v-else description="暂无数据"/>
<el-empty
v-else
description="暂无数据"
/>
</div>
</el-card>
</el-col>
<el-col :span="12">
<el-card shadow="never">
<template #header>风险等级分布</template>
<template #header>
风险等级分布
</template>
<div style="height:300px;display:flex;align-items:center;justify-content:center;flex-direction:column;gap:12px">
<div v-for="(item, index) in riskDistribution" :key="index" style="display:flex;align-items:center;gap:8px">
<el-tag :type="item.type" size="small" style="width:60px;text-align:center">{{ item.level }}</el-tag>
<div
v-for="(item, index) in riskDistribution"
:key="index"
style="display:flex;align-items:center;gap:8px"
>
<el-tag
:type="item.type"
size="small"
style="width:60px;text-align:center"
>
{{ item.level }}
</el-tag>
<div style="width:200px;background:#f0f0f0;border-radius:4px;height:24px">
<div :style="{width: item.percent + '%', background: item.color, height: '100%', borderRadius: '4px', transition: 'width 0.5s'}"></div>
<div :style="{width: item.percent + '%', background: item.color, height: '100%', borderRadius: '4px', transition: 'width 0.5s'}" />
</div>
<span style="font-size:13px;font-weight:bold">{{ item.count }} ({{ item.percent }}%)</span>
</div>
@@ -76,32 +165,81 @@
<!-- 评估记录表 -->
<el-card shadow="never">
<template #header>评估记录明细</template>
<el-table :data="trendData" border stripe v-loading="loading">
<el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column prop="assessmentType" label="评估类型" width="120" align="center">
<template #header>
评估记录明细
</template>
<el-table
v-loading="loading"
:data="trendData"
border
stripe
>
<el-table-column
type="index"
label="序号"
width="60"
align="center"
/>
<el-table-column
prop="assessmentType"
label="评估类型"
width="120"
align="center"
>
<template #default="{row}">
<el-tag size="small">{{ assessmentTypeText(row.assessmentType) }}</el-tag>
<el-tag size="small">
{{ assessmentTypeText(row.assessmentType) }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="patientName" label="患者" width="100"/>
<el-table-column prop="score" label="评分" width="80" align="center">
<el-table-column
prop="patientName"
label="患者"
width="100"
/>
<el-table-column
prop="score"
label="评分"
width="80"
align="center"
>
<template #default="{row}">
<span :style="{color: row.riskLevel === 'HIGH' ? '#F56C6C' : row.riskLevel === 'MEDIUM' ? '#E6A23C' : '#67C23A', fontWeight:'bold', fontSize:'16px'}">
{{ row.score }}
</span>
</template>
</el-table-column>
<el-table-column prop="riskLevel" label="风险等级" width="100" align="center">
<el-table-column
prop="riskLevel"
label="风险等级"
width="100"
align="center"
>
<template #default="{row}">
<el-tag :type="{HIGH:'danger',MEDIUM:'warning',LOW:'success',NORMAL:'info'}[row.riskLevel]" size="small">
<el-tag
:type="{HIGH:'danger',MEDIUM:'warning',LOW:'success',NORMAL:'info'}[row.riskLevel]"
size="small"
>
{{ riskLevelText(row.riskLevel) }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="assessTime" label="评估时间" width="170"/>
<el-table-column prop="assessorName" label="评估人" width="100"/>
<el-table-column prop="detail" label="评估备注" min-width="150" show-overflow-tooltip/>
<el-table-column
prop="assessTime"
label="评估时间"
width="170"
/>
<el-table-column
prop="assessorName"
label="评估人"
width="100"
/>
<el-table-column
prop="detail"
label="评估备注"
min-width="150"
show-overflow-tooltip
/>
</el-table>
</el-card>
</div>

View File

@@ -1,51 +1,195 @@
<template>
<div style="padding:16px">
<div style="margin-bottom:16px"><span style="font-size:18px;font-weight:bold">审计日志</span></div>
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
<el-input v-model="q.userName" placeholder="用户名" clearable style="width:120px"/>
<el-input v-model="q.module" placeholder="模块" clearable style="width:120px"/>
<el-input v-model="q.action" placeholder="操作" clearable style="width:120px"/>
<el-select v-model="q.result" placeholder="结果" clearable style="width:100px">
<el-option label="成功" value="SUCCESS"/>
<el-option label="失败" value="FAIL"/>
</el-select>
<el-button type="primary" @click="loadData">查询</el-button>
<div style="margin-bottom:16px">
<span style="font-size:18px;font-weight:bold">审计日志</span>
</div>
<el-table :data="tableData" border stripe>
<el-table-column prop="userName" label="用户" width="100"/>
<el-table-column prop="module" label="模块" width="120"/>
<el-table-column prop="action" label="操作" width="100"/>
<el-table-column prop="method" label="方法" width="70" align="center"/>
<el-table-column prop="url" label="URL" min-width="200" show-overflow-tooltip/>
<el-table-column prop="ip" label="IP" width="120"/>
<el-table-column prop="result" label="结果" width="80" align="center">
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
<el-input
v-model="q.userName"
placeholder="用户名"
clearable
style="width:120px"
/>
<el-input
v-model="q.module"
placeholder="模块"
clearable
style="width:120px"
/>
<el-input
v-model="q.action"
placeholder="操作"
clearable
style="width:120px"
/>
<el-select
v-model="q.result"
placeholder="结果"
clearable
style="width:100px"
>
<el-option
label="成功"
value="SUCCESS"
/>
<el-option
label="失败"
value="FAIL"
/>
</el-select>
<el-button
type="primary"
@click="loadData"
>
查询
</el-button>
</div>
<el-table
:data="tableData"
border
stripe
>
<el-table-column
prop="userName"
label="用户"
width="100"
/>
<el-table-column
prop="module"
label="模块"
width="120"
/>
<el-table-column
prop="action"
label="操作"
width="100"
/>
<el-table-column
prop="method"
label="方法"
width="70"
align="center"
/>
<el-table-column
prop="url"
label="URL"
min-width="200"
show-overflow-tooltip
/>
<el-table-column
prop="ip"
label="IP"
width="120"
/>
<el-table-column
prop="result"
label="结果"
width="80"
align="center"
>
<template #default="{row}">
<el-tag v-if="row.result==='SUCCESS'" type="success" size="small">成功</el-tag>
<el-tag v-else type="danger" size="small">失败</el-tag>
<el-tag
v-if="row.result==='SUCCESS'"
type="success"
size="small"
>
成功
</el-tag>
<el-tag
v-else
type="danger"
size="small"
>
失败
</el-tag>
</template>
</el-table-column>
<el-table-column prop="durationMs" label="耗时ms" width="80" align="center"/>
<el-table-column prop="createTime" label="时间" width="170"/>
<el-table-column label="操作" width="80">
<el-table-column
prop="durationMs"
label="耗时ms"
width="80"
align="center"
/>
<el-table-column
prop="createTime"
label="时间"
width="170"
/>
<el-table-column
label="操作"
width="80"
>
<template #default="{row}">
<el-popconfirm title="确定删除?" @confirm="delItem(row.id)">
<template #reference><el-button type="danger" link size="small">删除</el-button></template>
<el-popconfirm
title="确定删除?"
@confirm="delItem(row.id)"
>
<template #reference>
<el-button
type="danger"
link
size="small"
>
删除
</el-button>
</template>
</el-popconfirm>
</template>
</el-table-column>
</el-table>
<el-pagination style="margin-top:12px;justify-content:flex-end" v-model:current-page="q.pageNo" v-model:page-size="q.pageSize" :total="total" layout="total,prev,pager,next" @current-change="loadData"/>
<el-dialog v-model="detailVisible" title="审计日志详情" width="600px">
<el-descriptions :column="2" border>
<el-descriptions-item label="用户">{{ detail.userName }}</el-descriptions-item>
<el-descriptions-item label="模块">{{ detail.module }}</el-descriptions-item>
<el-descriptions-item label="操作">{{ detail.action }}</el-descriptions-item>
<el-descriptions-item label="方法">{{ detail.method }}</el-descriptions-item>
<el-descriptions-item label="URL" :span="2">{{ detail.url }}</el-descriptions-item>
<el-descriptions-item label="IP">{{ detail.ip }}</el-descriptions-item>
<el-descriptions-item label="耗时">{{ detail.durationMs }}ms</el-descriptions-item>
<el-descriptions-item label="参数" :span="2">{{ detail.params }}</el-descriptions-item>
<el-descriptions-item label="错误" :span="2">{{ detail.errorMsg }}</el-descriptions-item>
<el-pagination
v-model:current-page="q.pageNo"
v-model:page-size="q.pageSize"
style="margin-top:12px;justify-content:flex-end"
:total="total"
layout="total,prev,pager,next"
@current-change="loadData"
/>
<el-dialog
v-model="detailVisible"
title="审计日志详情"
width="600px"
>
<el-descriptions
:column="2"
border
>
<el-descriptions-item label="用户">
{{ detail.userName }}
</el-descriptions-item>
<el-descriptions-item label="模块">
{{ detail.module }}
</el-descriptions-item>
<el-descriptions-item label="操作">
{{ detail.action }}
</el-descriptions-item>
<el-descriptions-item label="方法">
{{ detail.method }}
</el-descriptions-item>
<el-descriptions-item
label="URL"
:span="2"
>
{{ detail.url }}
</el-descriptions-item>
<el-descriptions-item label="IP">
{{ detail.ip }}
</el-descriptions-item>
<el-descriptions-item label="耗时">
{{ detail.durationMs }}ms
</el-descriptions-item>
<el-descriptions-item
label="参数"
:span="2"
>
{{ detail.params }}
</el-descriptions-item>
<el-descriptions-item
label="错误"
:span="2"
>
{{ detail.errorMsg }}
</el-descriptions-item>
</el-descriptions>
</el-dialog>
</div>

View File

@@ -1,27 +1,85 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">自动计算</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">自动计算</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="code"
title="编码"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -1,27 +1,85 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">划价组套</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">划价组套</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="code"
title="编码"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -4,71 +4,268 @@
<template #header>
<div class="card-header">
<span class="card-title">床位管理</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增床位</el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增床位
</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form
:inline="true"
:model="queryParams"
label-width="80px"
>
<el-form-item label="床号">
<el-input v-model="queryParams.bedNo" placeholder="床号" clearable @keyup.enter="handleQuery" style="width: 140px" />
<el-input
v-model="queryParams.bedNo"
placeholder="床号"
clearable
style="width: 140px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="queryParams.status" placeholder="全部" clearable style="width: 120px">
<el-option label="空闲" :value="0" /><el-option label="占用" :value="1" />
<el-option label="清洁" :value="2" /><el-option label="维修" :value="3" />
<el-select
v-model="queryParams.status"
placeholder="全部"
clearable
style="width: 120px"
>
<el-option
label="空闲"
:value="0"
/><el-option
label="占用"
:value="1"
/>
<el-option
label="清洁"
:value="2"
/><el-option
label="维修"
:value="3"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="bedNo" title="床号" width="100" />
<vxe-column field="bedName" title="床位名" width="120" />
<vxe-column field="wardName" title="病区" width="120" />
<vxe-column field="deptName" title="科室" width="120" />
<vxe-column field="bedType" title="类型" width="80" align="center">
<vxe-table
v-loading="loading"
:data="tableData"
border
height="calc(100vh - 320px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="bedNo"
title="床号"
width="100"
/>
<vxe-column
field="bedName"
title="床位名"
width="120"
/>
<vxe-column
field="wardName"
title="病区"
width="120"
/>
<vxe-column
field="deptName"
title="科室"
width="120"
/>
<vxe-column
field="bedType"
title="类型"
width="80"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.bedType === 2 ? 'danger' : row.bedType === 3 ? 'warning' : 'info'" size="small">
<el-tag
:type="row.bedType === 2 ? 'danger' : row.bedType === 3 ? 'warning' : 'info'"
size="small"
>
{{ { 1: '普通', 2: 'ICU', 3: '急诊' }[row.bedType] || '普通' }}
</el-tag>
</template>
</vxe-column>
<vxe-column field="status" title="状态" width="80" align="center">
<vxe-column
field="status"
title="状态"
width="80"
align="center"
>
<template #default="{ row }">
<el-tag :type="statusType(row.status)" size="small">{{ statusText(row.status) }}</el-tag>
<el-tag
:type="statusType(row.status)"
size="small"
>
{{ statusText(row.status) }}
</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="220" fixed="right">
<vxe-column
title="操作"
width="220"
fixed="right"
>
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
<el-button v-if="row.status === 0" type="warning" link @click="changeStatus(row, 1)">占用</el-button>
<el-button v-if="row.status === 1" type="success" link @click="changeStatus(row, 2)">清洁</el-button>
<el-button v-if="row.status === 2" type="info" link @click="changeStatus(row, 0)">空闲</el-button>
<el-button v-if="row.status !== 3" type="danger" link @click="changeStatus(row, 3)">维修</el-button>
<el-button type="danger" link icon="Delete" @click="handleDelete(row)">删除</el-button>
<el-button
type="primary"
link
icon="Edit"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
v-if="row.status === 0"
type="warning"
link
@click="changeStatus(row, 1)"
>
占用
</el-button>
<el-button
v-if="row.status === 1"
type="success"
link
@click="changeStatus(row, 2)"
>
清洁
</el-button>
<el-button
v-if="row.status === 2"
type="info"
link
@click="changeStatus(row, 0)"
>
空闲
</el-button>
<el-button
v-if="row.status !== 3"
type="danger"
link
@click="changeStatus(row, 3)"
>
维修
</el-button>
<el-button
type="danger"
link
icon="Delete"
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="550px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="80px">
<el-form-item label="床号" prop="bedNo"><el-input v-model="form.bedNo" placeholder="床号" /></el-form-item>
<el-form-item label="床位名"><el-input v-model="form.bedName" placeholder="床位名" /></el-form-item>
<el-form-item label="病区"><el-input v-model="form.wardName" placeholder="病区" /></el-form-item>
<el-form-item label="科室"><el-input v-model="form.deptName" placeholder="科室" /></el-form-item>
<el-dialog
v-model="formVisible"
:title="formTitle"
width="550px"
append-to-body
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="80px"
>
<el-form-item
label="床号"
prop="bedNo"
>
<el-input
v-model="form.bedNo"
placeholder="床号"
/>
</el-form-item>
<el-form-item label="床位名">
<el-input
v-model="form.bedName"
placeholder="床位名"
/>
</el-form-item>
<el-form-item label="病区">
<el-input
v-model="form.wardName"
placeholder="病区"
/>
</el-form-item>
<el-form-item label="科室">
<el-input
v-model="form.deptName"
placeholder="科室"
/>
</el-form-item>
<el-form-item label="类型">
<el-select v-model="form.bedType" style="width:100%">
<el-option label="普通" :value="1" /><el-option label="ICU" :value="2" /><el-option label="急诊" :value="3" />
<el-select
v-model="form.bedType"
style="width:100%"
>
<el-option
label="普通"
:value="1"
/><el-option
label="ICU"
:value="2"
/><el-option
label="急诊"
:value="3"
/>
</el-select>
</el-form-item>
<el-form-item label="备注"><el-input v-model="form.remark" type="textarea" :rows="2" /></el-form-item>
<el-form-item label="备注">
<el-input
v-model="form.remark"
type="textarea"
:rows="2"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="formVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
</div>

View File

@@ -94,7 +94,8 @@
<el-radio
v-for="item in props.useRanges"
:key="item.value"
v-model="formData.useRangeEnum" :value="item.value"
v-model="formData.useRangeEnum"
:value="item.value"
>
{{ item.info }}
</el-radio>

View File

@@ -209,7 +209,8 @@
<el-radio-group v-model="form.typeEnum">
<el-radio
v-for="dict in typeEnumsOptions"
:key="dict.value" :value="dict.value"
:key="dict.value"
:value="dict.value"
>
{{
dict.info

View File

@@ -4,52 +4,191 @@
<template #header>
<div class="card-header">
<span class="card-title">常用诊断</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增诊断</el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增诊断
</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form
:inline="true"
:model="queryParams"
label-width="80px"
>
<el-form-item label="关键字">
<el-input v-model="queryParams.searchKey" placeholder="诊断名称/编码" clearable @keyup.enter="handleQuery" style="width: 200px" />
<el-input
v-model="queryParams.searchKey"
placeholder="诊断名称/编码"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="诊断名称" min-width="200" show-overflow="title" />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<vxe-table
v-loading="loading"
:data="tableData"
border
height="calc(100vh - 320px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="conditionCode"
title="编码"
width="120"
/>
<vxe-column
field="name"
title="诊断名称"
min-width="200"
show-overflow="title"
/>
<vxe-column
field="typeCode"
title="类型"
width="100"
/>
<vxe-column
field="status"
title="状态"
width="80"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'info'" size="small">{{ row.status === '0' ? '启用' : '停用' }}</el-tag>
<el-tag
:type="row.status === '0' ? 'success' : 'info'"
size="small"
>
{{ row.status === '0' ? '启用' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="180" fixed="right">
<vxe-column
title="操作"
width="180"
fixed="right"
>
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
<el-button v-if="row.status === '0'" type="warning" link @click="handleStop(row)">停用</el-button>
<el-button v-else type="success" link @click="handleStart(row)">启用</el-button>
<el-button
type="primary"
link
icon="Edit"
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
v-if="row.status === '0'"
type="warning"
link
@click="handleStop(row)"
>
停用
</el-button>
<el-button
v-else
type="success"
link
@click="handleStart(row)"
>
启用
</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="600px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="诊断编码" prop="conditionCode"><el-input v-model="form.conditionCode" placeholder="诊断编码" /></el-form-item>
<el-form-item label="诊断名称" prop="name"><el-input v-model="form.name" placeholder="诊断名称" /></el-form-item>
<el-form-item label="拼音首字母"><el-input v-model="form.pyStr" placeholder="拼音首字母" /></el-form-item>
<el-dialog
v-model="formVisible"
:title="formTitle"
width="600px"
append-to-body
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="100px"
>
<el-form-item
label="诊断编码"
prop="conditionCode"
>
<el-input
v-model="form.conditionCode"
placeholder="诊断编码"
/>
</el-form-item>
<el-form-item
label="诊断名称"
prop="name"
>
<el-input
v-model="form.name"
placeholder="诊断名称"
/>
</el-form-item>
<el-form-item label="拼音首字母">
<el-input
v-model="form.pyStr"
placeholder="拼音首字母"
/>
</el-form-item>
<el-form-item label="类型">
<el-select v-model="form.typeCode" placeholder="选择类型" clearable style="width:100%">
<el-option label="西医诊断" value="WEST" /><el-option label="中医诊断" value="TCM" />
<el-select
v-model="form.typeCode"
placeholder="选择类型"
clearable
style="width:100%"
>
<el-option
label="西医诊断"
value="WEST"
/><el-option
label="中医诊断"
value="TCM"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="formVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
</div>

View File

@@ -8,7 +8,8 @@
:name="1"
>
<vxe-table
:row-config="{ isCurrent: true }" :data="method_code"
:row-config="{ isCurrent: true }"
:data="method_code"
border
max-height="650"
@cell-click="clickRow"

View File

@@ -1,27 +1,85 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">合同管理</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">合同管理</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="code"
title="编码"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -1,27 +1,85 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">客户数据</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">客户数据</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="code"
title="编码"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -4,51 +4,183 @@
<template #header>
<div class="card-header">
<span class="card-title">费用配置</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增项目</el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增项目
</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form
:inline="true"
:model="queryParams"
label-width="80px"
>
<el-form-item label="关键字">
<el-input v-model="queryParams.searchKey" placeholder="项目名称/编码" clearable @keyup.enter="handleQuery" style="width: 200px" />
<el-input
v-model="queryParams.searchKey"
placeholder="项目名称/编码"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="项目名称" min-width="200" show-overflow="title" />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<vxe-table
v-loading="loading"
:data="tableData"
border
height="calc(100vh - 320px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="conditionCode"
title="编码"
width="120"
/>
<vxe-column
field="name"
title="项目名称"
min-width="200"
show-overflow="title"
/>
<vxe-column
field="typeCode"
title="类型"
width="100"
/>
<vxe-column
field="status"
title="状态"
width="80"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'info'" size="small">{{ row.status === '0' ? '启用' : '停用' }}</el-tag>
<el-tag
:type="row.status === '0' ? 'success' : 'info'"
size="small"
>
{{ row.status === '0' ? '启用' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="120" fixed="right">
<vxe-column
title="操作"
width="120"
fixed="right"
>
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
<el-button
type="primary"
link
icon="Edit"
@click="handleEdit(row)"
>
编辑
</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="600px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="项目编码" prop="conditionCode"><el-input v-model="form.conditionCode" placeholder="项目编码" /></el-form-item>
<el-form-item label="项目名称" prop="name"><el-input v-model="form.name" placeholder="项目名称" /></el-form-item>
<el-dialog
v-model="formVisible"
:title="formTitle"
width="600px"
append-to-body
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="100px"
>
<el-form-item
label="项目编码"
prop="conditionCode"
>
<el-input
v-model="form.conditionCode"
placeholder="项目编码"
/>
</el-form-item>
<el-form-item
label="项目名称"
prop="name"
>
<el-input
v-model="form.name"
placeholder="项目名称"
/>
</el-form-item>
<el-form-item label="类型">
<el-select v-model="form.typeCode" placeholder="选择类型" clearable style="width:100%">
<el-option label="诊疗费" value="TREAT" /><el-option label="药品费" value="DRUG" />
<el-option label="检查费" value="EXAM" /><el-option label="检验费" value="LAB" />
<el-option label="处置费" value="DISPOSAL" /><el-option label="材料费" value="MATERIAL" />
<el-select
v-model="form.typeCode"
placeholder="选择类型"
clearable
style="width:100%"
>
<el-option
label="诊疗费"
value="TREAT"
/><el-option
label="药品费"
value="DRUG"
/>
<el-option
label="检查费"
value="EXAM"
/><el-option
label="检验费"
value="LAB"
/>
<el-option
label="处置费"
value="DISPOSAL"
/><el-option
label="材料费"
value="MATERIAL"
/>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="formVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
</div>

View File

@@ -1,27 +1,85 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">LIS合管配置</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">LIS合管配置</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="code"
title="编码"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -1,28 +1,89 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">货位管理</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">货位管理</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="货位名称/编码" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="货位名称/编码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="locationCode" title="货位编码" />
<vxe-column field="locationName" title="货位名称" />
<vxe-column field="warehouseName" title="所属库房" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'danger'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="locationCode"
title="货位编码"
/>
<vxe-column
field="locationName"
title="货位名称"
/>
<vxe-column
field="warehouseName"
title="所属库房"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -91,7 +91,7 @@ import {debounce} from 'lodash-es';
const props = defineProps({
adviceQueryParams: {
type: Object,
default: '',
default: () => ({}),
},
patientInfo: {
type: Object,

View File

@@ -79,7 +79,7 @@ import {throttle} from 'lodash-es';
const props = defineProps({
adviceQueryParams: {
type: Object,
default: '',
default: () => ({}),
},
patientInfo: {
type: Object,

View File

@@ -38,7 +38,8 @@
</div>
</div>
<vxe-table
:row-config="{ isCurrent: true }" v-loading="templateLoading"
v-loading="templateLoading"
:row-config="{ isCurrent: true }"
:data="orderGroupList"
style="width: 100%"
border

View File

@@ -4,47 +4,159 @@
<template #header>
<div class="card-header">
<span class="card-title">中医处方</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增处方</el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增处方
</el-button>
</div>
</template>
<el-form :inline="true" :model="queryParams" label-width="80px">
<el-form
:inline="true"
:model="queryParams"
label-width="80px"
>
<el-form-item label="关键字">
<el-input v-model="queryParams.searchKey" placeholder="处方名称/编码" clearable @keyup.enter="handleQuery" style="width: 200px" />
<el-input
v-model="queryParams.searchKey"
placeholder="处方名称/编码"
clearable
style="width: 200px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 320px)" v-loading="loading">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="conditionCode" title="编码" width="120" />
<vxe-column field="name" title="处方名称" min-width="200" show-overflow="title" />
<vxe-column field="typeCode" title="类型" width="100" />
<vxe-column field="status" title="状态" width="80" align="center">
<vxe-table
v-loading="loading"
:data="tableData"
border
height="calc(100vh - 320px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="conditionCode"
title="编码"
width="120"
/>
<vxe-column
field="name"
title="处方名称"
min-width="200"
show-overflow="title"
/>
<vxe-column
field="typeCode"
title="类型"
width="100"
/>
<vxe-column
field="status"
title="状态"
width="80"
align="center"
>
<template #default="{ row }">
<el-tag :type="row.status === '0' ? 'success' : 'info'" size="small">{{ row.status === '0' ? '启用' : '停用' }}</el-tag>
<el-tag
:type="row.status === '0' ? 'success' : 'info'"
size="small"
>
{{ row.status === '0' ? '启用' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column title="操作" width="120" fixed="right">
<vxe-column
title="操作"
width="120"
fixed="right"
>
<template #default="{ row }">
<el-button type="primary" link icon="Edit" @click="handleEdit(row)">编辑</el-button>
<el-button
type="primary"
link
icon="Edit"
@click="handleEdit(row)"
>
编辑
</el-button>
</template>
</vxe-column>
</vxe-table>
<pagination v-show="total > 0" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" />
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</el-card>
<el-dialog v-model="formVisible" :title="formTitle" width="600px" append-to-body>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="处方编码" prop="conditionCode"><el-input v-model="form.conditionCode" placeholder="处方编码" /></el-form-item>
<el-form-item label="处方名称" prop="name"><el-input v-model="form.name" placeholder="处方名称" /></el-form-item>
<el-dialog
v-model="formVisible"
:title="formTitle"
width="600px"
append-to-body
>
<el-form
ref="formRef"
:model="form"
:rules="rules"
label-width="100px"
>
<el-form-item
label="处方编码"
prop="conditionCode"
>
<el-input
v-model="form.conditionCode"
placeholder="处方编码"
/>
</el-form-item>
<el-form-item
label="处方名称"
prop="name"
>
<el-input
v-model="form.name"
placeholder="处方名称"
/>
</el-form-item>
<el-form-item label="证型">
<el-input v-model="form.typeCode" placeholder="中医证型" />
<el-input
v-model="form.typeCode"
placeholder="中医证型"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="formVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="formVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
</div>

View File

@@ -38,7 +38,8 @@
@click="getWardList()"
/>
<vxe-table
:row-config="{ isCurrent: true }" ref="wardRef"
ref="wardRef"
:row-config="{ isCurrent: true }"
max-height="630"
:data="wardList"
@cell-click="(row) => clickRow(row, 10, 0)"

View File

@@ -3,18 +3,45 @@
<div style="margin-bottom:16px;display:flex;justify-content:space-between;align-items:center">
<span style="font-size:18px;font-weight:bold">经营分析</span>
<div>
<el-button type="primary" @click="loadData">刷新</el-button>
<el-button type="warning" @click="exportReport">导出报告</el-button>
<el-button
type="primary"
@click="loadData"
>
刷新
</el-button>
<el-button
type="warning"
@click="exportReport"
>
导出报告
</el-button>
</div>
</div>
<!-- 统计卡片 -->
<el-row :gutter="16" style="margin-bottom:16px">
<el-col :span="4" v-for="item in statCards" :key="item.label">
<el-card shadow="hover" :body-style="{padding:'10px'}">
<el-row
:gutter="16"
style="margin-bottom:16px"
>
<el-col
v-for="item in statCards"
:key="item.label"
:span="4"
>
<el-card
shadow="hover"
:body-style="{padding:'10px'}"
>
<div style="text-align:center">
<div style="font-size:20px;font-weight:bold" :style="{color:item.color}">{{ item.value }}</div>
<div style="font-size:12px;color:#999">{{ item.label }}</div>
<div
style="font-size:20px;font-weight:bold"
:style="{color:item.color}"
>
{{ item.value }}
</div>
<div style="font-size:12px;color:#999">
{{ item.label }}
</div>
</div>
</el-card>
</el-col>
@@ -22,46 +49,122 @@
<!-- 筛选 -->
<div style="margin-bottom:12px;display:flex;gap:8px;flex-wrap:wrap">
<el-select v-model="q.departmentName" placeholder="科室" clearable style="width:140px">
<el-option v-for="dept in departments" :key="dept" :label="dept" :value="dept"/>
<el-select
v-model="q.departmentName"
placeholder="科室"
clearable
style="width:140px"
>
<el-option
v-for="dept in departments"
:key="dept"
:label="dept"
:value="dept"
/>
</el-select>
<el-date-picker v-model="q.dateRange" type="daterange" start-placeholder="开始日期" end-placeholder="结束日期" style="width:240px"/>
<el-button type="primary" @click="loadData">查询</el-button>
<el-button @click="resetQuery">重置</el-button>
<el-date-picker
v-model="q.dateRange"
type="daterange"
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width:240px"
/>
<el-button
type="primary"
@click="loadData"
>
查询
</el-button>
<el-button @click="resetQuery">
重置
</el-button>
</div>
<!-- 数据表格 -->
<el-table :data="analyticsData" border stripe v-loading="loading">
<el-table-column prop="statDate" label="日期" width="120"/>
<el-table-column prop="departmentName" label="科室" width="120"/>
<el-table-column prop="revenue" label="收入(万元)" width="110" align="right">
<el-table
v-loading="loading"
:data="analyticsData"
border
stripe
>
<el-table-column
prop="statDate"
label="日期"
width="120"
/>
<el-table-column
prop="departmentName"
label="科室"
width="120"
/>
<el-table-column
prop="revenue"
label="收入(万元)"
width="110"
align="right"
>
<template #default="{row}">
<span style="color:#67C23A;font-weight:bold">{{ formatMoney(row.revenue) }}</span>
</template>
</el-table-column>
<el-table-column prop="cost" label="成本(万元)" width="110" align="right">
<el-table-column
prop="cost"
label="成本(万元)"
width="110"
align="right"
>
<template #default="{row}">
<span style="color:#F56C6C">{{ formatMoney(row.cost) }}</span>
</template>
</el-table-column>
<el-table-column prop="profit" label="利润(万元)" width="110" align="right">
<el-table-column
prop="profit"
label="利润(万元)"
width="110"
align="right"
>
<template #default="{row}">
<span :style="{color: row.profit >= 0 ? '#67C23A' : '#F56C6C', fontWeight:'bold'}">
{{ formatMoney(row.profit) }}
</span>
</template>
</el-table-column>
<el-table-column prop="patientCount" label="患者数" width="80" align="center"/>
<el-table-column prop="bedOccupancyRate" label="床位率" width="90" align="center">
<el-table-column
prop="patientCount"
label="患者数"
width="80"
align="center"
/>
<el-table-column
prop="bedOccupancyRate"
label="床位率"
width="90"
align="center"
>
<template #default="{row}">
<span :style="{color: row.bedOccupancyRate > 90 ? '#67C23A' : row.bedOccupancyRate > 70 ? '#E6A23C' : '#F56C6C', fontWeight:'bold'}">
{{ row.bedOccupancyRate }}%
</span>
</template>
</el-table-column>
<el-table-column prop="avgStayDays" label="平均住院日" width="100" align="center"/>
<el-table-column prop="bedTurnover" label="床位周转" width="80" align="center"/>
<el-table-column prop="profitRate" label="利润率" width="90" align="center">
<el-table-column
prop="avgStayDays"
label="平均住院日"
width="100"
align="center"
/>
<el-table-column
prop="bedTurnover"
label="床位周转"
width="80"
align="center"
/>
<el-table-column
prop="profitRate"
label="利润率"
width="90"
align="center"
>
<template #default="{row}">
<span :style="{color: row.profitRate > 20 ? '#67C23A' : '#E6A23C', fontWeight:'bold'}">
{{ row.profitRate || 0 }}%
@@ -70,7 +173,15 @@
</el-table-column>
</el-table>
<el-pagination style="margin-top:12px;justify-content:flex-end" v-model:current-page="q.pageNo" v-model:page-size="q.pageSize" :total="total" layout="total, sizes, prev, pager, next, jumper" @size-change="loadData" @current-change="loadData"/>
<el-pagination
v-model:current-page="q.pageNo"
v-model:page-size="q.pageSize"
style="margin-top:12px;justify-content:flex-end"
:total="total"
layout="total, sizes, prev, pager, next, jumper"
@size-change="loadData"
@current-change="loadData"
/>
</div>
</template>

View File

@@ -1,22 +1,61 @@
<template>
<el-dialog title="电子签名" v-model="visible" width="500px" :close-on-click-modal="false">
<el-form :model="formData" label-width="100px">
<el-dialog
v-model="visible"
title="电子签名"
width="500px"
:close-on-click-modal="false"
>
<el-form
:model="formData"
label-width="100px"
>
<el-form-item label="文档类型">
<el-select v-model="formData.documentType" placeholder="选择文档类型">
<el-option v-for="d in sign_document_type" :key="d.value" :label="d.label" :value="d.value" />
<el-select
v-model="formData.documentType"
placeholder="选择文档类型"
>
<el-option
v-for="d in sign_document_type"
:key="d.value"
:label="d.label"
:value="d.value"
/>
</el-select>
</el-form-item>
<el-form-item label="文档ID"><el-input v-model="formData.documentId" placeholder="文档ID" /></el-form-item>
<el-form-item label="签名人员"><el-input v-model="formData.signerName" /></el-form-item>
<el-form-item label="职称"><el-input v-model="formData.signerTitle" /></el-form-item>
<el-form-item label="科室"><el-input v-model="formData.signerDepartment" /></el-form-item>
<el-form-item label="签名密码"><el-input v-model="formData.signatureData" type="password" placeholder="输入签名密码" show-password /></el-form-item>
<el-form-item label="文档ID">
<el-input
v-model="formData.documentId"
placeholder="文档ID"
/>
</el-form-item>
<el-form-item label="签名人员">
<el-input v-model="formData.signerName" />
</el-form-item>
<el-form-item label="职称">
<el-input v-model="formData.signerTitle" />
</el-form-item>
<el-form-item label="科室">
<el-input v-model="formData.signerDepartment" />
</el-form-item>
<el-form-item label="签名密码">
<el-input
v-model="formData.signatureData"
type="password"
placeholder="输入签名密码"
show-password
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="handleSign">签名</el-button>
<el-button @click="visible = false">
取消
</el-button>
<el-button
type="primary"
@click="handleSign"
>
签名
</el-button>
</template>
</el-dialog>
</template>

View File

@@ -1,43 +1,144 @@
<template>
<div class="app-container">
<el-form :model="queryParams" :inline="true" v-show="showSearch">
<el-form-item label="文档类型" prop="documentType">
<el-select v-model="queryParams.documentType" placeholder="全部" clearable>
<el-option label="电子病历" value="EMR" /><el-option label="处方" value="PRESCRIPTION" />
<el-option label="医嘱" value="ORDER" /><el-option label="会诊" value="CONSULTATION" />
<el-form
v-show="showSearch"
:model="queryParams"
:inline="true"
>
<el-form-item
label="文档类型"
prop="documentType"
>
<el-select
v-model="queryParams.documentType"
placeholder="全部"
clearable
>
<el-option
label="电子病历"
value="EMR"
/><el-option
label="处方"
value="PRESCRIPTION"
/>
<el-option
label="医嘱"
value="ORDER"
/><el-option
label="会诊"
value="CONSULTATION"
/>
</el-select>
</el-form-item>
<el-form-item label="文档ID" prop="documentId">
<el-input v-model="queryParams.documentId" placeholder="文档ID" clearable />
<el-form-item
label="文档ID"
prop="documentId"
>
<el-input
v-model="queryParams.documentId"
placeholder="文档ID"
clearable
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
icon="Refresh"
@click="resetQuery"
>
重置
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="dataList">
<el-table-column label="文档类型" prop="documentType" width="100">
<template #default="scope"><el-tag>{{ docTypeMap[scope.row.documentType] }}</el-tag></template>
</el-table-column>
<el-table-column label="文档ID" prop="documentId" width="100" />
<el-table-column label="签名人员" prop="signerName" width="120" />
<el-table-column label="职称" prop="signerTitle" width="100" />
<el-table-column label="科室" prop="signerDepartment" width="120" />
<el-table-column label="签名时间" prop="signTime" width="180" />
<el-table-column label="状态" prop="status" width="100">
<el-table
v-loading="loading"
:data="dataList"
>
<el-table-column
label="文档类型"
prop="documentType"
width="100"
>
<template #default="scope">
<el-tag :type="scope.row.status === 'VALID' ? 'success' : 'danger'">{{ scope.row.status === 'VALID' ? '有效' : '已撤销' }}</el-tag>
<el-tag>{{ docTypeMap[scope.row.documentType] }}</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="120" align="center">
<el-table-column
label="文档ID"
prop="documentId"
width="100"
/>
<el-table-column
label="签名人员"
prop="signerName"
width="120"
/>
<el-table-column
label="职称"
prop="signerTitle"
width="100"
/>
<el-table-column
label="科室"
prop="signerDepartment"
width="120"
/>
<el-table-column
label="签名时间"
prop="signTime"
width="180"
/>
<el-table-column
label="状态"
prop="status"
width="100"
>
<template #default="scope">
<el-button link type="primary" @click="handleVerify(scope.row)">验证</el-button>
<el-tag :type="scope.row.status === 'VALID' ? 'success' : 'danger'">
{{ scope.row.status === 'VALID' ? '有效' : '已撤销' }}
</el-tag>
</template>
</el-table-column>
<el-table-column
label="操作"
width="120"
align="center"
>
<template #default="scope">
<el-button
link
type="primary"
@click="handleVerify(scope.row)"
>
验证
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
<el-dialog title="签名验证结果" v-model="verifyVisible" width="400px">
<el-result v-if="verifyResult" :icon="verifyResult.valid ? 'success' : 'error'" :title="verifyResult.valid ? '签名有效' : '签名无效'" :sub-title="verifyResult.message" />
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
<el-dialog
v-model="verifyVisible"
title="签名验证结果"
width="400px"
>
<el-result
v-if="verifyResult"
:icon="verifyResult.valid ? 'success' : 'error'"
:title="verifyResult.valid ? '签名有效' : '签名无效'"
:sub-title="verifyResult.message"
/>
</el-dialog>
</div>
</template>

View File

@@ -1,18 +1,62 @@
<template>
<div class="app-container">
<el-row :gutter="20" class="mb8">
<el-col :span="6"><el-card shadow="hover"><el-statistic title="总签名数" :value="stats.totalSignatures || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="有效签名" :value="stats.validSignatures || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="已撤销" :value="stats.revokedSignatures || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="今日签名" :value="stats.todaySignatures || 0" /></el-card></el-col>
<el-row
:gutter="20"
class="mb8"
>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="总签名数"
:value="stats.totalSignatures || 0"
/>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="有效签名"
:value="stats.validSignatures || 0"
/>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="已撤销"
:value="stats.revokedSignatures || 0"
/>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="今日签名"
:value="stats.todaySignatures || 0"
/>
</el-card>
</el-col>
</el-row>
<el-card>
<template #header><span>签名统计</span></template>
<template #header>
<span>签名统计</span>
</template>
<el-table :data="stats.departmentStats || []">
<el-table-column label="科室" prop="department" />
<el-table-column label="签名数" prop="count" />
<el-table-column label="有效率" prop="validRate">
<template #default="s"><el-progress :percentage="s.row.validRate || 0" /></template>
<el-table-column
label="科室"
prop="department"
/>
<el-table-column
label="签名数"
prop="count"
/>
<el-table-column
label="有效率"
prop="validRate"
>
<template #default="s">
<el-progress :percentage="s.row.validRate || 0" />
</template>
</el-table-column>
</el-table>
</el-card>

View File

@@ -25,7 +25,8 @@
</el-input>
</div>
<vxe-table
:row-config="{ isCurrent: true }" v-loading="listLoading"
v-loading="listLoading"
:row-config="{ isCurrent: true }"
border
:data="list"
max-height="450"

View File

@@ -25,7 +25,8 @@
</el-input>
</div>
<vxe-table
:row-config="{ isCurrent: true }" v-loading="listLoading"
v-loading="listLoading"
:row-config="{ isCurrent: true }"
border
:data="list"
max-height="450"

View File

@@ -25,7 +25,8 @@
</el-input>
</div>
<vxe-table
:row-config="{ isCurrent: true }" v-loading="listLoading"
v-loading="listLoading"
:row-config="{ isCurrent: true }"
border
:data="list"
max-height="450"

View File

@@ -1,30 +1,97 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">服务目录</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">服务目录</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="服务名称/编码" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="服务名称/编码"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="itemCode" title="服务编码" />
<vxe-column field="itemName" title="服务名称" />
<vxe-column field="itemSpec" title="规格" />
<vxe-column field="unit" title="单位" />
<vxe-column field="price" title="价格" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'danger'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="itemCode"
title="服务编码"
/>
<vxe-column
field="itemName"
title="服务名称"
/>
<vxe-column
field="itemSpec"
title="规格"
/>
<vxe-column
field="unit"
title="单位"
/>
<vxe-column
field="price"
title="价格"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'danger'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -319,9 +319,9 @@
:payment-id="paymentId"
:details="details"
:charged-items="chargedItems"
@close="handleClose"
:fee-type="patientInfo.medfeePaymtdCode"
:medfee_paymtd_code="medfee_paymtd_code"
@close="handleClose"
@refresh="getPatientList"
/>
</div>

View File

@@ -191,11 +191,11 @@ const props = defineProps({
},
chargeItemIds: {
type: Array,
default: [],
default: () => [],
},
medicineReturnList: {
type: Array,
default: [],
default: () => [],
},
details: {
type: Object,

View File

@@ -196,11 +196,11 @@ const props = defineProps({
},
chargeItemIds: {
type: Array,
default: [],
default: () => [],
},
chrgBchnoList: {
type: Array,
default: [],
default: () => [],
},
chrgBchno: {
type: String,

View File

@@ -225,7 +225,7 @@ const props = defineProps({
},
chargeItemIds: {
type: Array,
default: [],
default: () => [],
},
eventType: {
type: String,

View File

@@ -186,7 +186,8 @@
:close-on-click-modal="false"
>
<vxe-table
:row-config="{ isCurrent: true }" :data="recordList"
:row-config="{ isCurrent: true }"
:data="recordList"
style="width: 100%"
max-height="400"
@current-change="handleRecordSelect"

View File

@@ -632,7 +632,8 @@
@change="handleQuery"
/>
<vxe-table
:row-config="{ isCurrent: true }" v-loading="loading"
v-loading="loading"
:row-config="{ isCurrent: true }"
:data="outpatientRegistrationList"
:max-height="Math.max(470, Math.min(outpatientRegistrationList.length, 10) * 42 + 50)"
:scroll-x="{ enabled: true }"
@@ -826,9 +827,11 @@
</template>
</vxe-column>
<vxe-column
key="operation" title="操作"
key="operation"
title="操作"
align="center"
field="" width="150"
field=""
width="150"
fixed="right"
>
<template #default="scope">

View File

@@ -190,7 +190,8 @@
</div>
</template>
<vxe-table :row-config="{ isCurrent: true }"
<vxe-table
:row-config="{ isCurrent: true }"
:data="patientList"
style="width: 100%"
:row-key="row => row.identifierNo || row.patientId || row.cardNo"

View File

@@ -1,25 +1,71 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">挂号收费记录</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">挂号收费记录</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="date" title="日期" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="120">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="date"
title="日期"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleDetail(row)">详情</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="120"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleDetail(row)"
>
详情
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -1,25 +1,71 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">排班管理</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">排班管理</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="date" title="日期" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="120">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="date"
title="日期"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleDetail(row)">详情</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="120"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleDetail(row)"
>
详情
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -210,9 +210,9 @@
:payment-id="paymentId"
:details="details"
:charged-items="chargedItems"
@close="handleClose"
:fee-type="patientInfo.medfeePaymtdCode"
:medfee_paymtd_code="medfee_paymtd_code"
@close="handleClose"
@refresh="getChargeList"
/>
</div>

View File

@@ -1,60 +1,215 @@
<template>
<div class="app-container">
<el-row :gutter="20" class="mb8">
<el-col :span="6"><el-card shadow="hover"><el-statistic title="路径总数" :value="stats.totalPathways || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="入径数" :value="stats.enteredCount || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="完成数" :value="stats.completedCount || 0" /></el-card></el-col>
<el-col :span="6"><el-card shadow="hover"><el-statistic title="变异数" :value="stats.variedCount || 0" /></el-card></el-col>
<el-row
:gutter="20"
class="mb8"
>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="路径总数"
:value="stats.totalPathways || 0"
/>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="入径数"
:value="stats.enteredCount || 0"
/>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="完成数"
:value="stats.completedCount || 0"
/>
</el-card>
</el-col>
<el-col :span="6">
<el-card shadow="hover">
<el-statistic
title="变异数"
:value="stats.variedCount || 0"
/>
</el-card>
</el-col>
</el-row>
<el-card>
<template #header>
<div style="display:flex;justify-content:space-between;align-items:center">
<span>临床路径管理</span>
<el-button type="primary" icon="Plus" @click="handleAdd">新增路径</el-button>
<el-button
type="primary"
icon="Plus"
@click="handleAdd"
>
新增路径
</el-button>
</div>
</template>
<el-form :model="queryParams" :inline="true" class="mb8">
<el-form-item label="疾病编码"><el-input v-model="queryParams.diseaseCode" placeholder="疾病编码" clearable /></el-form-item>
<el-form
:model="queryParams"
:inline="true"
class="mb8"
>
<el-form-item label="疾病编码">
<el-input
v-model="queryParams.diseaseCode"
placeholder="疾病编码"
clearable
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">搜索</el-button>
<el-button @click="queryParams.diseaseCode='';handleQuery()">重置</el-button>
<el-button
type="primary"
@click="handleQuery"
>
搜索
</el-button>
<el-button @click="queryParams.diseaseCode='';handleQuery()">
重置
</el-button>
</el-form-item>
</el-form>
<el-table v-loading="loading" :data="dataList">
<el-table-column label="疾病编码" prop="diseaseCode" width="120" />
<el-table-column label="疾病名称" prop="diseaseName" width="150" />
<el-table-column label="路径名称" prop="pathwayName" width="200" show-overflow-tooltip />
<el-table-column label="标准住院日" prop="standardLos" width="100" align="center" />
<el-table-column label="版本" prop="version" width="70" align="center" />
<el-table-column label="状态" prop="status" width="90">
<el-table
v-loading="loading"
:data="dataList"
>
<el-table-column
label="疾病编码"
prop="diseaseCode"
width="120"
/>
<el-table-column
label="疾病名称"
prop="diseaseName"
width="150"
/>
<el-table-column
label="路径名称"
prop="pathwayName"
width="200"
show-overflow-tooltip
/>
<el-table-column
label="标准住院日"
prop="standardLos"
width="100"
align="center"
/>
<el-table-column
label="版本"
prop="version"
width="70"
align="center"
/>
<el-table-column
label="状态"
prop="status"
width="90"
>
<template #default="s">
<el-tag :type="s.row.status==='ACTIVE'?'success':'info'">{{ s.row.status === 'ACTIVE' ? '启用' : '停用' }}</el-tag>
<el-tag :type="s.row.status==='ACTIVE'?'success':'info'">
{{ s.row.status === 'ACTIVE' ? '启用' : '停用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="200" fixed="right">
<el-table-column
label="操作"
width="200"
fixed="right"
>
<template #default="s">
<el-button link type="primary" @click="handleEnter(s.row)">入径</el-button>
<el-button link type="success" @click="handleComplete(s.row)">完成</el-button>
<el-button link type="warning" @click="handleVary(s.row)">变异</el-button>
<el-button
link
type="primary"
@click="handleEnter(s.row)"
>
入径
</el-button>
<el-button
link
type="success"
@click="handleComplete(s.row)"
>
完成
</el-button>
<el-button
link
type="warning"
@click="handleVary(s.row)"
>
变异
</el-button>
</template>
</el-table-column>
</el-table>
<pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
<pagination
v-show="total > 0"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
:total="total"
@pagination="getList"
/>
</el-card>
<el-dialog title="新增临床路径" v-model="dialogVisible" width="600px">
<el-form :model="formData" label-width="110px">
<el-dialog
v-model="dialogVisible"
title="新增临床路径"
width="600px"
>
<el-form
:model="formData"
label-width="110px"
>
<el-row :gutter="20">
<el-col :span="12"><el-form-item label="疾病编码"><el-input v-model="formData.diseaseCode" /></el-form-item></el-col>
<el-col :span="12"><el-form-item label="疾病名称"><el-input v-model="formData.diseaseName" /></el-form-item></el-col>
<el-col :span="24"><el-form-item label="路径名称"><el-input v-model="formData.pathwayName" /></el-form-item></el-col>
<el-col :span="12"><el-form-item label="标准住院日"><el-input-number v-model="formData.standardLos" :min="1" /></el-form-item></el-col>
<el-col :span="24"><el-form-item label="路径内容"><el-input v-model="formData.pathwayContent" type="textarea" :rows="4" /></el-form-item></el-col>
<el-col :span="12">
<el-form-item label="疾病编码">
<el-input v-model="formData.diseaseCode" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="疾病名称">
<el-input v-model="formData.diseaseName" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="路径名称">
<el-input v-model="formData.pathwayName" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="标准住院日">
<el-input-number
v-model="formData.standardLos"
:min="1"
/>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="路径内容">
<el-input
v-model="formData.pathwayContent"
type="textarea"
:rows="4"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<el-button @click="dialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm">确定</el-button>
<el-button @click="dialogVisible = false">
取消
</el-button>
<el-button
type="primary"
@click="submitForm"
>
确定
</el-button>
</template>
</el-dialog>
</div>

View File

@@ -79,7 +79,7 @@ import {throttle} from 'lodash-es';
const props = defineProps({
adviceQueryParams: {
type: Object,
default: '',
default: () => ({}),
},
patientInfo: {
type: Object,

View File

@@ -34,13 +34,34 @@
clearable
style="width: 130px"
>
<el-option label="挂号费" value="REG" />
<el-option label="诊疗费" value="TREAT" />
<el-option label="药品费" value="DRUG" />
<el-option label="检查费" value="EXAM" />
<el-option label="检验费" value="LAB" />
<el-option label="处置费" value="DISPOSAL" />
<el-option label="全部" value="" />
<el-option
label="挂号费"
value="REG"
/>
<el-option
label="诊疗费"
value="TREAT"
/>
<el-option
label="药品费"
value="DRUG"
/>
<el-option
label="检查费"
value="EXAM"
/>
<el-option
label="检验费"
value="LAB"
/>
<el-option
label="处置费"
value="DISPOSAL"
/>
<el-option
label="全部"
value=""
/>
</el-select>
</el-form-item>
<el-form-item label="收费状态">
@@ -50,41 +71,81 @@
clearable
style="width: 120px"
>
<el-option label="已收费" value="1" />
<el-option label="已退费" value="2" />
<el-option label="待收费" value="0" />
<el-option
label="已费"
value="1"
/>
<el-option
label="已退费"
value="2"
/>
<el-option
label="待收费"
value="0"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">查询</el-button>
<el-button icon="Refresh" @click="handleReset">重置</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
查询
</el-button>
<el-button
icon="Refresh"
@click="handleReset"
>
重置
</el-button>
</el-form-item>
</el-form>
<!-- 费用汇总 -->
<el-row :gutter="16" class="summary-row" v-if="summaryData">
<el-row
v-if="summaryData"
:gutter="16"
class="summary-row"
>
<el-col :span="6">
<div class="summary-card">
<div class="summary-label">总收费金额</div>
<div class="summary-value">{{ formatAmount(summaryData.totalAmount) }}</div>
<div class="summary-label">
总收费金额
</div>
<div class="summary-value">
{{ formatAmount(summaryData.totalAmount) }}
</div>
</div>
</el-col>
<el-col :span="6">
<div class="summary-card">
<div class="summary-label">总退费金额</div>
<div class="summary-value refund">{{ formatAmount(summaryData.refundAmount) }}</div>
<div class="summary-label">
总退费金额
</div>
<div class="summary-value refund">
{{ formatAmount(summaryData.refundAmount) }}
</div>
</div>
</el-col>
<el-col :span="6">
<div class="summary-card">
<div class="summary-label">实收金额</div>
<div class="summary-value success">{{ formatAmount(summaryData.actualAmount) }}</div>
<div class="summary-label">
实收金额
</div>
<div class="summary-value success">
{{ formatAmount(summaryData.actualAmount) }}
</div>
</div>
</el-col>
<el-col :span="6">
<div class="summary-card">
<div class="summary-label">总笔数</div>
<div class="summary-value">{{ summaryData.totalCount || 0 }}</div>
<div class="summary-label">
总笔数
</div>
<div class="summary-value">
{{ summaryData.totalCount || 0 }}
</div>
</div>
</el-col>
</el-row>
@@ -98,40 +159,134 @@
max-height="calc(100vh - 420px)"
@cell-click="handleDetail"
>
<vxe-column field="billNo" title="账单号" align="center" width="180" show-overflow="title" />
<vxe-column field="patientName" title="患者姓名" align="center" width="110" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="70" />
<vxe-column field="age" title="年龄" align="center" width="60" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column field="billType_dictText" title="收费类型" align="center" width="100" />
<vxe-column field="totalAmount" title="收费金额" align="right" width="110">
<vxe-column
field="billNo"
title="账单号"
align="center"
width="180"
show-overflow="title"
/>
<vxe-column
field="patientName"
title="患者姓名"
align="center"
width="110"
/>
<vxe-column
field="genderEnum_enumText"
title="性别"
align="center"
width="70"
/>
<vxe-column
field="age"
title="年龄"
align="center"
width="60"
/>
<vxe-column
field="encounterNo"
title="门诊号"
align="center"
width="140"
show-overflow="title"
/>
<vxe-column
field="billType_dictText"
title="收费类型"
align="center"
width="100"
/>
<vxe-column
field="totalAmount"
title="收费金额"
align="right"
width="110"
>
<template #default="scope">
<span class="amount">{{ scope.row.totalAmount ? '¥' + scope.row.totalAmount.toFixed(2) : '-' }}</span>
</template>
</vxe-column>
<vxe-column field="refundAmount" title="退费金额" align="right" width="110">
<vxe-column
field="refundAmount"
title="退费金额"
align="right"
width="110"
>
<template #default="scope">
<span v-if="scope.row.refundAmount > 0" class="amount refund">{{ '¥' + scope.row.refundAmount.toFixed(2) }}</span>
<span
v-if="scope.row.refundAmount > 0"
class="amount refund"
>{{ '¥' + scope.row.refundAmount.toFixed(2) }}</span>
<span v-else>-</span>
</template>
</vxe-column>
<vxe-column field="payStatus_dictText" title="收费状态" align="center" width="90">
<vxe-column
field="payStatus_dictText"
title="收费状态"
align="center"
width="90"
>
<template #default="scope">
<el-tag v-if="scope.row.payStatus === '1'" type="success" size="small">已收费</el-tag>
<el-tag v-else-if="scope.row.payStatus === '2'" type="danger" size="small">已退费</el-tag>
<el-tag v-else type="info" size="small">待收费</el-tag>
<el-tag
v-if="scope.row.payStatus === '1'"
type="success"
size="small"
>
已收费
</el-tag>
<el-tag
v-else-if="scope.row.payStatus === '2'"
type="danger"
size="small"
>
已退费
</el-tag>
<el-tag
v-else
type="info"
size="small"
>
待收费
</el-tag>
</template>
</vxe-column>
<vxe-column field="payMethod_dictText" title="支付方式" align="center" width="100" />
<vxe-column field="operatorName" title="收费员" align="center" width="100" />
<vxe-column title="收费时间" align="center" width="160">
<vxe-column
field="payMethod_dictText"
title="支付方式"
align="center"
width="100"
/>
<vxe-column
field="operatorName"
title="收费员"
align="center"
width="100"
/>
<vxe-column
title="收费时间"
align="center"
width="160"
>
<template #default="scope">
{{ scope.row.payTime ? formatDateStr(scope.row.payTime, 'YYYY-MM-DD HH:mm') : '-' }}
</template>
</vxe-column>
<vxe-column title="操作" align="center" width="80" fixed="right">
<vxe-column
title="操作"
align="center"
width="80"
fixed="right"
>
<template #default="scope">
<el-button link type="primary" icon="View" @click.stop="handleDetail(scope.row)">查看</el-button>
<el-button
link
type="primary"
icon="View"
@click.stop="handleDetail(scope.row)"
>
查看
</el-button>
</template>
</vxe-column>
</vxe-table>
@@ -151,17 +306,48 @@
width="900px"
destroy-on-close
>
<div v-if="billDetail" class="detail-content">
<el-descriptions :column="3" border>
<el-descriptions-item label="账单号">{{ billDetail.billNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="患者姓名">{{ billDetail.patientName || '-' }}</el-descriptions-item>
<el-descriptions-item label="性别/年龄">{{ billDetail.genderEnum_enumText || '-' }}/{{ billDetail.age || '-' }}</el-descriptions-item>
<el-descriptions-item label="门诊号">{{ billDetail.encounterNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="收费类型">{{ billDetail.billType_dictText || '-' }}</el-descriptions-item>
<div
v-if="billDetail"
class="detail-content"
>
<el-descriptions
:column="3"
border
>
<el-descriptions-item label="账单号">
{{ billDetail.billNo || '-' }}
</el-descriptions-item>
<el-descriptions-item label="患者姓名">
{{ billDetail.patientName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="性别/年龄">
{{ billDetail.genderEnum_enumText || '-' }}/{{ billDetail.age || '-' }}
</el-descriptions-item>
<el-descriptions-item label="门诊号">
{{ billDetail.encounterNo || '-' }}
</el-descriptions-item>
<el-descriptions-item label="收费类型">
{{ billDetail.billType_dictText || '-' }}
</el-descriptions-item>
<el-descriptions-item label="收费状态">
<el-tag v-if="billDetail.payStatus === '1'" type="success">已收费</el-tag>
<el-tag v-else-if="billDetail.payStatus === '2'" type="danger">已退费</el-tag>
<el-tag v-else type="info">待收费</el-tag>
<el-tag
v-if="billDetail.payStatus === '1'"
type="success"
>
已收费
</el-tag>
<el-tag
v-else-if="billDetail.payStatus === '2'"
type="danger"
>
已退费
</el-tag>
<el-tag
v-else
type="info"
>
待收费
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="收费金额">
<span class="amount">¥{{ billDetail.totalAmount ? billDetail.totalAmount.toFixed(2) : '0.00' }}</span>
@@ -171,38 +357,97 @@
{{ billDetail.refundAmount > 0 ? '¥' + billDetail.refundAmount.toFixed(2) : '-' }}
</span>
</el-descriptions-item>
<el-descriptions-item label="支付方式">{{ billDetail.payMethod_dictText || '-' }}</el-descriptions-item>
<el-descriptions-item label="收费员">{{ billDetail.operatorName || '-' }}</el-descriptions-item>
<el-descriptions-item label="支付方式">
{{ billDetail.payMethod_dictText || '-' }}
</el-descriptions-item>
<el-descriptions-item label="收费员">
{{ billDetail.operatorName || '-' }}
</el-descriptions-item>
<el-descriptions-item label="收费时间">
{{ billDetail.payTime ? formatDateStr(billDetail.payTime, 'YYYY-MM-DD HH:mm:ss') : '-' }}
</el-descriptions-item>
<el-descriptions-item label="费用性质">{{ billDetail.contractName || '-' }}</el-descriptions-item>
<el-descriptions-item label="费用性质">
{{ billDetail.contractName || '-' }}
</el-descriptions-item>
</el-descriptions>
<div class="item-list" v-if="billDetail.items && billDetail.items.length">
<div class="item-title">费用明细</div>
<vxe-table :data="billDetail.items" border size="small">
<vxe-column type="index" title="序号" align="center" width="60" />
<vxe-column field="itemName" title="项目名称" align="left" min-width="180" show-overflow="title" />
<vxe-column field="itemType_dictText" title="类型" align="center" width="100" />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow="title" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="unitPrice" title="单价" align="right" width="100">
<div
v-if="billDetail.items && billDetail.items.length"
class="item-list"
>
<div class="item-title">
费用明细
</div>
<vxe-table
:data="billDetail.items"
border
size="small"
>
<vxe-column
type="index"
title="序号"
align="center"
width="60"
/>
<vxe-column
field="itemName"
title="项目名称"
align="left"
min-width="180"
show-overflow="title"
/>
<vxe-column
field="itemType_dictText"
title="类型"
align="center"
width="100"
/>
<vxe-column
field="specification"
title="规格"
align="center"
width="120"
show-overflow="title"
/>
<vxe-column
field="quantity"
title="数量"
align="center"
width="80"
/>
<vxe-column
field="unitPrice"
title="单价"
align="right"
width="100"
>
<template #default="scope">
{{ scope.row.unitPrice ? scope.row.unitPrice.toFixed(2) : '-' }}
</template>
</vxe-column>
<vxe-column field="totalAmount" title="金额" align="right" width="100">
<vxe-column
field="totalAmount"
title="金额"
align="right"
width="100"
>
<template #default="scope">
{{ scope.row.totalAmount ? scope.row.totalAmount.toFixed(2) : '-' }}
</template>
</vxe-column>
<vxe-column field="doctorName" title="开单医生" align="center" width="110" />
<vxe-column
field="doctorName"
title="开单医生"
align="center"
width="110"
/>
</vxe-table>
</div>
</div>
<template #footer>
<el-button @click="detailVisible = false">关闭</el-button>
<el-button @click="detailVisible = false">
关闭
</el-button>
</template>
</el-dialog>
</div>

View File

@@ -1,27 +1,85 @@
<template>
<div class="app-container">
<el-card shadow="never">
<template #header><span class="card-title">门诊会诊收费</span></template>
<el-form :inline="true" :model="queryParams">
<template #header>
<span class="card-title">门诊会诊收费</span>
</template>
<el-form
:inline="true"
:model="queryParams"
>
<el-form-item label="搜索">
<el-input v-model="queryParams.searchKey" placeholder="搜索" clearable @keyup.enter="handleQuery" />
<el-input
v-model="queryParams.searchKey"
placeholder="搜索"
clearable
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button type="success" icon="Plus" @click="handleAdd">新增</el-button>
<el-button
type="primary"
icon="Search"
@click="handleQuery"
>
搜索
</el-button>
<el-button
type="success"
icon="Plus"
@click="handleAdd"
>
新增
</el-button>
</el-form-item>
</el-form>
<vxe-table :data="tableData" border height="calc(100vh - 280px)">
<vxe-column type="seq" title="序号" width="60" />
<vxe-column field="name" title="名称" />
<vxe-column field="code" title="编码" />
<vxe-column field="status" title="状态">
<template #default="{ row }"><el-tag :type="row.status === '0' ? 'success' : 'info'">{{ row.status === '0' ? '正常' : '停用' }}</el-tag></template>
</vxe-column>
<vxe-column title="操作" width="150">
<vxe-table
:data="tableData"
border
height="calc(100vh - 280px)"
>
<vxe-column
type="seq"
title="序号"
width="60"
/>
<vxe-column
field="name"
title="名称"
/>
<vxe-column
field="code"
title="编码"
/>
<vxe-column
field="status"
title="状态"
>
<template #default="{ row }">
<el-button type="primary" link @click="handleEdit(row)">编辑</el-button>
<el-button type="danger" link @click="handleDelete(row)">删除</el-button>
<el-tag :type="row.status === '0' ? 'success' : 'info'">
{{ row.status === '0' ? '正常' : '停用' }}
</el-tag>
</template>
</vxe-column>
<vxe-column
title="操作"
width="150"
>
<template #default="{ row }">
<el-button
type="primary"
link
@click="handleEdit(row)"
>
编辑
</el-button>
<el-button
type="danger"
link
@click="handleDelete(row)"
>
删除
</el-button>
</template>
</vxe-column>
</vxe-table>

View File

@@ -15,7 +15,10 @@
@keyup.enter="getPatientList"
>
<template #append>
<el-button icon="Search" @click="getPatientList" />
<el-button
icon="Search"
@click="getPatientList"
/>
</template>
</el-input>
<el-select
@@ -25,10 +28,22 @@
style="width: 100%; margin-top: 10px"
@change="getPatientList"
>
<el-option label="全部" value="" />
<el-option label="未退费" value="0" />
<el-option label="部分退费" value="1" />
<el-option label="全额退费" value="2" />
<el-option
label="全部"
value=""
/>
<el-option
label="未退费"
value="0"
/>
<el-option
label="部分退费"
value="1"
/>
<el-option
label="全额退费"
value="2"
/>
</el-select>
<el-date-picker
v-model="dateRange"
@@ -47,20 +62,69 @@
height="calc(100vh - 360px)"
@cell-click="handlePatientClick"
>
<vxe-column field="patientName" title="姓名" align="center" width="110" show-overflow="title" />
<vxe-column field="genderEnum_enumText" title="性别" align="center" width="60" />
<vxe-column field="age" title="年龄" align="center" width="50" />
<vxe-column field="encounterNo" title="门诊号" align="center" width="140" show-overflow="title" />
<vxe-column title="就诊日期" align="center" width="110">
<vxe-column
field="patientName"
title="姓名"
align="center"
width="110"
show-overflow="title"
/>
<vxe-column
field="genderEnum_enumText"
title="性别"
align="center"
width="60"
/>
<vxe-column
field="age"
title="年龄"
align="center"
width="50"
/>
<vxe-column
field="encounterNo"
title="门诊号"
align="center"
width="140"
show-overflow="title"
/>
<vxe-column
title="就诊日期"
align="center"
width="110"
>
<template #default="scope">
{{ scope.row.receptionTime ? formatDateStr(scope.row.receptionTime, 'YYYY-MM-DD') : '-' }}
</template>
</vxe-column>
<vxe-column field="refundStatus" title="退费状态" align="center" width="90">
<vxe-column
field="refundStatus"
title="退费状态"
align="center"
width="90"
>
<template #default="scope">
<el-tag v-if="scope.row.refundStatus === '0'" type="success" size="small">正常</el-tag>
<el-tag v-else-if="scope.row.refundStatus === '1'" type="warning" size="small">部分退</el-tag>
<el-tag v-else-if="scope.row.refundStatus === '2'" type="danger" size="small">全额退</el-tag>
<el-tag
v-if="scope.row.refundStatus === '0'"
type="success"
size="small"
>
正常
</el-tag>
<el-tag
v-else-if="scope.row.refundStatus === '1'"
type="warning"
size="small"
>
部分退
</el-tag>
<el-tag
v-else-if="scope.row.refundStatus === '2'"
type="danger"
size="small"
>
全额退
</el-tag>
</template>
</vxe-column>
</vxe-table>
@@ -78,25 +142,45 @@
<template #header>
<div class="card-header">
<span>费用明细</span>
<span v-if="currentPatient" class="patient-info">
<span
v-if="currentPatient"
class="patient-info"
>
{{ currentPatient.patientName }} - {{ currentPatient.encounterNo }}
</span>
</div>
</template>
<div class="action-bar">
<el-button type="primary" :disabled="!selectedItems.length" @click="handleVerifyRefund">
<el-button
type="primary"
:disabled="!selectedItems.length"
@click="handleVerifyRefund"
>
退费验证
</el-button>
<el-button type="danger" :disabled="!selectedItems.length" @click="handleSubmitRefund">
<el-button
type="danger"
:disabled="!selectedItems.length"
@click="handleSubmitRefund"
>
确认退费
</el-button>
<el-button :disabled="!selectedItems.length" @click="handleClearSelection">
<el-button
:disabled="!selectedItems.length"
@click="handleClearSelection"
>
清空选择
</el-button>
<el-button icon="Refresh" @click="handleRegenerateCharge">
<el-button
icon="Refresh"
@click="handleRegenerateCharge"
>
重新生成收费
</el-button>
<span v-if="refundTotalAmount > 0" class="refund-total">
<span
v-if="refundTotalAmount > 0"
class="refund-total"
>
退费合计¥{{ refundTotalAmount.toFixed(2) }}
</span>
</div>
@@ -108,32 +192,100 @@
@checkbox-change="handleSelectionChange"
@select="handleSelectionChange"
>
<vxe-column type="checkbox" width="55" align="center" />
<vxe-column field="itemName" title="项目名称" align="center" show-overflow="title" min-width="180" />
<vxe-column field="itemType_dictText" title="类型" align="center" width="100" />
<vxe-column field="specification" title="规格" align="center" width="120" show-overflow="title" />
<vxe-column field="quantity" title="数量" align="center" width="80" />
<vxe-column field="unitPrice" title="单价" align="right" width="100">
<vxe-column
type="checkbox"
width="55"
align="center"
/>
<vxe-column
field="itemName"
title="项目名称"
align="center"
show-overflow="title"
min-width="180"
/>
<vxe-column
field="itemType_dictText"
title="类型"
align="center"
width="100"
/>
<vxe-column
field="specification"
title="规格"
align="center"
width="120"
show-overflow="title"
/>
<vxe-column
field="quantity"
title="数量"
align="center"
width="80"
/>
<vxe-column
field="unitPrice"
title="单价"
align="right"
width="100"
>
<template #default="scope">
{{ scope.row.unitPrice ? scope.row.unitPrice.toFixed(2) : '-' }}
</template>
</vxe-column>
<vxe-column field="totalAmount" title="金额" align="right" width="100">
<vxe-column
field="totalAmount"
title="金额"
align="right"
width="100"
>
<template #default="scope">
{{ scope.row.totalAmount ? scope.row.totalAmount.toFixed(2) : '-' }}
</template>
</vxe-column>
<vxe-column field="paidAmount" title="已付金额" align="right" width="100">
<vxe-column
field="paidAmount"
title="已付金额"
align="right"
width="100"
>
<template #default="scope">
{{ scope.row.paidAmount ? scope.row.paidAmount.toFixed(2) : '-' }}
</template>
</vxe-column>
<vxe-column field="doctorName" title="开单医生" align="center" width="110" />
<vxe-column field="deptName" title="科室" align="center" width="130" show-overflow="title" />
<vxe-column title="退费状态" align="center" width="90">
<vxe-column
field="doctorName"
title="开单医生"
align="center"
width="110"
/>
<vxe-column
field="deptName"
title="科室"
align="center"
width="130"
show-overflow="title"
/>
<vxe-column
title="退费状态"
align="center"
width="90"
>
<template #default="scope">
<el-tag v-if="scope.row.refundStatus === '0'" type="success" size="small">正常</el-tag>
<el-tag v-else-if="scope.row.refundStatus === '1'" type="warning" size="small">已退费</el-tag>
<el-tag
v-if="scope.row.refundStatus === '0'"
type="success"
size="small"
>
正常
</el-tag>
<el-tag
v-else-if="scope.row.refundStatus === '1'"
type="warning"
size="small"
>
已退费
</el-tag>
</template>
</vxe-column>
</vxe-table>
@@ -146,7 +298,10 @@
width="700px"
destroy-on-close
>
<div v-if="verifyResult" class="verify-content">
<div
v-if="verifyResult"
class="verify-content"
>
<el-alert
:type="verifyResult.success ? 'success' : 'error'"
:title="verifyResult.success ? '验证通过' : '验证未通过'"
@@ -155,16 +310,35 @@
:closable="false"
style="margin-bottom: 16px"
/>
<el-descriptions v-if="verifyResult.details" :column="2" border size="small">
<el-descriptions-item label="可退数量">{{ verifyResult.details.refundableCount || 0 }}</el-descriptions-item>
<el-descriptions-item label="可退金额">{{ verifyResult.details.refundableAmount || '¥0.00' }}</el-descriptions-item>
<el-descriptions-item label="已使用数量">{{ verifyResult.details.usedCount || 0 }}</el-descriptions-item>
<el-descriptions-item label="不可退原因">{{ verifyResult.details.reason || '-' }}</el-descriptions-item>
<el-descriptions
v-if="verifyResult.details"
:column="2"
border
size="small"
>
<el-descriptions-item label="可退数量">
{{ verifyResult.details.refundableCount || 0 }}
</el-descriptions-item>
<el-descriptions-item label="可退金额">
{{ verifyResult.details.refundableAmount || '¥0.00' }}
</el-descriptions-item>
<el-descriptions-item label="已使用数量">
{{ verifyResult.details.usedCount || 0 }}
</el-descriptions-item>
<el-descriptions-item label="不可退原因">
{{ verifyResult.details.reason || '-' }}
</el-descriptions-item>
</el-descriptions>
</div>
<template #footer>
<el-button @click="verifyVisible = false">关闭</el-button>
<el-button v-if="verifyResult && verifyResult.success" type="primary" @click="handleSubmitRefund">
<el-button @click="verifyVisible = false">
关闭
</el-button>
<el-button
v-if="verifyResult && verifyResult.success"
type="primary"
@click="handleSubmitRefund"
>
确认退费
</el-button>
</template>

View File

@@ -8,7 +8,8 @@
@close="close"
>
<vxe-table
:row-config="{ isCurrent: true }" :data="recordList"
:row-config="{ isCurrent: true }"
:data="recordList"
max-height="650"
style="width: 100%"
border

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