医生管理

This commit is contained in:
zoujiandong 2023-07-12 19:03:47 +08:00
parent 3b666aa539
commit 2c69c3dae5
10 changed files with 627 additions and 171 deletions

View File

@ -18,6 +18,7 @@
"axios": "^1.4.0",
"codemirror": "^6.0.1",
"cropperjs": "^1.5.13",
"dayjs": "^1.11.9",
"i": "^0.3.7",
"js-cookie": "^3.0.5",
"npm": "^9.6.6",
@ -29,11 +30,11 @@
"devDependencies": {
"@arco-design/web-vue": "^2.45.3",
"@vitejs/plugin-vue": "^4.2.1",
"unplugin-vue-components": "^0.24.1",
"eslint": "^8.40.0",
"eslint-plugin-vue": "^9.12.0",
"mockjs": "^1.1.0",
"sass": "^1.62.1",
"unplugin-vue-components": "^0.24.1",
"vite": "^4.3.5",
"vite-plugin-mock": "^3.0.0",
"vite-svg-loader": "^4.0.0"

View File

@ -42,21 +42,28 @@ export function getDoctorDetail(id){
}
export function departmentList(){ //获取科室列表
return request({
url:'/admin/department/custom/list',
url:'/basic/department/custom/list',
method: 'get'
})
}
export function decryptCard(user_id){
export function decryptCard(params){
return request({
url:'/decrypt/card/'+user_id,
method: 'get'
})
}
export function hospitalList(params){ //获取医院地址列表
return request({
url:'/admin/hospital/list',
url:'/decrypt/card/num',
method: 'get',
params
})
}
export function hospitalList(params){ //获取医院地址列表
return request({
url:'/basic/hospital/list',
method: 'get',
params
})
}
export function expertiseList(){ //获取专长列表
return request({
url:'/basic/expertise/list',
method: 'get'
})
}

View File

@ -1,4 +1,5 @@
import request from '../utils/request'
export function ossSign(params){
return request({
url:"/sign/oss",
@ -11,7 +12,7 @@ export function ossUpload(url,data){
url,
method: 'post',
data,
header:{
headers:{
'Content-Type': 'multipart/form-data'
}
})

View File

@ -92,7 +92,6 @@ watch(() => props.visible,(value) => {
const handleConfirm = () => {
proxy.$refs.modalFormRef.validate((valid) => {
if (!valid) {
console.log(delType.value)
// Akiraka 20230210
props.apiDelete({ [delType.value]: data.value }).then(response => {
// Akiraka 20230210
@ -102,8 +101,6 @@ const handleConfirm = () => {
proxy.$notification.error(response.message);
}
deleteVisible.value = false;
console.log(response)
})
}
})

View File

@ -1,22 +1,82 @@
<template>
<a-upload action="/" :auto-upload="false" accept="image/png, image/jpeg" @before-upload="beforeUpload" @change="onChange" :fileList="file ? [file] : []" :show-file-list="false"/>
</template>
<script setup>
import { ref,getCurrentInstance,} from 'vue';
const { proxy } = getCurrentInstance();
const file = ref();
const beforeUpload = (file) => {
return new Promise((resolve, reject) => {
if(file.size>=10*1024*1024){
proxy.$notification.error("图片大小不能超过10M");
reject('cancel')
}else{
resolve(true)
}
<a-upload list-type="picture-card" @change="onChangeFile" accept="image/*" :file-list="fileList"
@before-upload="beforeUpload" @before-remove="beforeMove" action="/" :multiple="isMultiple" :auto-upload="false" image-preview />
</template>
<script setup>
import { ref, getCurrentInstance,toRefs,watch} from 'vue';
import { ossSign, ossUpload } from '@/api/oss';
import dayjs from 'dayjs'
const { proxy } = getCurrentInstance();
const props = defineProps({
//
fileList: {
type: Array,
},
dataType:{
type:String
},
isMultiple: {
type: Boolean,
default:false
}
});
const {fileList,isMultiple,dataType} = toRefs(props);
const emits = defineEmits(['changeData']);
const beforeUpload = (file) => {
return new Promise((resolve, reject) => {
alert(isMultiple.value);
alert(fileList.value.length)
if(!isMultiple.value && fileList.value.length>=1){
proxy.$notification.error("只能上传一张图片");
reject('cancel')
}else if (file.size >= 10 * 1024 * 1024) {
proxy.$notification.error("图片大小不能超过10M");
reject('cancel')
} else {
resolve(true);
getOssSign(1,file);
}
});
};
const beforeMove=(file)=>{
return new Promise((resolve, reject) => {
console.log(file);
emits("changeData",{url:file.url,type:dataType.value,dealType:"remove"})
resolve(true)
});
}
//
const onChangeFile = (fileList) => {
// for (let i = 0; i < fileList.length; i++) {
// getOssSign(1, fileList[i].file);
// }
// //getOssSign(1, fileList[0].file);
// console.log(fileList)
};
//const emit = defineEmits(['fileList'])
//oss
const getOssSign = async (scene, File) => {
const { data, code, message } = await ossSign({
user_type: 4,
scene,
});
if (code == 200) {
let { access_id, dir, policy, signature, host } = data;
let filename = File.name;
let time = dayjs().format("YYYYMMDDHHmmss")
let formData = new FormData();
formData.append('OSSAccessKeyId', access_id);
formData.append('policy', policy);
formData.append('signature', signature);
formData.append('key', dir + time + filename);
formData.append('file', File, filename);
ossUpload(host, formData).then((res) => {
emits("changeData",{url:host+"/"+ dir + time + filename,type:dataType.value,dealType:"add"})
});
};
const onChange = (_, currentFile) => {
console.log(currentFile);
};
</script>
} else {
proxy.$notification.error(message);
}
}
</script>

View File

@ -6,7 +6,7 @@ export default {
const { value } = binding;
const permissions = store.buttonPermissions;
const all_permission = '*'
if (typeof value === 'string') {
if (typeof value === 'string' && permissions && permissions.length>0) {
const hasPermission = permissions.some((permission) => {
return all_permission==permission || value === permission;
})

View File

@ -8,7 +8,7 @@ const service = axios.create({
baseURL:import.meta.env.VITE_BASE_URL,
timeout: 8000,
headers:{
'Content-Type':'application/x-www-form-urlencoded',
'Content-Type':'application/json',
'Authorization':''
}
});
@ -21,7 +21,7 @@ service.interceptors.request.use(
// 设置请求头部 Authorization
if (store.token) {
config.headers['Authorization'] = 'Bearer ' + store.token;
config.headers['Content-Type'] = 'application/json'
//config.headers['Content-Type'] = 'multipart/form-data'
}
return config;
},

View File

@ -108,7 +108,7 @@
:check-strictly="false"
:data="treeData"
ref="tree"
checked-strategy="child"
checked-strategy="all"
@check="checkTree"
:only-check-leaf="true"
:default-expand-all="true"
@ -155,7 +155,8 @@
ref,
getCurrentInstance,
nextTick,
watch
watch,
shallowRef
} from 'vue';
import {
getRole,
@ -204,6 +205,7 @@
sort: 0,
role_status: '',
is_admin: '',
menu_ids:[]
});
const scopeForm = reactive({});
@ -314,8 +316,7 @@
const tree=ref(null);
const checkTree=(checkedKeys,data)=>{
allCheckKeys.value=checkedKeys.concat(data.halfCheckedKeys);
console.log(checkedKeys);
console.log(data);
console.log(allCheckKeys.value);
// if(data.checked){
// console.log(data.node.parent_id)
// tree.value.selectNode(data.node.parent_id,true);
@ -345,6 +346,7 @@
const { code, data, message } = await roleDetail(record.role_id);
if (code == 200) {
Object.assign(modalForm, data);
allCheckKeys.value=data.menu_ids;
//
const res2 = data.menu_ids.filter(item1 => !allParentId.some(item2 => item2 === item1))
checkedKeys.value = res2;
@ -413,8 +415,7 @@
proxy.$refs.modalFormRef.validate(async (valid) => {
// valid
if (!valid) {
console.log(checkedKeys.value);
modalForm.menu_ids = allCheckKeys.value;
modalForm.menu_ids= allCheckKeys.value;
let res;
if (modalForm.role_id) {
const {

View File

@ -87,7 +87,7 @@
<div>{{(rowIndex+1)+(pager.page-1)*10}}</div>
</template>
<template #role_name="{ record }">
{{ record.role.role_name}}
{{ record.role_name?.role_name}}
</template>
<template #dept_name="{ record }">
{{ record.dept?.dept_name }}
@ -609,7 +609,8 @@ function useModalOperate() {
const modalTitle = ref('默认标题');
// Form
const modalForm = reactive({ status: null });
const modalForm = reactive({ status: null,role:{},post:{},dept:{}
});
// AddRules
const rules = {

View File

@ -91,7 +91,7 @@
<template #action="{ record }">
<a-space>
<a-button v-has="'admin:sysDoctor:detail'" type="text"
@click="handleDetail(record)"><icon-edit />详情</a-button>
@click="handleDetail(record)"><icon-book />详情</a-button>
<a-button v-has="'admin:sysDoctor:edit'" type="text" @click="handleUpdate(record)"><icon-edit /> 修改</a-button>
<a-button v-has="'admin:sysDoctor:remove'" type="text"
@click="() => { deleteVisible = true; deleteData = [record.doctor_id]; }"><icon-delete /> 删除</a-button>
@ -108,38 +108,50 @@
</div>
<a-form :model="modalForm" :disabled="modalSatus=='detail'" :rules="rules" ref="modalFormRef"
:auto-label-width="true">
<a-form-item field="avatar" label="医生头像:">
<a-space size="large">
<a-avatar :size="80" :imageUrl="modalForm.avatar">
</a-avatar>
</a-space>
<a-upload action="/" :fileList="file ? [file] : []" class="upload" :auto-upload="false" @change="onChangeFile"
accept="image/png, image/jpeg" @before-upload="beforeUpload" :show-file-list="false"
v-if="modalSatus!='detail'" />
</a-form-item>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="avatar" label="医生头像:">
<a-space size="large">
<a-avatar :size="80" :imageUrl="modalForm.avatar">
</a-avatar>
</a-space>
<a-upload action="/" :fileList="file ? [file] : []" class="upload" :auto-upload="false"
@change="onChangeFile" accept="image/*" @before-upload="beforeUpload" :show-file-list="false"
v-if="modalSatus!='detail'" />
</a-form-item>
</a-col>
<a-col :span="12" v-if="modalSatus=='add'">
<a-form-item field="user.mobile" label="联系电话:">
<a-input v-model="modalForm.user.mobile" placeholder="请输入联系电话" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="user_name" label="医生名字:">
{{modalForm.user_name}}
<a-input v-model="modalForm.user_name" placeholder="请输入医生名字" :disabled="modalSatus=='edit'"/>
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item field="idCard" label="身份证号:">
<div class="box" v-show="!showEye">
<a-form-item field="card_num" label="身份证号:" v-if="modalSatus=='add'">
<a-input v-model="modalForm.card_num" placeholder="请输入身份证号" />
</a-form-item>
<a-form-item field="idCard" label="身份证号:" v-else>
<div class="box" v-show="!showEye && modalSatus!='add'">
<div>{{modalForm.user_doctor_info.card_num_mask}}</div>
<icon-eye-invisible class="eye" @click="()=>{showEye=true}" />
</div>
<div class="box" v-show="showEye">
<div class="box" v-show="showEye && modalSatus!='add'">
<div>{{id_card_num}}</div>
<icon-eye class="eye" @click="()=>{showEye=false}" />
</div>
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-row :gutter="24" v-if="modalSatus!='add'">
<a-col :span="12">
<a-form-item field="mobile" label="联系电话:">
{{modalForm.user.mobile}}
<a-form-item field="user.mobile" label="联系电话:">
<a-input v-model="modalForm.user.mobile" placeholder="请输入联系电话" />
</a-form-item>
</a-col>
<a-col :span="12">
@ -151,23 +163,28 @@
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="address" label="医院地址:">
<a-form-item field="hospital.address" label="医院地址:">
<a-input v-model="modalForm.hospital.address" placeholder="请输入医院地址" />
</a-form-item>
</a-col>
<a-col :span="12">
<a-form-item field="hospital_name" label="医院名称:">
<a-input v-model="modalForm.hospital.hospital_name" placeholder="请输入医院名称" />
<a-form-item field="hospital.hospital_name" label="医院名称:">
<a-select placeholder="请选择所在医院" v-model="modalForm.hospital.hospital_name">
<a-option v-for="item in hospitalData" :key="item.hospital_id" :value="item.hospital_id"
:label="item.hospital_name">{{item.hospital_name}}</a-option>
</a-select>
<!-- <a-input v-model="modalForm.hospital.hospital_name" placeholder="请输入医院名称" /> -->
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="department_custom_id" label="所在科室:">
<a-select placeholder="请选择所在科室" v-model="modalForm.department_custom_id">
<a-select placeholder="请选择所在科室" v-model="modalForm.department_custom_id" @change="changeSelect">
<a-option v-for="item in departmentData" :key="item.department_custom_id"
:value="item.department_custom_id"
:label="item.department_custom_name">{{item.department_custom_name}}</a-option>
:value="item.department_custom_id" :label="item.department_custom_name">
{{item.department_custom_name}}
</a-option>
</a-select>
</a-form-item>
@ -181,7 +198,11 @@
<a-row :gutter="24">
<a-col :span="12">
<a-form-item field="doctor_title" label="职 称 ">
<a-input v-model="doctor_title_name" placeholder="请输入职称" />
<a-select placeholder="请选择所在医院" v-model="modalForm.doctor_title">
<a-option v-for="item in doctor_title_data" :key="item.doctor_title" :value="item.doctor_title"
:label="item.doctor_title_name">{{item.doctor_title_name}}</a-option>
</a-select>
<!-- <a-input v-model="doctor_title_name" placeholder="请输入职称" /> -->
</a-form-item>
</a-col>
<a-col :span="12">
@ -200,30 +221,33 @@
</a-row> -->
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="qualification_cert_num" label="资格证编码:">
<a-input v-model="modalForm.user_doctor_info.qualification_cert_num" placeholder="请输入部门名称" />
<a-form-item field="user_doctor_info.qualification_cert_num" label="资格证编码:">
<a-input v-model="modalForm.user_doctor_info.qualification_cert_num" placeholder="请输入资格证编码" />
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24">
<a-col :span="24">
<a-form-item field="user_name" label="专长:">
<a-textarea v-model="modalForm.remark" placeholder="请输入备注内容" />
<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 v-model="modalForm.be_good_at" placeholder="请输入备注内容" />
<a-textarea 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 v-model="modalForm.brief_introduction" placeholder="请输入备注内容" />
<a-textarea v-model="modalForm.brief_introduction" placeholder="请填写医生从业经历职称和所获荣誉等信息字数在10-1000字" />
</a-form-item>
</a-col>
</a-row>
@ -233,135 +257,193 @@
<div class="name">是否推荐</div>
</div>
<a-row :gutter="24" style="margin-top: 35px;">
<a-col :span="4">
<a-form-item field="" label="状态:">
<a-col :span="12">
<a-form-item field="is_recommend" label="状态:">
<a-space size="large">
<a-switch checked-color="#14C9C9" :checked-value="1" :unchecked-value="0"
v-model="modalForm.is_recommend" style="cursor: not-allowed!important;" />
v-model="modalForm.is_recommend" />
</a-space>
</a-form-item>
</a-col>
<a-col :span="20" v-if="modalForm.is_recommend==1">
<a-col :span="12" v-if="modalForm.is_recommend==1">
<div>理由平台合作</div>
</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="4">
<a-form-item field="is_platform_deep_cooperation" label="平台深度合作医生:">
<a-space size="large">
<a-switch checked-color="#14C9C9" :checked-value="1" :unchecked-value="0"
v-model="modalForm.is_platform_deep_cooperation" />
</a-space>
</a-form-item>
</a-col>
<a-col :span="20" >
<a-form-item field="is_sys_diagno_cooperation" label="先思达合作医生:">
<a-space size="large">
<a-switch checked-color="#14C9C9" :checked-value="1" :unchecked-value="0"
v-model="modalForm.is_sys_diagno_cooperation" />
</a-space>
</a-form-item>
</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;"
v-if="modalForm.user_doctor_info.license_cert && modalForm.user_doctor_info.license_cert.length>0">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<div class="titletip">医师执业证<span>(点击图片查看大图)</span></div>
<a-image-preview-group infinite>
<a-space>
<a-image v-for="item in modalForm.user_doctor_info.license_cert" show-loader :src="item" />
v-if="(modalForm.user_doctor_info.license_cert && modalForm.user_doctor_info.license_cert.length>0) || modalSatus!='detail'">
<a-col :span="24">
<div class="titletip"><span class="arco-form-item-label-required-symbol">*</span>医师执业证<span>(点击图片查看大图)</span></div>
<a-form-item field="license_cert" :hide-label="true" :validate-trigger="['change']" >
<a-image-preview-group infinite>
<a-space v-show="modalSatus=='detail'">
<a-image width="120" height="120" fit="cover" v-for="item in modalForm.user_doctor_info.license_cert"
show-loader :src="item" />
</a-space>
</a-image-preview-group>
<upload v-show="modalSatus!='detail'" :isMultiple="true" :fileList="license_cert_list"
:dataType="'license_cert_list'" @changeData="changeData"></upload>
<!-- <a-upload v-show="modalSatus!='detail'" list-type="picture-card" @change="onChangeFile" accept="image/*"
:file-list="license_cert_list" @before-upload="beforeUpload" action="/" :auto-upload="false"
image-preview /> -->
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" style="margin-top: 35px;"
v-if="modalForm.user_doctor_info.qualification_cert && modalForm.user_doctor_info.qualification_cert.length>0">
v-if="(modalForm.user_doctor_info.qualification_cert && modalForm.user_doctor_info.qualification_cert.length>0) || modalSatus!='detail'">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<div class="titletip">医师资格证<span>(点击图片查看大图)</span></div>
<div class="titletip"><span class="arco-form-item-label-required-symbol">*</span>医师资格证<span>(点击图片查看大图)</span></div>
<a-form-item field="qualification_cert" label="" :hide-label="true" >
<a-image-preview-group infinite>
<a-space>
<a-image v-for="item in modalForm.user_doctor_info.license_cert" show-loader :src="item" />
<a-space v-show="modalSatus=='detail'">
<a-image width="120" height="120" fit="cover"
v-for="item in modalForm.user_doctor_info.qualification_cert" show-loader :src="item" />
</a-space>
</a-image-preview-group>
<upload v-show="modalSatus!='detail'" :isMultiple="true" :fileList="qualification_cert_list"
:dataType="'qualification_cert_list'" @changeData="changeData"></upload>
<!-- <a-upload v-show="modalSatus!='detail'" list-type="picture-card" :auto-upload="false"
@change="onChangeFile" accept="image/*" :file-list="qualification_cert_list"
@before-upload="beforeUpload" action="/" image-preview /> -->
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" style="margin-top: 35px;" v-if="(modalForm.user_doctor_info.work_cert && modalForm.user_doctor_info.work_cert.length>0) || modalSatus!='detail'">
<a-col :span="24">
<div class="titletip"><span class="arco-form-item-label-required-symbol">*</span>医师职称证<span>(点击图片查看大图)</span></div>
<a-form-item field="work_cert" label="" :hide-label="true" >
<a-image-preview-group infinite>
<a-space v-show="modalSatus=='detail'">
<a-image width="120" height="120" fit="cover" v-for="item in modalForm.user_doctor_info.work_cert"
show-loader :src="item" />
</a-space>
</a-image-preview-group>
<upload v-show="modalSatus!='detail'" :isMultiple="true" :fileList="work_cert_list"
:dataType="'work_cert_list'" @changeData="changeData"></upload>
<!-- <a-upload v-show="modalSatus!='detail'" list-type="picture-card" :auto-upload="false"
@change="onChangeFile" accept="image/*" :file-list="work_cert_list"
@before-upload="beforeUpload('avatar')" action="/" image-preview /> -->
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" style="margin-top: 35px;"
v-if="modalForm.user_doctor_info.work_cert && modalForm.user_doctor_info.work_cert.length>0">
v-if="modalForm.user_doctor_info.id_card_front || modalSatus!='detail' ">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<div class="titletip">医师职称证<span>(点击图片查看大图)</span></div>
<div class="titletip">医师身份证正面<span>(点击图片查看大图)</span></div>
<a-form-item field="id_card_front" label="" no-style>
<a-image-preview-group infinite>
<a-space>
<a-image v-for="item in modalForm.user_doctor_info.work_cert" show-loader :src="item" />
<a-space v-show="modalSatus=='detail'">
<a-image width="120" height="120" fit="cover" show-loader
:src="modalForm.user_doctor_info.id_card_front" />
</a-space>
</a-image-preview-group>
<upload v-show="modalSatus!='detail'" :isMultiple="false" :fileList="id_card_front_list"
:dataType="'id_card_front_list'" @changeData="changeData"></upload>
<!-- <a-upload v-show="modalSatus!='detail'" :file-list="id_card_front_list" list-type="picture-card"
action="/" :auto-upload="false" image-preview /> -->
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" style="margin-top: 35px;"
v-if="modalForm.user_doctor_info.id_card_front || modalForm.user_doctor_info.id_card_back ">
v-if="modalForm.user_doctor_info.id_card_back || modalSatus!='detail' ">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<div class="titletip">医师身份证<span>(点击图片查看大图)</span></div>
<a-form-item field="id_card_back" label="" no-style>
<div class="titletip">医师身份证反面<span>(点击图片查看大图)</span></div>
<a-image-preview-group infinite>
<a-space>
<a-image
v-for="item in [modalForm.user_doctor_info.id_card_front,modalForm.user_doctor_info.id_card_back]"
show-loader :src="item" v-show="item" />
<a-space v-show="modalSatus=='detail'">
<a-image width="120" height="120" fit="cover" show-loader
:src="modalForm.user_doctor_info.id_card_back" />
</a-space>
</a-image-preview-group>
<upload v-show="modalSatus!='detail'" :isMultiple="false" :fileList="id_card_back_list"
:dataType="'id_card_back_list'" @changeData="changeData"></upload>
<!-- <a-upload v-show="modalSatus!='detail'" :file-list="id_card_back_list" list-type="picture-card" action="/"
:auto-upload="false" image-preview /> -->
</a-form-item>
</a-col>
</a-row>
<a-row :gutter="24" style="margin-top: 35px;" v-if="modalForm.user_doctor_info.sign_image">
<a-row :gutter="24" style="margin-top: 35px;"
v-if="modalForm.user_doctor_info.sign_image || modalSatus!='detail'">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<a-form-item field="sign_image" label="" no-style>
<div class="titletip">医师手写签名<span>(点击图片查看大图)</span></div>
<a-image-preview-group infinite>
<a-space>
<a-image v-for="item in [modalForm.user_doctor_info.sign_image]" show-loader :src="item"
v-show="item" />
<a-image-preview-group infinite>
<a-space v-show="modalSatus=='detail'">
<a-image width="120" height="120" fit="cover" show-loader
:src="modalForm.user_doctor_info.sign_image" />
</a-space>
</a-image-preview-group>
<upload v-show="modalSatus!='detail'" :isMultiple="false" :fileList="sign_image_list"
:dataType="'sign_image_list'" @changeData="changeData"></upload>
<!-- <a-upload v-show="modalSatus!='detail'" :file-list="sign_image_list" list-type="picture-card" action="/"
:auto-upload="false" image-preview /> -->
</a-form-item>
</a-col>
</a-row>
<!-- <a-row :gutter="24" style="margin-top: 35px;">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<div class="titletip">医师云证书<span>(点击图片查看大图)</span></div>
<a-image-preview-group infinite>
<a-space>
<a-image show-loader src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/cd7a1aaea8e1c5e3d26fe2591e561798.png~tplv-uwbnlip3yd-webp.webp" width="200" />
<a-image show-loader src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/6480dbc69be1b5de95010289787d64f1.png~tplv-uwbnlip3yd-webp.webp" width="200" />
<a-image show-loader src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/0265a04fddbd77a19602a15d9d55d797.png~tplv-uwbnlip3yd-webp.webp" width="200" />
<a-image show-loader src="https://p1-arco.byteimg.com/tos-cn-i-uwbnlip3yd/24e0dd27418d2291b65db1b21aa62254.png~tplv-uwbnlip3yd-webp.webp" width="200" />
</a-space>
</a-image-preview-group>
</a-form-item>
</a-col>
</a-row> -->
<a-row :gutter="24" style="margin-top: 35px;" v-if="modalForm.qr_code">
<a-row :gutter="24" style="margin-top: 35px;" v-if="modalForm.qr_code && modalSatus!='add'">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<a-form-item field="qr_code" label="" no-style>
<div class="titletip">医师二维码<span>(点击图片查看大图)</span></div>
<a-image-preview-group infinite>
<a-space>
<a-image v-for="item in [modalForm.qr_code]" show-loader :src="item" v-show="item" width="200" />
<a-image width="120" height="120" fit="cover" show-loader :src="modalForm.qr_code" />
</a-space>
</a-image-preview-group>
</a-form-item>
</a-col>
</a-row>
<a-divider />
<a-divider v-show="modalSatus!='detail'" />
</a-form>
<div class="titlebox">
<div class="titlebox" v-if="modalSatus!='detail'">
<div class="bar"></div>
<div class="name">操作</div>
</div>
<a-row :gutter="24" style="margin-top: 35px;">
<a-row :gutter="24" style="margin-top: 35px;" v-if="modalSatus!='detail'">
<a-col :span="24">
<a-form-item field="" label="" no-style>
<a-space>
<a-button type="primary" status="success" v-if="modalSatus=='detail'">启用</a-button>
<a-button type="primary" status="danger" v-if="modalSatus=='detail'">禁用</a-button>
<a-button type="primary" v-if="modalSatus=='edit'">保存</a-button>
<a-space v-if="modalSatus!='detail'" style="margin-right: 8px;">
<a-button type="primary" @click="handleSubmit">保存</a-button>
</a-space>
<!-- <a-space v-if="modalSatus=='detail'">
<a-button type="primary" status="success">启用</a-button>
<a-button type="primary" status="danger">禁用</a-button>
</a-space> -->
<a-space v-if="modalSatus=='edit'">
<a-button type="primary" @click="handleSubmit">保存</a-button>
<a-button type="primary" status="warning">拉黑</a-button>
<a-button type="primary" status="danger" v-if="modalSatus=='edit'">删除</a-button>
<a-button type="primary" status="danger">删除</a-button>
</a-space>
</a-form-item>
</a-col>
@ -377,8 +459,9 @@
<script setup>
import { reactive, ref, getCurrentInstance, onMounted, nextTick, watch, computed } from 'vue';
import { getDoctorList, addDoctor, removeDoctor, updateDoctor, getDoctorDetail, departmentList, decryptCard, hospitalList } from '@/api/doctor/list';
import { getDoctorList, addDoctor, removeDoctor, updateDoctor, getDoctorDetail, departmentList, decryptCard, hospitalList,expertiseList} from '@/api/doctor/list';
import { ossSign, ossUpload } from '@/api/oss';
import dayjs from 'dayjs'
// Akiraka 20230210
const deleteData = ref([])
// Akiraka 20230210
@ -389,7 +472,7 @@
getDoctorInfo(pager);
}
});
const file = ref();
const { proxy } = getCurrentInstance();
@ -406,30 +489,243 @@
});
const modalForm = reactive({
hospital: {},
user_doctor_info: {},
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'
});
//const doctor_expertise=ref([]);
//
const transArr = (arr) => {
let newArr = [];
if (arr instanceof Array) {
arr.forEach((item) => {
newArr.push({ url: item })
});
} else if (typeof arr == "string") {
newArr.push({ url: arr })
}
return newArr
};
const changeData = (value) => {
switch (value.type) {
case 'license_cert_list':
if (value.dealType == "add") {
license_cert_list.value.push({
url: value.url
})
} else {
license_cert_list.value.splice(license_cert_list.value.findIndex(item => item.url === value.url), 1)
}
break;
case 'qualification_cert_list':
if (value.dealType == "add") {
qualification_cert_list.value.push({
url: value.url
})
} else {
qualification_cert_list.value.splice(qualification_cert_list.value.findIndex(item => item.url === value.url), 1)
}
break;
case 'work_cert_list':
if (value.dealType == "add") {
work_cert_list.value.push({
url: value.url
})
} else {
work_cert_list.value.splice(work_cert_list.value.findIndex(item => item.url === value.url), 1)
}
break;
case 'id_card_front_list':
if(value.dealType == "add") {
id_card_front_list.value.push({
url: value.url
})
} else {
id_card_front_list.value.splice(id_card_front_list.value.findIndex(item => item.url === value.url), 1)
}
break;
case 'id_card_back_list':
if(value.dealType == "add") {
id_card_back_list.value.push({
url: value.url
})
} else {
id_card_back_list.value.splice(id_card_back_list.value.findIndex(item => item.url === value.url), 1)
}
break;
case 'sign_image_list':
if(value.dealType == "add") {
sign_image_list.value.push({
url: value.url
})
} else {
sign_image_list.value.splice(sign_image_list.value.findIndex(item => item.url === value.url), 1)
}
}
// console.log(value);
// console.log([`${value.type}.value`]);
//[value.type].value=[value.type].value.concat([{url:value.url}]);
}
//
const license_cert_list = ref([]);
const qualification_cert_list = ref([]);
const work_cert_list = ref([]);
const id_card_front_list = ref([]);
const id_card_back_list = ref([]);
const sign_image_list = ref([]);
watch(() => modalForm.user_id, (value) => {
if (value) {
handelDecryptCard(value);
}
});
const doctor_title_name = computed(() => {
let obj = { 1: '主任医师', 2: '主任中医师', 3: '副主任医师', 4: '副主任中医师', 5: '主治医师', 6: '住院医师' };
return obj[modalForm.doctor_title]
watch(() => license_cert_list.value, (value) => {
let arr=[]
value.forEach((item)=>{
arr.push(item.url)
});
modalForm.license_cert=arr;
},{deep: true});
watch(() => qualification_cert_list.value, (value) => {
let arr=[]
value.forEach((item)=>{
arr.push(item.url)
});
modalForm.qualification_cert=arr;
},{deep: true });
})
watch(() => work_cert_list.value, (value) => {
let arr=[]
value.forEach((item)=>{
arr.push(item.url)
});
modalForm.work_cert=arr;
},{deep: true});
watch(() =>id_card_front_list.value, (value) => {
if(value.length>0){
modalForm.id_card_front=value[0].url;
}else{
modalForm.id_card_front=''
}
},{deep: true});
watch(() =>id_card_back_list.value, (value) => {
value.length>0? modalForm.id_card_back=value[0].url:modalForm.id_card_back=''
},{deep: true});
watch(() =>sign_image_list.value, (value) => {
if(value.length>0){
modalForm.sign_image=value[0].url;
}else{
modalForm.sign_image=''
}
},{deep: true});
// Rules
const rules = {
user_name: [{ required: true, message: '请输入医生名字' }]
avatar: [{ required: true, message: '请上传医生头像' }],
user_name: [
{ required: true, message: '请输入医生名字' },
{
validator: (value, cb) => {
let reg=/^([\u4e00-\u9fa5\·]{2,10})$/;
if (!reg.test(value)) {
cb('姓名要求在2-10个汉字');
}
}
}],
card_num: [
{ required: true, message: '请输入身份证号' },
{
validator: (value, cb) => {
let reg=/(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
if (!reg.test(value)) {
cb('身份证号码格式不正确');
}
}
}
],
'user.mobile': [
{ required: true, message: '请输入手机号' },
{
validator: (value, cb) => {
let reg=/^1[3456789]\d{9}$/;
if (!reg.test(value)) {
cb('手机号码格式不正确');
}
}
}],
'hospital.address': [{ required: true, message: '请输入医院地址' }],
'hospital.hospital_name': [{ required: true, message: '请选择医院名称' }],
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: '请输入资格证编码' }],
cur_doctor_expertise:[{ type:'array',minLength:1,required: true, message: '请选择专长' }],
be_good_at: [{ required: true, message: '请输入擅长内容',maxLength:1000,minLength:2 }],
brief_introduction: [{ required: true, message: '请输入简介',maxLength:1000,minLength:2 }],
// license_cert: [
// {
// validator: (value, cb) => {
// if(license_cert_list.value.length==0){
// cb("")
// }
// }
// }],
// qualification_cert: [{ type:'array',required: true, message: '' }],
// work_cert: [{ type:'array',required: true, message: '' }],
// is_platform_deep_cooperation:[{required: true, message: ''}],
// is_platform_deep_cooperation:[{required: true, message: ''}],
//is_recommend
};
// 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: '住院医师'
}
]
// Batch Del List
let batchList = [];
@ -454,21 +750,41 @@
const tableData = ref([]);
//
const modalSatus = ref('add');
//
const changeSelect = (value) => {
let arr = departmentData.value.filter((item) => {
return item.department_custom_id == value
})
modalForm.department_custom_name = arr[0].department_custom_name
}
// Satus
const handleAdd = () => {
modalVisible.value = true;
modalTitle.value = '新增医生';
modalSatus.value = 'add';
modalForm.doctor_id = null;
modalForm.hospital = {};
modalForm.user = {};
//$refs.modalFormRef.resetFields();
};
//
const handleDetail = async (record) => {
modalVisible.value = true;
modalTitle.value = '医生详情';
modalSatus.value = 'detail';
const { code, data, message } = await getDoctorDetail(record.doctor_id);
if (code == 200) {
Object.assign(modalForm, data);
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;
}
} else {
proxy.$notification.error(message);
}
@ -481,6 +797,21 @@
const { code, data, message } = await getDoctorDetail(record.doctor_id);
if (code == 200) {
Object.assign(modalForm, data);
let { license_cert, qualification_cert, work_cert, id_card_front, id_card_back, sign_image } = data.user_doctor_info;
license_cert_list.value = transArr(license_cert);
qualification_cert_list.value = transArr(qualification_cert);
work_cert_list.value = transArr(work_cert);
id_card_front_list.value = transArr(id_card_front);
id_card_back_list.value = transArr(id_card_back);
sign_image_list.value = transArr(sign_image);
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;
}
} else {
proxy.$notification.error(message);
}
@ -518,26 +849,53 @@
proxy.$refs.modalFormRef.validate(async (valid) => {
if (!valid) {
let res;
//alert(modalForm.id_card_front);
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,
department_custom_id:modalForm.department_custom_id,
department_custom_name:modalForm.department_custom_name,
department_custom_mobile:modalForm.department_custom_mobile,
hospital_id:modalForm.hospital_id,
be_good_at:modalForm.be_good_at,
brief_introduction:modalForm.brief_introduction,
license_cert:modalForm.license_cert,
qualification_cert:modalForm.qualification_cert,
work_cert:modalForm.work_cert,
qualification_cert_num:modalForm.user_doctor_info.qualification_cert_num,
id_card_front:modalForm.id_card_front,
id_card_back:modalForm.id_card_back,
sign_image:modalForm.sign_image,
card_num:modalForm.card_num,
doctor_expertise:modalForm.cur_doctor_expertise,
is_platform_deep_cooperation:modalForm.is_platform_deep_cooperation,
is_sys_diagno_cooperation :modalForm.is_sys_diagno_cooperation
}
if (!modalForm.doctor_id) {
const { code, message } = await addDoctor(modalForm);
const { code, message } = await addDoctor(modalData);
if (code == 200) {
proxy.$notification.success('新增成功');
} else {
proxy.$notification.error(message);
}
} else {
const { code, message } = await updateDoctor(modalForm, modalForm.doctor_id);
const { code, message } = await updateDoctor(modalData, modalForm.doctor_id);
if (code == 200) {
proxy.$notification.success('更新成功');
} else {
proxy.$notification.error(message);
}
}
done();
//done();
getDoctorInfo(pager);
} else {
console.log(valid)
proxy.$message.error('表单校验失败');
done(false);
//done(false);
}
});
};
@ -606,34 +964,54 @@
const departmentData = ref([]);
//
const getDepartmentList = () => {
const { data, code, message } = departmentList();
if (code == 200) {
departmentData.value = data;
} else {
proxy.$notification.error(message);
}
};
departmentList().then((res) => {
const { data, code, message } = res;
if (code == 200) {
departmentData.value = data;
} else {
proxy.$notification.error(message);
};
});
}
//
const showEye = ref(false);
const id_card_num = ref('');
//
const handelDecryptCard = () => {
const { data, code, message } = decryptCard();
const handelDecryptCard = async (user_id) => {
const { data, code, message } = await decryptCard({
user_id
});
if (code == 200) {
id_card_num.value = data;
} else {
proxy.$notification.error(message);
}
};
const hospitalData = ref([]);
//
const handleHospitalList = () => {
const { data, code, message } = hospitalList();
if (code == 200) {
//id_card_num.value = data;
} else {
proxy.$notification.error(message);
}
hospitalList().then((res) => {
const { data, code, message } = res;
if (code == 200) {
hospitalData.value = data;
} else {
proxy.$notification.error(message);
}
});
}
const expertiseData=ref([]);
//
const handlExpertiseList= () =>{
expertiseList().then((res) => {
const { data, code, message } = res;
if (code == 200) {
expertiseData.value = data;
} else {
proxy.$notification.error(message);
}
})
}
//
const handleResetQuery = () => {
proxy.$refs.queryFormRef.resetFields();
@ -649,22 +1027,28 @@
let { access_id, dir, policy, signature, host } = data;
//let index = File.lastIndexOf("/");
let filename = File.name;
let time = dayjs().format("YYYYMMDDHHmmss")
let formData = new FormData();
formData.append('OSSAccessKeyId',access_id);
formData.append('OSSAccessKeyId', access_id);
formData.append('policy', policy);
formData.append('signature', signature);
formData.append('key',dir+filename);
formData.append('file',File,filename);
ossUpload(host,formData).then((res)=>{
console.log(res);
formData.append('key', dir + time + filename);
formData.append('file', File, filename);
ossUpload(host, formData).then((res) => {
modalForm.avatar = host + "/" + dir + time + filename;
// if(res.code==204){
// alert('22')
// modalForm.avatar=host+dir+time+filename
// }
});
} else {
proxy.$notification.error(message);
}
}
//
const beforeUpload = (file) => {
const beforeUpload = (file, type) => {
return new Promise((resolve, reject) => {
if (file.size >= 10 * 1024 * 1024) {
proxy.$notification.error("图片大小不能超过10M");
@ -676,14 +1060,14 @@
};
//
const onChangeFile = (fileList) => {
console.log(fileList)
getOssSign(1, fileList[0].file);
}
onMounted(() => {
getDoctorInfo(pager);
handleHospitalList();
getDepartmentList();
handlExpertiseList();
});
</script>
@ -704,7 +1088,8 @@
border-radius: 50%;
}
.arco-form-item-layout-horizontal:first-child {
.arco-form-item-layout-horizontal:first-child,
.arco-form-item-layout-horizontal:nth-child(2) {
align-items: center;
}
@ -722,4 +1107,7 @@
display: flex;
align-items: center;
}
.cert .arco-form-item-label-col{
flex: 0 0 8px!important;
}
</style>