Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details

uat_us
caiyiling 2024-10-24 17:26:23 +08:00
commit cc520270ac
23 changed files with 2311 additions and 469 deletions

View File

@ -23,8 +23,8 @@
<img src="./error_assets/zzlogo2.png" alt=""> <img src="./error_assets/zzlogo2.png" alt="">
<img v-show="false" src="./error_assets/zzlogo3.png" alt=""> <img v-show="false" src="./error_assets/zzlogo3.png" alt="">
</div> </div>
<div class="login-image"> <div class="login-image login-image-usa">
<img src="./error_assets/login-bg.png"> <img src="./error_assets/login-bg.svg" style="max-width: 500px;max-height: 300px;">
</div> </div>
</div> </div>
<div class="login-r"> <div class="login-r">
@ -148,7 +148,7 @@
left: 50%; left: 50%;
top: 50%; top: 50%;
transform: translate(-50%,-50%); transform: translate(-50%,-50%);
width: 1200px; width: 1100px;
height: 600px; height: 600px;
box-sizing: border-box; box-sizing: border-box;
background: rgb(255, 255, 255); background: rgb(255, 255, 255);
@ -179,7 +179,12 @@
.login-container .login-body .login-l .login-image img{ .login-container .login-body .login-l .login-image img{
height: 100%; height: 100%;
} }
.login-container .login-body .login-l .login-image-usa {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-end;
}
.login-container .login-body .login-r{ .login-container .login-body .login-r{
position: relative; position: relative;
float: left; float: left;

View File

@ -23,8 +23,8 @@
<img src="./error_assets/zzlogo3.png" alt=""> <img src="./error_assets/zzlogo3.png" alt="">
<img v-show="false" src="./error_assets/zzlogo3.png" alt=""> <img v-show="false" src="./error_assets/zzlogo3.png" alt="">
</div> </div>
<div class="login-image"> <div class="login-image login-image-usa">
<img src="./error_assets/login-bg.png"> <img src="./error_assets/login-bg.svg" style="max-width: 500px;max-height: 300px;">
</div> </div>
</div> </div>
<div class="login-r"> <div class="login-r">
@ -104,7 +104,7 @@
left: 50%; left: 50%;
top: 50%; top: 50%;
transform: translate(-50%,-50%); transform: translate(-50%,-50%);
width: 1200px; width: 1100px;
height: 600px; height: 600px;
box-sizing: border-box; box-sizing: border-box;
background: rgb(255, 255, 255); background: rgb(255, 255, 255);
@ -135,7 +135,12 @@
.login-container .login-body .login-l .login-image img{ .login-container .login-body .login-l .login-image img{
height: 100%; height: 100%;
} }
.login-container .login-body .login-l .login-image-usa {
width: 100%;
display: flex;
align-items: center;
justify-content: flex-end;
}
.login-container .login-body .login-r{ .login-container .login-body .login-r{
position: relative; position: relative;
float: left; float: left;

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 98 KiB

View File

@ -309,3 +309,11 @@ export function rePublishEvent(params) {
params params
}) })
} }
// userId获取doctorId
export function useUserIDGetDoctorID(data) {
return request({
url: `/TrialSiteSurvey/useUserIDGetDoctorID`,
method: 'post',
data
})
}

View File

@ -322,3 +322,11 @@ export function addOrUpdateResearchPublicationInfo(param) {
data: param data: param
}) })
} }
// 发送简历采集邮件
export function doctorSendEmail(param) {
return request({
url: `/Doctor/sendEmail`,
method: 'post',
data: param
})
}

View File

@ -149,6 +149,7 @@ body .el-table th.gutter {
} }
.el-dialog__body { .el-dialog__body {
margin-top: 15px;
height: calc(100% - 70px); height: calc(100% - 70px);
padding: 0 20px; padding: 0 20px;
@ -347,6 +348,7 @@ body .el-table th.gutter {
background: #000; background: #000;
z-index: 3999; z-index: 3999;
} }
.el-message-box__wrapper{
.el-message-box__wrapper {
z-index: 9999 !important; z-index: 9999 !important;
} }

View File

@ -14,11 +14,17 @@
</el-form-item> </el-form-item>
<!-- 中心名称 --> <!-- 中心名称 -->
<el-form-item :label="$t('trials:customSite:form:siteName')" prop="SiteName"> <el-form-item
:label="$t('trials:customSite:form:siteName')"
prop="SiteName"
>
<el-input v-model="form.SiteName" /> <el-input v-model="form.SiteName" />
</el-form-item> </el-form-item>
<!-- 中心名称CN --> <!-- 中心名称CN -->
<el-form-item :label="$t('trials:customSite:form:siteName') + 'CN'" prop="SiteNameCN"> <el-form-item
:label="$t('trials:customSite:form:siteName') + 'CN'"
prop="SiteNameCN"
>
<el-input v-model="form.SiteNameCN" /> <el-input v-model="form.SiteNameCN" />
</el-form-item> </el-form-item>
@ -46,7 +52,7 @@
v-model="form.HospitalId" v-model="form.HospitalId"
clearable clearable
placeholder="Please select" placeholder="Please select"
style="width:100%;" style="width: 100%"
> >
<el-option <el-option
v-for="item in hospitalList" v-for="item in hospitalList"
@ -73,10 +79,22 @@
<el-input v-model="form.ContactPhone" /> <el-input v-model="form.ContactPhone" />
</el-form-item> </el-form-item>
</div> </div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
<el-form-item> <el-form-item>
<el-button :disabled="btnLoading" size="small" type="primary" @click="handleCancel">Cancel</el-button> <el-button
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">Save</el-button> :disabled="btnLoading"
size="small"
type="primary"
@click="handleCancel"
>Cancel</el-button
>
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>Save</el-button
>
</el-form-item> </el-form-item>
</div> </div>
</el-form> </el-form>
@ -91,8 +109,8 @@ export default {
type: Object, type: Object,
default() { default() {
return {} return {}
} },
} },
}, },
data() { data() {
return { return {
@ -111,50 +129,42 @@ export default {
ContactName: '', ContactName: '',
ContactPhone: '', ContactPhone: '',
UniqueCode: '', UniqueCode: '',
Address: '' Address: '',
}, },
rules: { rules: {
SiteName: [ SiteName: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } // { max: 50, message: 'The maximum length is 50' }
], ],
SiteNameCN: [ SiteNameCN: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } // { max: 50, message: 'The maximum length is 50' }
], ],
SiteCode: [ SiteCode: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
], ],
Country: [ Country: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
], ],
City: [ City: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
], ],
// HospitalId: [ // HospitalId: [
// { required: true, message: 'Please specify', trigger: 'blur' } // { required: true, message: 'Please specify', trigger: 'blur' }
// ], // ],
Address: [ Address: [
{ required: true, message: 'Please specify', trigger: 'blur' } { required: true, message: 'Please specify', trigger: 'blur' },
], ],
DirectorName: [ DirectorName: [{ max: 50, message: 'The maximum length is 50' }],
{ max: 50, message: 'The maximum length is 50' } DirectorPhone: [{ max: 50, message: 'The maximum length is 50' }],
], ContactName: [{ max: 50, message: 'The maximum length is 50' }],
DirectorPhone: [ ContactPhone: [{ max: 50, message: 'The maximum length is 50' }],
{ max: 50, message: 'The maximum length is 50' }
],
ContactName: [
{ max: 50, message: 'The maximum length is 50' }
],
ContactPhone: [
{ max: 50, message: 'The maximum length is 50' }
]
}, },
loading: false, loading: false,
show: false show: false,
} }
}, },
mounted() { mounted() {
@ -163,10 +173,11 @@ export default {
}, },
methods: { methods: {
handleSave() { handleSave() {
this.$refs.siteForm.validate(valid => { this.$refs.siteForm.validate((valid) => {
if (!valid) return if (!valid) return
this.btnLoading = true this.btnLoading = true
addOrUpdateSite(this.form).then(res => { addOrUpdateSite(this.form)
.then((res) => {
this.btnLoading = false this.btnLoading = false
if (res.IsSuccess) { if (res.IsSuccess) {
this.$message.success('Saved successfully') this.$message.success('Saved successfully')
@ -174,7 +185,8 @@ export default {
this.$emit('getList') this.$emit('getList')
this.$emit('close') this.$emit('close')
} }
}).catch(() => { })
.catch(() => {
this.btnLoading = false this.btnLoading = false
}) })
}) })
@ -189,8 +201,7 @@ export default {
if (Object.keys(this.data).length && this.data.Id) { if (Object.keys(this.data).length && this.data.Id) {
this.form = { ...this.data } this.form = { ...this.data }
} }
} },
} },
} }
</script> </script>

View File

@ -23,6 +23,17 @@
<el-input style="width: 300px" v-model="form.EmailTopic" /> <el-input style="width: 300px" v-model="form.EmailTopic" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="12">
<el-form-item label="邮件延时发送s数" prop="EmailDelaySeconds">
<el-input
v-model.number="form.EmailDelaySeconds"
style="width: 300px"
type="number"
clearable
>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12"> <el-col :span="12">
<el-form-item label="业务层级" prop="BusinessLevelEnum"> <el-form-item label="业务层级" prop="BusinessLevelEnum">
<el-select v-model="form.BusinessLevelEnum" clearable class="mr"> <el-select v-model="form.BusinessLevelEnum" clearable class="mr">
@ -329,6 +340,7 @@ export default {
IsEnable: true, IsEnable: true,
IsAutoSend: true, IsAutoSend: true,
CriterionTypeEnum: null, CriterionTypeEnum: null,
EmailDelaySeconds: null,
}, },
rules: { rules: {
Code: [{ required: true, message: 'Please select', trigger: ['blur'] }], Code: [{ required: true, message: 'Please select', trigger: ['blur'] }],

View File

@ -212,96 +212,41 @@
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
<el-row>
<!-- <el-row>--> <el-col :span="14">
<!-- <el-col :span="14">--> <el-form-item
<!-- <el-form-item label="Physician: " prop="PhysicianId" >--> :label="$t('system:reviewer:label:WorkPartTime')"
<!-- <el-select--> prop="WorkPartTime"
<!-- v-model="employmentForm.PhysicianId"--> >
<!-- placeholder="select"--> <el-input
<!-- :disabled="$route.query.ReviewStatus === '1'"--> :disabled="$route.query.ReviewStatus === '1'"
<!-- @change="PhysicianChange"--> v-model="employmentForm.WorkPartTime"
<!-- style="width:100%;"--> type="textarea"
<!-- size="small"--> :rows="2"
<!-- >--> :placeholder="
<!-- <el-option--> $t('curriculumVitae:info:form:placeholder:partTimeJob')
<!-- v-for="item of $d.PhysicianOriginal"--> "
<!-- :key="item.id"--> size="small"
<!-- :label="item.raw.Value"--> />
<!-- :value="item.id"--> </el-form-item>
<!-- />--> </el-col>
<!-- </el-select>--> </el-row>
<!-- </el-form-item>--> <el-row>
<!-- </el-col>--> <el-col :span="14">
<!-- <el-col :span="5">--> <el-form-item prop="WorkPartTimeEn">
<!-- <el-form-item v-if="$fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === '其它' || $fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === 'Other'" class="other-item" prop="Physician">--> <el-input
<!-- <el-input--> :disabled="$route.query.ReviewStatus === '1'"
<!-- :disabled="$route.query.ReviewStatus === '1'"--> v-model="employmentForm.WorkPartTimeEn"
<!-- v-model="employmentForm.Physician"--> type="textarea"
<!-- placeholder="Please specify"--> :rows="2"
<!-- size="small"--> :placeholder="
<!-- />--> $t('curriculumVitae:info:form:placeholder:partTimeJobEN')
<!-- </el-form-item>--> "
<!-- </el-col>--> size="small"
<!-- <el-col :span="5">--> />
<!-- <el-form-item v-if="$fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === '其它' || $fd('PhysicianOriginal', employmentForm.PhysicianId, 'id') === 'Other'" class="other-item" prop="PhysicianCN">--> </el-form-item>
<!-- <el-input--> </el-col>
<!-- :disabled="$route.query.ReviewStatus === '1'"--> </el-row>
<!-- v-model="employmentForm.PhysicianCN"-->
<!-- placeholder="请用中文注明"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- <el-row>-->
<!-- <el-col :span="14">-->
<!-- <el-form-item label="Position: " prop="PositionId">-->
<!-- <el-select-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PositionId"-->
<!-- placeholder="select"-->
<!-- style="width:100%;"-->
<!-- size="small"-->
<!-- >-->
<!-- &lt;!&ndash; <el-option-->
<!-- v-for="(key,value) of dictionaryList.Position"-->
<!-- :key="key"-->
<!-- :label="key"-->
<!-- :value="value"-->
<!-- /> &ndash;&gt;-->
<!-- <el-option-->
<!-- v-for="item of dictionaryList.Position"-->
<!-- :key="item.Id"-->
<!-- :label="item.Value"-->
<!-- :value="item.Id"-->
<!-- />-->
<!-- <el-option label="Other" :value="otherId" />-->
<!-- <el-option label="None" value="f30a074b-2b47-4a92-97ec-e15086d37883" />-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="5">-->
<!-- <el-form-item v-if="employmentForm.PositionId===otherId" class="other-item" prop="PositionOther">-->
<!-- <el-input-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PositionOther"-->
<!-- placeholder="Please specify"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="5">-->
<!-- <el-form-item v-if="employmentForm.PositionId===otherId" class="other-item" prop="PositionOtherCN">-->
<!-- <el-input-->
<!-- :disabled="$route.query.ReviewStatus === '1'"-->
<!-- v-model="employmentForm.PositionOtherCN"-->
<!-- placeholder="请用中文注明"-->
<!-- size="small"-->
<!-- />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-form-item> <el-form-item>
<el-button <el-button
@ -363,6 +308,8 @@ export default {
Physician: '', Physician: '',
PhysicianCN: '', PhysicianCN: '',
PhysicianOriginal: null, PhysicianOriginal: null,
WorkPartTime: null,
WorkPartTimeEn: null,
}, },
UniversityAffiliated: '', UniversityAffiliated: '',
City: '', City: '',
@ -548,7 +495,11 @@ export default {
PositionOther, PositionOther,
PositionOtherCN, PositionOtherCN,
HospitalId, HospitalId,
WorkPartTime,
WorkPartTimeEn,
} = res.Result } = res.Result
this.employmentForm.WorkPartTime = WorkPartTime
this.employmentForm.WorkPartTimeEn = WorkPartTimeEn
this.employmentForm.Id = id this.employmentForm.Id = id
this.employmentForm.DepartmentId = this.employmentForm.DepartmentId =
DepartmentId === this.selectId ? '' : DepartmentId DepartmentId === this.selectId ? '' : DepartmentId

View File

@ -0,0 +1,136 @@
<template>
<div class="form-container basic-form">
<el-card class="box-card">
<div style="width: 1000px">
<!-- v-loading="loading" -->
<el-form
ref="payForm"
v-loading="loading"
:inline="true"
:rules="rules"
:model="form"
class="demo-ruleForm"
label-width="120px"
size="small"
>
<div>{{ $t('system:reviewer:title:pay') }}</div>
<el-row>
<el-col :span="12">
<el-form-item
:label="$t('system:reviewer:label:BankNum')"
prop="BankNum"
>
<el-input v-model="form.BankNum" clearable size="small" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
:label="$t('system:reviewer:label:BankName')"
prop="BankName"
>
<el-input v-model="form.BankName" clearable size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
:label="$t('system:reviewer:label:OpeningBank')"
prop="OpeningBank"
>
<el-input v-model="form.OpeningBank" clearable size="small" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item
:label="$t('system:reviewer:label:IdCard')"
prop="IdCard"
>
<el-input v-model="form.IdCard" clearable size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
:label="$t('system:reviewer:label:BankPhoneNum')"
prop="BankPhoneNum"
>
<el-input v-model="form.BankPhoneNum" clearable size="small" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item style="margin-left: 120px">
<el-button
:disabled="$route.query.ReviewStatus === '1'"
type="primary"
:loading="loading"
size="small"
@click="handleSave"
>
{{ $t('common:button:save') }}</el-button
>
</el-form-item>
</el-row>
</el-form>
</div>
</el-card>
</div>
</template>
<script>
import { getDetail, updatePaymentMode } from '@/api/reviewers'
export default {
data() {
return {
loading: false,
form: {
BankNum: '',
BankName: '',
OpeningBank: '',
IdCard: '',
BankPhoneNum: '',
},
rules: {},
}
},
mounted() {
this.getDetail()
},
methods: {
async handleSave() {
try {
let validate = await this.$refs.payForm.validate()
if (!validate) return false
this.form.Id = this.$route.query.Id || this.reviewerId
this.loading = true
let res = await updatePaymentMode(this.form)
this.loading = false
if (res.IsSuccess) {
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
async getDetail() {
try {
let id = this.$route.query.Id || this.reviewerId
if (!id) return false
this.loading = true
let res = await getDetail(id)
this.loading = false
if (res.IsSuccess) {
Object.keys(this.form).forEach((key) => {
this.form[key] = res.Result.PaymentModeInfo[key]
})
}
} catch (err) {
this.loading = false
console.log(err)
}
},
},
}
</script>

View File

@ -7,6 +7,7 @@
:model="researchForm" :model="researchForm"
size="small" size="small"
> >
<div class="title">{{ $t('system:reviewer:title:Research') }}</div>
<el-form-item :label="$t('system:reviewer:label:Field of Research')"> <el-form-item :label="$t('system:reviewer:label:Field of Research')">
<el-row type="flex" justify="space-between"> <el-row type="flex" justify="space-between">
<el-col :span="11"> <el-col :span="11">
@ -55,9 +56,10 @@
</el-col> </el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<div class="title">{{ $t('system:reviewer:title:Publications') }}</div>
<el-form-item :label="$t('system:reviewer:label:Publications')"> <el-form-item :label="$t('system:reviewer:label:Publications')">
<el-row type="flex" justify="space-between"> <el-row type="flex" justify="space-between">
<el-col :span="11"> <el-col :span="24">
<el-input <el-input
:disabled="$route.query.ReviewStatus === '1'" :disabled="$route.query.ReviewStatus === '1'"
v-model="researchForm.Publications" v-model="researchForm.Publications"
@ -67,11 +69,9 @@
size="small" size="small"
/> />
</el-col> </el-col>
<el-col :span="11">
<!-- <el-input v-model="researchForm.PublicationsCN" type="textarea" rows="5" placeholder="请用中文注明" size="small" /> -->
</el-col>
</el-row> </el-row>
</el-form-item> </el-form-item>
<div class="title">{{ $t('system:reviewer:title:AH') }}</div>
<el-form-item :label="$t('system:reviewer:label:Awards & Honors')"> <el-form-item :label="$t('system:reviewer:label:Awards & Honors')">
<el-row type="flex" justify="space-between"> <el-row type="flex" justify="space-between">
<el-col :span="11"> <el-col :span="11">
@ -184,3 +184,13 @@ export default {
}, },
} }
</script> </script>
<style lang="scss" scoped>
.title {
width: 100%;
background-color: #eee;
line-height: 30px;
padding-left: 10px;
border-radius: 3px;
margin-bottom: 20px;
}
</style>

View File

@ -0,0 +1,132 @@
<template>
<div class="form-container">
<el-card class="box-card">
<div style="width: 80%">
<el-form
ref="summarizeFrom"
v-loading="loading"
:rules="rules"
:model="form"
class="demo-ruleForm"
label-width="150px"
>
<el-row>
<el-col :span="14">
<el-form-item
:label="$t('system:reviewer:label:Summarize')"
prop="Summarize"
>
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="form.Summarize"
type="textarea"
:rows="2"
:placeholder="
$t('curriculumVitae:summarize:form:placeholder:summarize')
"
size="small"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="14">
<el-form-item prop="SummarizeEn">
<el-input
:disabled="$route.query.ReviewStatus === '1'"
v-model="form.SummarizeEn"
type="textarea"
:rows="2"
:placeholder="
$t('curriculumVitae:summarize:form:placeholder:summarizeEN')
"
size="small"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item>
<el-button
type="primary"
:disabled="$route.query.ReviewStatus === '1'"
size="small"
:loading="loading"
@click="handleSave"
>
{{ $t('common:button:save') }}
</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
</div>
</template>
<script>
import { getDetail, updateGneralSituation } from '@/api/reviewers'
export default {
props: {
reviewerId: {
type: String,
},
},
data() {
return {
loading: false,
form: {
Summarize: null,
SummarizeEn: null,
},
rules: {},
}
},
mounted() {
this.getDetail()
},
methods: {
async handleSave() {
try {
let validate = await this.$refs.summarizeFrom.validate()
if (!validate) return false
this.form.Id = this.$route.query.Id || this.reviewerId
this.loading = true
let res = await updateGneralSituation(this.form)
this.loading = false
if (res.IsSuccess) {
}
} catch (err) {
this.loading = false
console.log(err)
}
},
//
async getDetail() {
try {
let id = this.$route.query.Id || this.reviewerId
if (!id) return false
this.loading = true
let res = await getDetail(id)
this.loading = false
if (res.IsSuccess) {
Object.keys(this.form).forEach((key) => {
this.form[key] = res.Result.SummarizeInfo[key]
})
}
} catch (err) {
this.loading = false
console.log(err)
}
},
},
}
</script>
<style lang="scss" scoped>
.basic-form {
.el-input--small {
width: 220px !important;
}
.el-select--small {
width: 220px !important;
}
}
</style>

View File

@ -269,7 +269,9 @@ export default {
openBox() { openBox() {
this.model_cfg.visible = true this.model_cfg.visible = true
}, },
handleCancle() {}, handleCancle() {
this.model_cfg.visible = false
},
handleRemoveFile(row) { handleRemoveFile(row) {
this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), { this.$confirm(this.$t('trials:uploadedDicoms:message:deleteMes'), {
type: 'warning', type: 'warning',

View File

@ -6,7 +6,6 @@
<template v-if="DATA.FirstName && DATA.LastName"> <template v-if="DATA.FirstName && DATA.LastName">
<div class="userInfo"> <div class="userInfo">
<span>{{ DATA.FirstName }}{{ DATA.LastName }}</span> <span>{{ DATA.FirstName }}{{ DATA.LastName }}</span>
<span>
<span v-if="isEN"> <span v-if="isEN">
{{ {{
Array.isArray(DATA.TitleList) && DATA.TitleList.length > 0 Array.isArray(DATA.TitleList) && DATA.TitleList.length > 0
@ -21,11 +20,8 @@
: '' : ''
}} }}
</span> </span>
</span>
<span>
<span v-if="isEN">{{ DATA.HospitalName }}</span> <span v-if="isEN">{{ DATA.HospitalName }}</span>
<span v-else>{{ DATA.HospitalNameCN }}</span> <span v-else>{{ DATA.HospitalNameCN }}</span>
</span>
</div> </div>
<div class="userTitle"> <div class="userTitle">
<span <span

View File

@ -42,7 +42,7 @@
}}</el-menu-item> }}</el-menu-item>
</el-menu> </el-menu>
</div> </div>
<div class="main"> <div class="main" id="main">
<div class="content"> <div class="content">
<div class="title"> <div class="title">
<div>{{ $t('curriculumVitae:content:title') }}</div> <div>{{ $t('curriculumVitae:content:title') }}</div>
@ -166,7 +166,9 @@
</div> </div>
</div> </div>
<el-dialog :visible.sync="visible" fullscreen> <el-dialog :visible.sync="visible" fullscreen>
<preview /> <div style="height: 100%; overflow: auto">
<preview :isEN="isEN" :reviewerId.sync="reviewerId" v-if="visible" />
</div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -227,6 +229,7 @@ export default {
SummarizeInfo: {}, SummarizeInfo: {},
TrialExperienceView: {}, TrialExperienceView: {},
}, },
dom: null,
} }
}, },
computed: { computed: {
@ -240,15 +243,21 @@ export default {
if (sessionStorage.getItem('reviewerId')) { if (sessionStorage.getItem('reviewerId')) {
this.reviewerId = sessionStorage.getItem('reviewerId') this.reviewerId = sessionStorage.getItem('reviewerId')
this.getDetail() this.getDetail()
} else if (this.$route.query.id) {
this.reviewerId = this.$route.query.id
sessionStorage.setItem('reviewerId', this.reviewerId)
this.getDetail()
} }
}, },
mounted() { mounted() {
this.dom = document.getElementById('main')
// //
window.addEventListener('scroll', this.onScroll) this.dom.addEventListener('scroll', this.onScroll)
}, },
destroy() { destroy() {
// vue // vue
window.removeEventListener('scroll', this.onScroll) this.dom.removeEventListener('scroll', this.onScroll)
this.dom = null
}, },
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: 'lang/setLanguage' }),
@ -271,8 +280,8 @@ export default {
const navContent = document.getElementById(key) const navContent = document.getElementById(key)
if (navContent) { if (navContent) {
const scrollTop = navContent.offsetTop const scrollTop = navContent.offsetTop
document.body.scrollTop = scrollTop document.getElementById('main').scrollTop = scrollTop
document.documentElement.scrollTop = scrollTop // document.documentElement.scrollTop = scrollTop
} }
}, },
onScroll() { onScroll() {
@ -284,8 +293,7 @@ export default {
offsetTopArr.push(item.offsetTop) offsetTopArr.push(item.offsetTop)
}) })
// scrollTop // scrollTop
const scrollTop = const scrollTop = document.getElementById('main').scrollTop
document.documentElement.scrollTop || document.body.scrollTop
// //
let navItem = null let navItem = null
for (let n = 0; n < offsetTopArr.length; n++) { for (let n = 0; n < offsetTopArr.length; n++) {
@ -308,13 +316,17 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.curriculumVitae {
position: relative;
height: 100%;
}
.title { .title {
line-height: 50px; line-height: 50px;
background-color: #fff; background-color: #fff;
text-align: center; text-align: center;
} }
.leftMenu { .leftMenu {
position: fixed; position: absolute;
left: 0; left: 0;
top: 0; top: 0;
width: 100px; width: 100px;
@ -341,7 +353,8 @@ export default {
} }
.main { .main {
width: calc(100% - 100px); width: calc(100% - 100px);
height: 100vh; height: 100%;
overflow: auto;
margin-left: 100px; margin-left: 100px;
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,12 @@
> >
<Employment v-if="load.Employment" :reviewerId.sync="reviewerId" /> <Employment v-if="load.Employment" :reviewerId.sync="reviewerId" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane
:label="$t('system:reviewer:tab:Summarize')"
name="Summarize"
>
<Summarize v-if="load.Summarize" :reviewerId.sync="reviewerId" />
</el-tab-pane>
<el-tab-pane <el-tab-pane
:label="$t('system:reviewer:tab:Specialty')" :label="$t('system:reviewer:tab:Specialty')"
name="Specialty" name="Specialty"
@ -61,6 +67,9 @@
> >
<Agreements v-if="load.Agreements" :reviewerId.sync="reviewerId" /> <Agreements v-if="load.Agreements" :reviewerId.sync="reviewerId" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="$t('system:reviewer:tab:Pay')" name="Pay">
<Pay v-if="load.Pay" :reviewerId.sync="reviewerId" />
</el-tab-pane>
<el-tab-pane :label="$t('system:reviewer:tab:Setting')" name="Setting"> <el-tab-pane :label="$t('system:reviewer:tab:Setting')" name="Setting">
<Setting v-if="load.Setting" :reviewerId.sync="reviewerId" /> <Setting v-if="load.Setting" :reviewerId.sync="reviewerId" />
</el-tab-pane> </el-tab-pane>
@ -70,6 +79,7 @@
<script> <script>
import BasicInfo from './components/BasicInfo' import BasicInfo from './components/BasicInfo'
import Employment from './components/Employment' import Employment from './components/Employment'
import Summarize from './components/Summarize'
import Specialty from './components/Specialty' import Specialty from './components/Specialty'
import EducationTraining from './components/EducationTraining' import EducationTraining from './components/EducationTraining'
import ResearchPublication from './components/ResearchPublication' import ResearchPublication from './components/ResearchPublication'
@ -77,12 +87,14 @@ import TrialExperience from './components/TrialExperience'
import Credentials from './components/Credentials' import Credentials from './components/Credentials'
import Resumes from './components/Resumes' import Resumes from './components/Resumes'
import Agreements from './components/Agreements' import Agreements from './components/Agreements'
import Pay from './components/Pay'
import Setting from './components/Setting' import Setting from './components/Setting'
import { changeURLStatic, getQueryString } from '@/utils/history.js' import { changeURLStatic, getQueryString } from '@/utils/history.js'
export default { export default {
components: { components: {
BasicInfo, BasicInfo,
Employment, Employment,
Summarize,
Specialty, Specialty,
EducationTraining, EducationTraining,
ResearchPublication, ResearchPublication,
@ -90,6 +102,7 @@ export default {
Credentials, Credentials,
Resumes, Resumes,
Agreements, Agreements,
Pay,
Setting, Setting,
}, },
props: { props: {
@ -108,6 +121,7 @@ export default {
load: { load: {
BasicInfo: true, BasicInfo: true,
Employment: false, Employment: false,
Summarize: false,
Specialty: false, Specialty: false,
EducationTraining: false, EducationTraining: false,
ResearchPublication: false, ResearchPublication: false,
@ -115,6 +129,7 @@ export default {
Credentials: false, Credentials: false,
Resumes: false, Resumes: false,
Agreements: false, Agreements: false,
Pay,
Setting: false, Setting: false,
}, },
} }

View File

@ -7,7 +7,7 @@
<el-form-item :label="$t('reviewers-list:label:Name')"> <el-form-item :label="$t('reviewers-list:label:Name')">
<el-input <el-input
v-model="searchData.Name" v-model="searchData.Name"
style="width:100px;" style="width: 100px"
clearable clearable
/> />
</el-form-item> </el-form-item>
@ -17,7 +17,7 @@
clearable clearable
multiple multiple
collapse-tags collapse-tags
style="width:150px;" style="width: 150px"
> >
<!-- <el-option <!-- <el-option
v-for="(key,value) of dictionaryList.ReadingType" v-for="(key,value) of dictionaryList.ReadingType"
@ -39,7 +39,7 @@
multiple multiple
collapse-tags collapse-tags
clearable clearable
style="width:180px;" style="width: 180px"
> >
<el-option <el-option
v-for="item of dict.type.Subspeciality" v-for="item of dict.type.Subspeciality"
@ -50,39 +50,56 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" @click="handleSearch">{{ $t('common:button:search') }}</el-button> <el-button
<el-button type="primary" icon="el-icon-refresh-left" @click="handleReset">{{ $t('common:button:reset') }}</el-button> type="primary"
icon="el-icon-search"
@click="handleSearch"
>{{ $t('common:button:search') }}</el-button
>
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>{{ $t('common:button:reset') }}</el-button
>
<el-button <el-button
icon="el-icon-download" icon="el-icon-download"
type="primary" type="primary"
:disabled="!(selectArr.length>0)" :disabled="!(selectArr.length > 0)"
@click="handleDownLoadOffical" @click="handleDownLoadOffical"
>{{$t('reviewers-list:label:DownloadCV')}}</el-button> >{{ $t('reviewers-list:label:DownloadCV') }}</el-button
>
<el-button <el-button
type="primary" type="primary"
icon="el-icon-link" icon="el-icon-link"
@click="showResearchLink" @click="showResearchLink"
> >
{{$t('reviewers-list:label:showResearchLink')}} {{ $t('reviewers-list:label:showResearchLink') }}
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<span style="margin-left:auto;"> <span style="margin-left: auto">
<!-- <el-switch--> <!-- <el-switch-->
<!-- v-model="isEN"--> <!-- v-model="isEN"-->
<!-- active-text="EN"--> <!-- active-text="EN"-->
<!-- inactive-text="中文"--> <!-- inactive-text="中文"-->
<!-- style="margin-right:10px;"--> <!-- style="margin-right:10px;"-->
<!-- @change="handleIsEnChange"--> <!-- @change="handleIsEnChange"-->
<!-- />--> <!-- />-->
<el-button size="small" icon="el-icon-plus" type="primary" @click="handleNew">{{$t('common:button:new')}}</el-button> <el-button
size="small"
icon="el-icon-plus"
type="primary"
@click="handleNew"
>{{ $t('common:button:new') }}</el-button
>
</span> </span>
</div> </div>
<!-- 医生列表 --> <!-- 医生列表 -->
<el-table <el-table
v-adaptive="{bottomOffset:55}" v-adaptive="{ bottomOffset: 55 }"
v-loading="listLoading" v-loading="listLoading"
stripe stripe
height="100" height="100"
@ -90,7 +107,12 @@
@sort-change="sortByColumn" @sort-change="sortByColumn"
@selection-change="handleSelectChange" @selection-change="handleSelectChange"
> >
<el-table-column type="selection" align="left" width="45" :selectable="hasResume" /> <el-table-column
type="selection"
align="left"
width="45"
:selectable="hasResume"
/>
<el-table-column type="index" width="40" align="left" /> <el-table-column type="index" width="40" align="left" />
<el-table-column <el-table-column
align="left" align="left"
@ -111,8 +133,20 @@
width="90" width="90"
align="left" align="left"
/> />
<el-table-column prop="ReviewerCode" :label="$t('reviewers-list:table:ID')" width="80" show-overflow-tooltip sortable="custom" /> <el-table-column
<el-table-column prop="AccountUserName" :label="$t('reviewers-list:table:UserName')" width="140" show-overflow-tooltip sortable="custom" /> prop="ReviewerCode"
:label="$t('reviewers-list:table:ID')"
width="80"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column
prop="AccountUserName"
:label="$t('reviewers-list:table:UserName')"
width="140"
show-overflow-tooltip
sortable="custom"
/>
<el-table-column <el-table-column
:label="$t('reviewers-list:table:Reading')" :label="$t('reviewers-list:table:Reading')"
width="100" width="100"
@ -122,14 +156,17 @@
prop="Reading" prop="Reading"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="scope.row.Reading" style="color:#428bca"> <span v-if="scope.row.Reading" style="color: #428bca">
<router-link <router-link
tag="a" tag="a"
:to="{ :to="{
path: `/trialStats?name=${scope.row.FirstName+' '+scope.row.LastName}&doctorId=${scope.row.Id}&status=10&TokenKey=${tokenKey}` path: `/trialStats?name=${
scope.row.FirstName + ' ' + scope.row.LastName
}&doctorId=${scope.row.Id}&status=10&TokenKey=${tokenKey}`,
}" }"
target="_blank" target="_blank"
>{{ scope.row.Reading }}</router-link> >{{ scope.row.Reading }}</router-link
>
</span> </span>
<span v-else>{{ scope.row.Reading }}</span> <span v-else>{{ scope.row.Reading }}</span>
</template> </template>
@ -143,14 +180,17 @@
prop="Finished" prop="Finished"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if=" scope.row.Finished" style="color:#428bca"> <span v-if="scope.row.Finished" style="color: #428bca">
<router-link <router-link
tag="a" tag="a"
:to="{ :to="{
path: `/trialStats?name=${scope.row.FirstName+' '+scope.row.LastName}&doctorId=${scope.row.Id}&status=14&TokenKey=${tokenKey}` path: `/trialStats?name=${
scope.row.FirstName + ' ' + scope.row.LastName
}&doctorId=${scope.row.Id}&status=14&TokenKey=${tokenKey}`,
}" }"
target="_blank" target="_blank"
>{{ scope.row.Finished }}</router-link> >{{ scope.row.Finished }}</router-link
>
</span> </span>
<span v-else>{{ scope.row.Finished }}</span> <span v-else>{{ scope.row.Finished }}</span>
</template> </template>
@ -165,7 +205,13 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span> <span>
{{ scope.row.SpecialityId === otherId ? scope.row.SpecialityOther : isEnglish?scope.row.Speciality:scope.row.SpecialityCN }} {{
scope.row.SpecialityId === otherId
? scope.row.SpecialityOther
: isEnglish
? scope.row.Speciality
: scope.row.SpecialityCN
}}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -178,10 +224,18 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="isEnglish"> <span v-if="isEnglish">
{{ scope.row.SubspecialityList.length>0?scope.row.SubspecialityList.join(', '):'' }} {{
scope.row.SubspecialityList.length > 0
? scope.row.SubspecialityList.join(', ')
: ''
}}
</span> </span>
<span v-else> <span v-else>
{{ scope.row.SubspecialityCNList.length>0?scope.row.SubspecialityCNList.join(', '):'' }} {{
scope.row.SubspecialityCNList.length > 0
? scope.row.SubspecialityCNList.join(', ')
: ''
}}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -195,7 +249,7 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span> <span>
{{ isEnglish?scope.row.HospitalName:scope.row.HospitalNameCN }} {{ isEnglish ? scope.row.HospitalName : scope.row.HospitalNameCN }}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -209,7 +263,7 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span> <span>
{{ isEnglish?scope.row.City:scope.row.CityCN }} {{ isEnglish ? scope.row.City : scope.row.CityCN }}
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
@ -241,7 +295,12 @@
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('common:action:action')" min-width="200" align="left" fixed="right"> <el-table-column
:label="$t('common:action:action')"
min-width="200"
align="left"
fixed="right"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
@ -279,14 +338,40 @@
<base-model :config="share_model"> <base-model :config="share_model">
<template slot="dialog-body"> <template slot="dialog-body">
<div> <div>
<i style="color:#428bca;" class="el-icon-success" /> <i style="color: #428bca" class="el-icon-success" />
<span>{{ $t('reviewers-list:message:msg1')}}</span> <span>{{ $t('reviewers-list:message:msg1') }}</span>
</div> </div>
<div style="margin:10px 0;"> <div style="margin: 10px 0">
<span style="">{{ $t('reviewers-list:message:msg2') }}</span><el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4}" v-model="shareLink" readonly style="width: 100%;margin-top: 10px" /> <span style="">{{ $t('reviewers-list:message:msg2') }}</span
><el-input
type="textarea"
:autosize="{ minRows: 2, maxRows: 4 }"
v-model="shareLink"
readonly
style="width: 100%; margin-top: 10px"
/>
</div> </div>
<div> <div>
<el-button type="primary" round @click="copyCode">{{ $t('reviewers-list:button:copyCode') }}</el-button> <el-button type="primary" round @click="copyCode">{{
$t('reviewers-list:button:copyCode')
}}</el-button>
</div>
<div class="sendEmailBox">
<el-input
v-model="email"
clearable
:placeholder="$t('reviewers-list:placeholder:sendEmail')"
></el-input>
<el-button
type="primary"
round
:disabled="!email"
@click="sendEmail"
:loading="emailLoading"
style="margin-left: 10px"
>
{{ $t('reviewers-list:button:sendEmail') }}
</el-button>
</div> </div>
</template> </template>
</base-model> </base-model>
@ -300,20 +385,48 @@
</el-radio-group> </el-radio-group>
</template> </template>
<template slot="dialog-footer"> <template slot="dialog-footer">
<el-button :disabled="btnLoading" size="small" type="primary" @click="model_cfg.visible = false">Cancel</el-button> <el-button
<el-button size="small" type="primary" :loading="btnLoading" @click="handleDownloadResumes">Ok</el-button> :disabled="btnLoading"
size="small"
type="primary"
@click="model_cfg.visible = false"
>Cancel</el-button
>
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleDownloadResumes"
>Ok</el-button
>
</template> </template>
</base-model> </base-model>
<el-dialog :visible.sync="preview_visible" fullscreen>
<div style="height: 100%; overflow: auto">
<preview
:isEN="isEN"
:isAll="isAll"
:reviewerId.sync="reviewerId"
v-if="preview_visible"
/>
</div>
</el-dialog>
</box-content> </box-content>
</template> </template>
<script> <script>
import { getDoctorSearchList, downloadOfficialCV, getOfficialResume } from '@/api/reviewers' import {
getDoctorSearchList,
downloadOfficialCV,
getOfficialResume,
doctorSendEmail,
} from '@/api/reviewers'
import store from '@/store' import store from '@/store'
import { mapGetters, mapMutations } from 'vuex' import { mapGetters, mapMutations } from 'vuex'
import Pagination from '@/components/Pagination' import Pagination from '@/components/Pagination'
import BoxContent from '@/components/BoxContent' import BoxContent from '@/components/BoxContent'
import BaseModel from '@/components/BaseModel' import BaseModel from '@/components/BaseModel'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import preview from '@/views/reviewers/curriculumVitae/preview.vue'
import JSZip from 'jszip' import JSZip from 'jszip'
import axios from 'axios' import axios from 'axios'
import { saveAs } from 'file-saver' import { saveAs } from 'file-saver'
@ -338,13 +451,13 @@ const searchDataDefault = () => {
PageIndex: 1, PageIndex: 1,
PageSize: 20, PageSize: 20,
Asc: false, Asc: false,
SortField: '' SortField: '',
} }
} }
const otherId = 'ef84e9cb-f1a6-49d7-b6da-34be2c12abd5' const otherId = 'ef84e9cb-f1a6-49d7-b6da-34be2c12abd5'
export default { export default {
name: 'Reviewers', name: 'Reviewers',
components: { BoxContent, BaseModel, Pagination }, components: { BoxContent, BaseModel, Pagination, preview },
data() { data() {
return { return {
otherId, otherId,
@ -363,20 +476,34 @@ export default {
visible: false, visible: false,
title: '', title: '',
width: '500px', width: '500px',
showClose: true showClose: true,
}, },
tokenKey: getToken(), tokenKey: getToken(),
share_model: { visible: false, title: '', width: '500px' }, share_model: { visible: false, title: '', width: '500px' },
shareLink: null, shareLink: null,
isEnglish: false isEnglish: false,
preview_visible: false,
reviewerId: '',
isAll: true,
emailLoading: false,
email: null,
} }
}, },
dicts: ['ReadingType', 'Subspeciality', 'Department', 'Rank', 'Position', 'ReadingStandard'], dicts: [
'ReadingType',
'Subspeciality',
'Department',
'Rank',
'Position',
'ReadingStandard',
],
computed: { computed: {
...mapGetters(['hospitalList', 'reviewersQuery']) ...mapGetters(['hospitalList', 'reviewersQuery']),
}, },
created() { created() {
this.reviewersQuery ? this.listQuery = this.reviewersQuery : '' this.reviewersQuery ? (this.listQuery = this.reviewersQuery) : ''
this.initPage() this.initPage()
// this.isEnglish = !!((this.$route.query.isEnglish === true || this.$route.query.isEnglish === 'true')) // this.isEnglish = !!((this.$route.query.isEnglish === true || this.$route.query.isEnglish === 'true'))
this.isEnglish = this.$i18n.locale === 'zh' ? false : true this.isEnglish = this.$i18n.locale === 'zh' ? false : true
@ -384,21 +511,48 @@ export default {
}, },
methods: { methods: {
copyCode() { copyCode() {
this.$copyText(`链接: ${this.shareLink}`).then( this.$copyText(`链接: ${this.shareLink}`)
res => { .then((res) => {
this.$message.success('复制成功') this.$message.success('复制成功')
})
.catch(() => {
this.$alert('复制失败')
})
},
//
async sendEmail() {
var pattern =
/^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/
if (!pattern.test(this.email))
return this.$message.warning(this.$t('rules:email'))
this.emailLoading = true
let res = await doctorSendEmail({
Email: this.email,
Url: `ReviewersResearch?lang=${this.$store.getters.language}`,
})
this.emailLoading = false
if (res.IsSuccess) {
this.$message.success(
this.$t('trials:researchStaff:message:sendEmalil')
)
this.share_model.visible = false
} }
).catch(() => { this.$alert('复制失败') })
}, },
// //
copyLink() { copyLink() {
// //
this.$copyText(`${this.$t('trials:researchRecord:message:researchFormLink')}: ${this.shareLink}`).then( this.$copyText(
res => { `${this.$t('trials:researchRecord:message:researchFormLink')}: ${
this.shareLink
}`
)
.then((res) => {
// //
this.$message.success(this.$t('trials:researchRecord:message:copySuccessfully')) this.$message.success(
} this.$t('trials:researchRecord:message:copySuccessfully')
).catch(() => { )
})
.catch(() => {
// //
this.$alert(this.$t('trials:researchRecord:message:copyFailed')) this.$alert(this.$t('trials:researchRecord:message:copyFailed'))
}) })
@ -409,8 +563,11 @@ export default {
this.share_model.visible = true this.share_model.visible = true
}, },
lookResumeInfo(row) { lookResumeInfo(row) {
console.log(row) this.reviewerId = row.Id
window.open(`/blindResumeInfo?doctorId=${row.Id}&token=${this.token}`) this.isAll = false
this.preview_visible = true
// console.log(row)
// window.open(`/blindResumeInfo?doctorId=${row.Id}&token=${this.token}`)
}, },
initPage() { initPage() {
store.dispatch('global/getHospital') store.dispatch('global/getHospital')
@ -424,10 +581,10 @@ export default {
// this.searchData.InformationConfirmed = 1 // this.searchData.InformationConfirmed = 1
// this.searchData.ContractorStatus = 1 // this.searchData.ContractorStatus = 1
getDoctorSearchList(this.searchData) getDoctorSearchList(this.searchData)
.then(res => { .then((res) => {
this.listLoading = false this.listLoading = false
this.list = res.Result.CurrentPageData this.list = res.Result.CurrentPageData
this.list.forEach(item => { this.list.forEach((item) => {
if (item.SubspecialityOther) { if (item.SubspecialityOther) {
item.SubspecialityList.push(item.SubspecialityOther) item.SubspecialityList.push(item.SubspecialityOther)
} }
@ -443,7 +600,9 @@ export default {
}, },
// //
handleNew() { handleNew() {
this.$router.push({ path: `/reviewers/reviewers-add?Id=&isEnglish=${this.isEnglish}&tabActive=BasicInfo` }) this.$router.push({
path: `/reviewers/reviewers-add?Id=&isEnglish=${this.isEnglish}&tabActive=BasicInfo`,
})
}, },
// More // More
handleMore() { handleMore() {
@ -460,53 +619,68 @@ export default {
this.getList() this.getList()
}, },
handleDetail(row) { handleDetail(row) {
this.$router.push({ path: `/reviewers/reviewers-detail?doctorId=${row.Id}&isEnglish=${this.isEnglish}` }) this.reviewerId = row.Id
this.isAll = true
this.preview_visible = true
// this.$router.push({
// path: `/reviewers/reviewers-detail?doctorId=${row.Id}&isEnglish=${this.isEnglish}`,
// })
}, },
handleEdit(row) { handleEdit(row) {
this.$router.push({ path: `/reviewers/reviewers-edit?Id=${row.Id}&isEnglish=${this.isEnglish}&tabActive=BasicInfo` }) this.$router.push({
path: `/reviewers/reviewers-edit?Id=${row.Id}&isEnglish=${this.isEnglish}&tabActive=BasicInfo`,
})
}, },
getFileData(fileUrl) { getFileData(fileUrl) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
axios(fileUrl, { axios(fileUrl, {
method: 'GET', method: 'GET',
responseType: 'blob' // blob arraybuffer responseType: 'blob', // blob arraybuffer
}).then((res) => { })
.then((res) => {
console.log('res', res) console.log('res', res)
resolve(res) resolve(res)
}).catch(error => { })
.catch((error) => {
reject(error) reject(error)
}) })
}) })
}, },
async handleBatchDown(dataSource) { async handleBatchDown(dataSource) {
return new Promise(resolve => { return new Promise((resolve) => {
console.log('开始压缩') console.log('开始压缩')
const zip = new JSZip() // const zip = new JSZip() //
const promises = [] const promises = []
dataSource.FileList.forEach((item) => { dataSource.FileList.forEach((item) => {
console.log(this.OSSclientConfig.basePath + item.Path) console.log(this.OSSclientConfig.basePath + item.Path)
const promise = this.getFileData(this.OSSclientConfig.basePath + item.Path).then((res) => { const promise = this.getFileData(
this.OSSclientConfig.basePath + item.Path
).then((res) => {
const fileName = item.FileName + '' const fileName = item.FileName + ''
// file() floder() // file() floder()
zip.file(fileName, res.data, {binary: true}) zip.file(fileName, res.data, { binary: true })
}) })
promises.push(promise) promises.push(promise)
}) })
console.log(promises) console.log(promises)
// zip // zip
Promise.all(promises).then(() => { Promise.all(promises)
.then(() => {
// zip // zip
zip.generateAsync({ zip
.generateAsync({
type: 'blob', type: 'blob',
compression: 'DEFLATE', // STORE: DEFLATE compression: 'DEFLATE', // STORE: DEFLATE
compressionOptions: { compressionOptions: {
level: 9 // 1~9 1 9 level: 9, // 1~9 1 9
} },
}).then((res) => { })
.then((res) => {
saveAs(res, dataSource.ReviewerCode + '_CV.zip') // 使FileSaver.saveAs saveAs(res, dataSource.ReviewerCode + '_CV.zip') // 使FileSaver.saveAs
resolve() resolve()
}) })
}).catch(reason => { })
.catch((reason) => {
resolve() resolve()
}) })
}) })
@ -517,8 +691,9 @@ export default {
this.model_cfg.showClose = false this.model_cfg.showClose = false
getOfficialResume({ getOfficialResume({
doctorIdList: this.selectArr, doctorIdList: this.selectArr,
language: this.language language: this.language,
}).then(async res => { })
.then(async (res) => {
try { try {
this.btnLoading = false this.btnLoading = false
this.model_cfg.visible = false this.model_cfg.visible = false
@ -533,7 +708,8 @@ export default {
console.log(e) console.log(e)
} }
// window.open(res.Result.FullFilePath) // window.open(res.Result.FullFilePath)
}).catch(() => { })
.catch(() => {
this.btnLoading = false this.btnLoading = false
this.model_cfg.showClose = true this.model_cfg.showClose = true
}) })
@ -585,7 +761,7 @@ export default {
}, },
...mapMutations({ ...mapMutations({
setQueryParam: 'reviewer/SET_QUERYPARAM', setQueryParam: 'reviewer/SET_QUERYPARAM',
setIsEnglish: 'reviewer/SET_ISENGLISH' setIsEnglish: 'reviewer/SET_ISENGLISH',
}), }),
hasResume(row) { hasResume(row) {
if (row.HasResume) { if (row.HasResume) {
@ -593,8 +769,8 @@ export default {
} else { } else {
return false return false
} }
} },
} },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@ -609,4 +785,10 @@ export default {
// margin-top: 5px; // margin-top: 5px;
// } // }
// } // }
.sendEmailBox {
margin-top: 20px;
display: flex;
align-items: center;
justify-content: space-between;
}
</style> </style>

View File

@ -17,6 +17,12 @@
> >
<Employment v-if="load.Employment" :reviewerId.sync="reviewerId" /> <Employment v-if="load.Employment" :reviewerId.sync="reviewerId" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane
:label="$t('system:reviewer:tab:Summarize')"
name="Summarize"
>
<Summarize v-if="load.Summarize" :reviewerId.sync="reviewerId" />
</el-tab-pane>
<el-tab-pane <el-tab-pane
:label="$t('system:reviewer:tab:Specialty')" :label="$t('system:reviewer:tab:Specialty')"
name="Specialty" name="Specialty"
@ -66,6 +72,9 @@
> >
<Agreements v-if="load.Agreements" :reviewerId.sync="reviewerId" /> <Agreements v-if="load.Agreements" :reviewerId.sync="reviewerId" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="$t('system:reviewer:tab:Pay')" name="Pay">
<Pay v-if="load.Pay" :reviewerId.sync="reviewerId" />
</el-tab-pane>
<el-tab-pane :label="$t('system:reviewer:tab:Setting')" name="Setting"> <el-tab-pane :label="$t('system:reviewer:tab:Setting')" name="Setting">
<Setting v-if="load.Setting" :reviewerId.sync="reviewerId" /> <Setting v-if="load.Setting" :reviewerId.sync="reviewerId" />
</el-tab-pane> </el-tab-pane>
@ -75,6 +84,7 @@
<script> <script>
import BasicInfo from './components/BasicInfo' import BasicInfo from './components/BasicInfo'
import Employment from './components/Employment' import Employment from './components/Employment'
import Summarize from './components/Summarize'
import Specialty from './components/Specialty' import Specialty from './components/Specialty'
import EducationTraining from './components/EducationTraining' import EducationTraining from './components/EducationTraining'
import ResearchPublication from './components/ResearchPublication' import ResearchPublication from './components/ResearchPublication'
@ -82,12 +92,14 @@ import TrialExperience from './components/TrialExperience'
import Credentials from './components/Credentials' import Credentials from './components/Credentials'
import Resumes from './components/Resumes' import Resumes from './components/Resumes'
import Agreements from './components/Agreements' import Agreements from './components/Agreements'
import Pay from './components/Pay'
import Setting from './components/Setting' import Setting from './components/Setting'
import { changeURLStatic, getQueryString } from '@/utils/history.js' import { changeURLStatic, getQueryString } from '@/utils/history.js'
export default { export default {
components: { components: {
BasicInfo, BasicInfo,
Employment, Employment,
Summarize,
Specialty, Specialty,
EducationTraining, EducationTraining,
ResearchPublication, ResearchPublication,
@ -95,6 +107,7 @@ export default {
Credentials, Credentials,
Resumes, Resumes,
Agreements, Agreements,
Pay,
Setting, Setting,
}, },
props: { props: {
@ -109,6 +122,7 @@ export default {
load: { load: {
BasicInfo: true, BasicInfo: true,
Employment: false, Employment: false,
Summarize: false,
Specialty: false, Specialty: false,
EducationTraining: false, EducationTraining: false,
ResearchPublication: false, ResearchPublication: false,
@ -116,6 +130,7 @@ export default {
Credentials: false, Credentials: false,
Resumes: false, Resumes: false,
Agreements: false, Agreements: false,
Pay,
Setting: false, Setting: false,
}, },
reviewerId: null, reviewerId: null,

View File

@ -7,14 +7,17 @@
style="width: 200px" style="width: 200px"
> >
<el-menu-item index="1">{{ <el-menu-item index="1">{{
$t("trials:trials-myinfo:menuTitle:mine") $t('trials:trials-myinfo:menuTitle:mine')
}}</el-menu-item> }}</el-menu-item>
<el-menu-item index="2">{{ <el-menu-item index="2">{{
$t("trials:trials-myinfo:menuTitle:account") $t('trials:trials-myinfo:menuTitle:account')
}}</el-menu-item> }}</el-menu-item>
<el-menu-item index="3">{{ <el-menu-item index="3">{{
$t("trials:trials-myinfo:menuTitle:loginLog") $t('trials:trials-myinfo:menuTitle:loginLog')
}}</el-menu-item> }}</el-menu-item>
<div index="4" @click="handleSelect('4')" class="el-menu-item">
{{ $t('trials:trials-myinfo:menuTitle:resume') }}
</div>
</el-menu> </el-menu>
<div class="contentBox"> <div class="contentBox">
<mine <mine
@ -35,65 +38,91 @@
</template> </template>
<script> <script>
import mine from "./mine.vue"; import mine from './mine.vue'
import account from "./account.vue"; import account from './account.vue'
import loginLog from "@/views/trials/trials-panel/trial-summary/login-log"; import loginLog from '@/views/trials/trials-panel/trial-summary/login-log'
import { getUserTypeList, getUser } from "@/api/admin.js"; import { getUserTypeList, getUser, useUserIDGetDoctorID } from '@/api/admin.js'
import store from "@/store"; import store from '@/store'
import { mapGetters } from "vuex"; import { mapGetters } from 'vuex'
export default { export default {
name: "TrialsMyinfo", name: 'TrialsMyinfo',
components: { mine, account, "login-log": loginLog }, components: { mine, account, 'login-log': loginLog },
data() { data() {
return { return {
activeIndex: "1", activeIndex: '1',
userTypeOptions: [], userTypeOptions: [],
user: {}, user: {},
IsCanConnectInternet: true, // IsCanConnectInternet: true, //
}; open: null,
}
}, },
computed: { computed: {
...mapGetters(["userId", "userName"]), ...mapGetters(['userId', 'userName']),
}, },
mounted() { mounted() {
this.getUserInfo(); this.getUserInfo()
this.getUserTypeList(); this.getUserTypeList()
}, },
methods: { methods: {
handleSelect(index) { async handleSelect(index) {
this.activeIndex = index; if (index === '4') {
if (this.open) {
this.open.close()
}
let id = await this.useUserIDGetDoctorID()
const routeData = this.$router.resolve({
path: `/curriculumVitae?id=${id}&&lang=${this.$i18n.locale}`,
})
this.open = window.open(routeData.href, '_blank')
} else {
this.activeIndex = index
}
},
async useUserIDGetDoctorID() {
try {
let res = await useUserIDGetDoctorID({
UserID: this.$store.state.user.userId,
})
if (res.IsSuccess) {
return res.Result.DoctorID
}
return false
} catch (err) {
return false
console.log(err)
}
}, },
getUserInfo() { getUserInfo() {
const loading = this.$loading({ const loading = this.$loading({
fullscreen: false, fullscreen: false,
lock: true, lock: true,
text: "Loading", text: 'Loading',
spinner: "el-icon-loading", spinner: 'el-icon-loading',
background: "rgba(0, 0, 0, 0.07)", background: 'rgba(0, 0, 0, 0.07)',
}); })
getUser(this.userId) getUser(this.userId)
.then(async (res) => { .then(async (res) => {
this.user = res.Result; this.user = res.Result
/* eslint-disable */ /* eslint-disable */
zzSessionStorage.setItem("realName", this.user.RealName); zzSessionStorage.setItem('realName', this.user.RealName)
await store.dispatch("user/updateInfo"); await store.dispatch('user/updateInfo')
loading.close(); loading.close()
}) })
.catch(() => { .catch(() => {
loading.close(); loading.close()
}); })
}, },
getUserTypeList() { getUserTypeList() {
getUserTypeList().then((res) => { getUserTypeList().then((res) => {
if (res.IsSuccess) { if (res.IsSuccess) {
this.userTypeOptions = res.Result; this.userTypeOptions = res.Result
} }
}); })
}, },
}, },
}; }
</script> </script>
<style lang="scss"> <style lang="scss">

View File

@ -371,6 +371,7 @@
<el-button <el-button
type="primary" type="primary"
round round
:disabled="!email"
@click="sendEmail" @click="sendEmail"
:loading="emailLoading" :loading="emailLoading"
style="margin-left: 10px" style="margin-left: 10px"
@ -381,7 +382,13 @@
</template> </template>
</base-model> </base-model>
<!--新增或修改简历--> <!--新增或修改简历-->
<el-dialog title="" :visible.sync="visible" fullscreen v-if="visible"> <el-dialog
title=""
:visible.sync="visible"
fullscreen
v-if="visible"
:before-close="beforeClose"
>
<reviewerAdd :isSystem="false" v-if="resumeType === 'add'" /> <reviewerAdd :isSystem="false" v-if="resumeType === 'add'" />
<reviewerEdit <reviewerEdit
:isSystem="false" :isSystem="false"
@ -400,6 +407,7 @@ import { getSelectionReviewerList, selectReviewers } from '@/api/trials'
import BaseModel from '@/components/BaseModel' import BaseModel from '@/components/BaseModel'
import reviewerAdd from '@/views/reviewers/new' import reviewerAdd from '@/views/reviewers/new'
import reviewerEdit from '@/views/reviewers/edit' import reviewerEdit from '@/views/reviewers/edit'
import { doctorSendEmail } from '@/api/reviewers'
const getListQueryDefault = () => { const getListQueryDefault = () => {
return { return {
TrialId: '', TrialId: '',
@ -467,6 +475,10 @@ export default {
this.$alert(this.$t('trials:researchRecord:message:copyFailed')) this.$alert(this.$t('trials:researchRecord:message:copyFailed'))
}) })
}, },
beforeClose() {
this.getList()
this.visible = false
},
// //
resumeCollection() { resumeCollection() {
this.shareLink = `${location.protocol}//${location.host}/ReviewersResearch?lang=${this.$store.getters.language}` this.shareLink = `${location.protocol}//${location.host}/ReviewersResearch?lang=${this.$store.getters.language}`
@ -474,8 +486,23 @@ export default {
this.share_model.visible = true this.share_model.visible = true
}, },
// //
sendEmail() { async sendEmail() {
this.$message.success('123') var pattern =
/^([A-Za-z0-9_\-\.\u4e00-\u9fa5])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,8})$/
if (!pattern.test(this.email))
return this.$message.warning(this.$t('rules:email'))
this.emailLoading = true
let res = await doctorSendEmail({
Email: this.email,
Url: `ReviewersResearch?lang=${this.$store.getters.language}`,
})
this.emailLoading = false
if (res.IsSuccess) {
this.$message.success(
this.$t('trials:researchStaff:message:sendEmalil')
)
this.share_model.visible = false
}
}, },
// //
openViewer(type, row) { openViewer(type, row) {

View File

@ -1,21 +1,33 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<resume-info v-if="isInit" /> <!-- <resume-info v-if="isInit" /> -->
<preview :isEN="isEN" :reviewerId.sync="reviewerId" />
</div> </div>
</template> </template>
<script> <script>
import ResumeInfo from '@/views/resumeInfo' import ResumeInfo from '@/views/resumeInfo'
import { changeURLStatic, getQueryString } from '@/utils/history.js' import { changeURLStatic, getQueryString } from '@/utils/history.js'
import preview from '@/views/reviewers/curriculumVitae/preview.vue'
import store from '@/store' import store from '@/store'
export default { export default {
components: { components: {
ResumeInfo ResumeInfo,
preview,
}, },
data() { data() {
return { return {
isInit: false isInit: false,
reviewerId: '',
} }
}, },
created() {
this.reviewerId = this.$route.query.doctorId
},
computed: {
isEN() {
return this.$i18n.locale !== 'zh'
},
},
mounted() { mounted() {
const token = getQueryString('token') const token = getQueryString('token')
if (token) { if (token) {
@ -23,13 +35,12 @@ export default {
changeURLStatic('token', '') changeURLStatic('token', '')
} }
this.isInit = true this.isInit = true
} },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .el-collapse-item__header{ /deep/ .el-collapse-item__header {
background-color: #e9eef1; background-color: #e9eef1;
padding: 0 10px; padding: 0 10px;
} }
</style> </style>

View File

@ -118,15 +118,7 @@ export default {
this.loading = false this.loading = false
}) })
break break
case 4: case 1:
searchData.ReadingExportType = 0
getCommonEvaluationList_Export(searchData)
.then((res) => {})
.catch(() => {
this.loading = false
})
break
case 5:
searchData.ReadingExportType = 1 searchData.ReadingExportType = 1
getCommonEvaluationList_Export(searchData) getCommonEvaluationList_Export(searchData)
.then((res) => {}) .then((res) => {})
@ -134,7 +126,7 @@ export default {
this.loading = false this.loading = false
}) })
break break
case 6: case 2:
searchData.ReadingExportType = 2 searchData.ReadingExportType = 2
getCommonEvaluationList_Export(searchData) getCommonEvaluationList_Export(searchData)
.then((res) => {}) .then((res) => {})
@ -142,6 +134,22 @@ export default {
this.loading = false this.loading = false
}) })
break break
case 3:
searchData.ReadingExportType = 3
getCommonEvaluationList_Export(searchData)
.then((res) => {})
.catch(() => {
this.loading = false
})
break
case 4:
searchData.ReadingExportType = 4
getCommonEvaluationList_Export(searchData)
.then((res) => {})
.catch(() => {
this.loading = false
})
break
case 7: case 7:
getCommonJudgeRatioList_Export(searchData) getCommonJudgeRatioList_Export(searchData)
.then((res) => {}) .then((res) => {})