This commit is contained in:
zoujiandong 2024-06-06 14:17:51 +08:00
parent fa6b80814c
commit 83932947f0
9 changed files with 300 additions and 123 deletions

1
components.d.ts vendored
View File

@ -10,6 +10,7 @@ export {}
declare module '@vue/runtime-core' {
export interface GlobalComponents {
AccountModal: typeof import('./src/components/accountModal.vue')['default']
AddHealthModal: typeof import('./src/components/addHealthModal.vue')['default']
AddInquiryConfigModal: typeof import('./src/components/addInquiryConfigModal.vue')['default']
AddSysconfigModal: typeof import('./src/components/addSysconfigModal.vue')['default']
ChatRecord: typeof import('./src/components/chatRecord.vue')['default']

View File

@ -62,11 +62,4 @@ export function getCouponDetail(id){
params
})
}
export function exportService(data){//导出
return request({
url:'/admin/export/order/service',
method: 'post',
data
})
}

View File

@ -8,10 +8,23 @@ export function getHealthList(data){//健康包管理-获取健康包列表-分
})
}
export function healthDetail(id,params){//健康包管理-获取健康包详情
export function healthDetail(id){//健康包管理-获取健康包详情
return request({
url:'/admin/inquiry/health/'+id,
method: 'post',
params
method: 'get'
})
}
}
export function addHealth(data){//健康包管理-获取健康包详情
return request({
url:'/admin/inquiry/health',
method: 'post',
data
})
}
export function updateHealth(id,data){//健康包管理-获取健康包详情
return request({
url:'/admin/inquiry/health/'+id,
method: 'post',
data
})
}

View File

@ -0,0 +1,203 @@
<template>
<!-- Modal -->
<a-modal
v-model:visible="modalVisible"
fullscreen
:title="title"
title-align="start"
:footer="false"
@cancel="handleClose"
>
<a-form :model="modalForm" ref="modalFormRefConfig" :auto-label-width="true" :rules="rules">
<div class="titlebox">
<div class="bar"></div>
<div class="name">健康包信息</div>
</div>
<a-row :gutter="24" style="margin-top: 35px">
<a-col :span="12">
<a-form-item field="service_count" label="总服务数:">
<a-input-number
v-model="modalForm.service_count"
:style="{ width: '320px' }"
placeholder="请输入总服务数"
class="input-demo"
:step="1" :precision="0"
:min="1"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item field="monthly_frequency" label="每月次数:">
<a-input-number
v-model="modalForm.monthly_frequency"
:style="{ width: '320px' }"
placeholder="请输入每月次数"
class="input-demo"
:step="1" :precision="0"
:min="0"
/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" >
<a-col :span="12">
<a-form-item field="service_rate" label="服务费率(%)">
<a-input-number
v-model="modalForm.service_rate"
:style="{ width: '320px' }"
placeholder="请选择服务费率"
class="input-demo"
:step="1" :precision="0"
:min="1"
/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item field="effective_days" label="服务有效天数:">
<a-input-number
v-model="modalForm.effective_days"
:style="{ width: '320px' }"
placeholder="请输入服务有效天数"
class="input-demo"
:step="1" :precision="0"
:min="0"
/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" >
<a-col :span="12">
<a-form-item field="product_id" label="关联商品:" :rules="[{required: true,message:'请选择关联商品'}]">
<a-select multiple v-model="modalForm.product_id" placeholder="请选择关联商品" allow-search
:loading="loading" @search="handleGetProduct">
<a-option v-for="item in productList" :key="item.product_id" :value="item.product_id" :label="item.product_name">
{{ item.product_name }}
</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-divider />
</a-form>
<div class="titlebox" >
<div class="bar"></div>
<div class="name">操作</div>
</div>
<a-row :gutter="24" style="margin-top: 35px;" >
<a-col :span="24">
<a-form-item field="" label="" no-style>
<a-space >
<a-button type="primary" @click="handleSubmit" v-has="'admin:sysDoctorconfigList:save'">保存</a-button>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-modal>
</template>
<script setup>
import { ref,toRefs,watch,getCurrentInstance,reactive,defineExpose} from 'vue';
import { addHealth,updateHealth} from '@/api/inquiry/service';
import { parseTime } from '@/utils/parseTime';
const { proxy } = getCurrentInstance();
let multi_point_status='';
const props = defineProps({
//
modalVisible: {
type: Boolean,
default: false,
},
id:{
type:String,
default:''
},
modalForm:{
type:Object,
default:{}
}
});
const title=ref('添加问诊配置');
const productList=ref([]);
const loading=ref(false);
const handleGetProduct=async(name='',id='')=>{
loading.value=true;
const {code,data}=await getProduct({
product_name:'',
product_id:'',
limit:100
});
if(code==200){
productList.value=data;
}
loading.value=false;
}
const {modalVisible,id,modalForm}=toRefs(props);
const emits = defineEmits(['healthVisibleChange','freshList']);
watch(()=>props.id,(newVal,oldValval)=>{
if(newVal){
title.value='修改健康包'
}else{
//handleDoctorList();
title.value='添加健康包';
}
},{immediate:true})
const reset=()=>{
}
// Akiraka 20230210
const handleClose = () => {
proxy.$refs.modalFormRefConfig.resetFields();
reset();
emits('healthVisibleChange', false);
};
const handleSubmit=()=>{
proxy.$refs.modalFormRefConfig.validate(async (valid) => {
let data=null;
if (!valid) {
if(props.inquiry_config_id){
data= await editInquiryconfig(modalForm,props.inquiry_config_id)
}else{
data= await addInquiryconfig(modalForm);
}
if(data.code==200){
props.inquiry_config_id?proxy.$message.success('修改成功'):proxy.$message.success('添加成功');
emits('freshList', '');
}
handleClose();
}else {
console.log(valid)
proxy.$message.error('表单校验失败');
//done(false);
}
});
};
const rules = {
service_count: [{ required: true, message: '请输入总服务天数' }],
monthly_frequency:[{ required: true, message: '请输入每月次数' }],
effective_days: [{ required: true, message: '请输入服务有效天数' }],
service_rate:[{ required: true, message: '请输入服务费率' }],
health_package_product:[{ required: true, message: '请选关联商品' }],
};
defineExpose({
reset
});
</script>
<style scoped>
</style>

View File

@ -135,7 +135,7 @@
<a-input-number
v-model="modalForm.coupon_count"
:style="{ width: '320px' }"
:step="0" :precision="0"
:step="1" :precision="0"
placeholder="请输入发放数量"
class="input-demo"
:min="1"
@ -180,7 +180,7 @@
v-model="modalForm.valid_days"
:style="{ width: '320px' }"
placeholder="请输入有效天数"
:step="0" :precision="0"
:step="1" :precision="0"
class="input-demo"
:min="1"
/>
@ -209,7 +209,7 @@
placeholder="请输入单商品最小可使用数量"
class="input-demo"
:min="1"
:step="0" :precision="0"
:step="1" :precision="0"
/>
</a-form-item>
</a-col>
@ -222,7 +222,7 @@
:style="{ width: '320px' }"
placeholder="请输入发放关联天数"
class="input-demo"
:step="0" :precision="0"
:step="1" :precision="0"
:min="1"
/>
</a-form-item>
@ -250,14 +250,14 @@
<a-row :gutter="24">
<a-col a-col :span="24">
<a-form-item field="is_display" label="是否展示:">
<a-switch v-model="modalForm.is_display" :checked-value="1" />
<a-switch v-model="modalForm.is_display" :checked-value="1" :unchecked-value="0"/>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col a-col :span="24">
<a-form-item field="is_mutex" label="是否互斥:">
<a-switch v-model="modalForm.is_mutex" :checked-value="1" />
<a-switch v-model="modalForm.is_mutex" :checked-value="1" :unchecked-value="0"/>
</a-form-item>
</a-col>
</a-row>
@ -280,6 +280,7 @@
<a-form-item field="inquiry_type" label="状态:" :style="{width:'320px'}">
<a-select
placeholder="请选择发放类型"
:disabled="modalForm.coupon_id"
v-model="modalForm.coupon_status"
>
<!-- 1:正常 2:强制失效 3:结束 4:删除-->
@ -341,18 +342,35 @@
>修改</a-button
>
</a-space>
<a-space style="margin-right: 8px" v-if="modalForm.coupon_id && modalForm.coupon_status==1">
<a-button
type="primary"
v-has="'admin:sysCouponList:edit'"
status="danger"
@click="showCoupon"
>强制失效</a-button
>
</a-space>
</a-form-item>
</a-col>
</a-row>
</a-modal>
<isOkCouponModal
:isVisible="isVisible"
:api="updateCouponStatus"
:title="okTitle"
:dealType="'status'"
:id="modalForm.coupon_id"
@closeChangeOk="closeChangeOk"
></isOkCouponModal>
</template>
<script setup>
import { ref, toRefs, watch,getCurrentInstance,defineExpose} from 'vue';
import { addCoupon,updateCoupon,getProduct } from '@/api/coupon/list';
import { addCoupon,updateCoupon,getProduct,updateCouponStatus } from '@/api/coupon/list';
import { Message } from '@arco-design/web-vue';
const { proxy } = getCurrentInstance();
import dayjs from 'dayjs'
const emits = defineEmits(['closeChange','changeTimeRange']);
const emits = defineEmits(['closeChange','changeTimeRange','freshDetail']);
const props = defineProps({
//
modalVisible: {
@ -380,6 +398,20 @@ const defaultValue = ref([]);
const rangeValue=ref([]);
const productList=ref([]);
const loading=ref(false);
const okTitle=ref('');
const isVisible=ref(false);
const showCoupon=()=>{
okTitle.value='确定强制失效吗?'
isVisible.value=true;
};
//
const closeChangeOk = () => {
isVisible.value = false;
modalVisible.value = false;
emits('freshDetail',{
coupon_id:modalForm.value.coupon_id
})
};
const handleGetProduct=async(name='',id='')=>{
loading.value=true;
const {code,data}=await getProduct({

View File

@ -85,7 +85,7 @@ const changeType=(val)=>{
const handleList=async(name='')=>{
loading.value=true;
const {code,data}=await getPatientList({
name:name
user_name:name
})
if(code==200){
patientList.value=data;

View File

@ -44,7 +44,7 @@ const handleClose = () => {
// Akiraka 20230210 =>
const handleConfirm = async () => {
const data=await api.value(id.value,{coupon_status:title.value=="确定开启吗?"?1:2})
const data=await api.value(id.value,{coupon_status:2})
if(data.code==200){
Message.success("成功");
//proxy.$refs.modalFormRef.resetFields();

View File

@ -103,7 +103,11 @@
</template>
<template #coupon_status="{ record }">
<!-- 1:正常 2:强制失效 3:结束 4:删除 -->
<a-switch @click="showCoupon(value,record)" v-model="record.coupon_status" :loading="loading" :disabled="record.coupon_status==2" :checked-value="1" />
<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>
@ -118,7 +122,7 @@
</a-table>
<!-- Modal -->
<couponDetail ref="couponChild" :modalVisible="modalVisible" :modalForm="modalForm" @closeChange="closeCouponDetail" @changeTimeRange="changeTimeRange"></couponDetail>
<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>
@ -236,7 +240,7 @@ const isVisible=ref(false);
},
{
title: '已领取数量',
dataIndex:'coupon_take_count '
dataIndex:'coupon_take_count'
},
{
title: '已使用数量',
@ -346,11 +350,9 @@ const isVisible=ref(false);
const closeChangeOk = () => {
isVisible.value = false;
modalVisible.value = false;
handleQuery();
};
const showCoupon=(value,record)=>{
okTitle.value=!record.coupon_status?'确定关闭吗?':'确定开启吗?';
isVisible.value=true;
cur_coupon_id.value=record.coupon_id;

View File

@ -1,54 +1,5 @@
<template>
<div class="app-container">
<a-form :model="queryForm" ref="queryFormRef" layout="inline">
<a-form-item field="doctor_name" label="医生姓名">
<a-input :style="{ width: '182px' }" v-model="queryForm.doctor_name" placeholder="请输入账号或者姓名" @press-enter="handleQuery" />
</a-form-item>
<a-form-item field="mobile" label="电话号码">
<a-input :style="{ width: '182px' }" v-model="queryForm.mobile" placeholder="请输入电话号码" @press-enter="handleQuery" />
</a-form-item>
<a-form-item field="inquiry_type" label="问诊类型">
<a-select v-model="queryForm.inquiry_type" 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="4">问诊购药</a-option>
</a-select>
</a-form-item>
<a-form-item field="inquiry_mode" label="问诊方式">
<a-select v-model="queryForm.inquiry_mode" 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="4">电话</a-option>
<a-option :value="5">会员</a-option>
<a-option :value="6">疑难会诊</a-option>
<a-option :value="7">附赠沟通</a-option>
<a-option :value="8">健康包服务</a-option>
<a-option :value="9">服务包服务</a-option>
</a-select>
</a-form-item>
<a-form-item field="is_enable" label="启用状态">
<a-select v-model="queryForm.is_enable" placeholder="请选择启用状态" :style="{ width: '182px' }">
<a-option :value="0">关闭</a-option>
<a-option :value="1">开启</a-option>
</a-select>
</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>
@ -59,41 +10,29 @@
<!-- table -->
<a-table :columns="columns" :data="tableData"
:scroll="{ x: 1500 }"
:row-selection="{ type: 'checkbox', showCheckedAll: true }"
:pagination="{ 'show-total': true, 'show-jumper': true, 'show-page-size': true, total: pager.total, current: currentPage }"
row-key="doctor_id" @selection-change="(selection) => {deleteData = selection;console.log(selection)}"
row-key="package_id" @selection-change="(selection) => {deleteData = selection;console.log(selection)}"
@page-change="handlePageChange" @page-size-change="handlepage_sizeChange">
<template #doctor_id="{record,rowIndex}">
<div>{{(rowIndex+1)+(pager.page-1)*pager.page_size}}</div>
</template>
<template #doctor_title="{ record }">
<div>{{ formatDoctorTitle(record.doctor_title) }}</div>
<template #monthly_frequency="{ record }">
<div v-if="record.monthly_frequency==0">不限次</div>
<div v-else>{{ record.monthly_frequency}}</div>
</template>
<template #multi_point_status="{ record }">
<div>{{ formatMultipoint(record.multi_point_status) }}</div>
<template #service_rate="{ record }">
<div>{{record.service_rate+"%"}}</div>
</template>
<template #inquiry_type="{record}">
<div>{{ formatInquiryType(record.inquiry_type) }}</div>
<template #health_package_product="{record}">
<div v-for="item in record.health_package_product" :key="item.product_id" v-if="record.health_package_product.length>0">{{item.product_name }}&nbsp;</div>
<div v-else>-</div>
</template>
<template #inquiry_mode="{record}">
<div>{{ formatMode(record.inquiry_mode) }}</div>
</template>
<template #last_enable_method="{record}">
<div class="reason" v-if="record.last_enable_method==1" >自己</div>
<div v-else>后台</div>
</template>
<template #is_enable="{record}">
<a-tag v-if="record.is_enable == 0" color="red">关闭</a-tag>
<a-tag v-else-if="record.is_enable== 1" color="green">开启</a-tag>
</template>
<template #relation="{record}">
<div>{{formatRelation(record.relation)}}</div>
</template>
<template #action="{ record }">
<a-space>
<a-button v-has="'admin:sysDoctorconfigList:edit'" type="text"
@ -106,11 +45,7 @@
</template>
</a-table>
<addInquiryConfigModal :modalVisible="modalVisible" :inquiry_config_id="inquiry_config_id" :modalForm="modalForm" @freshList="getInquiryInfo(pager);" @familyVisibleChange="()=>{modalVisible=false;inquiry_config_id='';}"></addInquiryConfigModal>
<!-- Akiraka 20230223 删除与批量删除 开始 -->
<!-- <DeleteModal :data="deleteData" :visible="deleteVisible" :apiDelete="removeFamily"
@deleteVisibleChange="() => deleteVisible = false" /> -->
<!-- Akiraka 20230223 删除与批量删除 结束 -->
<addHealthModal :modalVisible="modalVisible" :id="package_id" :modalForm="modalForm" @freshList="getInquiryInfo(pager);" @healthVisibleChange="()=>{modalVisible=false;package_id='';}"></addHealthModal>
<a-modal v-model:visible="okVisible" :modal-style="{width:'320px'}" body-class="okmodal"
@cancel="()=>okVisible=false">
<template #title>
@ -123,7 +58,7 @@
<script setup>
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch, computed } from 'vue';
import { getInquiryconfigList} from '@/api/inquiry/config';
import { getHealthList,healthDetail} from '@/api/inquiry/service';
import {formatDoctorTitle,formatInquiryType,formatMultipoint,formatMode} from "@/utils/format"
// Akiraka 20230210
@ -132,7 +67,7 @@
const deleteVisible = ref(false)
// Akiraka 20230210
const okVisible = ref(false);
const inquiry_config_id=ref("");
const package_id=ref("");
watch(() => deleteVisible.value, (value) => {
if (value == false) {
getInquiryInfo(pager);
@ -173,9 +108,7 @@
});
const modalForm = reactive({
user:{},
avatar: 'https://img.applets.igandanyiyuan.com/basic/file/patient_avatar.png',
});
// Modal
const modalVisible = ref(false);
@ -187,16 +120,12 @@
// Table Columns
const columns = [
{ title: '编号', dataIndex: 'doctor_id', slotName: 'doctor_id', width: '90' },
{ title: '医生姓名', dataIndex: 'doctor_name',width:180 },
{ title: '手机号码', dataIndex: 'mobile_mask', width:130 },
{ title: '科室', dataIndex: 'department_custom_name', width: 150 },
{ title: '职称', dataIndex: 'doctor_title', slotName: 'doctor_title' },
{ title: '接诊数量', dataIndex: 'work_num_day' },
{ title: '多点执业', dataIndex: 'multi_point_status',slotName:'multi_point_status' },
{ title: '问诊类型', dataIndex: 'inquiry_type',slotName:'inquiry_type' },
{ title: '问诊方式', dataIndex: 'inquiry_mode',slotName:'inquiry_mode' },
{ title: '启用状态', dataIndex: 'is_enable',slotName:'is_enable' },
{ title: '申请人', dataIndex: 'last_enable_method',slotName:'last_enable_method' },
{ title: '总服务次数', dataIndex: 'service_count',width:180 },
{ title: '每月次数', dataIndex: 'monthly_frequency',slotName:'monthly_frequency', width:130 },
{ title: '服务有效天数', dataIndex: 'effective_days', width: 150 },
{ title: '服务费率', dataIndex: 'service_rate', slotName: 'service_rate',width:80 },
{ title: '折扣商品总价格(元)', dataIndex: 'discount_product_total_amount',width:80 },
{ title: '关联商品', dataIndex: 'health_package_product',slotName:'health_package_product',width:200 },
{ title: '操作', slotName: 'action', fixed: "right", width: 180 },
];
@ -208,13 +137,17 @@
// Satus
const handleAdd = () => {
modalVisible.value = true;
inquiry_config_id.value='';
package_id.value='';
};
//
const handleDetail = async (record) => {
inquiry_config_id.value=record.inquiry_config_id;
package_id.value=record.package_id;
modalVisible.value = true;
const {code,data}=await healthDetail(record.package_id);
if(code==200){
Object.assign(modalForm,data)
}
};
/**
@ -237,7 +170,7 @@
//
const getInquiryInfo = async (params = {}) => {
const { data, code, message } = await getInquiryconfigList(params);
const { data, code, message } = await getHealthList(params);
if (code == 200) {
tableData.value = data.data;
Object.assign(pager, { total: data.total, page: data.page, page_size: data.page_size });