fan 2 rokov pred
rodič
commit
8524049d34

+ 10 - 1
src/api/biz/archives/patientBasicApi.ts

@@ -1,13 +1,14 @@
 import { defHttp } from '/@/utils/http/axios';
 import { setParams } from '/@/utils/index';
 
-enum Api {
+export enum Api {
   archivesPatientBasicQueryPage = '/archives/patientBasic/query/page',
   archivesPatientBasicDetail = '/archives/patientBasic/detail',
   archivesPatientBasicAdd = '/archives/patientBasic/add',
   archivesPatientBasicEdit = '/archives/patientBasic/edit',
   archivesPatientBasicRemove = '/archives/patientBasic/removeByIds',
   archivesPatientBasicStats = '/archives/patientBasic/stats',
+  archivesPatientBasicImportBatch = '/archives/patientBasic/import/batch',
 }
 
 /**
@@ -151,3 +152,11 @@ export const archivesPatientBasicEdit = (params?: object) => {
 export const archivesPatientBasicRemove = (params: Array<string | number>) => {
   return defHttp.post({ url: Api.archivesPatientBasicRemove, params: params });
 };
+
+/**
+ * @description: 批量导入,权限 - archives:patientBasic:import
+ * @method: POST
+ */
+export const archivesPatientBasicImportBatch = (params: Array<string | number>) => {
+  return defHttp.post({ url: Api.archivesPatientBasicImportBatch, params: params });
+};

+ 31 - 3
src/assets/iconfont/iconfont.css

@@ -1,8 +1,8 @@
 @font-face {
   font-family: 'iconfont'; /* Project id 3806176 */
-  src: url('//at.alicdn.com/t/c/font_3806176_em9e5cie965.woff2?t=1685580968021') format('woff2'),
-    url('//at.alicdn.com/t/c/font_3806176_em9e5cie965.woff?t=1685580968021') format('woff'),
-    url('//at.alicdn.com/t/c/font_3806176_em9e5cie965.ttf?t=1685580968021') format('truetype');
+  src: url('//at.alicdn.com/t/c/font_3806176_qz5bq7p4of.woff2?t=1694745206363') format('woff2'),
+    url('//at.alicdn.com/t/c/font_3806176_qz5bq7p4of.woff?t=1694745206363') format('woff'),
+    url('//at.alicdn.com/t/c/font_3806176_qz5bq7p4of.ttf?t=1694745206363') format('truetype');
 }
 
 .iconfont {
@@ -13,6 +13,34 @@
   -moz-osx-font-smoothing: grayscale;
 }
 
+.icon-xt-disable_default:before {
+  content: '\e605';
+}
+
+.icon-xt-disable_selected:before {
+  content: '\e606';
+}
+
+.icon-xt-Inventory_default:before {
+  content: '\e607';
+}
+
+.icon-xt-Inventory_disable:before {
+  content: '\e608';
+}
+
+.icon-xt-Inventory_selected:before {
+  content: '\e609';
+}
+
+.icon-xt-revocation_default:before {
+  content: '\e60a';
+}
+
+.icon-xt-revocation_selected:before {
+  content: '\e60b';
+}
+
 .icon-xt-dual-pump_default:before {
   content: '\e73f';
 }

+ 4 - 2
src/components/XTCard/src/SimpleCard.vue

@@ -7,7 +7,9 @@
         <i :class="['iconfont', icon]" v-if="icon" @click="handleIcon" />
       </div>
     </div>
-    <div class="card-body" />
+    <div class="card-body">
+      <slot name="body" />
+    </div>
   </div>
 </template>
 
@@ -125,7 +127,7 @@
     &-body {
       display: flex;
       align-items: center;
-      padding: 20px 20px 0;
+      padding: 20px;
     }
   }
 </style>

+ 1 - 0
src/components/XTImport/index.ts

@@ -0,0 +1 @@
+export { default as ImportModal } from './src/ImportModal.vue';

+ 301 - 0
src/components/XTImport/src/ImportModal.vue

@@ -0,0 +1,301 @@
+<template>
+  <BasicModal
+    :title="getTitle"
+    :canFullscreen="false"
+    :maskClosable="false"
+    :showOkBtn="showOkBtn"
+    @register="registerModal"
+    @ok="handleSubmit"
+    @cancel="handleSubmit"
+    width="580px"
+  >
+    <div
+      class="wrap"
+      :style="{
+        borderColor: importInfo[importStatus].borderColor,
+        borderStyle: importInfo[importStatus].borderStyle,
+      }"
+    >
+      <div class="wrap-cnt" :style="{ backgroundColor: importInfo[importStatus].backgroundColor }">
+        <div>
+          <div class="cnt-tit">
+            <i
+              :class="[
+                'iconfont cnt-icon',
+                'cnt-icon_' + importStatus,
+                importInfo[importStatus].icon,
+              ]"
+            />
+            {{ importInfo[importStatus].title }}
+          </div>
+          <div v-if="importStatus == 'default'">
+            <div class="cnt-desc">
+              若是您第一次上传文件,可先下载
+              <span :class="['pointer', 'cnt-desc_link']" @click="downloadFile"> 文件模板</span
+              >,文件大小不超过5M
+            </div>
+          </div>
+          <div class="cnt-detail">
+            <Upload
+              class="button-style"
+              name="file"
+              :beforeUpload="handleBeforeUpload"
+              :maxCount="1"
+              :action="uploadApi"
+              :showUploadList="false"
+              @change="onChange"
+            >
+              <a-button type="primary"> 导入文件 </a-button>
+            </Upload>
+          </div>
+        </div>
+        <div v-if="importStatus == 'progress'">
+          <div class="cnt-desc">
+            {{ importInfo[importStatus].desc }}
+          </div>
+          <div class="cnt-detail">
+            <Progress
+              :stroke-color="strokeColor"
+              :percent="importProgress"
+              :showInfo="false"
+              status="active"
+            />
+          </div>
+        </div>
+        <div v-if="importStatus == 'success'">
+          <div :class="['cnt-desc pointer', 'cnt-desc_link']" @click="importStatus = 'default'">
+            继续导入数据
+          </div>
+        </div>
+        <div v-if="importStatus == 'fail'">
+          <div class="cnt-desc">
+            <span class="mr-3">
+              成功:
+              <span
+                :style="{
+                  color: '#19BE6B',
+                }"
+              >
+                {{ importFail.success }}
+              </span></span
+            >
+            <span class="mr-3">
+              失败:
+              <span
+                :style="{
+                  color: importInfo[importStatus].borderColor,
+                }"
+              >
+                {{ importFail.fail }}
+              </span>
+            </span>
+            <span> 总数: {{ importFail.total }}</span>
+          </div>
+          <div class="cnt-detail">
+            下载失败结果 <a class="cnt-desc_link pointer" @click="exportExcel"> 失败文件</a>
+          </div>
+        </div>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+
+<script setup lang="ts">
+  import { BasicModal, useModalInner } from '@/components/Modal';
+  import { useGlobSetting } from '/@/hooks/setting';
+  import { excelSheetDetail, getDownloadUrl, tempDownload } from '/@/api/common/index';
+  import { downloadByBase64, downloadByUrl } from '/@/utils/file/download';
+  import { reactive, ref } from 'vue';
+  import { Progress, Upload } from 'ant-design-vue';
+
+  const globSetting = useGlobSetting();
+  // const uploadApi = globSetting.apiUrl + '/archives/patientBasic/import/batch';
+  const uploadApi = ref('');
+  const getTitle = ref('导入数据');
+  const exportFileId = ref('');
+  const timer = ref(null);
+  const showOkBtn = ref(false);
+  const strokeColor = {
+    '0%': '#00A8FF',
+    '100%': '#0072FF',
+  };
+  const importStatus = ref<'default' | 'progress' | 'success' | 'fail'>('default');
+  const importInfo = {
+    default: {
+      icon: '',
+      title: '选择需要导入的文件',
+      desc: '',
+      borderColor: '#DCDEE2',
+      borderStyle: 'dashed',
+      backgroundColor: '#F4F6F9',
+    },
+    progress: {
+      icon: '',
+      title: '数据导入中…',
+      desc: '请稍等, 不要离开此页面',
+      borderColor: '#DCDEE2',
+      borderStyle: 'dashed',
+      backgroundColor: '#F4F6F9',
+    },
+    success: {
+      icon: 'icon-xt-success',
+      title: '数据导入成功',
+      desc: '<a @click="downloadFile"> 继续导入数据</a>',
+      borderColor: '#DCDEE2',
+      borderStyle: 'solid',
+      backgroundColor: '#F4F6F9',
+    },
+    fail: {
+      icon: 'icon-xt-fail',
+      title: '数据导入失败',
+      desc: '',
+      borderColor: '#FF5D39',
+      borderStyle: 'solid',
+      backgroundColor: '#FFF0ED',
+    },
+  };
+  const importFail = reactive({
+    success: 0,
+    fail: 0,
+    total: 0,
+  });
+  const importProgress = ref(30);
+  const [registerModal, { setModalProps }] = useModalInner(async data => {
+    console.log('🚀 ~ file: code.vue:21 ~ data:', data);
+    setModalProps({ confirmLoading: false });
+    getTitle.value = data?.title;
+    uploadApi.value = globSetting.apiUrl + data.uploadUrl;
+  });
+
+  async function handleSubmit() {
+    importStatus.value = 'default';
+    showOkBtn.value = false;
+    clearInterval(timer.value);
+    timer.value = null;
+  }
+  async function onChange(file) {
+    console.log('🚀 ~ file: importModal.vue:162 ~ onChange ~ onChange:', file);
+    // 单文件
+    const fileInfo = file.file;
+    // if (fileInfo.status === 'uploading') {
+    //   importStatus.value = 'progress';
+    //   importProgress.value = importProgress.value > 30 ? fileInfo.percent : 30;
+    // }
+    if (file.file.status === 'done') {
+      importStatus.value = 'progress';
+      const id = fileInfo.response.data;
+      if (id) {
+        timer.value = setInterval(async function () {
+          const importStats = await excelSheetDetail(id);
+          console.log('importStats', importStats);
+          importFail.fail = importStats.failCount;
+          importFail.success = importStats.successCount;
+          importFail.total = importStats.totalCount;
+          const percent =
+            (importStats.failCount + importStats.successCount) / importStats.totalCount;
+          // 进度条
+          importProgress.value = isNaN(percent) ? 30 : percent * 100 + 30;
+          console.log('进度条:', importProgress.value);
+          if (importStats.status.includes('parsing')) return;
+          const isFinish =
+            importStats.failCount + importStats.successCount == importStats.totalCount;
+          if (isFinish) {
+            clearInterval(timer.value);
+            if (importStats.failCount) {
+              importStatus.value = 'fail';
+              exportFileId.value = importStats.exportFileId;
+            } else {
+              importStatus.value = 'success';
+            }
+            showOkBtn.value = true;
+            importProgress.value = 30;
+          }
+        }, 1000 * 5);
+      }
+    }
+  }
+  async function handleBeforeUpload(file) {
+    console.log('file', file);
+    // fileUpload.value = file;
+  }
+  async function exportExcel() {
+    const res = await getDownloadUrl(exportFileId.value);
+    console.log('res', res);
+    downloadByUrl({ url: res });
+  }
+  async function downloadFile() {
+    console.log('🚀 ~ file: importModal.vue:96 ~ downloadFile ~ downloadFile:');
+    const res = await tempDownload([]);
+    downloadByBase64(res.base64, res.fileName);
+  }
+</script>
+
+<style lang="less" scoped>
+  .wrap {
+    width: 480px;
+    height: 180px;
+    background: #fff;
+    border-radius: 2px;
+    border-width: 1px;
+    padding: 8px;
+    margin: 20px auto;
+
+    &-cnt {
+      height: 100%;
+      padding-top: 25px;
+    }
+  }
+
+  .cnt {
+    &-icon {
+      font-size: 24px;
+      margin-right: 4px;
+
+      &_success {
+        color: #19be6b;
+      }
+
+      &_fail {
+        color: #ff5d39;
+      }
+    }
+
+    &-tit {
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      font-size: 18px;
+      font-weight: 500;
+      color: #000a18;
+      line-height: 25px;
+      text-align: center;
+      margin-bottom: 10px;
+    }
+
+    &-desc {
+      font-size: 14px;
+      color: #515a6e;
+      line-height: 20px;
+      text-align: center;
+      margin-bottom: 24px;
+
+      &_link {
+        font-size: 14px;
+        color: #006dff;
+        text-decoration-line: underline;
+      }
+    }
+
+    &-detail {
+      text-align: center;
+    }
+  }
+
+  ::v-deep(.ant-progress-line) {
+    width: 152px;
+  }
+
+  ::v-deep(.ant-progress-inner) {
+    background-color: #fff;
+  }
+</style>

+ 68 - 25
src/views/biz/engineer/bed/data.ts

@@ -2,59 +2,60 @@ import { BasicColumn } from '@/components/Table';
 import { FormSchema } from '/@/components/Form';
 import { listDictModel } from '@/api/common';
 
-export const columns: BasicColumn[] = [
+export const columnsBed: BasicColumn[] = [
   {
-    title: '设备编号',
-    dataIndex: 'unique',
+    title: '病区',
+    dataIndex: 'wardName',
     align: 'left',
+    width: 90,
   },
   {
-    title: '设备厂家',
-    dataIndex: 'manufacturer',
+    title: '病区属性',
+    dataIndex: 'wardPropertyName',
     align: 'left',
+    width: 90,
   },
   {
-    title: '设备型号',
-    dataIndex: 'model',
+    title: '床位',
+    dataIndex: 'bedName',
     align: 'left',
   },
   {
-    title: '序列号',
-    dataIndex: 'serialNumber',
+    title: '设备编号',
+    dataIndex: 'deviceId',
     align: 'left',
   },
   {
-    title: '设备类型',
-    dataIndex: 'deviceType',
+    title: '设备信息',
+    dataIndex: 'deviceName',
     align: 'left',
   },
+];
+
+export const columnsDevice: BasicColumn[] = [
   {
-    title: '泵类型',
-    dataIndex: 'pumpType',
+    title: '操作时间',
+    dataIndex: 'createTime',
     align: 'left',
   },
   {
-    title: '传染标识',
-    dataIndex: 'infectiousDiseases',
+    title: '操作类型',
+    dataIndex: 'bindDevice',
     align: 'left',
   },
   {
-    title: '使用时间',
-    dataIndex: 'useDate',
+    title: '设备类型',
+    dataIndex: 'deviceType',
     align: 'left',
-    width: 180,
-    sorter: true,
   },
   {
-    title: '生产时间',
-    dataIndex: 'produceDate',
+    title: '设备编号',
+    dataIndex: 'deviceId',
     align: 'left',
-    width: 180,
-    sorter: true,
   },
   {
-    title: '保修期限(年)',
-    dataIndex: 'warrantyPeriod',
+    title: '设备备注',
+    dataIndex: 'remark',
     align: 'left',
   },
 ];
@@ -149,3 +150,45 @@ export const dataFormSchema: FormSchema[] = [
     },
   },
 ];
+
+// 床位信息搜索
+export const searchFormSchema = {
+  bed: [
+    {
+      name: 'wardId',
+      componentType: 'Select',
+      placeholder: '请选择病区',
+      width: 150,
+      defaultValue: '1',
+      dicts: [{ label: '全部', value: '1' }],
+    },
+    {
+      name: 'bindDevice',
+      componentType: 'Select',
+      placeholder: '请选择',
+      width: 150,
+      defaultValue: null,
+      dicts: [
+        { label: '全部', value: null },
+        { label: '未绑定', value: 0 },
+        { label: '已绑定', value: 1 },
+      ],
+    },
+  ],
+  device: [
+    {
+      name: 'createTime',
+      componentType: 'RangePicker',
+      placeholder: '请输入',
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+    },
+    {
+      name: 'deviceId',
+      componentType: 'Input',
+      placeholder: '请输入',
+      prefix: 'icon-xt-search',
+      width: 200,
+    },
+  ],
+};

+ 29 - 1
src/views/demo/card/index.vue

@@ -15,7 +15,14 @@
         </template>
       </SimpleCard>
     </div>
-
+    <div class="my-4">
+      <ChartsCard
+        title="透前血压趋势"
+        :has-safe="true"
+        :colors="chartData.colors"
+        :safe-range="chartData.safeRange"
+      />
+    </div>
     <div class="flex justify-between">
       <XTCard class="m-2" :data="cardData1" @item-click="cellCard" />
     </div>
@@ -28,6 +35,8 @@
 <script setup lang="ts">
   import { XTCard, SimpleCard } from '@/components/XTCard/index';
   import DescCard from '@/components/XTCard/src/DescCard.vue';
+  import ChartsCard from '/@/components/XTCard/src/ChartsCard.vue';
+
   import { ColorEnum } from '@/enums/colorEnum';
   import { XTForm } from '/@/components/XTForm/index';
 
@@ -226,6 +235,25 @@
     },
   ];
 
+  const chartData = {
+    colors: [
+      {
+        color: 'rgba(0, 117, 255, 1)',
+        label: '化验值',
+        dot: 'rgba(0, 117, 255, 1)',
+      },
+    ],
+    safeRange: [
+      {
+        // name: '60分到80分',
+        yAxis: 0,
+      },
+      {
+        yAxis: 20,
+      },
+    ],
+  };
+
   function cellCard(data) {
     console.log('🚀 ~ file: index.vue:106 ~ cellCard ~ data:', data);
   }

+ 258 - 0
src/views/demo/form/data.ts

@@ -0,0 +1,258 @@
+import { BasicColumn } from '/@/components/Table';
+import { FormSchema } from '/@/components/Form';
+import { radioBoolean } from '/@/utils/filters';
+import { listDictModel } from '/@/api/common';
+
+export const dataFormSchema: FormSchema[] = [
+  {
+    field: 'PlainTitle',
+    component: 'PlainTitle',
+    defaultValue: '检测时间',
+    colProps: {
+      span: 24,
+    },
+  },
+  {
+    field: 'PlainText1111',
+    component: 'RadioDescGroup',
+    label: '1、干体重在过去3~6个月总的变化',
+    componentProps: {
+      options: [
+        { label: '干体重没有减少或体重丢失 <0.5kg (0分)', value: 0 },
+        { label: '体重丢失 ≥0.5kg,但 <1kg (1分)', value: 1 },
+      ],
+    },
+    colProps: {
+      span: 24,
+    },
+    defaultValue: 1,
+  },
+  {
+    field: 'configName',
+    label: '参数名称',
+    labelColor: '#818694',
+    component: 'Input',
+    componentProps: {
+      placeholder: '请输入参数名称',
+      extra: '123123',
+    },
+  },
+  {
+    field: 'configName1',
+    label: '参数名称',
+    labelColor: '#818694',
+    component: 'Input',
+    componentProps: {
+      placeholder: '请输入参数名称',
+      extra: '123123',
+    },
+  },
+  {
+    field: 'configName22',
+    label: '参数名称',
+    labelColor: '#818694',
+    component: 'Input',
+    componentProps: {
+      placeholder: '请输入参数名称',
+      extra: '123123',
+    },
+  },
+  {
+    field: 'configName333',
+    label: '有无异常',
+    component: 'ApiComplex',
+    componentProps: ({ formModel }) => {
+      return {
+        placeholder: '请输入异常内容',
+        api: listDictModel,
+        params: {
+          dictCode: 'sys_dict_type',
+        },
+        onChange: e => {
+          console.log('🚀 ~ file: data.ts:81 ~ e:', e);
+          return (formModel['configName333'] = e);
+        },
+      };
+    },
+  },
+  {
+    field: 'configKey',
+    label: '参数键名',
+    labelColor: '#818694',
+    subLabel: '测试',
+    subLabelColor: '#FF5D39',
+    component: 'Input',
+    required: true,
+    componentProps: {
+      placeholder: '请输入参数键名',
+      // style: { width: '200px' },
+    },
+  },
+  {
+    field: 'configValue',
+    label: '参数键值',
+    component: 'InputNumberGroup',
+    componentProps: ({ formModel }) => {
+      return {
+        options: [
+          { min: 0, max: 200, placeholder: '最小值 0', field: 'min' },
+          { min: 0, max: 200, placeholder: '最大值 200', field: 'max' },
+        ],
+        onChange: e => {
+          return (formModel['configValue'] = e);
+        },
+      };
+    },
+  },
+  {
+    field: 'idCard',
+    label: '证件号码',
+    component: 'ApiInputDict',
+    componentProps: ({ formModel }) => {
+      return {
+        placeholder: '请输入异常内容',
+        api: listDictModel,
+        params: {
+          dictCode: 'sys_dict_type',
+          dictSort: true,
+        },
+        onChange: e => {
+          console.log('🚀 ~ file: data.ts:81 ~ e:', e);
+          return (formModel['idCard'] = e);
+        },
+      };
+    },
+  },
+  {
+    field: 'sort',
+    label: '排序',
+    component: 'InputNumber',
+    required: true,
+    defaultValue: '1',
+    componentProps: {
+      placeholder: '请输入排序',
+      min: 1,
+    },
+  },
+  {
+    field: 'sysInner',
+    label: '系统内置',
+    component: 'RadioGroup',
+    componentProps: {
+      options: radioBoolean,
+      disabled: true,
+    },
+    defaultValue: '1',
+  },
+  {
+    field: 'apiCheck',
+    label: '系统内置',
+    component: 'ApiCheckboxGroup',
+    componentProps: {
+      api: listDictModel,
+      params: {
+        dictCode: 'bm_pump',
+      },
+    },
+    // defaultValue: ['pump_single'],
+  },
+  // {
+  //   field: 'disable',
+  //   label: '状态',
+  //   component: 'RadioGroup',
+  //   required: true,
+  //   componentProps: {
+  //     options: radioSwitch,
+  //   },
+  //   defaultValue: '0',
+  // },
+  {
+    label: '备注',
+    field: 'remark',
+    component: 'InputTextArea',
+    componentProps: {
+      placeholder: '请输入备注',
+    },
+  },
+];
+export const columns: BasicColumn[] = [
+  {
+    title: '名称',
+    dataIndex: 'name',
+    width: 100,
+    edit: true,
+    editable: true,
+    editComponent: 'Input',
+  },
+  {
+    title: '类型',
+    dataIndex: 'type',
+    width: 150,
+  },
+  {
+    title: '联系人',
+    dataIndex: 'contractUser',
+    width: 150,
+  },
+  {
+    title: '联系人电话',
+    dataIndex: 'contactMobile',
+    width: 150,
+  },
+  {
+    title: '名称',
+    dataIndex: 'name',
+    width: 100,
+  },
+  {
+    title: '类型',
+    dataIndex: 'type',
+    width: 150,
+  },
+  {
+    title: '联系人',
+    dataIndex: 'contractUser',
+    width: 150,
+  },
+  {
+    title: '联系人电话',
+    dataIndex: 'contactMobile',
+    width: 150,
+  },
+  {
+    title: '管理账号',
+    dataIndex: 'username',
+    width: 150,
+  },
+  {
+    title: '套餐名称',
+    dataIndex: 'packageName',
+    width: 150,
+  },
+  {
+    title: '联系人',
+    dataIndex: 'contractUser',
+    width: 150,
+  },
+  {
+    title: '联系人电话',
+    dataIndex: 'contactMobile',
+    width: 150,
+  },
+  {
+    title: '管理账号',
+    dataIndex: 'username',
+    width: 150,
+  },
+  {
+    title: '套餐名称',
+    dataIndex: 'packageName',
+    width: 150,
+    fixed: 'right',
+  },
+  {
+    title: '状态',
+    dataIndex: 'disable',
+    fixed: 'right',
+  },
+];

+ 207 - 3
src/views/demo/form/index.vue

@@ -1,7 +1,211 @@
 <template>
-  <div> 占位符 </div>
+  <div class="m-4">
+    <div class="flex justify-between my-4">
+      <XTTab
+        type="illness"
+        :width="120"
+        :selected="tabSelected"
+        :data="tabData"
+        @item-click="callTab"
+      />
+      <XTForm :form-data="formData" />
+    </div>
+    <div class="flex">
+      <Sift :data="siftData" />
+    </div>
+    <div class="m-6">
+      <BasicForm @register="registerForm" @field-value-change="filedChange" />
+    </div>
+  </div>
 </template>
 
-<script setup lang="ts"></script>
+<script setup lang="ts">
+  import { ref } from 'vue';
+  import { XTTab } from '/@/components/XTTab/index';
+  import { XTForm } from '/@/components/XTForm/index';
+  import { BasicForm, useForm } from '/@/components/Form';
+  import { dataFormSchema } from './data';
+  import { onMounted } from 'vue';
+  import { Sift } from '/@/components/XTList/index';
 
-<style lang="less" scoped></style>
+  const tabSelected = ref('0');
+  const dataSource = ref([]);
+  const siftData = [
+    {
+      field: 'gender',
+      label: '性别',
+      value: '男',
+    },
+    {
+      field: 'age',
+      label: '年龄区间',
+      value: '25岁-50岁',
+    },
+  ];
+
+  onMounted(async () => {
+    for (let i = 0; i < 10; i++) {
+      const obj = {
+        createTime: '2023-05-23 10:09:48',
+        updateTime: '2023-05-23 19:00:32',
+        id: '1660830352886149125' + Math.round(Math.random() * 10000),
+        name: '驼人',
+        packageId: '1655202440997244930',
+        packageName: '测试套餐',
+        username: 'tuoren',
+        type: 'custom',
+        contractUser: 'Lf',
+        contactMobile: '18339543638',
+        remark: null,
+        disable: 0,
+      };
+      dataSource.value.push(obj);
+    }
+
+    await setFieldsValue({
+      configName333: {
+        bool: 1,
+        remark: '321321dsada',
+        dictValues: ['DIC_BIZ', '-1'],
+      },
+      configValue: [100, 150],
+      idCard: {
+        input: '测试',
+        dictValue: 'DICT_SYS',
+      },
+      apiCheck: ['pump_single'],
+    });
+  });
+  const [registerForm, { setFieldsValue }] = useForm({
+    layout: 'vertical',
+    labelWidth: '100%',
+    baseColProps: {
+      span: 8,
+    },
+    baseRowGutter: [16, 8],
+    schemas: dataFormSchema,
+    showActionButtonGroup: false,
+    actionColOptions: {
+      span: 8,
+    },
+    showResetButton: false,
+    submitButtonOptions: {
+      text: '添加',
+    },
+  });
+
+  function filedChange(key, value) {
+    console.log('🚀 ~ file: index.vue:47 ~ filedChange ~ value:', value);
+    console.log('🚀 ~ file: index.vue:47 ~ filedChange ~ key:', key);
+  }
+  const tabData = [
+    {
+      key: '0',
+      label: '全部',
+      value: 128,
+      hasValue: true,
+      hasBracket: true,
+    },
+    {
+      key: '1',
+      label: 'A区',
+      value: 12,
+      hasValue: true,
+      prefixColor: '#1BC1B3',
+      valueColor: 'red',
+      hasBracket: true,
+    },
+    {
+      key: '2',
+      label: 'B区',
+      value: 18,
+      hasValue: true,
+      prefixColor: '#854AFF',
+      hasBracket: true,
+    },
+  ];
+  // formdata
+  const formData = [
+    {
+      name: 'text',
+      label: '全部',
+      componentType: 'Select',
+      placeholder: '请选择',
+      width: 80,
+      defaultValue: '1',
+      dicts: [
+        { label: '全部', value: '1' },
+        { label: '未称量', value: '2', prefixColor: '#1BC1B3' },
+        { label: '待确认', value: '3', prefixColor: '#854AFF' },
+        { label: '可打印', value: '4', prefixColor: '#1BC1B3' },
+        { label: '完成', value: '5', prefixColor: '#854AFF' },
+      ],
+    },
+    {
+      name: 'text22',
+      componentType: 'Select',
+      placeholder: '请选择',
+      width: 120,
+      defaultValue: '1',
+      label: '班次',
+      dicts: [
+        { label: '第一班', value: '1' },
+        { label: '第二班', value: '2' },
+        { label: '第三班', value: '3' },
+      ],
+    },
+    {
+      name: 'text1',
+      componentType: 'Input',
+      placeholder: '请输入',
+      width: 200,
+    },
+    {
+      name: 'text233',
+      componentType: 'DatePicker',
+      placeholder: '请输入',
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+    },
+    {
+      name: 'text233',
+      componentType: 'RangePicker',
+      placeholder: '请输入',
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+    },
+    {
+      name: 'filter',
+      componentType: 'IconBtn',
+      count: 4,
+    },
+  ];
+  // 回调
+  function callTab(data) {
+    console.log('🚀 ~ file: index.vue:41 ~ callTab ~ data:', data);
+    tabSelected.value = data.value;
+  }
+</script>
+
+<style lang="less" scoped>
+  ::v-deep(.ant-form-item-label > label) {
+    width: 100% !important;
+  }
+
+  .timeline-outer {
+    display: flex;
+    margin-left: 20px;
+    transition: all 0.3s ease-in-out;
+
+    &_item {
+      padding: 0 30px;
+      height: 40px;
+      line-height: 40px;
+      border-radius: 30px;
+      color: #fff;
+      background: #0075ff;
+      margin-right: 20px;
+      cursor: pointer;
+    }
+  }
+</style>

+ 0 - 0
src/views/demo/list/data.ts


+ 73 - 0
src/views/demo/list/index.vue

@@ -0,0 +1,73 @@
+<template>
+  <div class="m-4">
+    <div class="mx-6 my-2">
+      <List type="default" :data="listData" selected="0" />
+    </div>
+    <div class="mx-6 my-2">
+      <List type="attachment" :data="listData1" selected="0" :width="320" />
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+  import { onMounted } from 'vue';
+  import List from '@/components/XTList/src/List.vue';
+
+  const listData = [
+    {
+      id: '0',
+      title: '红细胞笔迹测定',
+      startTime: '2023-11-11 12:00',
+      endTime: '2023-12-11 12:00',
+      status: 'default',
+    },
+    {
+      id: '2',
+      title: '红细胞笔迹测定2',
+      startTime: '2023-11-11 12:00',
+      endTime: '2023-12-11 12:00',
+      status: 'default',
+    },
+  ];
+  const listData1 = [
+    {
+      id: '0',
+      title: '红细胞笔迹测定',
+      startTime: '2023-11-11 12:00',
+      endTime: '2023-12-11 12:00',
+      status: 'default',
+    },
+    {
+      id: '2',
+      title: '红细胞笔迹测定2',
+      startTime: '2023-11-11 12:00',
+      endTime: '2023-12-11 12:00',
+      status: 'default',
+    },
+  ];
+
+  onMounted(async () => {});
+</script>
+
+<style lang="less" scoped>
+  ::v-deep(.ant-form-item-label > label) {
+    width: 100% !important;
+  }
+
+  .timeline-outer {
+    display: flex;
+    margin-left: 20px;
+    transition: all 0.3s ease-in-out;
+
+    &_item {
+      padding: 0 30px;
+      height: 40px;
+      line-height: 40px;
+      border-radius: 30px;
+      color: #fff;
+      background: #0075ff;
+      margin-right: 20px;
+      cursor: pointer;
+    }
+  }
+</style>

+ 201 - 3
src/views/demo/tab/index.vue

@@ -1,7 +1,205 @@
 <template>
-  <div> 占位符 </div>
+  <div class="m-4">
+    <div class="mt-6" />
+    <XTTab type="illness11" :selected="tabSelected" :data="tabData1" @item-click="callTab" />
+    <div class="mt-6" />
+    <div class="mt-6" />
+    <XTTab type="illness11" :selected="tabSelected" :data="tabData2" @item-click="callTab" />
+    <div class="mt-6" />
+    <div class="flex justify-between my-4">
+      <XTTab
+        type="illness"
+        :width="120"
+        :selected="tabSelected"
+        :data="tabData"
+        @item-click="callTab"
+      />
+      <XTForm :form-data="formData" />
+    </div>
+    <div class="flex">
+      <Sift :data="siftData" />
+    </div>
+  </div>
 </template>
 
-<script setup lang="ts"></script>
+<script setup lang="ts">
+  import { ref } from 'vue';
+  import { XTTab } from '/@/components/XTTab/index';
+  import { XTForm } from '/@/components/XTForm/index';
+  import { onMounted } from 'vue';
+  import { Sift } from '/@/components/XTList/index';
 
-<style lang="less" scoped></style>
+  const tabSelected = ref('0');
+  const dataSource = ref([]);
+  const siftData = [
+    {
+      field: 'gender',
+      label: '性别',
+      value: '男',
+    },
+    {
+      field: 'age',
+      label: '年龄区间',
+      value: '25岁-50岁',
+    },
+  ];
+  onMounted(async () => {
+    for (let i = 0; i < 10; i++) {
+      const obj = {
+        createTime: '2023-05-23 10:09:48',
+        updateTime: '2023-05-23 19:00:32',
+        id: '1660830352886149125' + Math.round(Math.random() * 10000),
+        name: '驼人',
+        packageId: '1655202440997244930',
+        packageName: '测试套餐',
+        username: 'tuoren',
+        type: 'custom',
+        contractUser: 'Lf',
+        contactMobile: '18339543638',
+        remark: null,
+        disable: 0,
+      };
+      dataSource.value.push(obj);
+    }
+  });
+  const tabData = [
+    {
+      key: '0',
+      label: '全部',
+      value: 128,
+      hasValue: true,
+      hasBracket: true,
+    },
+    {
+      key: '1',
+      label: 'A区',
+      value: 12,
+      hasValue: true,
+      prefixColor: '#1BC1B3',
+      valueColor: 'red',
+      hasBracket: true,
+    },
+    {
+      key: '2',
+      label: 'B区',
+      value: 18,
+      hasValue: true,
+      prefixColor: '#854AFF',
+      hasBracket: true,
+    },
+  ];
+  const tabData2 = [
+    {
+      key: '0',
+      label: 'A1',
+    },
+    {
+      key: '1',
+      label: 'A2',
+      disabled: true,
+    },
+    {
+      key: '2',
+      label: 'B3',
+    },
+  ];
+  const tabData1 = [
+    {
+      key: '0',
+      label: '全部',
+    },
+    {
+      key: '1',
+      label: 'A区',
+    },
+    {
+      key: '2',
+      label: 'B区',
+    },
+  ];
+  // formdata
+  const formData = [
+    {
+      name: 'text',
+      label: '全部',
+      componentType: 'Select',
+      placeholder: '请选择',
+      width: 80,
+      defaultValue: '1',
+      dicts: [
+        { label: '全部', value: '1' },
+        { label: '未称量', value: '2', prefixColor: '#1BC1B3' },
+        { label: '待确认', value: '3', prefixColor: '#854AFF' },
+        { label: '可打印', value: '4', prefixColor: '#1BC1B3' },
+        { label: '完成', value: '5', prefixColor: '#854AFF' },
+      ],
+    },
+    {
+      name: 'text22',
+      componentType: 'Select',
+      placeholder: '请选择',
+      width: 120,
+      defaultValue: '1',
+      label: '班次',
+      dicts: [
+        { label: '第一班', value: '1' },
+        { label: '第二班', value: '2' },
+        { label: '第三班', value: '3' },
+      ],
+    },
+    {
+      name: 'text1',
+      componentType: 'Input',
+      placeholder: '请输入',
+      width: 200,
+    },
+    {
+      name: 'text233',
+      componentType: 'DatePicker',
+      placeholder: '请输入',
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+    },
+    {
+      name: 'text233',
+      componentType: 'RangePicker',
+      placeholder: '请输入',
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+    },
+    {
+      name: 'filter',
+      componentType: 'IconBtn',
+      count: 4,
+    },
+  ];
+
+  // 回调
+  function callTab(data) {
+    console.log('🚀 ~ file: index.vue:41 ~ callTab ~ data:', data);
+    tabSelected.value = data.value;
+  }
+</script>
+
+<style lang="less" scoped>
+  ::v-deep(.ant-form-item-label > label) {
+    width: 100% !important;
+  }
+
+  .timeline-outer {
+    display: flex;
+    margin-left: 20px;
+    transition: all 0.3s ease-in-out;
+
+    &_item {
+      padding: 0 30px;
+      height: 40px;
+      line-height: 40px;
+      border-radius: 30px;
+      color: #fff;
+      background: #0075ff;
+      margin-right: 20px;
+      cursor: pointer;
+    }
+  }
+</style>

+ 167 - 0
src/views/demo/title/ShortcutModal.vue

@@ -0,0 +1,167 @@
+<template>
+  <BasicModal
+    :title="getTitle"
+    :canFullscreen="false"
+    @register="registerModal"
+    @ok="handleSubmit"
+    @cancel="handleSubmit"
+    width="580px"
+  >
+    <div class="wrap shortcut">
+      <div
+        :class="[
+          'shortcut-item',
+          item.selected ? 'shortcut-item--seleted' : '',
+          !item.selected && disabled ? 'shortcut-item--disabled' : '',
+        ]"
+        v-for="item in shortcutData"
+        :key="item.name"
+        @click="selectedShortcut(item)"
+      >
+        <i :class="['iconfont shortcut-item_icon', 'icon-xt-fail']" />
+        <div class="shortcut-item_name">{{ item.name }}</div>
+      </div>
+    </div>
+  </BasicModal>
+</template>
+
+<script setup lang="ts">
+  import { BasicModal, useModalInner } from '@/components/Modal';
+  import { computed } from 'vue';
+  import { reactive } from 'vue';
+  import { ref } from 'vue';
+  const emit = defineEmits(['success']);
+  const getTitle = computed(() => '快捷入口(已选' + count.curr + '/' + count.total + ')');
+  const count = reactive({
+    total: 4,
+    curr: 1,
+  });
+  const disabled = ref<boolean>(false);
+  const shortcutData = ref([
+    {
+      icon: 'icon-xt-fail',
+      name: '透前准备',
+      route: '/bizArchives/index',
+      selected: false,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '透析室',
+      route: '/bizArchives/index',
+      selected: false,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '查房',
+      route: '/bizVisit/check',
+      selected: true,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '交班记录',
+      route: '/bizArchives/handover_shifts',
+      selected: false,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '透前准备1',
+      route: '/bizArchives/index',
+      selected: false,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '透析室1',
+      route: '/bizArchives/index',
+      selected: false,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '查房1',
+      route: '/bizVisit/check',
+      selected: true,
+    },
+    {
+      icon: 'icon-xt-fail',
+      name: '交班记录1s',
+      route: '/bizArchives/handover_shifts',
+      selected: false,
+    },
+  ]);
+  const [registerModal, { setModalProps, closeModal }] = useModalInner(async data => {
+    console.log('🚀 ~ file: code.vue:21 ~ data:', data);
+    setModalProps({ confirmLoading: false });
+    disabledShortcut();
+  });
+
+  function selectedShortcut(data) {
+    console.log('🚀 ~ file: ShortcutModal.vue:67 ~ data:', data);
+    if (count.curr == count.total && !data.selected) return;
+    shortcutData.value = shortcutData.value.map(ele => {
+      if (ele.name == data.name) {
+        ele.selected = !ele.selected;
+      }
+      return ele;
+    });
+    disabledShortcut();
+  }
+  function disabledShortcut() {
+    count.curr = shortcutData.value.filter(ele => ele.selected).length;
+    if (count.curr == count.total) {
+      disabled.value = true;
+    } else {
+      disabled.value = false;
+    }
+  }
+  async function handleSubmit() {
+    console.log('提交请求');
+    emit('success');
+    closeModal();
+  }
+</script>
+
+<style lang="less" scoped>
+  .wrap {
+    padding: 8px;
+  }
+
+  .shortcut {
+    display: flex;
+    justify-content: space-between;
+    flex-wrap: wrap;
+
+    &-item {
+      width: 120px;
+      height: 120px;
+      border-radius: 8px;
+      cursor: pointer;
+      margin-bottom: 18px;
+
+      &_icon {
+        display: block;
+        text-align: center;
+        padding: 20px 10px;
+        font-size: 24px;
+        margin-right: 4px;
+      }
+
+      &_name {
+        text-align: center;
+      }
+
+      &--seleted {
+        border: 1px solid #006dff;
+        background: #ecf0f5;
+      }
+
+      &--disabled {
+        color: #d3dadf;
+        background: #f4f5f7;
+        cursor: not-allowed;
+      }
+
+      &:hover {
+        box-shadow: 0 0 18px 0 rgb(0 37 74 / 12%);
+      }
+    }
+  }
+</style>

+ 26 - 428
src/views/demo/title/index.vue

@@ -1,33 +1,5 @@
 <template>
   <div class="m-4">
-    <!-- 透前准备
-    <a-button type="primary" @click="plusFn">
-      {{ countRef }}
-    </a-button> -->
-    <XTTitle title="透析病历" :right-data="titleData" />
-
-    <div class="mt-6" />
-    <XTTab type="illness11" :selected="tabSelected" :data="tabData1" @item-click="callTab" />
-    <div class="mt-6" />
-    <div class="mt-6" />
-    <XTTab type="illness11" :selected="tabSelected" :data="tabData2" @item-click="callTab" />
-    <div class="mt-6" />
-    <div class="flex justify-between my-4">
-      <XTTab
-        type="illness"
-        :width="120"
-        :selected="tabSelected"
-        :data="tabData"
-        @item-click="callTab"
-      />
-      <XTForm :form-data="formData" />
-    </div>
-    <div class="flex">
-      <Sift :data="siftData" />
-    </div>
-    <div class="m-6">
-      <BasicForm @register="registerForm" @field-value-change="filedChange" />
-    </div>
     <div>
       <BasicTable @register="registerTable">
         <template #headerTop>
@@ -38,24 +10,7 @@
         </template>
       </BasicTable>
     </div>
-    <div class="mx-6 my-2">
-      <ChartsCard
-        title="透前血压趋势"
-        :has-safe="true"
-        :colors="chartData.colors"
-        :safe-range="chartData.safeRange"
-      />
-    </div>
-    <div class="mx-6 my-2">
-      <DescCard
-        id="1"
-        icon="icon-xt-add_default"
-        title="透析测量"
-        type="touxi"
-        :data="descData"
-        :right="descRight"
-      />
-    </div>
+
     <div class="mx-6 my-2">
       <TimeLine :data="timeLineData" @hover="callHover">
         <template #head>
@@ -69,118 +24,32 @@
         </template>
       </TimeLine>
     </div>
-    <div class="mx-6 my-2">
-      <List type="default" :data="listData" selected="0" />
-    </div>
-    <div class="mx-6 my-2">
-      <List type="attachment" :data="listData1" selected="0" :width="320" />
-    </div>
-    <div class="flex justify-between">
-      <XTCard class="m-2" :data="cardData1" @item-click="cellCard" />
+    <div class="mx-6 my-4">
+      <a-button type="primary" @click="showImport"> 显示导入</a-button>
     </div>
-    <div class="flex justify-between">
-      <XTCard class="m-2" :data="cardData" @item-click="cellCard" />
+    <div class="mx-6 my-4">
+      <a-button type="primary" @click="showShortcut"> 显示快捷方式</a-button>
     </div>
+    <ImportModal @register="registerModal" />
+    <ShortcutModal @register="registerModalShortcut" />
   </div>
 </template>
 
 <script setup lang="ts">
   import { ref } from 'vue';
-  import { XTTab } from '/@/components/XTTab/index';
-  import { XTCard } from '/@/components/XTCard/index';
-  import { XTForm } from '/@/components/XTForm/index';
-  import { XTTitle } from '/@/components/XTTitle/index';
-  import { ColorEnum } from '/@/enums/colorEnum';
-  import { BasicForm, useForm } from '/@/components/Form';
-  import { dataFormSchema, columns } from './data';
   import { BasicTable, useTable } from '/@/components/Table';
   import { onMounted } from 'vue';
-  import ChartsCard from '/@/components/XTCard/src/ChartsCard.vue';
-  import DescCard from '/@/components/XTCard/src/DescCard.vue';
+  import { columns } from './data';
   import TimeLine from '/@/components/XTTimeLine/src/TimeLine.vue';
-  import List from '/@/components/XTList/src/List.vue';
-  import { Sift } from '/@/components/XTList/index';
+  import { ImportModal } from '/@/components/XTImport/index';
   // import { TransitionPresets, useTransition } from '@vueuse/core';
+  import { useModal } from '/@/components/Modal';
+  import { Api } from '/@/api/biz/archives/patientBasicApi';
+  import ShortcutModal from './ShortcutModal.vue';
 
-  const tabSelected = ref('0');
+  const [registerModal, { openModal }] = useModal();
+  const [registerModalShortcut, { openModal: openModalShortcut }] = useModal();
   const dataSource = ref([]);
-  const titleData = [
-    {
-      type: 'import',
-      icon: 'icon-xt-import_default',
-    },
-    {
-      type: 'export',
-      icon: 'icon-xt-export_default',
-    },
-    {
-      type: 'add',
-      btnIcon: 'icon-xt-add_default',
-      btnText: '患者建档',
-    },
-  ];
-  const siftData = [
-    {
-      field: 'gender',
-      label: '性别',
-      value: '男',
-    },
-    {
-      field: 'age',
-      label: '年龄区间',
-      value: '25岁-50岁',
-    },
-  ];
-  const chartData = {
-    colors: [
-      {
-        color: 'rgba(0, 117, 255, 1)',
-        label: '化验值',
-        dot: 'rgba(0, 117, 255, 1)',
-      },
-    ],
-    safeRange: [
-      {
-        // name: '60分到80分',
-        yAxis: 0,
-      },
-      {
-        yAxis: 20,
-      },
-    ],
-  };
-  const listData = [
-    {
-      id: '0',
-      title: '红细胞笔迹测定',
-      startTime: '2023-11-11 12:00',
-      endTime: '2023-12-11 12:00',
-      status: 'default',
-    },
-    {
-      id: '2',
-      title: '红细胞笔迹测定2',
-      startTime: '2023-11-11 12:00',
-      endTime: '2023-12-11 12:00',
-      status: 'default',
-    },
-  ];
-  const listData1 = [
-    {
-      id: '0',
-      title: '红细胞笔迹测定',
-      startTime: '2023-11-11 12:00',
-      endTime: '2023-12-11 12:00',
-      status: 'default',
-    },
-    {
-      id: '2',
-      title: '红细胞笔迹测定2',
-      startTime: '2023-11-11 12:00',
-      endTime: '2023-12-11 12:00',
-      status: 'default',
-    },
-  ];
 
   const descData = [
     {
@@ -205,13 +74,6 @@
       ],
     },
   ];
-  const descRight = {
-    show: true,
-    date: '2023-04-23',
-    doctor: '张医生',
-    edit: true,
-    delete: true,
-  };
 
   const timeLineData = [
     {
@@ -256,20 +118,6 @@
       };
       dataSource.value.push(obj);
     }
-
-    await setFieldsValue({
-      configName333: {
-        bool: 1,
-        remark: '321321dsada',
-        dictValues: ['DIC_BIZ', '-1'],
-      },
-      configValue: [100, 150],
-      idCard: {
-        input: '测试',
-        dictValue: 'DICT_SYS',
-      },
-      apiCheck: ['pump_single'],
-    });
   });
   // const count = ref(0);
   // const countRef = useTransition(count, {
@@ -299,273 +147,23 @@
     canResize: false,
   });
 
-  const [registerForm, { setFieldsValue }] = useForm({
-    layout: 'vertical',
-    labelWidth: '100%',
-    baseColProps: {
-      span: 8,
-    },
-    baseRowGutter: [16, 8],
-    schemas: dataFormSchema,
-    showActionButtonGroup: false,
-    actionColOptions: {
-      span: 8,
-    },
-    showResetButton: false,
-    submitButtonOptions: {
-      text: '添加',
-    },
-  });
-
-  function filedChange(key, value) {
-    console.log('🚀 ~ file: index.vue:47 ~ filedChange ~ value:', value);
-    console.log('🚀 ~ file: index.vue:47 ~ filedChange ~ key:', key);
-  }
-  const tabData = [
-    {
-      key: '0',
-      label: '全部',
-      value: 128,
-      hasValue: true,
-      hasBracket: true,
-    },
-    {
-      key: '1',
-      label: 'A区',
-      value: 12,
-      hasValue: true,
-      prefixColor: '#1BC1B3',
-      valueColor: 'red',
-      hasBracket: true,
-    },
-    {
-      key: '2',
-      label: 'B区',
-      value: 18,
-      hasValue: true,
-      prefixColor: '#854AFF',
-      hasBracket: true,
-    },
-  ];
-  const tabData2 = [
-    {
-      key: '0',
-      label: 'A1',
-    },
-    {
-      key: '1',
-      label: 'A2',
-      disabled: true,
-    },
-    {
-      key: '2',
-      label: 'B3',
-    },
-  ];
-  const tabData1 = [
-    {
-      key: '0',
-      label: '全部',
-    },
-    {
-      key: '1',
-      label: 'A区',
-    },
-    {
-      key: '2',
-      label: 'B区',
-    },
-  ];
-  // formdata
-  const formData = [
-    {
-      name: 'text',
-      label: '全部',
-      componentType: 'Select',
-      placeholder: '请选择',
-      width: 80,
-      defaultValue: '1',
-      dicts: [
-        { label: '全部', value: '1' },
-        { label: '未称量', value: '2', prefixColor: '#1BC1B3' },
-        { label: '待确认', value: '3', prefixColor: '#854AFF' },
-        { label: '可打印', value: '4', prefixColor: '#1BC1B3' },
-        { label: '完成', value: '5', prefixColor: '#854AFF' },
-      ],
-    },
-    {
-      name: 'text22',
-      componentType: 'Select',
-      placeholder: '请选择',
-      width: 120,
-      defaultValue: '1',
-      label: '班次',
-      dicts: [
-        { label: '第一班', value: '1' },
-        { label: '第二班', value: '2' },
-        { label: '第三班', value: '3' },
-      ],
-    },
-    {
-      name: 'text1',
-      componentType: 'Input',
-      placeholder: '请输入',
-      width: 200,
-    },
-    {
-      name: 'text233',
-      componentType: 'DatePicker',
-      placeholder: '请输入',
-      format: 'YYYY-MM-DD',
-      valueFormat: 'YYYY-MM-DD',
-    },
-    {
-      name: 'text233',
-      componentType: 'RangePicker',
-      placeholder: '请输入',
-      format: 'YYYY-MM-DD',
-      valueFormat: 'YYYY-MM-DD',
-    },
-    {
-      name: 'filter',
-      componentType: 'IconBtn',
-      count: 4,
-    },
-  ];
-  // card 标签组
-  const cardData = [
-    {
-      groupKey: '123',
-      groupTit: '待确认/测试/待核对',
-      groupMode: 'default',
-      groupValue: [
-        { value: 10, color: ColorEnum.BLUE, background: ColorEnum.BLUE_BG },
-        { value: 1, color: ColorEnum.MUTED, background: ColorEnum.MUTED_BG },
-        { value: 4, color: ColorEnum.PRIMARY, background: ColorEnum.PRIMARY_BG },
-      ],
-      groupValueShow: true,
-      groupData: [
-        {
-          id: '1',
-          type: '1',
-          borderLeftColor: ColorEnum.BLUE,
-          ward: 'A区',
-          bed: '99',
-          cure: 'HDF/AVF',
-          name: '范了饭饭饭',
-          age: 20,
-          gender: '1',
-          infoShow: true,
-          info: [
-            { label: '时间', value: '4:00', span: 12 },
-            { label: '超滤量', value: '2.1', suffix: 'kg', span: 12 },
-            { label: '血流量', value: '300', span: 12 },
-            { label: '透析器', value: 'fx60', span: 12 },
-            { label: '抗凝剂', value: '低分子肝素1配上低分子肝素2', span: 24 },
-          ],
-          way: [
-            { label: '下机', type: '0' },
-            { label: '医嘱执行', type: '1', badge: 12 },
-            { label: '记录并发症', type: '2', badge: 2 },
-            { label: '交叉核对', type: '3' },
-          ],
-        },
-        {
-          id: '12',
-          type: '2',
-          borderLeftColor: ColorEnum.PRIMARY,
-          ward: 'C区',
-          bed: '99',
-          cure: 'HDF/AVF',
-          name: '范了饭饭饭',
-          age: 20,
-          gender: '1',
-          infoShow: true,
-          info: [
-            { label: '时间', value: '4:00', span: 12 },
-            { label: '超滤量', value: '2.1', suffix: 'kg', span: 12 },
-            { label: '血流量', value: '300', span: 12 },
-            { label: '透析器', value: 'fx60', span: 12 },
-            { label: '抗凝剂', value: '低分子肝素1配上低分子肝素2', span: 24 },
-          ],
-          way: [
-            { label: '下机', type: '0' },
-            { label: '医嘱执行', type: '1', badge: 12 },
-            { label: '记录并发症', type: '2', badge: 2 },
-            { label: '交叉核对', type: '3' },
-          ],
-        },
-        {
-          id: '3',
-          type: '3',
-          borderLeftColor: ColorEnum.MUTED,
-          ward: 'C区',
-          bed: '99',
-          cure: 'HDF/AVF',
-          name: '范了饭饭饭',
-          age: 20,
-          gender: '1',
-          infoShow: true,
-          info: [
-            { label: '时间', value: '4:00', span: 12 },
-            { label: '超滤量', value: '2.1', suffix: 'kg', span: 12 },
-            { label: '血流量', value: '300', span: 12 },
-            { label: '透析器', value: 'fx60', span: 12 },
-            { label: '抗凝剂', value: '低分子肝素1配上低分子肝素2', span: 24 },
-          ],
-          way: [
-            { label: '下机', type: '0' },
-            { label: '医嘱执行', type: '1', badge: 12 },
-            { label: '记录并发症', type: '2', badge: 2 },
-            { label: '交叉核对', type: '3' },
-          ],
-        },
-      ],
-    },
-  ];
-  const cardData1 = [
-    {
-      groupKey: '123',
-      groupTit: '待确认/测试',
-      groupMode: 'simple',
-      groupValue: [
-        { value: 10, color: ColorEnum.BLUE, background: ColorEnum.BLUE_BG },
-        { value: 1, color: ColorEnum.MUTED, background: ColorEnum.MUTED_BG },
-      ],
-      groupValueShow: true,
-      groupData: [
-        {
-          id: '1',
-          type: '1',
-          borderLeftColor: ColorEnum.BLUE,
-          ward: 'A区',
-          bed: '99',
-          cure: 'HDF/AVF',
-          name: '范了饭饭饭',
-          age: 20,
-          gender: '1',
-          infoShow: false,
-          way: [
-            { label: '透前称量', type: '2' },
-            { label: '确认配方', type: '3' },
-          ],
-        },
-      ],
-    },
-  ];
-
   function handleAdd() {
     timeOuter.value = false;
   }
-  // 回调
-  function callTab(data) {
-    console.log('🚀 ~ file: index.vue:41 ~ callTab ~ data:', data);
-    tabSelected.value = data.value;
-  }
 
-  function cellCard(data) {
-    console.log('🚀 ~ file: index.vue:106 ~ cellCard ~ data:', data);
+  function showImport() {
+    openModal(true, {
+      title: '导入数据111',
+      uploadUrl: Api.archivesPatientBasicImportBatch,
+    });
   }
+  function showShortcut() {
+    console.log('显示快捷方式');
+    openModalShortcut(true, {
+      title: '导入数据111',
+    });
+  }
+  // 回调
 
   function callHover() {
     timeOuter.value = true;