huangxw 10 mēneši atpakaļ
vecāks
revīzija
56d239ccf4

+ 1 - 1
package.json

@@ -47,7 +47,7 @@
     "vue-json-pretty": "2.4.0",
     "vue-router": "4.4.5",
     "vue-types": "5.1.3",
-    "vxe-table": "^4.11.18"
+    "vxe-table": "4.6.17"
   },
   "devDependencies": {
     "@eslint/js": "9.15.0",

+ 2 - 2
src/assets/styles/variables.module.scss

@@ -4,7 +4,7 @@
   --menuColor: #bfcbd9;
   --menuActiveText: #f4f4f5;
   --menuHover: #263445;
-
+  --el-color-primary: #2c9049;
   --subMenuBg: #1f2d3d;
   --subMenuActiveText: #f4f4f5;
   --subMenuHover: #001528;
@@ -106,7 +106,7 @@ $fixed-header-bg: var(--fixedHeaderBg);
 $table-header-bg: var(--tableHeaderBg);
 $table-header-text-color: var(--tableHeaderTextColor);
 
-$--color-primary: #409eff;
+$--color-primary: #2c9049;
 $--color-success: #67c23a;
 $--color-warning: #e6a23c;
 $--color-danger: #f56c6c;

+ 28 - 0
src/assets/styles/vxe-table.scss

@@ -0,0 +1,28 @@
+$vxe-primary-color: #2c9049;
+@import 'vxe-table/styles/index.scss';
+[data-vxe-table-theme="default"] {
+    --vxe-modal-header-background-color: #fff;
+    --vxe-table-row-hover-background-color:#fafafa;
+    
+    --vxe-font-family: PingFang, PingFang SC, Microsoft YaHei, Arial, sans-serif, Helvetica Neue, Helvetica, Hiragino Sans GB;
+}
+[data-vxe-ui-theme=light] {
+    --vxe-table-row-checkbox-checked-background-color: #e6f7ff;
+    --vxe-table-row-hover-checkbox-checked-background-color: #e6f7ff;
+    --vxe-font-family: PingFang, PingFang SC, Microsoft YaHei, Arial, sans-serif, Helvetica Neue, Helvetica, Hiragino Sans GB;
+}
+.table-box-row-highlight {
+    --vxe-table-row-radio-checked-background-color: #e6f7ff;
+}
+.vxe-header--row.tb-hd-inner {
+    background-color: #fafcfb;
+}
+.vxe-body--row.tb-ce-td{
+    background-color: #fafcfb;
+}
+
+.is--expand-row.row--hover {
+    & + .vxe-body--expanded-row {
+        background-color: var(--vxe-table-row-hover-background-color);
+    }
+}

+ 80 - 84
src/layout/components/Settings/index.vue

@@ -1,90 +1,86 @@
 <template>
-  <el-drawer v-model="showSettings" :with-header="false" direction="rtl" size="300px" close-on-click-modal>
-    <h3 class="drawer-title">主题风格设置</h3>
-
-    <div class="setting-drawer-block-checbox">
-      <div class="setting-drawer-block-checbox-item" @click="handleTheme(SideThemeEnum.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>
+    <el-drawer v-model="showSettings" :with-header="false" direction="rtl" size="300px" close-on-click-modal>
+        <h3 class="drawer-title">主题风格设置</h3>
+
+        <div class="setting-drawer-block-checbox">
+            <div class="setting-drawer-block-checbox-item" @click="handleTheme(SideThemeEnum.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(SideThemeEnum.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>
+                </div>
+            </div>
         </div>
-      </div>
-      <div class="setting-drawer-block-checbox-item" @click="handleTheme(SideThemeEnum.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>
+        <div class="drawer-item">
+            <span>主题颜色</span>
+            <span class="comp-style">
+                <el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange" />
+            </span>
         </div>
-      </div>
-    </div>
-    <div class="drawer-item">
-      <span>主题颜色</span>
-      <span class="comp-style">
-        <el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange" />
-      </span>
-    </div>
-    <div class="drawer-item">
-      <span>深色模式</span>
-      <span class="comp-style">
-        <el-switch v-model="isDark" class="drawer-switch" @change="toggleDark" />
-      </span>
-    </div>
-
-    <el-divider />
-
-    <h3 class="drawer-title">系统布局配置</h3>
-
-    <div class="drawer-item">
-      <span>开启 TopNav</span>
-      <span class="comp-style">
-        <el-switch v-model="settingsStore.topNav" class="drawer-switch" @change="topNavChange" />
-      </span>
-    </div>
-
-    <div class="drawer-item">
-      <span>开启 Tags-Views</span>
-      <span class="comp-style">
-        <el-switch v-model="settingsStore.tagsView" class="drawer-switch" />
-      </span>
-    </div>
-
-    <div class="drawer-item">
-      <span>固定 Header</span>
-      <span class="comp-style">
-        <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" />
-      </span>
-    </div>
-
-    <div class="drawer-item">
-      <span>动态标题</span>
-      <span class="comp-style">
-        <el-switch v-model="settingsStore.dynamicTitle" class="drawer-switch" @change="dynamicTitleChange" />
-      </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-drawer>
+        <div class="drawer-item">
+            <span>深色模式</span>
+            <span class="comp-style">
+                <el-switch v-model="isDark" class="drawer-switch" @change="toggleDark" />
+            </span>
+        </div>
+
+        <el-divider />
+
+        <h3 class="drawer-title">系统布局配置</h3>
+
+        <div class="drawer-item">
+            <span>开启 TopNav</span>
+            <span class="comp-style">
+                <el-switch v-model="settingsStore.topNav" class="drawer-switch" @change="topNavChange" />
+            </span>
+        </div>
+
+        <div class="drawer-item">
+            <span>开启 Tags-Views</span>
+            <span class="comp-style">
+                <el-switch v-model="settingsStore.tagsView" class="drawer-switch" />
+            </span>
+        </div>
+
+        <div class="drawer-item">
+            <span>固定 Header</span>
+            <span class="comp-style">
+                <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" />
+            </span>
+        </div>
+
+        <div class="drawer-item">
+            <span>动态标题</span>
+            <span class="comp-style">
+                <el-switch v-model="settingsStore.dynamicTitle" class="drawer-switch" @change="dynamicTitleChange" />
+            </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-drawer>
 </template>
 
 <script setup lang="ts">

+ 3 - 12
src/main.ts

@@ -15,11 +15,7 @@ import directive from './directive';
 // 注册插件
 import plugins from './plugins/index'; // plugins
 
-// 高亮组件
-// import 'highlight.js/styles/a11y-light.css';
-import 'highlight.js/styles/atom-one-dark.css';
-import 'highlight.js/lib/common';
-import HighLight from '@highlightjs/vue-plugin';
+
 
 // svg图标
 import 'virtual:svg-icons-register';
@@ -32,24 +28,19 @@ import './permission';
 import i18n from '@/lang/index';
 
 // vxeTable
-import VXETable from 'vxe-table';
-import 'vxe-table/lib/style.css';
-VXETable.config({
-  zIndex: 999999
-});
 
+import { useTable } from './plugins/vxe-table';
 // 修改 el-dialog 默认点击遮照为不关闭
 import { ElDialog } from 'element-plus';
 ElDialog.props.closeOnClickModal.default = false;
 
 const app = createApp(App);
 
-app.use(HighLight);
+app.use(useTable);
 app.use(ElementIcons);
 app.use(router);
 app.use(store);
 app.use(i18n);
-app.use(VXETable);
 app.use(plugins);
 // 自定义指令
 directive(app);

+ 7 - 0
src/plugins/vxe-table.ts

@@ -0,0 +1,7 @@
+import { App } from 'vue';
+import VXETable from 'vxe-table';
+import '@/assets/styles/vxe-table.scss';
+
+export function useTable(app: App) {
+    app.use(VXETable);
+}

+ 57 - 57
src/settings.ts

@@ -1,62 +1,62 @@
 import { LanguageEnum } from '@/enums/LanguageEnum';
 
 const setting: DefaultSettings = {
-  /**
-   * 网页标题
-   */
-  title: import.meta.env.VITE_APP_TITLE,
-
-  theme: '#2c9049',
-
-  /**
-   * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
-   */
-  sideTheme: 'theme-dark',
-  /**
-   * 是否系统布局配置
-   */
-  showSettings: false,
-
-  /**
-   * 是否显示顶部导航
-   */
-  topNav: false,
-
-  /**
-   * 是否显示 tagsView
-   */
-  tagsView: false,
-
-  /**
-   * 是否固定头部
-   */
-  fixedHeader: false,
-
-  /**
-   * 是否显示logo
-   */
-  sidebarLogo: true,
-
-  /**
-   * 是否显示动态标题
-   */
-  dynamicTitle: false,
-
-  /**
-   * @type {string | array} 'production' | ['production', 'development']
-   * @description Need show err logs component.
-   * The default is only used in the production env
-   * If you want to also use it in dev, you can pass ['production', 'development']
-   */
-  errorLog: 'production',
-
-  animationEnable: false,
-
-  dark: false,
-  language: LanguageEnum.zh_CN,
-
-  size: 'default',
-
-  layout: ''
+    /**
+     * 网页标题
+     */
+    title: import.meta.env.VITE_APP_TITLE,
+
+    theme: '#2c9049',
+
+    /**
+     * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
+     */
+    sideTheme: 'theme-dark',
+    /**
+     * 是否系统布局配置
+     */
+    showSettings: false,
+
+    /**
+     * 是否显示顶部导航
+     */
+    topNav: false,
+
+    /**
+     * 是否显示 tagsView
+     */
+    tagsView: false,
+
+    /**
+     * 是否固定头部
+     */
+    fixedHeader: false,
+
+    /**
+     * 是否显示logo
+     */
+    sidebarLogo: true,
+
+    /**
+     * 是否显示动态标题
+     */
+    dynamicTitle: false,
+
+    /**
+     * @type {string | array} 'production' | ['production', 'development']
+     * @description Need show err logs component.
+     * The default is only used in the production env
+     * If you want to also use it in dev, you can pass ['production', 'development']
+     */
+    errorLog: 'production',
+
+    animationEnable: false,
+
+    dark: false,
+    language: LanguageEnum.zh_CN,
+
+    size: 'default',
+
+    layout: ''
 };
 export default setting;

+ 3 - 6
src/views/cdt/discount/index.vue

@@ -9,17 +9,14 @@
                     <!-- 序号 -->
                     <vxe-column type="seq" width="60" title="序号" align="center" />
                     <vxe-column title="会员级别" align="center" field="name" min-width="100" :formatter="colNoData" />
-                    <vxe-column title="折扣标准" align="center"  min-width="100">
-                        <template #default="{ row }">
-                           {{ row?.discount }}折
-                        </template>
+                    <vxe-column title="折扣标准" align="center" min-width="100">
+                        <template #default="{ row }">{{ row?.discount }}折</template>
                     </vxe-column>
                     <vxe-column title="创建人" align="center" field="createByName" min-width="100" :formatter="colNoData" />
                     <vxe-column title="创建时间" align="center" field="createTime" min-width="100" :formatter="colNoData" />
                 </vxe-table>
             </div>
-            <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum"
-                v-model:limit="queryParams.pageSize" @pagination="getList" />
+            <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
             <div class="pd-5"></div>
         </div>
     </div>

+ 22 - 14
src/views/cdt/items/index.vue

@@ -18,20 +18,26 @@
             </div>
             <div class="flex1 ov-hd d-flex content-border">
                 <div class="tree-wrap">
-                   <div v-show="tabActive === '1'">
-                    <el-tree ref="treeItemsRef" class="base-tree-tabs" auto-expand-parent default-expand-all node-key="id" :data="itemsData" :props="{ label: 'name' }" highlight-current @node-click="itemsClick" accordion>
-                        <template #default="{ node, data }">
-                            <span>{{ node.label }} <template v-if="!data?.children">({{ data?.itemCount || '0' }})</template></span>
-                        </template>
-                    </el-tree>
-                   </div>
-                   <div v-show="tabActive === '2'">
-                    <el-tree ref="treeStandardsRef" class="base-tree-tabs" auto-expand-parent :data="standards" node-key="id" :props="{ label: 'name' }" highlight-current @node-click="standardsClick" accordion>
-                        <template #default="{ node, data }">
-                            <span>{{ node.label }} <template v-if="!data?.children">({{ data?.itemCount || '0' }})</template></span>
-                        </template>
-                    </el-tree>
-                   </div>
+                    <div v-show="tabActive === '1'">
+                        <el-tree ref="treeItemsRef" class="base-tree-tabs" auto-expand-parent default-expand-all node-key="id" :data="itemsData" :props="{ label: 'name' }" highlight-current @node-click="itemsClick" accordion>
+                            <template #default="{ node, data }">
+                                <span>
+                                    {{ node.label }}
+                                    <template v-if="!data?.children">({{ data?.itemCount || '0' }})</template>
+                                </span>
+                            </template>
+                        </el-tree>
+                    </div>
+                    <div v-show="tabActive === '2'">
+                        <el-tree ref="treeStandardsRef" class="base-tree-tabs" auto-expand-parent :data="standards" node-key="id" :props="{ label: 'name' }" highlight-current @node-click="standardsClick" accordion>
+                            <template #default="{ node, data }">
+                                <span>
+                                    {{ node.label }}
+                                    <template v-if="!data?.children">({{ data?.itemCount || '0' }})</template>
+                                </span>
+                            </template>
+                        </el-tree>
+                    </div>
                 </div>
                 <div class="flex1 ov-hd d-flex flex-cln">
                     <div class="flex1 ov-hd">
@@ -103,12 +109,14 @@ const getTabsTree = async () => {
 const itemsClick = (data: any) => {
     if (!data.children) {
         queryParams.value.itemTypeId = data.id;
+        queryParams.value.packageId = '';
     }
     handleQuery()
 };
 const standardsClick = (data: any) => {
     if (!data.children) {
         queryParams.value.packageId = data.id;
+        queryParams.value.itemTypeId = '';
     }
     handleQuery()
 };

+ 3 - 1
src/views/cdt/menus/form/index.vue

@@ -97,15 +97,17 @@
             </div>
         </div>
     </div>
+    <TransferItems v-if="showSelectItems" v-model:show="showSelectItems"></TransferItems>
 </template>
 
 <script setup name="Member-detail" lang="ts">
 import { AddBtn, SearchSelect } from '@/views/models';
+import { TransferItems } from '../../models';
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 const { dm_package_type, dm_permit_type, vip_level } = toRefs<any>(proxy?.useDict('dm_package_type', 'dm_permit_type', 'vip_level'));
 // 字典
 const router = useRouter();
-const activeName = ref('info');
+const showSelectItems = ref(true);
 const form = ref<any>({
    items: []
 });

+ 1 - 0
src/views/cdt/models/index.ts

@@ -0,0 +1 @@
+export { default as TransferItems } from './transferItems.vue'; // 选择检测项目

+ 210 - 0
src/views/cdt/models/transferItems.vue

@@ -0,0 +1,210 @@
+<template>
+    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width">
+        <template #default>
+            <div style="height: 80vh" class="d-flex flex-cln">
+                <div class="pd-16 border-bottom d-flex j-sb pb-4">
+                    <div>
+                        <searchTabs v-model="tabActive" :list="[{ label: '按检测项目', value: '1' }, { label: '按执行标准', value: '2' }]" :is-num="false"></searchTabs>
+                    </div>
+                    <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="auto">
+                        <el-form-item label="检测项名称:" prop="name">
+                            <el-input v-model="queryParams.name" placeholder="请输入检测项名称关键字" clearable style="width: 180px" @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-form-item>
+                    </el-form>
+                </div>
+                <div class="flex1 ov-hd d-flex content-border">
+                    <div class="tree-wrap">
+                        <div v-show="tabActive === '1'">
+                            <el-tree ref="treeItemsRef" class="base-tree-tabs" auto-expand-parent default-expand-all node-key="id" :data="itemsData" :props="{ label: 'name' }" highlight-current @node-click="itemsClick" accordion>
+                                <template #default="{ node, data }">
+                                    <span>
+                                        {{ node.label }}
+                                        <template v-if="!data?.children">({{ data?.itemCount || '0' }})</template>
+                                    </span>
+                                </template>
+                            </el-tree>
+                        </div>
+                        <div v-show="tabActive === '2'">
+                            <el-tree ref="treeStandardsRef" class="base-tree-tabs" auto-expand-parent :data="standards" node-key="id" :props="{ label: 'name' }" highlight-current @node-click="standardsClick" accordion>
+                                <template #default="{ node, data }">
+                                    <span>
+                                        {{ node.label }}
+                                        <template v-if="!data?.children">({{ data?.itemCount || '0' }})</template>
+                                    </span>
+                                </template>
+                            </el-tree>
+                        </div>
+                    </div>
+                    <div class="flex1 ov-hd d-flex flex-cln">
+                        <div class="flex1 ov-hd">
+                            <vxe-table ref="tableLeftRef" :loading="loading" border :data="list" height="100%" :column-config="{ resizable: true }" :row-config="{keyField: 'id',isCurrent: true, isHover: true}" :checkbox-config="{ highlight: true, range: true, trigger: 'row', reserve: true }">
+                                <vxe-column type="checkbox" width="60"></vxe-column>
+                                <!-- 序号 -->
+                                <vxe-column type="seq" width="60" title="序号" align="center" />
+                                <vxe-column title="检测项目" align="center" field="name" min-width="100" :formatter="colNoData" />
+                                <vxe-column title="单价(元、批次)" align="center" field="price" min-width="100" :formatter="colNoData" />
+                            </vxe-table>
+                        </div>
+                    </div>
+                    <div class="d-flex j-c a-c flex-cln pd-10">
+                        <el-button type="primary" @click="transferRight">
+                            <el-icon>
+                                <DArrowRight />
+                            </el-icon>
+                        </el-button>
+                        <div class="pd-10"></div>
+                        <el-button type="primary" @click="transferLeft">
+                            <el-icon>
+                                <DArrowLeft />
+                            </el-icon>
+                        </el-button>
+                    </div>
+                    <div class="flex1 ov-hd d-flex flex-cln">
+                        <div class="flex1 ov-hd">
+                            <vxe-table ref="tableRightRef" :loading="loading" border :data="targetList" height="100%" :column-config="{ resizable: true }" :row-config="{ keyField: 'id', isCurrent: true, isHover: true }" :checkbox-config="{ highlight: true, range: true, trigger: 'row', reserve: true }">
+                                <vxe-column type="checkbox" width="60"></vxe-column>
+                                <vxe-column type="seq" width="60" title="序号" align="center" />
+                                <vxe-column title="检测项目" align="center" field="name" min-width="100" :formatter="colNoData" />
+                                <vxe-column title="单价(元、批次)" align="center" field="price" min-width="100" :formatter="colNoData" />
+                            </vxe-table>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </template>
+        <template #footer>
+            <el-button @click="close">取消</el-button>
+            <el-button type="primary" @click="submitForm">确认添加</el-button>
+        </template>
+    </vxe-modal>
+</template>
+
+<script setup name="transferItems" lang="ts">
+import { itemsList, itemsListByTree, itemsStandardList } from '@/api/cdt/items';
+import { colNoData } from '@/utils/noData';
+import { propTypes } from '@/utils/propTypes';
+import { searchTabs } from '@/views/models';
+import { FormInstance } from 'element-plus';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const dialogVisible = ref(false);
+const emit = defineEmits(['update:show', 'close', 'success']);
+const props = defineProps({
+    show: propTypes.bool.def(false),
+    title: propTypes.string.def('选择检测项目'),
+    width: propTypes.string.def('80vw'),
+    info: propTypes.any.def(null)
+});
+const treeItemsRef = ref<any>();
+const treeStandardsRef = ref<any>();
+const tabActive = ref('1');
+const queryParams = ref<any>({
+    pageNum: 1,
+    pageSize: 300,
+    name: '',
+    itemTypeId: '',
+    packageId: ''
+});
+const loading = ref(false);
+const total = ref(0);
+const list = ref<any>([]);
+const targetList = ref<any>([]);
+const itemsData = ref<any>([]);
+const getList = async () => {
+    loading.value = true;
+    const res = await itemsList(queryParams.value);
+    if (!res || res.code !== 200) return;
+    list.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
+};
+const handleQuery = () => {
+    queryParams.value.pageNum = 1;
+    getList();
+};
+const resetQuery = () => {
+    queryParams.value = {
+        pageNum: 1,
+        pageSize: 10,
+        name: '',
+        itemTypeId: '',
+        packageId: ''
+    };
+    // 重置树高亮
+    treeItemsRef.value?.setCurrentKey(null, true);
+    treeStandardsRef.value?.setCurrentKey(null, true);
+    handleQuery();
+};
+const getTabsTree = async () => {
+    const res = await itemsListByTree();
+    if (!res || res.code !== 200) return;
+    itemsData.value = res.data;
+};
+const itemsClick = (data: any) => {
+    if (!data.children) {
+        queryParams.value.itemTypeId = data.id;
+        queryParams.value.packageId = '';
+    }
+    handleQuery();
+};
+const standardsClick = (data: any) => {
+    if (!data.children) {
+        queryParams.value.packageId = data.id;
+        queryParams.value.itemTypeId = '';
+    }
+    handleQuery();
+};
+// 查询执行标准列表
+const standards = ref<any>([]);
+const getStandardList = async () => {
+    const res = await itemsStandardList({ pageNum: 1, pageSize: 10000 });
+    if (!res || res.code !== 200) return;
+    standards.value = res.rows;
+};
+const formRef = ref<FormInstance>();
+const close = () => {
+    emit('update:show', false);
+    emit('close', false);
+};
+const submitForm = async () => {
+    try {
+    } catch (error) { }
+};
+const tableLeftRef = ref<any>();
+const tableRightRef = ref<any>();
+const transferRight = () => {
+    targetList.value = tableLeftRef.value?.getCheckboxReserveRecords(true).concat(tableLeftRef.value?.getCheckboxRecords());
+};
+const transferLeft = () => {
+    targetList.value = targetList.value.filter((item: any) => !tableRightRef.value?.getCheckboxRecords().includes(item));
+    tableLeftRef.value?.setCheckboxRow(tableRightRef.value?.getCheckboxRecords(), false);
+    tableRightRef.value.setCheckboxRow(tableRightRef.value?.getCheckboxRecords(), false);
+};
+watch(
+    () => props.show,
+    (val) => {
+        dialogVisible.value = val;
+        if (val) {
+            getTabsTree();
+            getStandardList();
+        }
+    },
+    { immediate: true }
+);
+</script>
+<style lang="scss" scoped>
+.tree-wrap {
+    width: 310px;
+    box-sizing: border-box;
+    border-right: 1px solid #ebeef5;
+    padding: 16px;
+}
+
+.content-border {
+    border: 1px solid var(--border-color);
+}
+</style>

+ 1 - 2
src/views/dgtmedicine/model/index.ts

@@ -1,8 +1,7 @@
-// 上传发票组件
 export { default as uploadInvoiceForm } from './uploadInvoiceForm.vue'; // 上传发票
 export { default as CheckPass } from './CheckPass.vue'; // 审核为通过弹框
 export { default as CheckNoPass } from './CheckNoPass.vue'; // 审核为不通过弹框
 export { default as MemberInfo } from './MemberInfo.vue'; // 会员信息
 export { default as MemberPayLog } from './MemberPayLog.vue'; // 会员缴费记录
 export { default as EditVipLevel } from './EditVipLevel.vue'; // 修改级别
-export { default as EditVipEndDate } from './EditVipEndDate.vue'; // 修改会员有效期时间
+export { default as EditVipEndDate } from './EditVipEndDate.vue'; // 修改会员有效期时间

+ 54 - 65
vite.config.ts

@@ -4,71 +4,60 @@ import createPlugins from './vite/plugins';
 
 import path from 'path';
 export default defineConfig(({ mode, command }: ConfigEnv): UserConfig => {
-  const env = loadEnv(mode, process.cwd());
-  return {
-    // 部署生产环境和开发环境下的URL。
-    // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
-    // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
-    base: env.VITE_APP_CONTEXT_PATH,
-    resolve: {
-      alias: {
-        '~': path.resolve(__dirname, './'),
-        '@': path.resolve(__dirname, './src')
-      },
-      extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
-    },
-    // https://cn.vitejs.dev/config/#resolve-extensions
-    plugins: createPlugins(env, command === 'build'),
-    server: {
-      host: '0.0.0.0',
-      port: Number(env.VITE_APP_PORT),
-      open: true,
-      proxy: {
-        [env.VITE_APP_BASE_API]: {
-          // target: 'http://dm.yujin.shuziyunyao.com/api',
-          // target: 'http://dm.yujin.shuziyunyao.com/api',
-          target: 'http://192.168.1.68:8080',
-          changeOrigin: true,
-          ws: true,
-          rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
-        }
-      }
-    },
-    css: {
-      preprocessorOptions: {
-        scss: {
-          javascriptEnabled: true
-        }
-      },
-      postcss: {
-        plugins: [
-          {
-            postcssPlugin: 'internal:charset-removal',
-            AtRule: {
-              charset: (atRule) => {
-                if (atRule.name === 'charset') {
-                  atRule.remove();
+    const env = loadEnv(mode, process.cwd());
+    return {
+        // 部署生产环境和开发环境下的URL。
+        // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上
+        // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
+        base: env.VITE_APP_CONTEXT_PATH,
+        resolve: {
+            alias: {
+                '~': path.resolve(__dirname, './'),
+                '@': path.resolve(__dirname, './src')
+            },
+            extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
+        },
+        // https://cn.vitejs.dev/config/#resolve-extensions
+        plugins: createPlugins(env, command === 'build'),
+        server: {
+            host: '0.0.0.0',
+            port: Number(env.VITE_APP_PORT),
+            open: true,
+            proxy: {
+                [env.VITE_APP_BASE_API]: {
+                    // target: 'http://dm.yujin.shuziyunyao.com/api',
+                    target: 'http://dm.yujin.shuziyunyao.com/api',
+                    // target: 'http://192.168.1.68:8080',
+                    changeOrigin: true,
+                    ws: true,
+                    rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '')
                 }
-              }
             }
-          }
-        ]
-      }
-    },
-    // 预编译
-    optimizeDeps: {
-      include: [
-        'vue',
-        'vue-router',
-        'pinia',
-        'axios',
-        '@vueuse/core',
-        'echarts',
-        'vue-i18n',
-        '@vueup/vue-quill',
-        'image-conversion',
-        'element-plus/es/components/**/css'
-      ]
-    }
-  };
+        },
+        css: {
+            preprocessorOptions: {
+                scss: {
+                    javascriptEnabled: true
+                }
+            },
+            postcss: {
+                plugins: [
+                    {
+                        postcssPlugin: 'internal:charset-removal',
+                        AtRule: {
+                            charset: (atRule) => {
+                                if (atRule.name === 'charset') {
+                                    atRule.remove();
+                                }
+                            }
+                        }
+                    }
+                ]
+            }
+        },
+        // 预编译
+        optimizeDeps: {
+            include: ['vue', 'vue-router', 'pinia', 'axios', '@vueuse/core', 'echarts', 'vue-i18n', '@vueup/vue-quill', 'image-conversion', 'element-plus/es/components/**/css']
+        }
+    };
 });