Merge branch 'dev'

This commit is contained in:
zoujiandong 2024-03-29 17:34:31 +08:00
commit c9c82f7687
16 changed files with 766 additions and 24 deletions

View File

@ -1,3 +1,3 @@
BASE_URL= "https://vue3.go-admin.dev"
VITE_BASE_URL= "https://dev.hospital.admin.api.igandanyiyuan.com"
VITE_BASE_URL= "http://dev.hospital.admin.api.igandanyiyuan.com"
VITE_IMG_URL="https://img.applets.igandanyiyuan.com"

View File

@ -1,3 +1,3 @@
BASE_URL= "https://vue3.go-admin.dev"
VITE_BASE_URL= "https://dev.hospital.admin.api.igandanyiyuan.com"
VITE_BASE_URL= "http://dev.hospital.admin.api.igandanyiyuan.com"
VITE_IMG_URL="https://img.applets.igandanyiyuan.com"

2
components.d.ts vendored
View File

@ -16,6 +16,8 @@ declare module '@vue/runtime-core' {
ConfirmModal: typeof import('./src/components/confirmModal.vue')['default']
DeleteModal: typeof import('./src/components/DeleteModal.vue')['default']
DoctorModal: typeof import('./src/components/doctorModal.vue')['default']
ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
FamilyModal: typeof import('./src/components/familyModal.vue')['default']
InquiryDetailModal: typeof import('./src/components/inquiryDetailModal.vue')['default']
InquiryDetailMoneyModal: typeof import('./src/components/inquiryDetailMoneyModal.vue')['default']

View File

@ -0,0 +1,24 @@
import request from '../../utils/request'
const url = '/admin/doctor/introduction';
export function getDoctorList(params){
return request({
url:'/admin/doctor/introduction',
method: 'get',
params
})
}
export function getDoctorDetail(id){
return request({
url:'/admin/doctor/introduction/'+id,
method: 'get'
})
}
export function checkDoctor(data,id){
return request({
url:'/admin/doctor/introduction/'+id,
method: 'put',
data
})
}

View File

@ -34,6 +34,32 @@
</a-col>
</a-row>
<a-divider />
<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="inquiry_type" :hide-label="true">
<a-select
:disabled="inquiry_config_id?true:false"
v-model="modalForm.inquiry_mode"
placeholder="请选择问诊类型"
@change="changeType"
:style="{ width: '320px' }"
>
<!-- 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-option :value="6">疑难会诊</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-divider />
<div class="titlebox">
<div class="bar"></div>
<div class="name">添加医生</div>

View File

@ -220,6 +220,27 @@
</a-col>
</a-row>
<a-divider />
<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="max_work_num_day" :hide-label="true">
<a-space direction="vertical" size="large">
<a-input-number
mode="button"
v-model="modalForm.default_work_num_day"
:style="{ width: '180px' }"
placeholder="每日最大接诊量"
class="input-demo"
:min="1"
/>
</a-space>
</a-form-item>
</a-col>
</a-row>
<a-divider />
</a-form>
<div class="titlebox">
<div class="bar"></div>
@ -397,8 +418,10 @@ const handleSubmit = () => {
if(modalForm.inquiry_type==3){
modalForm.inquiry_price=modalForm.temp_free_price.join(',')
}else if(modalForm.inquiry_type==2 || modalForm.inquiry_type==4){
modalForm.inquiry_price=String(modalForm.inquiry_price)
modalForm.inquiry_price=String(modalForm.inquiry_price);
}
console.log(modalForm)
const {data,code}=await editSysconfig(modalForm, props.inquiry_config_id);
if (code == 200) {
proxy.$message.success('修改成功')

View File

@ -5,9 +5,12 @@
提示
</template>
<a-form :model="form" :rules="rules" ref="modalFormRef" size="medium" label-align="left" auto-label-width>
<a-form-item field="cancel_remarks" label="理由" >
<a-textarea v-model.trim="form.cancel_remarks" allow-clear placeholder="请输入取消订单理由"></a-textarea>
</a-form-item>
<a-form-item field="cancel_remarks" label="理由" >
<a-textarea v-model.trim="form.cancel_remarks" allow-clear placeholder="请输入取消订单理由"></a-textarea>
</a-form-item>
<a-form-item field="refund_amount" label="退款金额(元)" >
<a-input-number v-model="form.refund_amount" placeholder="请输入退款金额" size="large" class="input-demo" />
</a-form-item>
</a-form>
<template #footer>
<a-button @click="handleClose"><template #icon><icon-close /></template>取消</a-button>
@ -17,11 +20,12 @@
</a-modal>
</template>
<script setup>
import { reactive, toRefs, getCurrentInstance } from 'vue';
import { reactive, toRefs, getCurrentInstance,watch } from 'vue';
import { Message } from '@arco-design/web-vue';
const { proxy } = getCurrentInstance();
const form = reactive({
cancel_remarks: ''
cancel_remarks: '',
refund_amount:null
});
const props = defineProps({
//
@ -33,6 +37,10 @@ const props = defineProps({
type: String,
default:'',
},
payment_amount_total:{
type:Number,
default:''
},
dealType:{
type: String,
default:'',
@ -46,16 +54,20 @@ const props = defineProps({
},
});
const emits = defineEmits(['closeChange']);
const {okVisible,title,id,api} = toRefs(props);
const {okVisible,title,id,api,payment_amount_total} = toRefs(props);
// Akiraka 20230210
const handleClose = () => {
emits('closeChange',false);
// alert(flag)
}
watch(()=>props.payment_amount_total,(newVal,oldVal)=>{
form.refund_amount=newVal;
},{immediate:true})
// Akiraka 20230210
const rules = reactive({
cancel_remarks: [{ required: true, message: '请输入取消订单理由' }]
cancel_remarks: [{ required: true, message: '请输入取消订单理由' }],
refund_amount:[{ required: true, message: '请输入退款金额' }]
});
// Akiraka 20230210 =>
const handleConfirm = () => {

View File

@ -50,7 +50,13 @@
<span>{{ formatInquiryType(modalForm.inquiry_type) }}</span>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item field="inquiry_mode" label="问诊类型:">
<span>{{ formatMode(modalForm.inquiry_mode) }}</span>
</a-form-item>
</a-col>
</a-row>
<a-divider />
<div class="titlebox" v-if="modalForm.user_doctor">
<div class="bar"></div>
@ -254,7 +260,7 @@ import { ref, toRefs, reactive, watch,nextTick } from 'vue';
import { formatDoctorTitle } from '@/utils/format';
import { parseTime } from '@/utils/parseTime';
import { inquiryCase} from '@/api/order/list';
import { formatInquiryType, formatInquiryStatus } from '@/utils/format';
import { formatInquiryType, formatInquiryStatus,formatMode } from '@/utils/format';
const emits = defineEmits(['inquiryVisibleChange']);
const props = defineProps({
//

View File

@ -64,6 +64,13 @@
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="inquiry_mode" label="问诊方式:">
<span>{{formatMode(modalForm.inquiry_mode)}}</span>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" v-if="modalForm.cancel_reason">
<a-col :span="24">
<a-form-item field="department_custom_name" label="备 注 ">
@ -237,7 +244,7 @@ import { ref, toRefs, reactive, watch} from 'vue';
import { formatDoctorTitle } from '@/utils/format';
import { parseTime } from '@/utils/parseTime';
import { inquiryCase} from '@/api/order/list';
import { formatInquiryType, formatInquiryStatus,formatOrderCancelReason } from '@/utils/format';
import { formatInquiryType,formatMode, formatInquiryStatus,formatOrderCancelReason } from '@/utils/format';
const emits = defineEmits(['inquiryVisibleChange']);
const props = defineProps({
//

View File

@ -101,7 +101,7 @@ export const formatRelation=(val)=>{
export const formatMode=(val)=>{
//1:图文 2:视频 3:语音 4:电话 5:会员
let data={1:'图文',2:'视频', 3:'语音', 4:'电话',5:'会员'}
let data={1:'图文',2:'视频', 3:'语音', 4:'电话',5:'会员',6:'疑难会诊',7:'附赠沟通'}
if(val){
return data[val]
}else{

View File

@ -178,6 +178,13 @@
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="user.email" label="邮箱:">
<a-input v-model="modalForm.user.email" placeholder="请输入邮箱" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="cur_doctor_expertise" label="专长:">

View File

@ -0,0 +1,588 @@
<template>
<div class="app-container">
<a-form :model="queryForm" ref="queryFormRef" layout="inline">
<a-form-item field="user_name" label="医生名字">
<a-input v-model="queryForm.user_name" placeholder="请输入医生名字" @press-enter="handleQuery" />
</a-form-item>
<a-form-item field="mobile" label="电话号码">
<a-input v-model="queryForm.mobile" placeholder="请输入电话号码" @press-enter="handleQuery" />
</a-form-item>
<!-- <a-form-item field="multi_point_status" label="审核状态">
<a-select v-model="queryForm.multi_point_status" placeholder="请选择审核状态" :style="{ width: '180px' }">
<a-option :value="2">审核中</a-option>
<a-option :value="3">认证失败</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 -->
<!-- table -->
<a-table :columns="columns" :data="tableData"
: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;}" @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 }">
<!-- 医生职称1:主任医师 2:主任中医师 3:副主任医师 4:副主任中医师 5:主治医师 6:住院医师 -->
<div v-if="record.doctor_title==1">主任医师</div>
<div v-else-if="record.doctor_title==2">主任中医师</div>
<div v-else-if="record.doctor_title==3">副主任医师</div>
<div v-else-if="record.doctor_title==4">副主任中医师</div>
<div v-else-if="record.doctor_title==5">主治医师</div>
<div v-else-if="record.doctor_title==6">住院医师</div>
</template>
<template #created_at="{ record }">
{{ parseTime(record.created_at) }}
</template>
<template #hospital_name="{record}">
<div class="hospital_name" :title="record.hospital_name">{{record.hospital_name}}</div>
</template>
<template #inquiry_service="{ record }">
<span>{{filterService(record)}}</span>
</template>
<template #introduction_status="{ record }">
<!-- 简介认证状态0:未认证 1:认证通过 2:审核中 3:认证失败 -->
<a-tag v-if="record.introduction_status == 0" color="gray">未审核</a-tag>
<a-tag v-else-if="record.introduction_status == 1" color="green">审核通过</a-tag>
<a-tag v-else-if="record.introduction_status == 2" color="#ffb400">审核中</a-tag>
<a-tag v-else color="red">审核失败</a-tag>
</template>
<template #is_recommend="{ record }">
<!-- 身份认证状态0:未认证 1:认证通过 2:审核中 3:认证失败 -->
<a-tag v-if="record.is_recommend == 0" color="gray"></a-tag>
<a-tag v-else color="green"></a-tag>
</template>
<template #status="{ record }">
<!-- 状态0:禁用 1:正常 2:删除 -->
<a-switch v-model="record.status" checked-color="#14C9C9" :checked-value="1" unchecked-value="0" />
</template>
<template #action="{ record }">
<a-space>
<a-button v-has="'admin:sysDoctorIntroduction:check'" type="text"
@click="handleDetail(record)"><icon-book />审核</a-button>
</a-space>
</template>
</a-table>
<!-- Modal -->
<a-modal v-model:visible="modalVisible" fullscreen :title="modalTitle" title-align="start" :footer="false"
@close="() => {$refs.modalFormRef.resetFields(); modalForm.doctor_id = null;}">
<div class="titlebox">
<div class="bar"></div>
<div class="name">医生信息</div>
</div>
<a-form :model="modalForm" :disabled="true" ref="modalFormRef"
:auto-label-width="true">
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="avatar" label="医生头像:">
<a-space size="large">
<a-image width="80" height="80" class="headImg" :src="modalForm.avatar">
</a-image>
</a-space>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="cur_doctor_expertise" label="专长:">
<a-select multiple placeholder="请选择专长" v-model="modalForm.cur_doctor_expertise">
<a-option v-for="item in expertiseData" :key="item.expertise_id" :value="item.expertise_id"
:label="item.expertise_name">{{item.expertise_name}}</a-option>
</a-select>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="be_good_at" label="擅长信息:">
<a-textarea :auto-size="{minRows:2}" :max-length="{length:1000,errorOnly:true}" allow-clear
show-word-limit v-model="modalForm.be_good_at"
placeholder="请填写医生擅长信息。内容为医生专业领域、擅长疾病、研究方法等信息字数在10-1000字" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="brief_introduction" label="个人简介:">
<a-textarea :auto-size="{minRows:2}" :max-length="{length:1000,errorOnly:true}" allow-clear
show-word-limit v-model="modalForm.brief_introduction"
placeholder="请填写医生从业经历职称和所获荣誉等信息字数在10-1000字" />
</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" v-has="'admin:sysDoctorIntroduction:ok'" @click="handleCheck('ok')">审核通过</a-button>
<a-button type="primary" v-has="'admin:sysDoctorIntroduction:deny'" status="danger" @click="handleCheck(deny)">审核拒绝</a-button>
</a-space>
<!-- <a-space v-if="modalSatus=='edit'">
<a-button type="primary" status="warning">拉黑</a-button>
<a-button type="primary" status="danger">删除</a-button>
</a-space> -->
</a-form-item>
</a-col>
</a-row>
</a-modal>
<!-- 审核失败弹框 -->
<a-modal :mask-closable="false" v-model:visible="modalCheckVisible" :title="'拒绝理由'" title-align="start"
@before-ok="handleSubmit" @close="() => { $refs.checkFormRef.resetFields();}">
<a-form :model="modalCheckForm" ref="checkFormRef"
:auto-label-width="true" :mask-closable="false" :rules="rules" >
<a-form-item field="avatar_reason" label="头像原因:">
<a-textarea v-model="modalCheckForm.avatar_reason" placeholder="请输入头像原因" />
</a-form-item>
<a-form-item field="doctor_expertise_reason" label="专长原因:">
<a-textarea v-model="modalCheckForm.doctor_expertise_reason" placeholder="请输入专长原因" />
</a-form-item>
<a-form-item field="brief_introduction_reason" label="简介原因:">
<a-textarea v-model="modalCheckForm.brief_introduction_reason" placeholder="请输入简介原因" />
</a-form-item>
<a-form-item field="be_good_at_reason" label="擅长原因:">
<a-textarea v-model="modalCheckForm.be_good_at_reason" placeholder="请输入擅长原因" />
</a-form-item>
</a-form>
</a-modal>
</div>
</template>
<script setup>
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch, computed } from 'vue';
import { getDoctorList,getDoctorDetail,checkDoctor} from '@/api/doctor/introduction';
import {departmentList, decryptCard, hospitalList, expertiseList } from '@/api/doctor/list';
import dayjs from 'dayjs'
import { parseTime } from '@/utils/parseTime';
// Akiraka 20230210
const deleteData = ref([])
// Akiraka 20230210
const deleteVisible = ref(false)
const modalCheckVisible = ref(false)
// Akiraka 20230210
watch(() => deleteVisible.value, (value) => {
if (value == false) {
getDoctorInfo(pager);
}
});
const file = ref();
const { proxy } = getCurrentInstance();
const currentPage = ref(1);
// Pager
const pager = {
total: 0,
page: 1,
page_size: 10,
};
// form
const queryForm = reactive({
inquiry_service: ''
});
const modalCheckForm = reactive({
avatar_reason:'',
doctor_expertise_reason:'',
brief_introduction_reason:'',
be_good_at_reason:''
});
const modalForm = reactive({
hospital: {},
user_doctor_info: {
},
user: {},
doctor_id: '',
license_cert: [],
qualification_cert: [],
work_cert: [],
department_custom_name: '',
user_id: '',
status: 1,
id_card_front: '',
id_card_back: '',
sign_image: '',
card_num: null,
cur_doctor_expertise: [],
avatar: 'https://img.applets.igandanyiyuan.com/basic/file/doctor_avatar.png'
});
// Modal
const modalVisible = ref(false);
const modalTitle = ref('默认标题');
//let obj = { 1: '', 2: '', 3: '', 4: '', 5: '', 6: '' };
const doctor_title_data = [
{
doctor_title: 1,
doctor_title_name: '主任医师'
},
{
doctor_title: 2,
doctor_title_name: '主任中医师'
},
{
doctor_title: 3,
doctor_title_name: '副主任医师'
},
{
doctor_title: 4,
doctor_title_name: '副主任中医师'
},
{
doctor_title: 5,
doctor_title_name: '主治医师'
},
{
doctor_title: 6,
doctor_title_name: '住院医师'
}
];
// rules
const rules = reactive({
avatar_reason: [ {
validator: (value, cb) => {
if (value && value.length>20) {
cb('头像理由不能超过20个字符');
}
}
}],
doctor_expertise_reason: [ {
validator: (value, cb) => {
if (value && value.length>20) {
cb('专长理由不能超过20个字符');
}
}
}],
brief_introduction_reason: [ {
validator: (value, cb) => {
if (value && value.length>20) {
cb('简介理由不能超过20个字符');
}
}
}],
be_good_at_reason: [ {
validator: (value, cb) => {
if (value && value.length>20) {
cb('擅长理由不能超过20个字符');
}
}
}],
});
// Batch Del List
let batchList = [];
// Table Columns
const columns = [
{ title: '编号', dataIndex: 'doctor_id', slotName: 'doctor_id', width: '90' },
{ title: '医生名字', dataIndex: 'user_name' },
{ title: '手机号码', dataIndex: 'mobile' },
{ title: '医院', dataIndex: 'hospital_name', width: 160, slotName: 'hospital_name' },
{ title: '科室', dataIndex: 'department_custom_name',},
{ title: '职称', dataIndex: 'doctor_title', slotName: 'doctor_title' },
{ title: '申请时间', dataIndex: 'created_at', slotName: 'created_at' },
{ title: '审核状态', dataIndex: 'introduction_status', slotName: 'introduction_status' },
{ title: '操作', slotName: 'action' },
];
// Table Data
const tableData = ref([]);
//
const changeSelect = (value) => {
let arr = departmentData.value.filter((item) => {
return item.department_custom_id == value
})
modalForm.department_custom_name = arr[0].department_custom_name
}
//
const handleDetail = async (record) => {
modalVisible.value = true;
modalTitle.value = '医生详情';
const { code, data, message } = await getDoctorDetail(record.doctor_id);
if (code == 200) {
Object.assign(modalForm, data);
if(data.doctor_title==0){
modalForm.doctor_title='';
}
if(data.hospital_id==0){
modalForm.hospital_id='';
}
if(data.department_custom_id==0){
modalForm.department_custom_id=''
}
if (!data.user_doctor_info) {
data.user_doctor_info = {};
modalForm.user_doctor_info = {};
}
if (!data.hospital) {
modalForm.hospital = {};
}
if (!data.doctor_bank_card) {
modalForm.doctor_bank_card = {
province_id: '',
city_id: '',
county_id: '',
bank_id: ''
}
};
if (data.doctor_expertise && data.doctor_expertise.length > 0) {
let arr = [];
data.doctor_expertise.forEach((item) => {
arr.push(item.expertise_id)
})
modalForm.cur_doctor_expertise = arr;
}
}
};
//
const filterService = (record) => {
let arr = [];
let str = '';
if (record.is_img_expert_reception == 1) {
arr.push("专家问诊");
}
if (record.is_img_welfare_reception == 1) {
arr.push("公益问诊")
}
if (record.is_img_quick_reception == 1) {
arr.push("快速问诊")
};
if (record.multi_point_status == 1) {
arr.push("问诊购药")
}
arr.forEach((item) => {
if (!str) {
str += item
} else {
str += ',' + item
}
})
return str ? str : "暂无"
}
/**
* 分页改变
* @param {Number} [page]
*/
const handlePageChange = (page) => {
pager.page = page;
//
currentPage.value = page;
getDoctorInfo({ ...pager, ...queryForm });
};
//
const handlepage_sizeChange = (page_size) => {
pager.page_size = page_size;
getDoctorInfo({ ...pager, ...queryForm });
};
//
const getDoctorInfo = async (params = {}) => {
const { data, code, message } = await getDoctorList(params);
if (code == 200) {
tableData.value = data.data;
Object.assign(pager, { total: data.total, page: data.page, page_size: data.page_size });
}
};
//
const handleQuery = async () => {
pager.page=1;
const params = {
page: pager.page,
page_size: pager.page_size,
...queryForm,
};
getDoctorInfo(params);
};
const departmentData = ref([]);
//
const getDepartmentList = () => {
departmentList().then((res) => {
const { data, code, message } = res;
if (code == 200) {
departmentData.value = data;
}
});
}
//
const showEye = ref(false);
const id_card_num = ref('');
//
const handelDecryptCard = async (user_id) => {
showEye.value=true
const { data, code, message } = await decryptCard({
user_id
});
if (code == 200) {
id_card_num.value = data;
}
};
const hospitalData = ref([]);
//
const handleHospitalList = () => {
hospitalList().then((res) => {
const { data, code, message } = res;
if (code == 200) {
hospitalData.value = data;
}
});
}
const expertiseData = ref([]);
//
const handlExpertiseList = () => {
expertiseList().then((res) => {
const { data, code, message } = res;
if (code == 200) {
expertiseData.value = data;
}
})
}
// Modal done()
const handleSubmit = (done) => {
proxy.$refs.checkFormRef.validate(async (valid) => {
if (!valid) {
if(!modalCheckForm.avatar_reason && !modalCheckForm.doctor_expertise_reason && !modalCheckForm.brief_introduction_reason && !modalForm.be_good_at_reason){
proxy.$notification.error("理由至少填写一个");
done(false);
return false
}
proxy.$loading.show();
let dataFrom=Object.assign({},modalCheckForm,{
introduction_status:3
})
const {code,message,data}= await checkDoctor(dataFrom,modalForm.doctor_id);
if (code == 200) {
proxy.$loading.hide();
proxy.$notification.success("提交成功");
modalVisible.value=false;
}
done();
getDoctorInfo(pager);
} else {
console.log(valid)
proxy.$message.error('表单校验失败');
done(false);
}
});
};
//
const handleCheck= async(type)=>{
if(type=="ok"){
proxy.$loading.show();
const {code,message,data}= await checkDoctor({
introduction_status:1
},modalForm.doctor_id);
if (code == 200) {
proxy.$notification.success("审核通过");
modalVisible.value=false;
};
proxy.$loading.hide();
getDoctorInfo(pager);
}else{
modalCheckVisible.value=true;
}
}
//
const handleResetQuery = () => {
proxy.$refs.queryFormRef.resetFields();
getDoctorInfo(queryForm);
}
onMounted(() => {
getDoctorInfo(pager);
handleHospitalList();
getDepartmentList();
handlExpertiseList();
});
</script>
<style lang="scss" scoped>
.action {
margin-bottom: 12px;
}
.hospital_name {
width: 160px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.headImg {
margin-right: 20px;
border-radius: 50%;
}
.arco-form-item-layout-horizontal:first-child,
.arco-form-item-layout-horizontal:nth-child(2) {
align-items: center;
}
.upload {
margin-left: 20px;
}
.eye {
margin-left: 20px;
cursor: pointer;
font-size: 18px;
}
.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;
}
</style>

View File

@ -303,6 +303,13 @@
</a-col>
</a-row> -->
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="user.email" label="邮箱:">
<a-input v-model="modalForm.user.email" placeholder="请输入邮箱" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="cur_doctor_expertise" label="专长:">
@ -895,6 +902,7 @@ const showCheckedAll=ref(true);
}
}
}],
'hospital.address': [{ required: true, message: '请输入医院地址' }],
'hospital_id': [{ required: true, message: '请选择医院名称' }],
'department_custom_mobile': [{
@ -903,7 +911,16 @@ const showCheckedAll=ref(true);
department_custom_id: [{ required: true, message: '请选择所在科室' }],
department_custom_name: [{ required: true, message: '请输入科室名称' }],
doctor_title: [{ required: true, message: '请选择职称' }],
// 'user_doctor_info.qualification_cert_num': [{ required: true, message: '' }],
'user.email': [
{ required: true, message: '请输入邮箱' },
{
validator: (value, cb) => {
let reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
if (!reg.test(value)) {
cb('邮箱格式不正确');
}
}
}],
cur_doctor_expertise: [
{ type: 'array', required: true, message: '请选择专长' },
{
@ -1283,7 +1300,7 @@ const showCheckedAll=ref(true);
let modalData = {
card_name: modalForm.user_name,
mobile: modalForm.user.mobile,
mobile: modalForm.user.mobile,
is_recommend: modalForm.is_recommend,
avatar: modalForm.avatar,
doctor_title: modalForm.doctor_title,

View File

@ -16,16 +16,27 @@
<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-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>
@ -46,7 +57,7 @@
<!-- table -->
<a-table :columns="columns" :data="tableData"
:scroll="{ x: 1400 }"
: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)}"
@ -64,6 +75,9 @@
<template #inquiry_type="{record}">
<div>{{ formatInquiryType(record.inquiry_type) }}</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>
@ -108,7 +122,7 @@
<script setup>
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch, computed } from 'vue';
import { getInquiryconfigList} from '@/api/inquiry/config';
import {formatDoctorTitle,formatInquiryType,formatMultipoint} from "@/utils/format"
import {formatDoctorTitle,formatInquiryType,formatMultipoint,formatMode} from "@/utils/format"
// Akiraka 20230210
const deleteData = ref([])
@ -178,6 +192,7 @@
{ 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: '操作', slotName: 'action', fixed: "right", width: 180 },

View File

@ -63,7 +63,7 @@
<!-- table -->
<a-table :columns="columns" :data="tableData"
:scroll="{ x: 1400 }"
: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)}"
@ -74,6 +74,9 @@
<template #inquiry_type="{record}">
<div>{{formatInquiryType(record.inquiry_type)}}</div>
</template>
<template #inquiry_mode="{ record }">
{{ formatMode(record.inquiry_mode) }}
</template>
<template #inquiry_status="{record}">
<div>{{formatInquiryStatus(record.inquiry_status)}}</div>
</template>
@ -99,7 +102,7 @@
<script setup>
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch, computed } from 'vue';
import { getInquiryList,getInquiryDetail} from '@/api/inquiry/list';
import {formatInquiryType,formatInquiryStatus} from "@/utils/format"
import {formatInquiryType,formatInquiryStatus,formatMode} from "@/utils/format"
import { parseTime } from '@/utils/parseTime';
// Akiraka 20230210
const deleteData = ref([])
@ -216,6 +219,7 @@ watch(()=>queryForm.create_range_time,(value)=>{
{ title: '就诊人', dataIndex:'patient_name_mask',slotName: 'patient_name_mask',width:100 },
{ title: '所属患者', dataIndex: 'user_name', slotName: 'user_name',width: 150 },
{ title: '问诊类型', dataIndex: 'inquiry_type', slotName: 'inquiry_type' },
{ title: '问诊方式', dataIndex: 'inquiry_mode',slotName:'inquiry_mode',width:100 },
{ title: '订单状态', dataIndex: 'inquiry_status', slotName: 'inquiry_status' },
{ title: '接诊时间', dataIndex: 'reception_time', slotName: 'reception_time',width:200 },
{ title: '操作', slotName: 'action', fixed: "right", width: 180 },

View File

@ -94,7 +94,7 @@
<!-- table -->
<a-table
:columns="columns"
:scroll="{ x: 1600 }"
:scroll="{ x: 1700 }"
:data="tableData"
:pagination="{ 'show-total': true, 'show-jumper': true, 'show-page-size': true, total: pager.total, current: currentPage }"
:row-selection="{ type: 'checkbox', showCheckedAll: true }"
@ -134,6 +134,9 @@
<template #inquiry_type="{ record }">
{{ formatInquiryType(record.inquiry_type) }}
</template>
<template #inquiry_mode="{ record }">
{{ formatMode(record.inquiry_mode) }}
</template>
<template #pay_time="{ record }">
{{ parseTime(record.pay_time) }}
</template>
@ -208,6 +211,13 @@
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="inquiry_mode" label="问诊方式:">
<span>{{formatMode(modalForm.inquiry_mode)}}</span>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" v-if="modalForm.cancel_reason">
<a-col :span="24">
<a-form-item field="department_custom_name" label="备 注 ">
@ -403,7 +413,7 @@
<!-- 患者详情弹窗 -->
<patientModal :patientVisible="patientVisible" :data="patientData" @patientVisibleChange="() => {patientVisible = false;}"></patientModal>
<confirmModal :okVisible="okVisible" :api="cancelInquiry" :title="'确定取消此订单吗?'" :dealType="'order_inquiry_id'" :id="cur_inruiry_id" @closeChange="handelCloseChange"></confirmModal>
<confirmModal :okVisible="okVisible" :payment_amount_total="modalForm.payment_amount_total" :api="cancelInquiry" :title="'确定取消此订单吗?'" :dealType="'order_inquiry_id'" :id="cur_inruiry_id" @closeChange="handelCloseChange"></confirmModal>
<!-- 聊天记录 -->
<!-- Modal -->
@ -431,7 +441,7 @@
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch } from 'vue';
import {exportInquiry, getOrderList,getOrderDetail,cancelInquiry,inquiryCase} from '@/api/order/list';
import { parseTime } from '@/utils/parseTime';
import {formatDoctorTitle,formatOrderCancelReason} from "@/utils/format"
import {formatDoctorTitle,formatOrderCancelReason,formatMode} from "@/utils/format"
import { downloadFile } from '@/utils/downloadFile';
// Akiraka 20230210
const deleteData = ref([])
@ -547,6 +557,7 @@ const columns = [
{ title: '订单金额', dataIndex: 'amount_total',slotName:'amount_total',width:100 },
{ title: '实付金额', dataIndex: 'payment_amount_total',slotName:'payment_amount_total',width:100 },
{ title: '服务类型', dataIndex: 'inquiry_type',slotName:'inquiry_type',width:100 },
{ title: '问诊方式', dataIndex: 'inquiry_mode',slotName:'inquiry_mode',width:100 },
{ title: '支付方式', dataIndex: 'inquiry_pay_channel',slotName: 'inquiry_pay_channel'},
{ title: '订单状态', dataIndex: 'inquiry_status', slotName:'inquiry_status' },
{ title: '支付时间', dataIndex: 'pay_time', slotName: 'pay_time',width:200 },