zoujiandong 83932947f0 更新
2024-06-06 14:17:51 +08:00

488 lines
15 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="app-container">
<a-form :model="queryForm" ref="queryFormRef" layout="inline">
<a-form-item field="coupon_name" label="优惠卷名称">
<a-input :style="{ width: '182px' }" v-model="queryForm.coupon_name" placeholder="请输入患者名字" @press-enter="handleQuery" />
</a-form-item>
<a-form-item field="coupon_desc" label="优惠卷描述">
<a-input :style="{ width: '182px' }" v-model="queryForm.coupon_desc" placeholder="请输入优惠卷描述" @press-enter="handleQuery" />
</a-form-item>
<a-form-item field="coupon_status" label="启用状态">
<a-select v-model="queryForm.coupon_status" placeholder="请选择启用状态" :style="{ width: '182px' }">
<!-- 1:正常 2:强制失效 3:结束 4:删除 -->
<a-option :value="1">正常</a-option>
<a-option :value="2">强制失效</a-option>
<a-option :value="3">结束</a-option>
<a-option :value="3">删除</a-option>
</a-select>
</a-form-item>
<a-form-item field="distribution_object" label="发放对象">
<a-select v-model="queryForm.distribution_object" placeholder="请选择发放对象" :style="{ width: '182px' }">
<!-- 1:全部用户 2:新注册用户 3:会员 4:近期消费 5:近期购药 6:存量用户 7:健康包服务用户 -->
<a-option :value="1">全部用户</a-option>
<a-option :value="2">新注册用户</a-option>
<a-option :value="3">会员</a-option>
<a-option :value="4">近期消费</a-option>
<a-option :value="5">近期购药</a-option>
<a-option :value="6">存量用户</a-option>
<a-option :value="7">健康包服务用户</a-option>
</a-select>
</a-form-item>
<a-form-item field="application_scope" label="适用范围">
<a-select v-model="queryForm.application_scope" placeholder="请选择适用范围" :style="{ width: '182px' }">
<!-- 1:全场通用 2:问诊 3:按品牌适用 4:按类别适用 5:单品使用 6:全品类药品-->
<a-option :value="1">全场通用</a-option>
<a-option :value="2">问诊</a-option>
<a-option :value="3">按品牌适用</a-option>
<a-option :value="4">按类别适用</a-option>
<a-option :value="5">单品使用</a-option>
<a-option :value="6">全品类药品</a-option>
</a-select>
</a-form-item>
<a-form-item field="application_scope" label="关联问诊类型">
<a-select v-model="queryForm.application_scope" placeholder="请选择适用范围" :style="{ width: '182px' }">
<!--1:'专家问诊', 2:'快速问诊', 3:'公益问诊', 4:'问诊购药',5:'糖组检测'-->
<a-option value="1">专家问诊</a-option>
<a-option value="2">快速问诊</a-option>
<a-option value="3">公益问诊</a-option>
<a-option value="4">问诊购药</a-option>
<a-option value="5">糖组检测</a-option>
</a-select>
</a-form-item>
<!-- <a-form-item field="create_range_time" label="创建时间范围">
<a-range-picker
style="width: 260px"
v-model="queryForm.create_range_time"
/>
</a-form-item> -->
<a-form-item>
<a-space>
<a-button type="primary" @click="handleQuery"><icon-search /> 搜索</a-button>
<a-button @click="handleResetQuery"><icon-loop /> 重置</a-button>
</a-space>
</a-form-item>
</a-form>
<a-divider />
<!-- action -->
<div class="action">
<a-space>
<a-button v-has="'admin:sysCouponList:add'" type="primary" @click="showAdd"><icon-plus /> 创建优惠卷 </a-button>
<!-- <a-button v-has="'admin:sysPatientList:selectExport'" type="primary" @click="handlExport(2)"><icon-export /> 选择数据导出 </a-button>
<a-button v-has="'admin:sysPatientList:searchExport'" type="primary" @click="handlExport(1)"><icon-export /> 当前搜索全部导出</a-button>
<a-button v-has="'admin:sysPatientList:allExport'" type="primary" @click="handlExport(3)"><icon-export /> 全部导出</a-button> -->
</a-space>
</div>
<!-- table -->
<a-table :columns="columns" :data="tableData"
:pagination="{ 'show-total': true, 'show-jumper': true, 'show-page-size': true, total: pager.total, current: currentPage }"
row-key="coupon_id" @selection-change="(selection) => {deleteData = selection;console.log(selection)}"
@page-change="handlePageChange" @page-size-change="handlepage_sizeChange">
<template #code="{record,rowIndex}">
<div>{{(rowIndex+1)+(pager.page-1)*pager.page_size}}</div>
</template>
<template #coupon_client="{record}">
<div v-if="record.coupon_client==1">小程序</div>
</template>
<template #distribution_object="{record}">
<div>{{formatCouponObject(record.distribution_object)}}</div>
</template>
<template #application_scope="{record}">
<div>{{formatCouponRange(record.application_scope)}}</div>
</template>
<template #coupon_type="{record}">
<div>{{formatCouponType(record.coupon_type)}}</div>
</template>
<template #valid_type="{record}">
<div v-if="record.valid_type==1">绝对时效</div>
<div v-else-if="record.valid_type==2">相对时效</div>
</template>
<template #coupon_status="{ record }">
<!-- 1:正常 2:强制失效 3:结束 4:删除) -->
<div v-if="record.coupon_status==1">正常</div>
<div v-else-if="record.coupon_status==2">强制失效</div>
<div v-else-if="record.coupon_status==3">结束</div>
<div v-else>删除</div>
<!-- <a-switch @click="showCoupon(value,record)" v-model="record.coupon_status" :loading="loading" :disabled="record.coupon_status==2" :checked-value="1" /> -->
</template>
<template #action="{ record }">
<a-space>
<a-button v-has="'admin:sysCouponList:detail'" type="text"
@click="handleDetail(record)"><icon-book />详情</a-button>
</a-space>
<a-space>
<a-button v-has="'admin:sysCouponList:give'" type="text"
@click="handleGive(record)"><icon-pushpin />发放优惠卷</a-button>
</a-space>
</template>
</a-table>
<!-- Modal -->
<couponDetail ref="couponChild" :modalVisible="modalVisible" :modalForm="modalForm" @closeChange="closeCouponDetail" @changeTimeRange="changeTimeRange" @freshDetail="handleDetail"></couponDetail>
<!-- 发放弹窗giveVisible-->
<giveCouponModal ref="giveCouponChild" :giveVisible="giveVisible" @closeGiVe="closeGiVe" :id="give_coupon_id"> </giveCouponModal>
<!-- Akiraka 20230223 删除与批量删除 结束 -->
<a-modal v-model:visible="okVisible" :modal-style="{width:'420px'}" body-class="okmodal"
@cancel="cancelOk" @ok="handleOk">
<template #title>
提示
</template>
<a-form :model="okForm" :rules="formRules" ref="okModalFormRef" size="medium" label-align="left" auto-label-width>
<a-form-item field="disable_reason" label="禁用理由" >
<a-textarea v-model.trim="okForm.disable_reason" allow-clear placeholder="请输入禁用理由"></a-textarea>
</a-form-item>
<!-- <template #footer>
<a-button @click="()=>okVisible=false"><template #icon><icon-close /></template>取消</a-button>
<a-button type="primary" @click="handleOk"><template #icon><icon-check /></template>确认</a-button>
</template> -->
</a-form>
</a-modal>
<isOkCouponModal
:isVisible="isVisible"
:api="updateCouponStatus"
:title="okTitle"
:dealType="'status'"
:id="cur_coupon_id"
@closeChangeOk="closeChangeOk"
></isOkCouponModal>
</div>
</template>
<script setup>
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch, computed } from 'vue';
import { getSystemCouponList,getCouponDetail,updateCouponStatus} from '@/api/coupon/list';
import { formatCouponStatus,formatCouponType,formatCouponObject,formatCouponRange } from '@/utils/format';
// Akiraka 20230210 删除数据
const deleteData = ref([])
// Akiraka 20230210 删除对话框
const deleteVisible = ref(false)
// Akiraka 20230210 监听删除事件
const loading=ref(true);
const okVisible = ref(false);
const okTitle=ref('');
const okForm = reactive({
disable_reason: ''
});
const formRules = reactive({
disable_reason: [{ required: true, message: '请输入禁用理由' }]
});
const isVisible=ref(false);
watch(() => deleteVisible.value, (value) => {
if (value == false) {
getInfo(pager);
}
});
const file = ref();
const { proxy } = getCurrentInstance();
const currentPage = ref(1);
const family_data=ref([]);
const couponChild = ref(null);
const giveCouponChild= ref(null);
const giveVisible=ref(false);
// Pager
const pager = {
total: 0,
page: 1,
page_size: 10,
};
// form
const queryForm = reactive({
});
const modalForm = reactive({
avatar: 'https://img.applets.igandanyiyuan.com/basic/file/patient_avatar.png',
});
// Modal
const modalVisible = ref(false);
const modalTitle = ref('默认标题');
// Batch Del List
let batchList = [];
// Table Columns
const columns = ref([{
title: '编号',
dataIndex: 'code',
slotName:'code'
},{
title: '优惠卷名称',
dataIndex: 'coupon_name',
},{
title: '适用平台',
dataIndex: 'coupon_client',
slotName:'coupon_client'
},{
title: '发放对象',
dataIndex: 'distribution_object',
slotName:'distribution_object'
},{
title: '发放类型',
dataIndex: 'coupon_type',
slotName:'coupon_type'
},{
title: '适用范围',
dataIndex: 'application_scope',
slotName:'application_scope'
},
{
title: '发放数量',
dataIndex:'coupon_count',
slotName:'coupon_count'
},
{
title: '已领取数量',
dataIndex:'coupon_take_count'
},
{
title: '已使用数量',
dataIndex:'coupon_used_count'
},
{
title: '优惠卷金额',
dataIndex:'coupon_price',
slotName:'coupon_price'
},
{
title: '有效类型',
dataIndex:'valid_type',
slotName:'valid_type'
},
{
title: '状态',
dataIndex: 'coupon_status',
slotName:'coupon_status'
}, { title: '操作', slotName: 'action'}])
// Table Data
const tableData = ref([]);
//弹框状态
const modalSatus = ref('add');
// 新增Satus
const handleAdd = () => {
modalVisible.value = true;
modalTitle.value = '新增患者';
modalSatus.value = 'add';
modalForm.coupon_id = null;
};
const give_coupon_id=ref('');
const closeGiVe=()=>{
giveVisible.value=false;
};
const handleGive=(record)=>{
give_coupon_id.value=record.coupon_id;
giveVisible.value=true;
giveCouponChild.value.changeStatus();
}
//详情
const handleDetail = async (record) => {
modalVisible.value = true;
modalTitle.value = '患者详情';
modalSatus.value = 'detail';
const { code, data, message } = await getCouponDetail(record.coupon_id);
if (code == 200) {
Object.assign(modalForm, data);
family_data.value=data.patient_family;
}
};
const cur_coupon_id=ref('');
const switchStatus= async(coupon_id,putData)=>{
const {code,message}= await changeStatus(coupon_id,putData);
if(code==200){
putData.status==0?proxy.$notification.success("禁用成功"):proxy.$notification.success('启用成功');
modalVisible.value=false;
handleQuery();
proxy.$refs.okModalFormRef.resetFields();
}else{
proxy.$notification.error(message);
}
};
const showAdd=()=>{
modalVisible.value=true;
modalForm.coupon_id='';
modalForm.valid_days=null;
modalForm.coupon_status=1;
modalForm.coupon_client=1;
modalForm.is_mutex=1;
modalForm.is_display=1;
modalForm.is_popup=0;
modalForm.valid_start_time='';
modalForm.valid_end_time='';
modalForm.valid_type='';
modalForm.is_reissuable_after_expire=0;
if(couponChild.value){
couponChild.value.changeStatus();
}
};
const changeTimeRange=(data)=>{
modalForm.valid_start_time=data.valid_start_time;
modalForm.valid_end_time=data.valid_end_time;
};
const cancelOk=()=>{
okVisible.value=false;
}
const handleOk = () => {
proxy.$refs.okModalFormRef.validate(async(valid) => {
if (!valid) {
switchStatus(cur_coupon_id.value,{
status:0,
disable_reason:okForm.disable_reason
})
}else{
okVisible.value=true
}
})
}
//关闭启用弹框
const closeChangeOk = () => {
isVisible.value = false;
modalVisible.value = false;
};
const showCoupon=(value,record)=>{
okTitle.value=!record.coupon_status?'确定关闭吗?':'确定开启吗?';
isVisible.value=true;
cur_coupon_id.value=record.coupon_id;
};
/**
* 分页改变
* @param {Number} [page]
*/
const handlePageChange = (page) => {
pager.page = page;
// 修改当前页码
currentPage.value = page;
getInfo({ ...pager, ...queryForm });
};
// 每页数据量
const handlepage_sizeChange = (page_size) => {
pager.page_size = page_size;
getInfo({ ...pager, ...queryForm });
};
// 获取患者信息
const getInfo = async (params = {}) => {
loading.value=true;
const { data, code, message } = await getSystemCouponList(params);
if (code == 200) {
tableData.value = data.data;
Object.assign(pager, { total: data.total, page: data.page, page_size: data.page_size });
}
loading.value=false;
};
// 查询患者信息
const handleQuery = async () => {
pager.page = 1;
const params = {
page: pager.page,
page_size: pager.page_size,
...queryForm,
};
getInfo(params);
};
// 重置搜索
const handleResetQuery = () => {
proxy.$refs.queryFormRef.resetFields();
getInfo(queryForm);
}
const closeCouponDetail=()=>{
modalVisible.value=false;
getInfo({ ...pager, ...queryForm });
}
onMounted(() => {
getInfo(pager);
});
</script>
<style lang="scss" scoped>
.action {
margin-bottom: 12px;
}
.okmodal div {
text-align: center;
}
.hospital_name {
width: 140px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.headImg {
margin-right: 20px;
border-radius: 50%;
width: 80px;
height: 80px;
}
.arco-form-item-layout-horizontal:first-child,
.arco-form-item-layout-horizontal:nth-child(2) {
align-items: center;
}
.cellbox{
margin-top: 35px;
}
.cellbox .cell{
width:50%;
border-bottom:1px dashed #efefef;
margin-bottom: 20px;
}
.cellbox .cell:first-child{
border: none;
}
.cell{
.arco-form-item{
margin-bottom: 10px;
}
}
.box {
display: flex;
align-items: center;
}
.cert .arco-form-item-label-col {
flex: 0 0 8px !important;
}
.red {
display: inline-block;
margin-right: 5px;
font-size: 14px;
color: red;
margin-top: 5px;
}
.cardNum {
width: 148px;
}
.codbox{
display: flex;
align-items: center;
}
.reason{
max-width:250px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>