Pārlūkot izejas kodu

优化调理方案显示

cc12458 1 gadu atpakaļ
vecāks
revīzija
1a2e85c80c

+ 8 - 4
src/pages/index/patient/room@default.vue

@@ -112,9 +112,13 @@ function handle(model: ReportModel) {
   });
 }
 
-function schemeRefreshHandle() {
+function schemeRefreshHandle(id?: string) {
   invalidateCache(reportSchemeMethod(reportId.value!));
-  schemeRefresh();
+  schemeRefresh().then(() => nextTick()).then(() => {
+    if ( id ) {
+      document.querySelector(`#scrollable_scheme_${ id }`)?.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'nearest' });
+    }
+  });
 }
 
 const analysisReportPreviewOpening = ref();
@@ -209,9 +213,9 @@ const { height } = useElementSize(patientCardRef);
       </div>
       <div class="area flex-auto" v-if="report?.scheme?.show">
         <ReportSchemeCardWidget
-          :dataset="scheme" :loading="schemeLoading" :editable="report.scheme.editable"
+          :dataset="scheme" :loading="schemeLoading" :editable="report?.scheme?.editable"
           v-model:collapsed="schemeCollapsed"
-          @refresh="schemeRefreshHandle()"
+          @refresh="schemeRefreshHandle($event)"
         >
           <template #footer v-if="report?.scheme?.editable">
             <div style="padding: 8px;background-color: #fff;text-align: center;">

+ 1 - 1
src/request/api/report.api.ts

@@ -72,7 +72,7 @@ export function searchSchemeMethod(keyword?: string, query?: Partial<ReportSchem
           label: scheme.name ?? `预设 ${ index + 1 }`,
         };
       });
-      if ( keyword && !groups.find(group => group.label === keyword) ) groups.unshift({ name: keyword, label: keyword });
+      if ( keyword && !groups.find(group => group.label === keyword) ) groups.unshift(<any>{ name: keyword, label: keyword });
       return groups;
     },
   });

+ 1 - 1
src/widgets/PatientTagWidget.vue

@@ -69,7 +69,7 @@ async function edit(value = !editing.value) {
     <div class="card__content overflow-auto">
       <a-space-compact v-if="editing" block size="small" class="tags-edit-select-wrapper">
         <a-select
-          ref="selectRef" allow-clear autofocus
+          ref="selectRef" autofocus
           v-model:value="selected" mode="multiple"
           :options="options.data" :field-names="{ label: 'name', value: 'id'}"
           :disabled="submitting" :loading="optionsLoading"

+ 50 - 24
src/widgets/ReportSchemeCardWidget.vue

@@ -3,6 +3,7 @@ import ReportSchemeEdit                                  from '@/components/Repo
 import ReportSchemePreview                               from '@/components/ReportSchemePreview.vue';
 import type { ReportSchemeItemModel, ReportSchemeModel } from '@/model';
 import { deleteSchemeMethod }                            from '@/request/api/report.api';
+import { withResolvers }                                 from '@/tools/promise';
 
 import { ExclamationCircleOutlined, PlusOutlined } from '@ant-design/icons-vue';
 
@@ -24,7 +25,7 @@ const props = withDefaults(defineProps<{
   hideTitle: false,
 });
 const emits = defineEmits<{
-  refresh: [];
+  refresh: [ id?: string ];
 }>();
 
 const { send: deleteScheme } = useRequest(
@@ -39,6 +40,7 @@ const { send: deleteScheme } = useRequest(
 
 
 function deleteSchemeItemHandle(item: ReportSchemeItemModel, index?: number) {
+  const { promise, resolve } = withResolvers();
   Modal.confirm({
     icon: h(ExclamationCircleOutlined),
     title: `是否删除调理方案?`,
@@ -46,8 +48,9 @@ function deleteSchemeItemHandle(item: ReportSchemeItemModel, index?: number) {
     okType: 'danger',
     okText: '删除',
     zIndex: 9999,
-    onOk: () => deleteScheme(item),
+    onOk: () => deleteScheme(item).then(resolve),
   });
+  return promise;
 }
 
 const openMode = ref<'edit' | 'preview'>();
@@ -84,7 +87,7 @@ function openSchemeHandle(mode: 'edit' | 'preview', item?: ReportSchemeItemModel
               'onUpdate:value'(model) {
                 openModel.value = model;
                 openMode.value = 'preview';
-                emits('refresh');
+                emits('refresh', model.id);
               },
               onDestroy,
             });
@@ -103,7 +106,7 @@ function openSchemeHandle(mode: 'edit' | 'preview', item?: ReportSchemeItemModel
             Button,
             {
               size: 'small', type: 'dashed', danger: true,
-              onClick: () => deleteSchemeItemHandle(item, index),
+              onClick: () => deleteSchemeItemHandle(item!, index).then(() => onDestroy()),
             },
             () => '删除',
           ),
@@ -123,11 +126,18 @@ function openSchemeHandle(mode: 'edit' | 'preview', item?: ReportSchemeItemModel
             },
             () => '查看',
           ),
-        ]);
+        ]) as any;
       },
     },
   });
 }
+
+const showDescriptions = (panel: ReportSchemeItemModel) => {
+  return panel.descriptions?.length || (
+    panel.type !== 'other' &&
+    panel.content?.length
+  );
+};
 </script>
 <template>
   <div class="card report-card">
@@ -146,25 +156,41 @@ function openSchemeHandle(mode: 'edit' | 'preview', item?: ReportSchemeItemModel
       </div>
     </div>
     <div class="card__content flex-auto">
-      <a-card class="card background descriptions-card" size="small" v-for="(panel, index) in props.dataset.children">
-        <template #title>
-          <div @click="openSchemeHandle('preview', panel,index)">
-            <span class="header">{{ panel.category }}</span>
-            <span class="header" v-if="panel.name">{{ panel.name }}</span>
-          </div>
-        </template>
-        <template #extra v-if="editable">
-          <a-space>
-            <a-button size="small" @click.stop="openSchemeHandle('edit',panel, index)">编辑</a-button>
-            <a-button size="small" danger @click.stop="deleteSchemeItemHandle(panel, index)">删除</a-button>
-          </a-space>
-        </template>
-        <a-descriptions :column="1" bordered size="small" v-if="panel.descriptions?.length">
-          <a-descriptions-item v-for="row in panel.descriptions" :key="row.name" :label="row.name ">
-            {{ row.description }}
-          </a-descriptions-item>
-        </a-descriptions>
-      </a-card>
+      <template v-for="(panel, index) in props.dataset.children" :key="panel.id">
+        <div :id="'scrollable_scheme_' + panel.id" style="position: relative;top:-48px;"></div>
+        <a-card class="card background descriptions-card" size="small">
+          <template #title>
+            <div @click="openSchemeHandle('preview', panel,index)">
+              <span class="header">{{ panel.category }}</span>
+              <span class="header" v-if="panel.name">{{ panel.name }}</span>
+            </div>
+          </template>
+          <template #extra v-if="editable">
+            <a-space>
+              <a-button size="small" @click.stop="openSchemeHandle('edit',panel, index)">编辑</a-button>
+              <a-button size="small" danger @click.stop="deleteSchemeItemHandle(panel, index)">删除</a-button>
+            </a-space>
+          </template>
+          <a-descriptions :column="1" bordered size="small" v-if="showDescriptions(panel)">
+            <a-descriptions-item v-if="panel.type === 'acupoint'" label="穴位">
+              <template v-for="(item,index) in panel.content" :key="index">
+                <a-tag>{{ item.name }}</a-tag>
+              </template>
+            </a-descriptions-item>
+            <a-descriptions-item v-if="panel.type === 'medicine'" label="组成">
+              <template v-for="(item,index) in panel.content" :key="index">
+                <a-tag>{{ item.name }} {{ item.doase }}{{ item.unit }}</a-tag>
+              </template>
+            </a-descriptions-item>
+            <a-descriptions-item v-for="row in panel.descriptions" :key="row.name" :label="row.name ">
+              {{ row.description }}
+            </a-descriptions-item>
+          </a-descriptions>
+        </a-card>
+      </template>
+    </div>
+    <div class="cart__footer flex-none sticky bottom-0">
+      <slot name="footer"></slot>
     </div>
   </div>
 </template>