huangxw il y a 8 mois
Parent
commit
eb2c75d5c3

+ 39 - 29
src/api/dgtmedicine/vipPayment/index.ts

@@ -9,11 +9,11 @@ import { VipPaymentVO, VipPaymentForm, VipPaymentQuery } from '@/api/dgtmedicine
  */
 
 export const listVipPayment = (query?: VipPaymentQuery): AxiosPromise<VipPaymentVO[]> => {
-  return request({
-    url: '/dgtmedicine/vipPayment/list',
-    method: 'get',
-    params: query
-  });
+    return request({
+        url: '/dgtmedicine/vipPayment/list',
+        method: 'get',
+        params: query
+    });
 };
 
 /**
@@ -21,10 +21,10 @@ export const listVipPayment = (query?: VipPaymentQuery): AxiosPromise<VipPayment
  * @param id
  */
 export const getVipPayment = (id: string | number): AxiosPromise<VipPaymentVO> => {
-  return request({
-    url: '/dgtmedicine/vipPayment/getInfo/' + id,
-    method: 'get'
-  });
+    return request({
+        url: '/dgtmedicine/vipPayment/getInfo/' + id,
+        method: 'get'
+    });
 };
 
 /**
@@ -32,11 +32,11 @@ export const getVipPayment = (id: string | number): AxiosPromise<VipPaymentVO> =
  * @param data
  */
 export const addVipPayment = (data: VipPaymentForm) => {
-  return request({
-    url: '/dgtmedicine/vipPayment/add',
-    method: 'post',
-    data: data
-  });
+    return request({
+        url: '/dgtmedicine/vipPayment/add',
+        method: 'post',
+        data: data
+    });
 };
 
 /**
@@ -44,23 +44,23 @@ export const addVipPayment = (data: VipPaymentForm) => {
  * @param data
  */
 export const updateVipPayment = (data: VipPaymentForm) => {
-  return request({
-    url: '/dgtmedicine/vipPayment/edit',
-    method: 'post',
-    data: data
-  });
+    return request({
+        url: '/dgtmedicine/vipPayment/edit',
+        method: 'post',
+        data: data
+    });
 };
 
 /**
  * 上传发票
  * @param data
  */
-export const uploadInvoice = (data: { id:  string | number, invoiceUrl: String }) => {
-  return request({
-    url: '/dgtmedicine/vipPayment/uploadInvoice',
-    method: 'post',
-    data: data
-  });
+export const uploadInvoice = (data: { id: string | number; invoiceUrl: String }) => {
+    return request({
+        url: '/dgtmedicine/vipPayment/uploadInvoice',
+        method: 'post',
+        data: data
+    });
 };
 
 /**
@@ -68,8 +68,18 @@ export const uploadInvoice = (data: { id:  string | number, invoiceUrl: String }
  * @param id
  */
 export const delVipPayment = (id: string | number | Array<string | number>) => {
-  return request({
-    url: '/dgtmedicine/vipPayment/remove/' + id,
-    method: 'get'
-  });
+    return request({
+        url: '/dgtmedicine/vipPayment/remove/' + id,
+        method: 'get'
+    });
+};
+/**
+ * 确认对公转账支付
+ * @param id
+ */
+export const VipConfirmPay = (id: string | number) => {
+    return request({
+        url: '/dgtmedicine/vipPayment/confirmLevelPay/' + id,
+        method: 'get'
+    });
 };

+ 2 - 1
src/views/cdt/menus/detail/index.vue

@@ -21,6 +21,7 @@
                         <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?.totalCount || '-' }}</el-descriptions-item>
+                        <el-descriptions-item label="检测类型:">{{ selectDictLabel(dm_test_type, form.testType) }}</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>
@@ -82,7 +83,7 @@ import { saleLog } from '../../models';
 
 const { query }: any = useRoute();
 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 { dm_package_type, dm_permit_type, vip_level, dm_test_type } = toRefs<any>(proxy?.useDict('dm_package_type', 'dm_permit_type', 'vip_level', 'dm_test_type'));
 const router = useRouter();
 const form = ref<any>({
    items: [],

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

@@ -97,6 +97,13 @@
                                     <el-input v-model.number="form.totalCount" clearable placeholder="请输入上架数量"></el-input>
                                 </el-form-item>
                             </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="检测类型" prop="testType">
+                                    <el-select v-model="form.testType" clearable placeholder="请选择检测类型">
+                                        <el-option v-for="item in dm_test_type" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
                             <el-col :span="8">
                                 <el-form-item label="执行标准" prop="standard">
                                     <el-input type="textarea" v-model="form.standard" placeholder="请输入执行标准" :rows="4" show-word-limit maxlength="100"></el-input>
@@ -174,7 +181,7 @@ import { debounce } from 'lodash';
 import { addTestPackage, editTestPackage, getTestPackage, getTestPackageItems, testPackageSale } from '@/api/cdt/menus';
 const { query }: any = useRoute();
 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 { dm_package_type, dm_permit_type, vip_level, dm_test_type } = toRefs<any>(proxy?.useDict('dm_package_type', 'dm_permit_type', 'vip_level', 'dm_test_type'));
 // 字典
 const TransferItemsRef = ref<any>();
 const router = useRouter();
@@ -209,6 +216,9 @@ const rules = reactive<any>({
     totalCount: [
         { required: true, message: '请输入上架数量', trigger: 'blur' }
     ],
+    testType: [
+        { required: true, message: '请选择检测类型', trigger: 'change' }
+    ],
     standard: [
         { required: true, message: '请输入执行标准', trigger: 'blur' }
     ],

+ 6 - 1
src/views/cdt/menus/index.vue

@@ -88,6 +88,11 @@
                             <template #default="{ row }">{{ row?.period }}个工作日</template>
                         </vxe-column>
                         <vxe-column title="上架数量" field="totalCount" width="80" :formatter="colNoData"></vxe-column>
+                        <vxe-column title="检测类型" width="80">
+                            <template #default="{ row }">
+                                {{ selectDictLabel(dm_test_type, row?.testType) }}
+                            </template>
+                        </vxe-column>
                         <vxe-column title="销量" field="orderedCount" width="80" :formatter="colNoData"></vxe-column>
                         <vxe-column title="开始时间" field="validFrom" width="110">
                             <template #default="{ row }">{{ row?.validFrom }}</template>
@@ -168,7 +173,7 @@ import { debounce } from 'lodash';
 import html2canvas from 'html2canvas';
 const base_url = import.meta.env.VITE_APP_PACKAGE_SHARE_URL;
 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 { dm_package_type, dm_permit_type, vip_level, dm_test_type } = toRefs<any>(proxy?.useDict('dm_package_type', 'dm_permit_type', 'vip_level', 'dm_test_type'));
 const router = useRouter();
 const queryParams = ref<any>({
     pageNum: 1,

+ 2 - 1
src/views/cdt/models/menuInfo.vue

@@ -10,6 +10,7 @@
                 <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?.totalCount || '-' }}</el-descriptions-item>
+                <el-descriptions-item label="检测类型:">{{ selectDictLabel(dm_test_type, form?.testType) }}</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>
@@ -55,7 +56,7 @@ const props = defineProps({
 });
 const { query }: any = useRoute();
 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 { dm_package_type, dm_permit_type, vip_level, dm_test_type} = toRefs<any>(proxy?.useDict('dm_package_type', 'dm_permit_type', 'vip_level', 'dm_test_type'));
 const router = useRouter();
 const form = ref<any>({
    items: [],

+ 42 - 0
src/views/dgtmedicine/model/InvoiceInfo.vue

@@ -0,0 +1,42 @@
+<template>
+    <vxe-modal v-model="dialogVisible" :title="title" show-zoom resize show-footer destroy-on-close transfer @hide="close" :width="width" :z-index="100">
+        <template #default>
+            <div>
+                <div>发票抬头:{{ info?.headTitle }}</div>
+                <div>税号:{{ info?.taxSn }}</div>
+                <div>收票邮箱:{{ info?.email }}</div>
+                <div>单位地址:{{ info?.address }}</div>
+                <div>电话号码:{{ info?.contactPhone }}</div>
+                <div>开户银行:{{ info?.bankName }}</div>
+                <div>银行账户:{{ info?.bankAccount }}</div>
+            </div>
+        </template>
+    </vxe-modal>
+</template>
+
+<script setup name="InvoiceInfo" lang="ts">
+import { propTypes } from '@/utils/propTypes';
+const emit = defineEmits(['update:show', 'close', 'success']);
+const props = defineProps({
+    show: propTypes.bool.def(false),
+    title: propTypes.string.def('发票信息'),
+    width: propTypes.number.def(560),
+    info: propTypes.any.def(null),
+    dict: propTypes.object.def({}),
+});
+const dialogVisible = ref(false);
+
+const close = () => {
+
+    emit('update:show', false);
+    emit('close', false);
+};
+
+watch(
+    () => props.show,
+    (val) => {
+        dialogVisible.value = val;
+    },
+    { immediate: true }
+);
+</script>

+ 51 - 7
src/views/dgtmedicine/model/MemberPayLog.vue

@@ -7,26 +7,45 @@
             <vxe-column title="缴费金额" width="120" :formatter="colNoData">
                 <template #default="{ row }">{{ row.paymentAmount }}元</template>
             </vxe-column>
-            <vxe-column title="邮箱" field="email" min-width="100" :formatter="colNoData" />
-            <vxe-column title="缴费人" field="createName" min-width="100" :formatter="colNoData" />
+            <vxe-column title="发票信息" min-width="100">
+                <template #default="{ row }">
+                    <div v-if="row?.invoiceInfo" @click="openInvoiceInfo(row)" class="cs-p">
+                        <div>发票抬头:{{ row?.invoiceInfo?.headTitle || '-' }}</div>
+                        <div class="f-s-12">发票税号:{{ row?.invoiceInfo?.taxSn || '-' }}</div>
+                        <div class="f-s-12">收票邮箱:{{ row?.invoiceInfo?.email || '-' }}</div>
+                    </div>
+                    <div v-else>-</div>
+                </template>
+            </vxe-column>
+            <vxe-column title="缴费人" field="createName" width="70" :formatter="colNoData" />
             <vxe-column title="缴费时间" field="createTime" width="170" :formatter="colNoData" />
+            <vxe-column title="缴费状态" width="90">
+                <template #default="{ row }">
+                    {{ +row?.paymentStatus ? '已支付' : '待支付' }}
+                </template>
+            </vxe-column>
             <vxe-column title="发票" width="100" :formatter="colNoData">
                 <template #default="{ row }">{{ +row.invoiceStatus ? '已开票' : '待开票' }}</template>
             </vxe-column>
-            <vxe-column title="操作" class-name="small-padding fixed-width">
+            <vxe-column title="操作" align="center" width="200" class-name="small-padding fixed-width">
                 <template #default="{ row }">
-                    <el-button v-if="+row.invoiceStatus" style="color: #999;" tag="a" text :underline="false" type="primary" :href="row.invoiceUrlAddr" target="_blank">查看发票</el-button>
+                    <el-button @click="confirmPay(row)" v-if="!+row?.paymentStatus" type="success" text>确认支付</el-button>
+                    <span></span>
+                    <el-button v-if="+row.invoiceStatus" style="color: #999;" tag="a" text :underline="false"
+                        type="primary" :href="row.invoiceUrlAddr" target="_blank">查看发票</el-button>
                     <el-button v-else type="primary" text @click="clickRowEdit(row)">上传发票</el-button>
                 </template>
             </vxe-column>
         </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" />
     <uploadInvoiceForm v-if="showInvoice" v-model:show="showInvoice" :info="rowInfo"></uploadInvoiceForm>
+    <InvoiceInfo v-if="showInvoiceInfo" v-model:show="showInvoiceInfo" :info="rowInfo"></InvoiceInfo>
 </template>
 <script setup name="Pay-log" lang="ts">
 import { colNoData } from '@/utils/noData';
-import { listVipPayment } from '@/api/dgtmedicine/vipPayment/index';
+import { listVipPayment, VipConfirmPay } from '@/api/dgtmedicine/vipPayment/index';
 import { DateRange } from '@/views/models/index';
 import { uploadInvoiceForm } from '../model/index';
 const { query }: any = useRoute()
@@ -36,6 +55,7 @@ const list = ref<any[]>([]);
 const loading = ref(true);
 const showSearch = ref(true);
 const showInvoice = ref(false);
+const showInvoiceInfo = ref(false);
 const total = ref(0);
 const queryFormRef = ref<ElFormInstance>();
 const data = reactive<any>({
@@ -55,6 +75,10 @@ const clickRowEdit = (row: any) => {
     rowInfo.value = row;
     showInvoice.value = true;
 };
+const openInvoiceInfo = (row: any) => {
+    rowInfo.value = { ...row?.invoiceInfo };
+    showInvoiceInfo.value = true;
+};
 /** 查询会员信息列表 */
 const getList = async () => {
     loading.value = true;
@@ -78,7 +102,27 @@ const resetQuery = () => {
     handleQuery();
 };
 
-
+// 确认支付方法
+const confirmPay = async (row: any) => {
+    // 确认支付弹框
+    ElMessageBox({
+        title: '支付提示',
+        cancelButtonText: '取消',
+        confirmButtonText: '确认支付',
+        showCancelButton: true,
+        confirmButtonClass: 'el-button--danger',
+        message: h('p', null, [h('div', null, `是否确认支付企业:${row.cpyName}设置为已支付状态吗?`), h('div', null, [h('span', null, '注意:'), h('span', { style: 'color: #F56C6C' }, '确认支付后,代表该企业对公转账为已支付,请仔细核对!')])]),
+        callback: async (action: string) => {
+            if (action === 'confirm') {
+                const res = await VipConfirmPay(row.id);
+                if (res) {
+                    ElMessage.success('操作成功');
+                    getList();
+                }
+            }
+        }
+    });
+};
 onMounted(() => {
     getList();
 });

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

@@ -5,3 +5,4 @@ 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 InvoiceInfo } from './InvoiceInfo.vue'; // 修改会员有效期时间

+ 80 - 28
src/views/dgtmedicine/pay-log/index.vue

@@ -27,22 +27,45 @@
                 </el-form>
             </div>
             <div class="d-flex flex1 ov-hd flex-cln pd-16">
+                <searchTabs :list="dm_pay_method" v-model="queryParams.payType" keyLabel="label" @change="handleQuery" :isNum="false" keyValue="value"></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 title="订单号" field="id" min-width="100" :formatter="colNoData" />
                         <vxe-column title="会员名称" field="cpyName" min-width="100" :formatter="colNoData" />
                         <vxe-column title="会员级别" field="vipLevelDesc" width="100" :formatter="colNoData" />
+                        <vxe-column title="支付方式" width="100">
+                            <template #default="{ row }">
+                                {{ selectDictLabel(dm_pay_method, row?.payType) }}
+                            </template>
+                        </vxe-column>
                         <vxe-column title="缴费金额" width="120" :formatter="colNoData">
                             <template #default="{ row }">{{ row.paymentAmount }}元</template>
                         </vxe-column>
-                        <vxe-column title="邮箱" field="email" min-width="100" :formatter="colNoData" />
-                        <vxe-column title="缴费人" field="createName" min-width="100" :formatter="colNoData" />
+                        <vxe-column title="发票信息" min-width="100">
+                            <template #default="{ row }">
+                                <div v-if="row?.invoiceInfo" @click="openInvoiceInfo(row)" class="cs-p">
+                                    <div>发票抬头:{{ row?.invoiceInfo?.headTitle || '-' }}</div>
+                                    <div class="f-s-12">发票税号:{{ row?.invoiceInfo?.taxSn || '-' }}</div>
+                                    <div class="f-s-12">收票邮箱:{{ row?.invoiceInfo?.email || '-' }}</div>
+                                </div>
+                                <div v-else>-</div>
+                            </template>
+                        </vxe-column>
+                        <vxe-column title="缴费人" field="createName" width="70" :formatter="colNoData" />
                         <vxe-column title="缴费时间" field="createTime" width="170" :formatter="colNoData" />
+                        <vxe-column title="缴费状态" width="90">
+                            <template #default="{ row }">
+                                {{ +row?.paymentStatus ? '已支付' : '待支付' }}
+                            </template>
+                        </vxe-column>
                         <vxe-column title="发票" width="100" :formatter="colNoData">
                             <template #default="{ row }">{{ +row.invoiceStatus ? '已开票' : '待开票' }}</template>
                         </vxe-column>
-                        <vxe-column title="操作" class-name="small-padding fixed-width">
+                        <vxe-column title="操作" align="center" width="200" class-name="small-padding fixed-width">
                             <template #default="{ row }">
+                                <el-button @click="confirmPay(row)" v-if="!+row?.paymentStatus" type="success" text>确认支付</el-button>
+                                <span></span>
                                 <el-button v-if="+row.invoiceStatus" style="color: #999;" tag="a" text :underline="false" type="primary" :href="row.invoiceUrlAddr" target="_blank">查看发票</el-button>
                                 <el-button v-else type="primary" text @click="clickRowEdit(row)">上传发票</el-button>
                             </template>
@@ -54,62 +77,91 @@
         </div>
     </div>
     <uploadInvoiceForm v-if="showInvoice" v-model:show="showInvoice" :info="rowInfo" @success="getList()"></uploadInvoiceForm>
+    <InvoiceInfo v-if="showInvoiceInfo" v-model:show="showInvoiceInfo" :info="rowInfo"></InvoiceInfo>
 </template>
 <script setup name="Pay-log" lang="ts">
 import { colNoData } from '@/utils/noData';
-import { listVipPayment } from '@/api/dgtmedicine/vipPayment/index';
-import { DateRange } from '@/views/models/index';
-import { uploadInvoiceForm } from '../model/index';
+import { listVipPayment, VipConfirmPay } from '@/api/dgtmedicine/vipPayment/index';
+import { DateRange, searchTabs } from '@/views/models/index';
+import { uploadInvoiceForm, InvoiceInfo } from '../model/index';
 const router = useRouter();
 const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { dm_pay_method } = toRefs<any>(proxy?.useDict('dm_pay_method'));
 const list = ref<any[]>([]);
 const loading = ref(true);
 const showSearch = ref(true);
 const showInvoice = ref(false);
+const showInvoiceInfo = ref(false);
 const total = ref(0);
 const queryFormRef = ref<ElFormInstance>();
 const data = reactive<any>({
-  queryParams: {
-    pageNum: 1,
-    pageSize: 10,
-    dateRange: [],
-    id: '',
-    startDate: '',
-    endDate: '',
-  }
+    queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        dateRange: [],
+        id: '',
+        startDate: '',
+        endDate: '',
+        payType: '1'
+    }
 });
+const openInvoiceInfo = (row: any) => {
+    rowInfo.value = { ...row?.invoiceInfo };
+    showInvoiceInfo.value = true;
+};
 const { queryParams } = toRefs(data);
 /** 点击行上传发票 */
 const rowInfo = ref<any>({});
 const clickRowEdit = (row: any) => {
-  rowInfo.value = row;
-  showInvoice.value = true;
+    rowInfo.value = row;
+    showInvoice.value = true;
 };
 /** 查询会员信息列表 */
 const getList = async () => {
-  loading.value = true;
-  const res = await listVipPayment(queryParams.value);
-  list.value = res.rows;
-  total.value = res.total;
-  loading.value = false;
+    loading.value = true;
+    const res = await listVipPayment(queryParams.value);
+    list.value = res.rows;
+    total.value = res.total;
+    loading.value = false;
 };
+// 确认支付方法
+const confirmPay = async (row: any) => {
+    // 确认支付弹框
+    ElMessageBox({
+        title: '支付提示',
+        cancelButtonText: '取消',
+        confirmButtonText: '确认支付',
+        showCancelButton: true,
+        confirmButtonClass: 'el-button--danger',
 
+        message: h('p', null, [h('div', null, `是否确认支付企业:${row.cpyName}设置为已支付状态吗?`), h('div', null, [h('span', null, '注意:'), h('span', { style: 'color: #F56C6C' }, '确认支付后,代表该企业对公转账为已支付,请仔细核对!')])]),
+        callback: async (action: string) => {
+            if (action === 'confirm') {
+                const res = await VipConfirmPay(row.id);
+                if (res) {
+                    ElMessage.success('操作成功');
+                    getList();
+                }
+            }
+        }
+    });
+};
 /** 搜索按钮操作 */
 const handleQuery = (level?: any) => {
-  queryParams.value.pageNum = 1;
-  getList();
+    queryParams.value.pageNum = 1;
+    getList();
 };
 
 /** 重置按钮操作 */
 const resetQuery = () => {
-  queryFormRef.value?.resetFields();
-  queryParams.value.startDate = '';
-  queryParams.value.endDate = '';
-  handleQuery();
+    queryFormRef.value?.resetFields();
+    queryParams.value.startDate = '';
+    queryParams.value.endDate = '';
+    handleQuery();
 };
 
 
 onMounted(() => {
-  getList();
+    getList();
 });
 </script>