huangxw hai 10 meses
pai
achega
3c68e88acd

+ 1 - 0
package.json

@@ -46,6 +46,7 @@
     "vue-cropper": "1.1.1",
     "vue-i18n": "10.0.5",
     "vue-json-pretty": "2.4.0",
+    "vue-qr": "^4.0.9",
     "vue-router": "4.4.5",
     "vue-types": "5.1.3",
     "vxe-table": "4.6.17"

+ 18 - 10
src/views/cdt/items/index.vue

@@ -3,12 +3,13 @@
         <div class="bg-fff flex1 ov-hd d-flex flex-cln">
             <div class="pd-16 border-bottom">
                 <div class="f-s-20 c-333 f-w-7 mb-20">检测项查询</div>
-                <searchTabs v-model="tabActive" :list="[ { label: '按检测项目', value: '1' }, { label: '按执行标准', value: '2' } ]" :is-num="false"></searchTabs>
+                <searchTabs v-model="tabActive" :list="[{ label: '按检测项目', value: '1' }, { label: '按执行标准', value: '2' }]"
+                    :is-num="false"></searchTabs>
             </div>
             <div class="pd-16">
                 <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-input v-model="queryParams.name" placeholder="请输入检测项名称关键字" clearable style="width: 180px" />
                     </el-form-item>
                     <el-form-item>
                         <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -19,7 +20,9 @@
             <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>
+                        <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 }}
@@ -29,7 +32,9 @@
                         </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>
+                        <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 }}
@@ -45,11 +50,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" field="price" min-width="100" :formatter="colNoData" />
-                            <vxe-column title="备注" align="center" field="description" min-width="100" :formatter="colNoData" />
+                            <vxe-column title="单价(元、批次)" align="center" field="price" min-width="100"
+                                :formatter="colNoData" />
+                            <vxe-column title="备注" align="center" field="description" 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>
@@ -98,7 +106,7 @@ const resetQuery = () => {
     };
     // 重置树高亮
     treeItemsRef.value?.setCurrentKey(null, true);
-    treeStandardsRef.value?.setCurrentKey(null, true);
+    treeStandardsRef.value?.setCurrentKey(null, false);
     handleQuery()
 };
 const getTabsTree = async () => {
@@ -140,7 +148,7 @@ onMounted(() => {
     border-right: 1px solid #ebeef5;
     padding: 16px;
 }
+
 .content-border {
     border: 1px solid var(--border-color);
-}
-</style>
+}</style>

+ 77 - 13
src/views/cdt/menus/index.vue

@@ -10,22 +10,27 @@
                     <div class="flex1 ov-hd d-flex j-ed">
                         <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-input v-model="queryParams.name" placeholder="请输入套餐名称关键字" clearable style="width: 180px"
+                                    @keyup.enter="handleQuery" />
                             </el-form-item>
                             <el-form-item label="套餐状态" prop="status">
-                                <el-select style="width: 160px" v-model="queryParams.status" clearable placeholder="请选择套餐状态" @change="handleQuery">
+                                <el-select style="width: 160px" v-model="queryParams.status" clearable placeholder="请选择套餐状态"
+                                    @change="handleQuery">
                                     <el-option label="未上架" value="0"></el-option>
                                     <el-option label="在售" value="1"></el-option>
                                     <el-option label="已下架" value="2"></el-option>
                                 </el-select>
                             </el-form-item>
                             <el-form-item label="制定规则" prop="permitType">
-                                <el-select style="width: 160px" v-model="queryParams.permitType" clearable placeholder="请选择制定规则" @change="handleQuery">
-                                    <el-option v-for="item in dm_permit_type" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                                <el-select style="width: 160px" v-model="queryParams.permitType" clearable
+                                    placeholder="请选择制定规则" @change="handleQuery">
+                                    <el-option v-for="item in dm_permit_type" :key="item.value" :label="item.label"
+                                        :value="item.value"></el-option>
                                 </el-select>
                             </el-form-item>
                             <el-form-item label="创建人" prop="createByName">
-                                <el-input v-model="queryParams.createByName" placeholder="请输入创建人关键字" clearable style="width: 160px" @keyup.enter="handleQuery" />
+                                <el-input v-model="queryParams.createByName" placeholder="请输入创建人关键字" clearable
+                                    style="width: 160px" @keyup.enter="handleQuery" />
                             </el-form-item>
                             <el-form-item>
                                 <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
@@ -36,16 +41,18 @@
                 </div>
             </div>
             <div class="flex1 ov-hd pd-16 d-flex flex-cln">
-                <searchTabs v-model="queryParams.publicFlag" @change="handleQuery" :list="tabs" key-label="name" key-value="type" key-count="num"></searchTabs>
+                <searchTabs v-model="queryParams.publicFlag" @change="handleQuery" :list="tabs" key-label="name"
+                    key-value="type" key-count="num"></searchTabs>
                 <div class="pd-8"></div>
                 <div class="flex1 ov-hd">
                     <vxe-table :loading="loading" border :data="list" min-height="0" max-height="100%">
                         <!-- 序号 -->
                         <vxe-column type="seq" fixed="left" width="60" title="序号" align="center" />
-                        <vxe-column title="套餐名称" fixed="left" align="center" field="name" min-width="100" :formatter="colNoData" />
+                        <vxe-column title="套餐名称" fixed="left" align="center" field="name" min-width="100"
+                            :formatter="colNoData" />
                         <vxe-column title="适用对象" field="applyType" min-width="100">
                             <template #default="{ row }">
-                                <view class="d-flex flex-cln">
+                                <view class="d-flex flex-cln" v-if="row?.permitType == '1'">
                                     <template v-for="(item, index) in row?.priceDetail" :key="index">
                                         <view>
                                             {{ item?.memberLevelName }}-{{ NP.times(item?.memberDiscount, 10) }}折
@@ -53,6 +60,13 @@
                                         </view>
                                     </template>
                                 </view>
+                                <view class="d-flex flex-cln" v-if="row?.permitType == '2'">
+                                    <view>
+                                        {{ row?.permitCpyNames?.join(',') }}-{{
+                                            NP.times(row?.priceDetail[0]?.memberDiscount, 10) }}折
+                                        <span class="c-333 f-w-5">({{ row?.priceDetail[0]?.price }})</span>
+                                    </view>
+                                </view>
                             </template>
                         </vxe-column>
                         <vxe-column title="检测项目" min-width="140">
@@ -69,6 +83,23 @@
                         </vxe-column>
                         <vxe-column title="上架数量" field="totalCount" width="80" :formatter="colNoData"></vxe-column>
                         <vxe-column title="销量" field="orderedCount" width="80" :formatter="colNoData"></vxe-column>
+                        <vxe-column title="开始时间" field="validFrom" width="160">
+                            <template #default="{ row }">{{ row?.validFrom }}</template>
+                        </vxe-column>
+                        <vxe-column title="结束时间" field="validUntil" width="160">
+                            <template #default="{ row }">{{ row?.validUntil }}</template>
+                        </vxe-column>
+                        <vxe-column title="剩余时间" field="restDay" width="100">
+                            <template #default="{ row }">
+                                <span v-if="row.status == 0">未上架</span>
+                                <span v-if="row.status == 2"></span>
+                                <span v-if="row.status == 1 && new Date(row?.validUntil ) > new Date()">
+                                    {{Math.floor((new Date(row?.validUntil).getTime()-new Date().getTime())/(3600*24*1000))+1 }}天</span>
+                                <span v-else>已过期</span>
+                            </template>
+                        </vxe-column>
+                        <vxe-column title="创建人" field="createName" width="100"></vxe-column>
+                        <vxe-column title="创建时间" field="createTime" width="160"></vxe-column>
                         <vxe-column title="套餐状态" align="center" width="90" fixed="right">
                             <template #default="{ row }">
                                 <span v-if="+row?.status === 0" class="c-danger">未上架</span>
@@ -81,12 +112,13 @@
                                 <template v-if="+row?.status === 0">
                                     <el-button @click="putaway(row)" text type="primary">上架</el-button>
                                     <span></span>
-                                    <el-button @click="router.push({ path: 'menus-form', query: { id: row?.id } })" text type="primary">编辑</el-button>
+                                    <el-button @click="router.push({ path: 'menus-form', query: { id: row?.id } })" text
+                                        type="primary">编辑</el-button>
                                 </template>
                                 <template v-if="+row?.status === 1">
                                     <el-button @click="soldOut(row)" text type="danger">下架</el-button>
                                     <span></span>
-                                    <el-button text type="primary">分享</el-button>
+                                    <el-button text type="primary" @click="showShareImg(row)">分享</el-button>
                                 </template>
                                 <template v-if="+row?.status === 2">
                                     <el-button @click="putaway(row)" text type="primary">上架</el-button>
@@ -96,18 +128,29 @@
                                 <span></span>
                                 <el-button @click="copyItem(row)" text type="primary">复制</el-button>
                                 <span></span>
-                                <el-button @click="router.push({ path: 'menus-detail', query: { id: row?.id } })" text type="primary">详情</el-button>
+                                <el-button @click="router.push({ path: 'menus-detail', query: { id: row?.id } })" text
+                                    type="primary">详情</el-button>
                             </template>
                         </vxe-column>
                     </vxe-table>
                 </div>
             </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>
     </div>
+    <el-dialog title="套餐分享" v-model="shareDialog" width="350px">
+        <div class="d-flex flex-cln">
+            {{ sharePkgName }}
+            <el-button type="primary" @click="download">下载</el-button>
+        </div>
+        <vue-qr ref="qrCode" :text="shareText" v-if="shareText" :size="300"></vue-qr>
+    </el-dialog>
     <rowItems v-if="showRowItems" v-model:show="showRowItems" :packageId="rowId"></rowItems>
 </template>
 <script setup name="Menus" lang="ts">
+import vueQr from 'vue-qr/src/packages/vue-qr.vue'
 import { copyTestPackage, testPackageList, testPackageListCount, testPackageSale, testPackageUnSale } from '@/api/cdt/menus';
 import { colNoData } from '@/utils/noData';
 import { searchTabs } from '@/views/models';
@@ -146,7 +189,9 @@ const resetQuery = () => {
 // 获取tabs统计数据
 const tabs = ref<any[]>([]);
 const getTabsCount = debounce(async () => {
-    const res = await testPackageListCount({ ...queryParams.value });
+    const params = { ...queryParams.value }
+    params.publicFlag = ''
+    const res = await testPackageListCount(params);
     if (!res || res.code !== 200) return;
     // this.tabsList = res.rows;
     tabs.value = res.data;
@@ -205,6 +250,25 @@ const queryRowItems = (row: any) => {
     rowId.value = row?.id;
     showRowItems.value = true;
 };
+//二维码分享
+const shareText = ref('');
+const sharePkgName = ref('');
+const shareDialog = ref(false);
+const showShareImg = (row) => {
+    shareText.value = `http://dm.share.yujin.shuziyunyao.com/package?id=${row?.id}`;
+    sharePkgName.value = row?.name;
+    shareDialog.value = true;
+}
+const qrCode = ref<any>(null)
+const download = () => {
+    const a: any = document.createElement('a')
+    // 下载的文件名
+    a.download = `${sharePkgName.value}.png`
+    // url
+    a.href = qrCode.value.$el.src
+    // 触发点击
+    a.click()
+}
 onMounted(() => {
     getTabsCount();
     getList();

+ 8 - 5
src/views/cdt/models/menuInfo.vue

@@ -8,12 +8,15 @@
                 <el-descriptions-item label="制定规则:">{{ selectDictLabel(dm_permit_type,form?.permitType ) }}</el-descriptions-item>
                 <el-descriptions-item v-if="form?.permitType === '1'" label="适用类型:">{{ selectDictLabels(vip_level, form?.permit, ',') || '-' }}</el-descriptions-item>
                 <el-descriptions-item v-if="form?.permitType === '2'" label="适用企业:">{{ form?.permitCpyNames.toString()|| '-' }}</el-descriptions-item>
-                <el-descriptions-item label="检测周期:">{{ form?.period || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="检测周期:">{{ form?.period || '-' }}工作日</el-descriptions-item>
                 <el-descriptions-item label="上架数量:">{{ form?.totalCount || '-' }}</el-descriptions-item>
-                <el-descriptions-item label="执行标准:">{{ form?.standard || '-' }}</el-descriptions-item>
-                <el-descriptions-item label="送样信息:" :span="2">{{ form?.description || '-' }}</el-descriptions-item>
-                <el-descriptions-item label="购买须知:" :span="2">{{ form?.purchaseNotes || '-' }}</el-descriptions-item>
-                <el-descriptions-item label="失效日期:">{{ form?.validUntil || '-' }}</el-descriptions-item>
+                <el-descriptions-item ></el-descriptions-item>
+                <el-descriptions-item ></el-descriptions-item>
+                <el-descriptions-item  label="执行标准:" :span="2">{{ form?.standard || '-' }}</el-descriptions-item>
+                <el-descriptions-item   label="送样信息:" :span="2">{{ form?.description || '-' }}</el-descriptions-item>
+                <el-descriptions-item   label="购买须知:" :span="2">{{ form?.purchaseNotes || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="创建人:">{{ form?.createName || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="创建时间:">{{ form?.createTime || '-' }}</el-descriptions-item>
             </el-descriptions>
             <el-divider />
             <el-descriptions :column="4" direction="vertical">

+ 1 - 1
src/views/cdt/models/orderInfo.vue

@@ -117,7 +117,7 @@
                         </el-steps>
                         <el-divider />
                     </template>
-                    <template v-if="+info.status >= 2  && +info?.originStatus >= 2">
+                    <template v-if="+info.status >= 2  && +info?.originStatus >= 2 && info?.sendAddress">
                         <div class="f-s-16 c-333 f-w-6 mb-16">寄样信息</div>
                         <div class="d-flex a-c">
                             <div class="card-blcok pd-16 d-flex flex1">

+ 2 - 2
src/views/cdt/models/rowItems.vue

@@ -2,8 +2,8 @@
     <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width">
         <template #default>
             <div class="d-flex flex-cln" style="height: 60vh;">
-                <div class="flex1 ov-hd">
-                    <vxe-table :loading="loading" border :data="list">
+                <div class="flex1 ov-hd" style="height:50vh">
+                    <vxe-table :loading="loading" border :data="list" height="auto" >
                         <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" />

+ 1 - 1
src/views/dgtmedicine/member/index.vue

@@ -22,7 +22,7 @@
                         <el-select style="width: 140px" v-model="queryParams.vipEnable" clearable placeholder="搜有效期状态">
                             <el-option label="全部" value=""></el-option>
                             <el-option label="有效" value="1"></el-option>
-                            <el-option label="过期" value="-1"></el-option>
+                            <el-option label="过期" value="3"></el-option>
                         </el-select>
                     </el-form-item>
                     <el-form-item>