You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

386 lines
12 KiB

3 years ago
<template>
<el-dialog
class="teamDialog"
:visible.sync="visible"
width="50%"
:title="!dataForm.id ? '新增人员' : '修改人员'"
@close="closeDialog"
>
<el-form ref="dataForm" :model="dataForm" :rules="dataRule">
<el-form-item label="工号:" label-width="90px" prop="employeeId">
<el-input v-model="dataForm.employeeId" placeholder="请输入工号" />
</el-form-item>
<el-form-item label="姓名:" label-width="90px" prop="realName">
<el-input v-model="dataForm.realName" placeholder="请输入姓名" />
</el-form-item>
<el-form-item v-if="!dataForm.id" label="登录密码:" label-width="90px" prop="password">
<el-input v-model="dataForm.password" placeholder="请输入密码" />
</el-form-item>
<el-form-item label="性别:" label-width="90px" prop="gender">
<el-radio-group v-model="dataForm.gender" size="medium">
<el-radio-button label="0"></el-radio-button>
<el-radio-button label="1"></el-radio-button>
<el-radio-button label="2">保密</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="手机号:" label-width="90px" prop="mobile">
<el-input v-model="dataForm.mobile" placeholder="请输入手机号" />
</el-form-item>
<!-- <el-form-item label="医生职位:" label-width="90px" prop="doctorJob">
<el-input v-model="dataForm.doctorJob" placeholder="请输入医生职位" />
</el-form-item> -->
<!-- superAdmin0普通用户 1是慧目管理员 -->
3 years ago
<!-- <el-form-item v-if="loginInfo.superAdmin===1" label="所属医院:" label-width="90px" prop="centreId">-->
<!-- <el-select v-model="dataForm.centreId" placeholder="请选择">-->
<!-- <el-option v-for="item in centerList" :key="item.id" :label="item.name" :value="item.id" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
3 years ago
<el-form-item label="用户类型:" label-width="90px" prop="positionListValue">
<el-cascader
v-model="dataForm.positionListValue"
:options="positionList"
:props="props"
clearable
@change="positionChange"
/>
<!-- <el-select v-model="dataForm.position" placeholder="请选择">
<el-option v-for="item in positionList" :key="item.id" :label="item.name" :value="item.name" />
</el-select> -->
</el-form-item>
<el-form-item label="设置权限:" label-width="90px" prop="roleNameListValue">
<!-- :label="" :value="" :children="" -->
<el-cascader
v-model="dataForm.roleNameListValue"
:options="roleNameList"
:props="props"
clearable
@change="roleCascaderChange"
/>
</el-form-item>
<el-form-item label="签名:" label-width="90px" prop="signImgBase" class="sign-form">
<div v-if="dataForm.signImgBase" class="img-div">
<img :src="dataForm.signImgBase" alt="" height="70px" @click="handlePictureCardPreview">
<span class="icon-span" @click="deleteImgHandle">
<i class="el-icon-delete" />
</span>
</div>
<el-upload
ref="fileupload"
action="#"
list-type="picture-card"
:show-file-list="false"
:http-request="uploadFileBaseHandle"
>
<i class="el-icon-plus" />
</el-upload>
<el-dialog :visible.sync="uploadImgDialogVisible" append-to-body width="500px">
<el-image width="100%" :src="dataForm.signImgBase" alt="" fit="cover" />
</el-dialog>
</el-form-item>
<el-form-item label="状态:" label-width="90px" prop="status">
<el-radio-group v-model="dataForm.status">
<el-radio :label="0">停用</el-radio>
<el-radio :label="1">正常</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<template slot="footer">
<el-button @click="visible = false">{{ $t('cancel') }}</el-button>
<el-button type="primary" @click="dataFormSubmitHandle()">{{ $t('confirm') }}</el-button>
</template>
<cropper
ref="cropperRef"
:visible="cropperVisible"
:url="uploadSignImgBase"
:auto-crop-width="autoCropWidth"
:auto-crop-height="autoCropHeight"
@cancel="cropperVisible = false"
@confirm="onConfirm"
/>
</el-dialog>
</template>
<script>
import cropper from './cropper.vue'
import debounce from 'lodash/debounce'
import { isMobile } from '@/utils/validate'
export default {
components: {
cropper
},
props: {
roleNameList: {
type: Array,
default: () => []
}
},
data() {
return {
props: {
multiple: true,
label: 'name',
value: 'id',
children: 'childrenList'
},
visible: false,
isShowImg: true,
dataForm: {
centreId: '',
centreName: '',
employeeId: '',
realName: '',
password: '',
gender: 1,
mobile: '',
positionIdList: [],
positionListValue: [],
roleIdList: [],
roleNameListValue: [],
signImgBase: '',
status: 1 // 0:停用 1:正常
},
positionList: [{
name: '医生'
}, {
name: '护士'
}, {
name: '技师'
}, {
name: '医辅'
}],
uploadSignImgBase: '',
uploadImgDialogVisible: false,
centerList: [],
loginInfo: {},
autoCropWidth: '500',
autoCropHeight: '300',
cropperVisible: false
}
},
computed: {
dataRule() {
var validataMobile = (rule, value, callback) => {
if (value && !isMobile(value)) {
return callback(new Error(this.$t('您输入的手机号格式不正确')))
} else if (!value) {
return callback(new Error(this.$t('请输入手机号')))
}
callback()
}
return {
employeeId: [
{ required: true, message: '请输入医生工号', trigger: 'blur' }
],
realName: [
{ required: true, message: '请输入医生姓名', trigger: 'blur' }
],
password: [
{ required: true, message: '请输入密码', trigger: 'blur' }
],
gender: [
{ required: true, message: '请选择性别', trigger: 'change' }
],
mobile: [
{ required: true, validator: validataMobile, trigger: 'blur' }
]
// doctorJob: [
// { required: true, message: '请输入医生职位', trigger: 'blur' }
// ],
}
}
},
methods: {
init() {
this.visible = true
this.$nextTick(() => {
// 获取中心
this.getCentreList()
this.getCentreJobList()
this.loginInfo = JSON.parse(window.localStorage.getItem('qg-userData'))
this.$refs.dataForm.resetFields() // 重置表单
if (this.dataForm.id) {
this.getInfo()
}
})
},
// 获取中心
async getCentreList() {
const { data: res } = await this.$http.get('/sys/centre/list')
if (res.code === 0) {
this.centerList = res.data
}
},
// 获取职位列表 --- 1:职位,2:手术方式,3:手术间,4:麻醉方式
async getCentreJobList() {
const { data: res } = await this.$http.get('/sys/param/getList', {
params: {
type: 1
}
})
if (res.code === 0) {
this.positionList = res.data
}
},
// 获取信息
getInfo() {
this.$http.get(`/sys/user/${this.dataForm.id}`).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
// 权限
const roleArr = []
// 职位
const postionArr = []
res.data.roleIdList.forEach(item => {
roleArr.push([item])
})
res.data.positionIdList.forEach(item => {
postionArr.push([item])
})
this.dataForm = {
...this.dataForm,
...res.data
}
this.dataForm.roleNameListValue = roleArr
this.dataForm.positionListValue = postionArr
}).catch(() => { })
},
// 角色级联选择器选择
roleCascaderChange(val) {
console.log(val)
this.dataForm.roleIdList = []
val.forEach(item => {
this.dataForm.roleIdList.push(item[0])
})
console.log(this.dataForm.roleIdList)
},
// 职位级联选择器选择
positionChange(val) {
console.log(val)
this.dataForm.positionIdList = []
val.forEach(item => {
this.dataForm.positionIdList.push(item[0])
})
console.log(this.dataForm.positionIdList)
},
// 上传文件转换
uploadFileBaseHandle(data) {
const _this = this
const rd = new FileReader() // 创建文件读取对象
const file = data.file
rd.readAsDataURL(file) // 文件读取装换为base64类型
rd.onloadend = function(e) {
// this指向当前方法onloadend的作用域, this.result就是文件的base64, 这里可自由处理
_this.uploadSignImgBase = this.result
_this.cropperVisible = true
_this.$nextTick(() => {
_this.$refs.cropperRef.init()
})
}
},
// 裁切返回
async onConfirm(file) {
const _this = this
const rd = new FileReader() // 创建文件读取对象
rd.readAsDataURL(file) // 文件读取装换为base64类型
rd.onloadend = function(e) {
// this指向当前方法onloadend的作用域, this.result就是文件的base64, 这里可自由处理
_this.dataForm.signImgBase = this.result
_this.cropperVisible = false
}
},
// 图片浏览
handlePictureCardPreview() {
this.uploadImgDialogVisible = true
},
// 删除图片
deleteImgHandle() {
this.dataForm.signImgBase = ''
},
// 表单提交
dataFormSubmitHandle: debounce(function() {
console.log(this.dataForm)
this.$refs.dataForm.validate((valid) => {
if (!valid) {
return false
}
this.$http[!this.dataForm.id ? 'post' : 'put']('/sys/user', this.dataForm).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
}
this.$message({
message: this.$t('prompt.success'),
type: 'success',
duration: 500,
onClose: () => {
this.visible = false
this.$emit('refreshDataList')
}
})
}).catch(() => { })
})
}, 1000, { leading: true, trailing: false }),
// 关闭弹框
closeDialog() {
this.$emit('closeDialog', false)
}
}
}
</script>
<style lang="scss" scoped>
.teamDialog {
.img-div {
position:relative;
margin-right: 20px;
}
.icon-span {
display: none;
position: absolute;
right: 0;
bottom: -10px;
.el-icon-delete {
font-size: 16px;
}
}
.img-div:hover{
.icon-span {
cursor: pointer;
display: inline-block;
}
}
}
</style>
<style lang="scss">
.teamDialog {
.el-dialog__header {
margin-bottom: 12px;
}
.el-cascader {
display: block;
}
.el-dialog__body {
padding-right: 30px;
}
.sign-form {
.change-sing-fs {
cursor: pointer;
}
img {
margin-right: 10px;
}
.el-form-item__content {
display: flex;
align-items: center;
}
}
.el-upload--picture-card {
line-height: 79px;
}
.el-upload--picture-card,.el-upload-list--picture-card .el-upload-list__item {
width: 70px;
height: 70px;
}
}
</style>