【中心调研】中心调研表手机扫描二维码进入时,同pc一样也需要增加验证。上传文件功能也要能正常使用
continuous-integration/drone/push Build is passing Details

main
wangxiaoshuang 2026-07-07 17:35:33 +08:00
parent 69ba30e5a9
commit 7bc70bfd6c
9 changed files with 909 additions and 335 deletions

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="wscn-http404-container"> <div class="wscn-http404-container">
<div class="wscn-http404" style="display: flex;align-items: center"> <div class="wscn-http404" style="display: flex;align-items: center;flex-wrap: wrap;justify-content: center;">
<div class="pic-404"> <div class="pic-404">
<!-- <img class="pic-404__parent" src="@/assets/login-bg.png" alt="404"> --> <!-- <img class="pic-404__parent" src="@/assets/login-bg.png" alt="404"> -->
<svg-icon icon-class="login-bg" style="width: 100%; height: 100%" /> <svg-icon icon-class="login-bg" style="width: 100%; height: 100%" />
@ -55,18 +55,20 @@ export default {
position: absolute; position: absolute;
top: 40%; top: 40%;
left: 50%; left: 50%;
width: 100%;
} }
.wscn-http404 { .wscn-http404 {
position: relative; position: relative;
width: 1200px; width: 100%;
padding: 0 50px; padding: 0 50px;
overflow: hidden; overflow: hidden;
.pic-404 { .pic-404 {
position: relative; position: relative;
float: left; float: left;
width: 500px; width: 100%;
max-width: 500px;
height: 300px; height: 300px;
overflow: hidden; overflow: hidden;
margin-right: 10px; margin-right: 10px;
@ -211,6 +213,7 @@ export default {
animation-name: slideUp; animation-name: slideUp;
animation-duration: 0.5s; animation-duration: 0.5s;
animation-fill-mode: forwards; animation-fill-mode: forwards;
text-align: center;
} }
&__headline { &__headline {

View File

@ -25,19 +25,10 @@
<div class="login_content"> <div class="login_content">
<div class="form-label-width"> <div class="form-label-width">
<el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId"> <el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
<el-select <el-select v-model="form.TrialSiteId" filterable style="width:100%;"
v-model="form.TrialSiteId" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" @change="handleSiteChange">
filterable <el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteAliasName"
style="width:100%;" :value="item.TrialSiteId" />
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"
@change="handleSiteChange"
>
<el-option
v-for="(item,index) of siteOptions"
:key="index"
:label="item.TrialSiteAliasName"
:value="item.TrialSiteId"
/>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 中心编号 --> <!-- 中心编号 -->
@ -49,74 +40,149 @@
<el-input v-model="form.UserName" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" /> <el-input v-model="form.UserName" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
</el-form-item> </el-form-item>
<!-- 联系电话 --> <!-- 联系电话 -->
<el-form-item <el-form-item :label="$t('trials:researchForm:form:contactorPhone')" prop="Phone">
:label="$t('trials:researchForm:form:contactorPhone')"
prop="Phone"
>
<el-input v-model="form.Phone" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" /> <el-input v-model="form.Phone" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
</el-form-item> </el-form-item>
<!-- 联系邮箱 --> <!-- 联系邮箱 -->
<el-form-item :label="$t('trials:researchForm:form:contactorEmail')"> <el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="Email">
<el-input v-model="form.Email" disabled /> <el-input v-model="form.Email" disabled />
</el-form-item> </el-form-item>
<el-form-item :label="$t('trials:researchForm:form:CommonUploadRecordId')
" v-if="IsSupportUploadFile" class="file">
<el-input v-model="form.SiteSurveyFile.FileName" type="textarea" :autosize="{ minRows: 1, maxRows: 3 }"
style="margin-right: 5px;" disabled />
<div class="upload" v-if="!(!(state === 0 && userTypeEnumInt === 0) || isHistory)">
<input accept=".pdf,.docx,.doc" type="file" name="uploadFolder" class="select-file" title=""
@change="beginScanFiles($event)" />
<div class="btn-select">
{{ $t('dictionary:template:basicData:button:selectFile') }}
</div>
</div>
<!-- <el-button type="primary" @click="viewManualFile"
:disabled="!this.form.SiteSurveyFile || !this.form.SiteSurveyFile.Path">{{
$t('trials:researchForm:form:preview') }}</el-button> -->
<el-button type="primary" @click="downLoad"
:disabled="!this.form.SiteSurveyFile || !this.form.SiteSurveyFile.Path">{{
$t('trials:researchForm:form:download') }}</el-button>
</el-form-item>
<!-- 平均刻盘周期 --> <!-- 平均刻盘周期 -->
<el-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')" :label="$t('trials:researchForm:form:engravingCycle')"> <el-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')"
<el-input-number v-model="form.AverageEngravingCycle" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" controls-position="right" :min="0" style="width:100%;" /> :label="$t('trials:researchForm:form:engravingCycle')">
<el-input-number v-model="form.AverageEngravingCycle"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" controls-position="right" :min="0"
style="width:100%;" />
</el-form-item> </el-form-item>
</div> </div>
<!-- MRI-PDFF 是否为本中心该适应症的常规诊疗检查项目 -->
<el-form-item v-if="!notShowFieldList.includes('IsRoutineMRIPDEE')"
:label="$t('trials:researchForm:form:IsRoutineMRIPDEE')" prop="IsRoutineMRIPDEE">
<el-radio-group v-model="form.IsRoutineMRIPDEE"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)">
<el-radio v-for="item of $d.YesOrNo" :key="`IsRoutineMRIPDEE${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<!-- MRI-PDFF 检查的检测周期含单次检查时长预约等待时长等 -->
<el-form-item
v-if="!notShowFieldList.includes('MRIPDFFScanTime') || !notShowFieldList.includes('MRIPDFFLeadTime') || !notShowFieldList.includes('MRIPDFFOther')"
:label="$t('trials:researchForm:form:IsMRIPDFF')">
</el-form-item>
<!-- 单次检查时长分钟 -->
<el-form-item v-if="!notShowFieldList.includes('MRIPDFFScanTime')"
:label="$t('trials:researchForm:form:MRIPDFFScanTime')">
<el-input-number v-model="form.MRIPDFFScanTime"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)" controls-position="right" :min="0" />
</el-form-item>
<!-- 平均预约等待时长 -->
<el-form-item v-if="!notShowFieldList.includes('MRIPDFFLeadTime')"
:label="$t('trials:researchForm:form:MRIPDFFLeadTime')">
<el-input-number v-model="form.MRIPDFFLeadTime"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)" controls-position="right" :min="0" />
</el-form-item>
<!-- 特殊情况备注-->
<el-form-item v-if="!notShowFieldList.includes('MRIPDFFOther')"
:label="$t('trials:researchForm:form:MRIPDFFOther')">
<el-input v-model="form.MRIPDFFOther" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)" />
</el-form-item>
<!-- 如已选择研究者评估项目是否会授权影像科老师参与本试验如不单独授权是否可在试验中保持 1-2 名固定技师操作-->
<el-form-item
v-if="!notShowFieldList.includes('IsAuthorizeRadiologistsParticipate') || !notShowFieldList.includes('AssignFixedTechnologists')"
:label="$t('trials:researchForm:form:IsAuthorize')" prop="IsAuthorize">
<el-radio-group v-model="form.IsAuthorize" :disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)"
@input="handleIsAuthorizeInput">
<el-radio label="IsAuthorizeRadiologistsParticipate">{{
$t('trials:researchForm:form:IsAuthorizeRadiologistsParticipate') }}</el-radio>
<el-radio label="AssignFixedTechnologists">{{
$t('trials:researchForm:form:AssignFixedTechnologists') }}</el-radio>
</el-radio-group>
</el-form-item>
<!-- 请确认参与本项目影像采集的影像技师具备对应的资质技师证对应设备的大型设备上岗证 --> <!-- 请确认参与本项目影像采集的影像技师具备对应的资质技师证对应设备的大型设备上岗证 -->
<el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')" :label="$t('trials:researchForm:form:isQualified')"> <el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')"
<el-radio-group v-model="form.IsConfirmImagingTechnologist" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"> :label="$t('trials:researchForm:form:isQualified')" prop="IsConfirmImagingTechnologist">
<el-radio <el-radio-group v-model="form.IsConfirmImagingTechnologist"
v-for="item of $d.YesOrNo" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
:key="`IsConfirmImagingTechnologist${item.value}`" <el-radio v-for="item of $d.YesOrNo" :key="`IsConfirmImagingTechnologist${item.value}`"
:label="item.value" :label="item.value">{{ item.label }}</el-radio>
>{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 原因 --> <!-- 原因 -->
<el-form-item <el-form-item
v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false" v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false"
:label="$t('trials:researchForm:form:notQualifiedReason')" :label="$t('trials:researchForm:form:notQualifiedReason')" prop="NotConfirmReson">
> <el-input v-model="form.NotConfirmReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
<el-input :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
v-model="form.NotConfirmReson"
type="textarea"
:autosize="{ minRows: 2, maxRows: 4}"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"
/>
</el-form-item> </el-form-item>
<!-- 研究单位疗效评估人员类型 --> <!-- 研究单位疗效评估人员类型 -->
<el-form-item v-if="!notShowFieldList.includes('EfficacyEvaluatorType')" :label="$t('trials:researchForm:form:staffType')"> <el-form-item v-if="!notShowFieldList.includes('EfficacyEvaluatorType')"
<el-radio-group v-model="form.EfficacyEvaluatorType" :disabled="!(state === 0 && userTypeEnumInt === 0)|| isHistory"> :label="$t('trials:researchForm:form:staffType')">
<el-radio v-for="item of $d.EfficacyEvaluatorType" :key="`EfficacyEvaluatorType${item.value}`" :label="item.value">{{ item.label }}</el-radio> <el-radio-group v-model="form.EfficacyEvaluatorType"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
<el-radio v-for="item of $d.EfficacyEvaluatorType" :key="`EfficacyEvaluatorType${item.value}`"
:label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<!-- 是否严格按照研究单位影像手册参数完成图像采集 --> <!-- 是否严格按照研究单位影像手册参数完成图像采集 -->
<el-form-item v-if="!notShowFieldList.includes('IsFollowStudyParameters')"> <el-form-item v-if="!notShowFieldList.includes('IsFollowStudyParameters')" prop="IsFollowStudyParameters">
<span slot="label" v-html="$t('trials:researchForm:form:isFollowStudyParam')" /> <span slot="label" v-html="$t('trials:researchForm:form:isFollowStudyParam')" />
<el-radio-group v-model="form.IsFollowStudyParameters" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory"> <el-radio-group v-model="form.IsFollowStudyParameters"
<el-radio v-for="item of $d.YesOrNo" :key="`IsFollowStudyParameters${item.value}`" :label="item.value">{{ item.label }}</el-radio> :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
<el-radio v-for="item of $d.YesOrNo" :key="`IsFollowStudyParameters${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group> </el-radio-group>
<el-button type="primary" size="small" style="margin-left: 5px;" @click="viewManual">
{{ $t('trials:researchForm:button:viewManual') }}
</el-button>
</el-form-item> </el-form-item>
<!-- 不能严格按照研究单位影像手册参数采集图像原因 --> <!-- 不能严格按照研究单位影像手册参数采集图像原因 -->
<el-form-item <el-form-item v-if="!notShowFieldList.includes('NotFollowReson') && !form.IsFollowStudyParameters"
v-if="!notShowFieldList.includes('NotFollowReson') && !form.IsFollowStudyParameters" prop="NotFollowReson">
>
<span slot="label" v-html="$t('trials:researchForm:form:notFollowStudyParam')" /> <span slot="label" v-html="$t('trials:researchForm:form:notFollowStudyParam')" />
<el-input <el-input v-model="form.NotFollowReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
v-model="form.NotFollowReson" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
type="textarea" </el-form-item>
:autosize="{ minRows: 2, maxRows: 4}" <!-- 是否严格按照影像手册参数完成刻盘 -->
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" <el-form-item v-if="!notShowFieldList.includes('ISStrictManualBurnFlag')" prop="ISStrictManualBurnFlag">
/> <span slot="label" v-html="$t('trials:researchForm:form:ISStrictManualBurnFlag')" />
<el-radio-group v-model="form.ISStrictManualBurnFlag"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)" style="margin-right: 10px;">
<el-radio v-for="item of $d.YesOrNo" :key="`ISStrictManualBurnFlag${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<!-- 不能严格按照影像手册参数完成刻盘原因 -->
<el-form-item v-if="!notShowFieldList.includes('NotStrictManualBurnFlagReason') && !form.ISStrictManualBurnFlag"
prop="NotStrictManualBurnFlagReason">
<span slot="label" v-html="$t('trials:researchForm:form:NotStrictManualBurnFlagReason')" />
<el-input v-model="form.NotStrictManualBurnFlagReason" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory)" />
</el-form-item> </el-form-item>
</div> </div>
</el-form> </el-form>
</div> </div>
</template> </template>
<script> <script>
import { getTrialSiteSelect } from '@/api/trials' import { getTrialSiteSelect, getTrialDocumentList, addOrUpdateCommonUploadRecord } from '@/api/trials'
import { addOrUpdateTrialSiteSurvey } from '@/api/research' import { addOrUpdateTrialSiteSurvey } from '@/api/research'
export default { export default {
name: 'ResearchBasicInfo', name: 'ResearchBasicInfo',
@ -124,7 +190,15 @@ export default {
isHistory: { isHistory: {
type: Boolean, type: Boolean,
default: false default: false
} },
IsOnlyUploadFile: {
type: Boolean,
default: false
},
IsSupportUploadFile: {
type: Boolean,
default: false
},
}, },
data() { data() {
var checkPhone = (rule, value, callback) => { var checkPhone = (rule, value, callback) => {
@ -156,16 +230,51 @@ export default {
Phone: '', // Phone: '', //
Email: '', // Email: '', //
AverageEngravingCycle: '', AverageEngravingCycle: '',
IsRoutineMRIPDEE: '',
MRIPDFFScanTime: '',
MRIPDFFLeadTime: '',
MRIPDFFOther: '',
IsAuthorize: '',
IsAuthorizeRadiologistsParticipate: '',
AssignFixedTechnologists: '',
ISStrictManualBurnFlag: '',
NotStrictManualBurnFlagReason: '',
IsConfirmImagingTechnologist: '', IsConfirmImagingTechnologist: '',
NotConfirmReson: '', NotConfirmReson: '',
EfficacyEvaluatorType: '', EfficacyEvaluatorType: '',
IsFollowStudyParameters: '', IsFollowStudyParameters: '',
NotFollowReson: '' NotFollowReson: '',
CommonUploadRecordId: null,
SiteSurveyFile: []
}, },
rules: { rules: {
TrialSiteId: [ TrialSiteId: [
{ required: true, message: this.$t('trials:researchForm:formRule:specify'), trigger: 'blur' } { required: true, message: this.$t('trials:researchForm:formRule:specify'), trigger: 'blur' }
], ],
IsRoutineMRIPDEE: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
],
IsAuthorize: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
],
ISStrictManualBurnFlag: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
],
IsFollowStudyParameters: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
],
IsConfirmImagingTechnologist: [
{ required: true, message: this.$t('common:ruleMessage:select'), trigger: 'blur' }
],
NotConfirmReson: [
{ required: true, message: this.$t('trials:researchForm:formRule:specify'), trigger: 'blur' }
],
NotFollowReson: [
{ required: true, message: this.$t('trials:researchForm:formRule:specify'), trigger: 'blur' }
],
NotStrictManualBurnFlagReason: [
{ required: true, message: this.$t('trials:researchForm:formRule:specify'), trigger: 'blur' }
],
UserName: [ UserName: [
{ required: true, validator: (rule, value, callback) => { !value ? callback(new Error(this.$t('trials:researchForm:formRule:specify'))) : callback() }, trigger: 'blur' }, { required: true, validator: (rule, value, callback) => { !value ? callback(new Error(this.$t('trials:researchForm:formRule:specify'))) : callback() }, trigger: 'blur' },
{ min: 0, max: 50, message: this.$t('trials:researchForm:formRule:maxLength'), trigger: ['blur', 'change'] } { min: 0, max: 50, message: this.$t('trials:researchForm:formRule:maxLength'), trigger: ['blur', 'change'] }
@ -186,14 +295,173 @@ export default {
state: null, state: null,
userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1, userTypeEnumInt: zzSessionStorage.getItem('userTypeEnumInt') * 1,
isShow: false, isShow: false,
notShowFieldList: [] notShowFieldList: [],
perview_visible: false,
ExternalList: []
} }
}, },
methods: { methods: {
async beginScanFiles(e) {
try {
let file = e.target.files[0]
let name = file.name
if (!this.checkFileSuffix(name)) return this.$message.warning(this.$t("trials:researchRecord:ImageManual:message:checkFileSuffix"))
this.loading = true
file = await this.fileToBlob(file)
let scope = this
var index = name.lastIndexOf('.')
var type = name.substring(index + 1, name.length)
let res = await this.OSSclient.put(
`/${this.$route.query.trialId}/InspectionUpload/SiteSurvey/${this.form.TrialSiteId}/${scope.getGuid(Date.now() + '_' + name.split('.')[0])}.${type}`,
file
)
let data = {
Path: this.$getObjectName(res.url),
FileName: name,
FileSize: file.size,
FileType: type
}
res = await addOrUpdateCommonUploadRecord(data)
this.loading = false
if (res.IsSuccess) {
this.form.CommonUploadRecordId = res.Result
data.Id = res.Result
this.form.SiteSurveyFile = data
}
} catch (err) {
console.log(err)
this.loading = false;
}
},
checkFileSuffix(fileName) {
var index = fileName.lastIndexOf('.')
var suffix = fileName.substring(index + 1, fileName.length)
if ('.pdf'.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1 && '.docx'.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1 && '.doc'.toLocaleLowerCase().search(suffix.toLocaleLowerCase()) === -1) {
return false
} else {
return true
}
},
handleIsAuthorizeInput(label) {
this.form.IsAuthorizeRadiologistsParticipate = false
this.form.AssignFixedTechnologists = false
this.form[label] = true
},
async viewManualFile() {
if (!this.form.SiteSurveyFile || !this.form.SiteSurveyFile.Path) return this.$message.warning(this.$t("trials:researchForm:message:notFile"))
this.$preview({
path: this.form.SiteSurveyFile.Path,
type: this.form.SiteSurveyFile.FileType,
title: this.form.SiteSurveyFile.Path.FileName,
})
},
async downLoad() {
if (!this.form.SiteSurveyFile || !this.form.SiteSurveyFile.Path) return this.$message.warning(this.$t("trials:researchForm:message:notFile"))
let link = document.createElement('a')
link.href = this.OSSclientConfig.basePath + this.form.SiteSurveyFile.Path;
link.target = '_blank'
link.download = this.form.SiteSurveyFile.FileName
link.style.display = 'none'
document.body.append(link)
link.click()
document.body.removeChild(link)
link = null
},
async viewManual() {
try {
let data = {
PageIndex: 1,
PageSize: 20,
TrialId: this.$route.query.trialId,
IsPublish: true,
FileTypeCode: 4,
IsDeleted: false
}
let res = await getTrialDocumentList(data)
if (res.IsSuccess) {
const { CurrentPageData } = res.Result
if (CurrentPageData.length <= 0) return this.$message.warning(this.$t("trials:researchRecord:ImageManual:message:noImageManual"))
this.ExternalList = []
CurrentPageData.forEach(item => {
let obj = {
FilePath: item.Path,
FileFormat: 'pdf',
Name: item.Name
}
this.ExternalList.push(obj)
});
// this.perview_visible = true
this.ExternalList.forEach(item => {
let link = document.createElement('a')
link.href = this.OSSclientConfig.basePath + item.FilePath;
link.target = '_blank'
link.download = item.Name
link.style.display = 'none'
document.body.append(link)
link.click()
document.body.removeChild(link)
link = null
})
}
} catch (err) {
console.log(err)
}
},
// //
handleSave(isAutoCommit) { handleSave(isAutoCommit, isCheck = false) {
return new Promise(async(resolve) => { return new Promise(async (resolve) => {
isCheck = false
try { try {
if (this.IsOnlyUploadFile && !isCheck) {
if (!this.form.UserName) {
this.$message.warning(this.$t("trials:researchForm:message:notUserName"))
return resolve(false)
}
if (!this.form.Phone) {
this.$message.warning(this.$t("trials:researchForm:message:notPhone"))
return resolve(false)
}
if (!this.form.CommonUploadRecordId) {
this.$message.warning(this.$t("trials:researchForm:message:notCommonUploadRecordId"))
return resolve(false)
}
this.btnLoading = true
const param = {
id: this.form.Id,
trialId: this.$route.query.trialId,
trialSiteId: this.form.TrialSiteId,
userName: this.form.UserName,
phone: this.form.Phone,
email: this.form.Email,
averageEngravingCycle: this.form.AverageEngravingCycle,
IsRoutineMRIPDEE: this.form.IsRoutineMRIPDEE,
MRIPDFFScanTime: this.form.MRIPDFFScanTime,
MRIPDFFLeadTime: this.form.MRIPDFFLeadTime,
MRIPDFFOther: this.form.MRIPDFFOther,
IsAuthorizeRadiologistsParticipate: this.form.IsAuthorizeRadiologistsParticipate,
AssignFixedTechnologists: this.form.AssignFixedTechnologists,
ISStrictManualBurnFlag: this.form.ISStrictManualBurnFlag,
NotStrictManualBurnFlagReason: this.form.NotStrictManualBurnFlagReason,
isConfirmImagingTechnologist: this.form.IsConfirmImagingTechnologist,
notConfirmReson: this.form.NotConfirmReson,
efficacyEvaluatorType: this.form.EfficacyEvaluatorType,
isFollowStudyParameters: this.form.IsFollowStudyParameters,
notFollowReson: this.form.NotFollowReson,
CommonUploadRecordId: this.form.CommonUploadRecordId
}
addOrUpdateTrialSiteSurvey(param).then(res => {
this.btnLoading = false
if (res.IsSuccess && !isAutoCommit) {
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
resolve(true)
}).catch(() => {
this.btnLoading = false
reject(false)
})
return resolve(true)
}
const valid = await this.$refs['researchBSForm'].validate() const valid = await this.$refs['researchBSForm'].validate()
if (valid) { if (valid) {
this.loading = true this.loading = true
@ -205,11 +473,20 @@ export default {
phone: this.form.Phone, phone: this.form.Phone,
email: this.form.Email, email: this.form.Email,
averageEngravingCycle: this.form.AverageEngravingCycle, averageEngravingCycle: this.form.AverageEngravingCycle,
IsRoutineMRIPDEE: this.form.IsRoutineMRIPDEE,
MRIPDFFScanTime: this.form.MRIPDFFScanTime,
MRIPDFFLeadTime: this.form.MRIPDFFLeadTime,
MRIPDFFOther: this.form.MRIPDFFOther,
IsAuthorizeRadiologistsParticipate: this.form.IsAuthorizeRadiologistsParticipate,
AssignFixedTechnologists: this.form.AssignFixedTechnologists,
ISStrictManualBurnFlag: this.form.ISStrictManualBurnFlag,
NotStrictManualBurnFlagReason: this.form.NotStrictManualBurnFlagReason,
isConfirmImagingTechnologist: this.form.IsConfirmImagingTechnologist, isConfirmImagingTechnologist: this.form.IsConfirmImagingTechnologist,
notConfirmReson: this.form.NotConfirmReson, notConfirmReson: this.form.NotConfirmReson,
efficacyEvaluatorType: this.form.EfficacyEvaluatorType, efficacyEvaluatorType: this.form.EfficacyEvaluatorType,
isFollowStudyParameters: this.form.IsFollowStudyParameters, isFollowStudyParameters: this.form.IsFollowStudyParameters,
notFollowReson: this.form.NotFollowReson notFollowReson: this.form.NotFollowReson,
CommonUploadRecordId: this.form.CommonUploadRecordId
} }
const res = await addOrUpdateTrialSiteSurvey(param) const res = await addOrUpdateTrialSiteSurvey(param)
this.loading = false this.loading = false
@ -232,7 +509,7 @@ export default {
// //
async initForm(trialInfo, trialSiteSurvey, notShowFieldList) { async initForm(trialInfo, trialSiteSurvey, notShowFieldList) {
// site // site
const { Result } = await getTrialSiteSelect(this.$route.query.trialId) const { Result } = await getTrialSiteSelect(this.$route.query.trialId, { IgnoreDisable: true })
this.siteOptions = Result this.siteOptions = Result
this.form.Id = trialSiteSurvey.Id this.form.Id = trialSiteSurvey.Id
this.form.Sponsor = trialInfo.Sponsor // this.form.Sponsor = trialInfo.Sponsor //
@ -246,7 +523,20 @@ export default {
this.form.UserName = trialSiteSurvey.UserName // this.form.UserName = trialSiteSurvey.UserName //
this.form.Phone = trialSiteSurvey.Phone // this.form.Phone = trialSiteSurvey.Phone //
this.form.Email = trialSiteSurvey.Email // this.form.Email = trialSiteSurvey.Email //
this.form.CommonUploadRecordId = trialSiteSurvey.CommonUploadRecordId
this.form.SiteSurveyFile = trialSiteSurvey.SiteSurveyFile || {}
this.form.fileStr = this.form.SiteSurveyFile.FileName
this.form.AverageEngravingCycle = trialSiteSurvey.AverageEngravingCycle this.form.AverageEngravingCycle = trialSiteSurvey.AverageEngravingCycle
this.form.IsRoutineMRIPDEE = trialSiteSurvey.IsRoutineMRIPDEE
this.form.MRIPDFFScanTime = trialSiteSurvey.MRIPDFFScanTime
this.form.MRIPDFFLeadTime = trialSiteSurvey.MRIPDFFLeadTime
this.form.MRIPDFFOther = trialSiteSurvey.MRIPDFFOther
this.form.IsAuthorizeRadiologistsParticipate = trialSiteSurvey.IsAuthorizeRadiologistsParticipate
this.form.AssignFixedTechnologists = trialSiteSurvey.AssignFixedTechnologists
if (this.form.IsAuthorizeRadiologistsParticipate) this.form.IsAuthorize = 'IsAuthorizeRadiologistsParticipate'
if (this.form.AssignFixedTechnologists) this.form.IsAuthorize = 'AssignFixedTechnologists'
this.form.ISStrictManualBurnFlag = trialSiteSurvey.ISStrictManualBurnFlag
this.form.NotStrictManualBurnFlagReason = trialSiteSurvey.NotStrictManualBurnFlagReason
this.form.IsConfirmImagingTechnologist = trialSiteSurvey.IsConfirmImagingTechnologist this.form.IsConfirmImagingTechnologist = trialSiteSurvey.IsConfirmImagingTechnologist
this.form.NotConfirmReson = trialSiteSurvey.NotConfirmReson this.form.NotConfirmReson = trialSiteSurvey.NotConfirmReson
this.form.EfficacyEvaluatorType = trialSiteSurvey.EfficacyEvaluatorType this.form.EfficacyEvaluatorType = trialSiteSurvey.EfficacyEvaluatorType
@ -267,39 +557,46 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.research_bs_content{ .research_bs_content {
.basic_content{ .basic_content {
padding: 0 20px; padding: 0 20px;
background: #fff; background: #fff;
} }
.login_content{
.login_content {
padding: 5px 20px; padding: 5px 20px;
margin-top: 5px; margin-top: 5px;
background: #fff; background: #fff;
::v-deep .el-form-item { ::v-deep .el-form-item {
padding-bottom: 20px; padding-bottom: 20px;
} }
} }
.code_content{
display:flex; .code_content {
display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
.el-input{
.el-input {
margin-right: 10px; margin-right: 10px;
} }
} }
.form-label-width{
::v-deep .el-form-item__label{ .form-label-width {
::v-deep .el-form-item__label {
width: 140px; width: 140px;
} }
::v-deep .el-form-item__content{
::v-deep .el-form-item__content {
margin-left: 140px; margin-left: 140px;
} }
} }
.submit_content{
.submit_content {
margin-top: 20px; margin-top: 20px;
text-align: center; text-align: center;
} }
@ -308,10 +605,61 @@ export default {
margin-bottom: 0px; margin-bottom: 0px;
padding-top: 5px; padding-top: 5px;
border-bottom: 1px solid #f5f7fa; border-bottom: 1px solid #f5f7fa;
.el-form-item__content{
.el-form-item__content {
color: #82848a; color: #82848a;
} }
} }
} }
.upload {
display: inline-block;
height: 36px;
width: 90px;
padding: 0 10px;
line-height: 23px;
position: relative;
text-decoration: none;
border-radius: 3px;
overflow: hidden;
text-align: center;
background: #428bca;
border-color: #428bca;
color: #fff;
margin-right: 5px;
.select-file {
height: 36px;
width: 90px;
position: absolute;
overflow: hidden;
left: 0;
top: 0;
opacity: 0;
font-size: 0;
}
.btn-select {
//
// width: 70px;
height: 36px;
line-height: 36px;
text-align: center;
cursor: pointer;
border-radius: 24px;
overflow: hidden;
position: absolute;
top: 0;
left: 10px;
pointer-events: none; //pointer-events:none穿
}
}
.file {
::v-deep .el-form-item__content {
display: flex;
align-items: center;
}
}
</style> </style>

View File

@ -1,59 +1,107 @@
<template> <template>
<div <div v-loading="loading" class="equipment_form_content">
v-loading="loading" <el-form ref="equipmentForm" :model="form" :rules="rules" label-position="left">
class="equipment_form_content"
>
<el-form
ref="equipmentForm"
:model="form"
:rules="rules"
label-position="left"
>
<!-- 扫描设备 --> <!-- 扫描设备 -->
<el-form-item :label="$t('trials:equiptResearch:form:equipment')" prop="EquipmentTypeId"> <el-form-item :label="$t('trials:equiptResearch:form:equipment')" prop="EquipmentTypeEnum"
<el-select v-if="EquipmentControlFieldList.includes('EquipmentTypeEnum')">
v-model="form.EquipmentTypeId" <div style="display: flex;align-items: center;">
style="width:100%" <el-select v-model="form.EquipmentTypeEnum" style="width:100%" @change="form.OtherEquipmentType = null">
> <el-option v-for="item of $d.SiteSurvey_ScanEquipmentType" :key="item.id" :label="item.label"
<el-option :value="item.value" />
v-for="item of $d.SiteSurvey_ScanEquipmentType" </el-select>
:key="item.id" <el-input placeholder="" v-model="form.OtherEquipmentType" style="margin-left: 10px;"
:label="item.label" v-if="form.EquipmentTypeEnum == '-1'" clearable>
:value="item.id" </el-input>
/> </div>
</el-select>
</el-form-item> </el-form-item>
<!-- 扫描参数 --> <!-- 扫描参数 -->
<el-form-item v-if="isShowParameters" :label="$t('trials:equiptResearch:form:param')"> <el-form-item :label="$t('trials:equiptResearch:form:param')"
v-if="EquipmentControlFieldList.includes('Parameters')" prop="Parameters">
<el-input v-model="form.Parameters" /> <el-input v-model="form.Parameters" />
</el-form-item> </el-form-item>
<!-- 扫描仪器制造商名称 --> <!-- 扫描仪器制造商名称 -->
<el-form-item :label="$t('trials:equiptResearch:form:manufacturer')"> <el-form-item :label="$t('trials:equiptResearch:form:manufacturer')"
<el-input v-model="form.ManufacturerName" /> v-if="EquipmentControlFieldList.includes('ManufacturerType')" prop="ManufacturerType">
<div style="display: flex;align-items: center;">
<el-select v-model="form.ManufacturerType" style="width:100%" @change="form.ManufacturerName = null">
<el-option v-for="item of $d.ManufacturerType" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
<el-input placeholder="" v-model="form.ManufacturerName" style="margin-left: 10px;"
v-if="form.ManufacturerType == '-1'" clearable>
</el-input>
</div>
</el-form-item> </el-form-item>
<!-- 扫描仪型号 --> <!-- 扫描仪型号 -->
<el-form-item :label="$t('trials:equiptResearch:form:model')"> <el-form-item :label="$t('trials:equiptResearch:form:model')"
v-if="EquipmentControlFieldList.includes('ScannerType')" prop="ScannerType">
<el-input v-model="form.ScannerType" /> <el-input v-model="form.ScannerType" />
</el-form-item> </el-form-item>
<!-- 磁场强度 -->
<el-form-item :label="$t('trials:equiptResearch:form:MagneticFieldStrengthType')"
v-if="EquipmentControlFieldList.includes('MagneticFieldStrengthType')" prop="MagneticFieldStrengthType">
<el-select v-model="form.MagneticFieldStrengthType" style="width:100%">
<el-option v-for="item of $d.MagneticFieldStrengthType" :key="item.id" :label="item.label"
:value="item.value" />
</el-select>
</el-form-item>
<!-- 体部线圈通道数 -->
<el-form-item :label="$t('trials:equiptResearch:form:BodyCoilChannelCount')"
v-if="EquipmentControlFieldList.includes('BodyCoilChannelCount')" prop="BodyCoilChannelCount">
<el-select v-model="form.BodyCoilChannelCount" style="width:100%">
<el-option v-for="item of $d.BodyCoilChannelCount" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- 是否具备专用的PDFF脂肪定量序列CSE-MRI序列 -->
<el-form-item :label="$t('trials:equiptResearch:form:HasDedicatedPdfFatQuantificationSequence')"
v-if="EquipmentControlFieldList.includes('HasDedicatedPdfFatQuantificationSequence')"
prop="HasDedicatedPdfFatQuantificationSequence">
<el-select v-model="form.HasDedicatedPdfFatQuantificationSequence" style="width:100%"
@change="form.PdfFatQuantificationSequenceType = null, form.OtherSequenceSpecification = null">
<el-option v-for="item of $d.YesOrNo" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- PDFF脂肪定量序列 -->
<el-form-item :label="$t('trials:equiptResearch:form:PdfFatQuantificationSequenceType')"
prop="PdfFatQuantificationSequenceType"
v-if="form.HasDedicatedPdfFatQuantificationSequence && EquipmentControlFieldList.includes('PdfFatQuantificationSequenceType')">
<div style="display: flex;align-items: center;">
<el-select v-model="form.PdfFatQuantificationSequenceType" style="width:100%"
@change="form.OtherSequenceSpecification = null">
<el-option v-for="item of $d.PdfFatQuantificationSequenceType" :key="item.id" :label="item.label"
:value="item.value" />
</el-select>
<el-input placeholder="" v-model="form.OtherSequenceSpecification" style="margin-left: 10px;"
v-if="form.PdfFatQuantificationSequenceType == '-1'" clearable>
</el-input>
</div>
</el-form-item>
<!-- 是否包含 T2/R2 校正用于铁沉积校正 -->
<el-form-item :label="$t('trials:equiptResearch:form:HasT2R2Correction')" prop="HasT2R2Correction"
v-if="EquipmentControlFieldList.includes('HasT2R2Correction')">
<el-select v-model="form.HasT2R2Correction" style="width:100%">
<el-option v-for="item of $d.YesOrNo" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- 是否可完整导出 PDFF 参数图及全部原始 DICOM 数据 -->
<el-form-item :label="$t('trials:equiptResearch:form:CanFullyExportPdfParameterMapsAndRawDicom')"
prop="CanFullyExportPdfParameterMapsAndRawDicom"
v-if="EquipmentControlFieldList.includes('CanFullyExportPdfParameterMapsAndRawDicom')">
<el-select v-model="form.CanFullyExportPdfParameterMapsAndRawDicom" style="width:100%">
<el-option v-for="item of $d.YesOrNo" :key="item.id" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<!-- 备注 --> <!-- 备注 -->
<el-form-item :label="$t('trials:equiptResearch:form:remark')"> <el-form-item :label="$t('trials:equiptResearch:form:remark')" prop="Note"
v-if="EquipmentControlFieldList.includes('Note')">
<el-input v-model="form.Note" /> <el-input v-model="form.Note" />
</el-form-item> </el-form-item>
<div style="text-align: center;padding:20px 0px;"> <div style="text-align: center;padding:20px 0px;">
<!-- 取消 --> <!-- 取消 -->
<el-button <el-button size="large" type="primary" @click="handleCancel">
size="large"
type="primary"
@click="handleCancel"
>
{{ $t("common:button:cancel") }} {{ $t("common:button:cancel") }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button size="large" type="primary" @click="handleSave">
size="large"
type="primary"
@click="handleSave"
>
{{ $t("common:button:save") }} {{ $t("common:button:save") }}
</el-button> </el-button>
</div> </div>
@ -76,29 +124,96 @@ export default {
type: String, type: String,
default: '' default: ''
}, },
isShowParameters: { EquipmentControlFieldList: {
type: Boolean, type: Array,
default: false default: () => {
return []
}
} }
}, },
data() { data() {
return { return {
form: { form: {
Id: '', Id: '',
EquipmentTypeId: '', EquipmentTypeEnum: null,
Parameters: '', OtherEquipmentType: null,
ManufacturerName: '', Parameters: null,
ScannerType: '', Note: null,
Note: '', ManufacturerType: null,
ManufacturerName: null,
ScannerType: null,
MagneticFieldStrengthType: null,
BodyCoilChannelCount: null,
HasDedicatedPdfFatQuantificationSequence: null,
PdfFatQuantificationSequenceType: null,
OtherSequenceSpecification: null,
HasT2R2Correction: null,
CanFullyExportPdfParameterMapsAndRawDicom: null,
TrialSiteSurveyId: '' TrialSiteSurveyId: ''
}, },
rules: { rules: {
EquipmentTypeId: [ EquipmentTypeEnum: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] },
{
validator: (rule, value, callback) => {
if (this.form.EquipmentTypeEnum === -1 && !this.form.OtherEquipmentType) {
callback(this.$t('common:ruleMessage:specify'));
} else {
callback()
}
}, message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']
},
],
Parameters: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change'] }
],
// Note: [
// { required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change'] }
// ],
ManufacturerType: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] },
{
validator: (rule, value, callback) => {
if (this.form.ManufacturerType === -1 && !this.form.ManufacturerName) {
callback(this.$t('common:ruleMessage:specify'));
} else {
callback()
}
}, message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']
},
],
ScannerType: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change'] }
],
MagneticFieldStrengthType: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] } { required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] }
] ],
BodyCoilChannelCount: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] }
],
HasDedicatedPdfFatQuantificationSequence: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] }
],
PdfFatQuantificationSequenceType: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] },
{
validator: (rule, value, callback) => {
if (this.form.PdfFatQuantificationSequenceType === -1 && !this.form.OtherSequenceSpecification) {
callback(this.$t('common:ruleMessage:specify'));
} else {
callback()
}
}, message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']
},
],
HasT2R2Correction: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] }
],
CanFullyExportPdfParameterMapsAndRawDicom: [
{ required: true, message: this.$t('trials:researchForm:formRule:select'), trigger: ['blur', 'change'] }
],
}, },
loading: false, loading: false,
dictionaryList: {}
} }
}, },
mounted() { mounted() {
@ -154,13 +269,15 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.equipment_form_content{ .equipment_form_content {
padding: 0 10px; padding: 0 10px;
::v-deep .el-form-item { ::v-deep .el-form-item {
margin-bottom: 0px; margin-bottom: 0px;
padding: 5px 0 20px 0; padding: 5px 0 20px 0;
border-bottom: 1px solid #f5f7fa; border-bottom: 1px solid #f5f7fa;
.el-form-item__content{
.el-form-item__content {
color: #82848a; color: #82848a;
} }
} }

View File

@ -13,18 +13,22 @@
<i class="el-icon-receiving" /> <i class="el-icon-receiving" />
</div> </div>
<div class="p_info"> <div class="p_info">
<div <div class="p_info_basic" :style="{
class="p_info_basic" maxWidth: w + 'px', 'white-space': 'nowrap',
:style="{maxWidth:w+'px','white-space': 'nowrap', overflow: 'hidden',
overflow: 'hidden', 'text-overflow': 'ellipsis'
'text-overflow': 'ellipsis'}" }">
> <div class="p_text" v-if="EquipmentControlFieldList.includes('EquipmentTypeEnum')">
<div class="p_text">{{ item.EquipmentType }}</div> {{ item.OtherEquipmentType ? item.OtherEquipmentType :
<div v-if="isShowParameters" class="p_text" style="margin-left:10px">{{ item.Parameters }}</div> $fd('SiteSurvey_ScanEquipmentType', item.EquipmentTypeEnum) }}</div>
<div class="p_text" style="margin-left:10px">{{ item.ManufacturerName }}</div> <div v-if="EquipmentControlFieldList.includes('Parameters')" class="p_text" style="margin-left:10px">{{
item.Parameters }}</div>
<div class="p_text" style="margin-left:10px" v-if="EquipmentControlFieldList.includes('ManufacturerType')">{{
item.ManufacturerName ? item.ManufacturerName : $fd('ManufacturerType',
item.ManufacturerType) }}</div>
</div> </div>
<div class="p_text">{{ item.ScannerType }}</div> <div class="p_text" v-if="EquipmentControlFieldList.includes('ScannerType')">{{ item.ScannerType }}</div>
<div class="p_text">{{ item.Note }}</div> <div class="p_text" v-if="EquipmentControlFieldList.includes('Note')">{{ item.Note }}</div>
</div> </div>
<div v-if="state === 0 && userTypeEnumInt === 0 && !isHistory" class="p_func"> <div v-if="state === 0 && userTypeEnumInt === 0 && !isHistory" class="p_func">
<el-button type="text" @click="handleEdit(item)"> <el-button type="text" @click="handleEdit(item)">
@ -36,19 +40,9 @@
</div> </div>
</div> </div>
<!-- 添加/编辑设备信息 --> <!-- 添加/编辑设备信息 -->
<el-drawer <el-drawer :title="title" :visible.sync="formVisible" direction="btt" size="70%">
:title="title" <EquipmentForm v-if="formVisible" :equipment-info="equipmentInfo"
:visible.sync="formVisible" :EquipmentControlFieldList="EquipmentControlFieldList" @getList="getList" @close="close" />
direction="btt"
size="70%"
>
<EquipmentForm
v-if="formVisible"
:equipment-info="equipmentInfo"
:is-show-parameters="isShowParameters"
@getList="getList"
@close="close"
/>
</el-drawer> </el-drawer>
</div> </div>
</template> </template>
@ -81,7 +75,7 @@ export default {
state: null, state: null,
trialSiteSurveyId: '', trialSiteSurveyId: '',
trialId: '', trialId: '',
isShowParameters: false EquipmentControlFieldList: []
} }
}, },
mounted() { mounted() {
@ -142,8 +136,11 @@ export default {
console.log(e) console.log(e)
} }
}, },
initList(TrialSiteEquipmentSurveyList, trialSiteSurvey, isShowParameters) { initList(TrialSiteEquipmentSurveyList, trialSiteSurvey, EquipmentControlFieldList) {
this.isShowParameters = isShowParameters this.EquipmentControlFieldList = []
EquipmentControlFieldList.forEach(item => {
this.EquipmentControlFieldList.push(item.FiledName)
})
this.list = TrialSiteEquipmentSurveyList this.list = TrialSiteEquipmentSurveyList
this.state = trialSiteSurvey.State this.state = trialSiteSurvey.State
this.$forceUpdate() this.$forceUpdate()
@ -157,63 +154,70 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.equipments_content{ .equipments_content {
background: #fff; background: #fff;
padding: 10px; padding: 10px;
.title{
.title {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
margin-bottom: 10px; margin-bottom: 10px;
} }
.equipment_info{
.equipment_info {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-around; justify-content: space-around;
align-items: center; align-items: center;
border-top: 1px solid #f5f7fa; border-top: 1px solid #f5f7fa;
.p_icon{
.p_icon {
width: 70px; width: 70px;
font-size: 25px; font-size: 25px;
font-weight: bold; font-weight: bold;
text-align: center; text-align: center;
} }
.p_info{
.p_info {
position: relative; position: relative;
flex:1; flex: 1;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: space-evenly; justify-content: space-evenly;
// border-right: 1px solid #f5f7fa; // border-right: 1px solid #f5f7fa;
font-size: 13px; font-size: 13px;
} }
.p_info:after { .p_info:after {
content: ''; content: '';
position: absolute; position: absolute;
top: 50%; top: 50%;
transform: translateY(-50%); transform: translateY(-50%);
right: 0; right: 0;
height: 50px; height: 50px;
width: 1px; width: 1px;
background-color: #f5f7fa; background-color: #f5f7fa;
} }
.p_info_basic{
.p_info_basic {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: center; align-items: center;
} }
.p_text{
.p_text {
line-height: 25px; line-height: 25px;
color: #82848a; color: #82848a;
} }
.p_func{
.p_func {
width: 80px; width: 80px;
padding: 0 10px; padding: 0 10px;
text-align: center; text-align: center;
} }
} }
} }
</style> </style>

View File

@ -4,30 +4,22 @@
<div class="d_content"> <div class="d_content">
<!-- 项目基本信息 --> <!-- 项目基本信息 -->
<BasicInfo ref="basicInfo" /> <BasicInfo ref="basicInfo" :IsOnlyUploadFile="IsOnlyUploadFile" :IsSupportUploadFile="IsSupportUploadFile" />
<!-- 历史人员 --> <!-- 历史人员 -->
<HistoricalParticipants ref="historicalParticipant" class="mt5" /> <HistoricalParticipants ref="historicalParticipant" class="mt5" />
<!-- 新增人员 --> <!-- 新增人员 -->
<Participants ref="participants" class="mt5" /> <Participants ref="participants" class="mt5" />
<!-- 设备调研 --> <!-- 设备调研 -->
<Equipments ref="equipments" class="mt5" /> <Equipments ref="equipments" class="mt5" v-if="!siteSurveyNoteInfo.IsCloseEquipmentSurvey" />
<!-- 备注 --> <!-- 备注 -->
<Notes ref="notes" class="mt5" /> <Notes ref="notes" class="mt5" />
</div> </div>
<div class="d_footer"> <div class="d_footer">
<div class="d_func_row"> <div class="d_func_row">
<div <div v-if="state === 0 && userTypeEnumInt === 0" class="d_func" @click="handleSave">
v-if="state === 0 && userTypeEnumInt === 0"
class="d_func"
@click="handleSave"
>
{{ $t('common:button:save') }} {{ $t('common:button:save') }}
</div> </div>
<div <div v-if="(state === 0 && userTypeEnumInt === 0)" class="d_func" @click="handleSubmit('submit')">
v-if="(state === 0 && userTypeEnumInt === 0)"
class="d_func"
@click="handleSubmit('submit')"
>
{{ $t('trials:researchForm:button:submit') }} {{ $t('trials:researchForm:button:submit') }}
</div> </div>
</div> </div>
@ -58,7 +50,9 @@ export default {
userTypeEnumInt: 0, userTypeEnumInt: 0,
rejectVisible: false, rejectVisible: false,
rejectForm: { reason: '' }, rejectForm: { reason: '' },
siteSurveyNoteInfo: null siteSurveyNoteInfo: {},
IsSupportUploadFile: false,
IsOnlyUploadFile: false
} }
}, },
mounted() { mounted() {
@ -78,6 +72,9 @@ export default {
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) { if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote') this.siteSurveyNoteInfo = res.Result.SiteSurveyFiledConfig.ModifyFiledList.find(i => i.NeedModifyFiled === 'SiteSurveyNote')
} }
this.IsSupportUploadFile = res.Result.SiteSurveyFiledConfig.IsSupportUploadFile
this.IsOnlyUploadFile = res.Result.SiteSurveyFiledConfig.IsOnlyUploadFile
this.siteSurveyNoteInfo.IsCloseEquipmentSurvey = res.Result.SiteSurveyFiledConfig.IsCloseEquipmentSurvey
this.state = res.Result.TrialSiteSurvey.State this.state = res.Result.TrialSiteSurvey.State
this.$refs['basicInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null) this.$refs['basicInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null)
var historicalArr = [] var historicalArr = []
@ -92,7 +89,7 @@ export default {
this.$refs['historicalParticipant'].initList(historicalArr, res.Result.TrialSiteSurvey) this.$refs['historicalParticipant'].initList(historicalArr, res.Result.TrialSiteSurvey)
this.$refs['participants'].initList(newArr, res.Result.TrialSiteSurvey) this.$refs['participants'].initList(newArr, res.Result.TrialSiteSurvey)
this.$refs['equipments'].initList(res.Result.TrialSiteEquipmentSurveyList, res.Result.TrialSiteSurvey, !(res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0)) this.$refs['equipments'].initList(res.Result.TrialSiteEquipmentSurveyList, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig.EquipmentControlFieldList)
this.$refs['notes'].initPage(this.siteSurveyNoteInfo) this.$refs['notes'].initPage(this.siteSurveyNoteInfo)
} }
this.loading = false this.loading = false
@ -160,9 +157,10 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.research_detal_wrapper{ .research_detal_wrapper {
background-color:#f5f7fa; background-color: #f5f7fa;
.d_title{
.d_title {
margin-bottom: 5px; margin-bottom: 5px;
line-height: 80px; line-height: 80px;
font-size: 28px; font-size: 28px;
@ -173,10 +171,11 @@ export default {
top: 0; top: 0;
z-index: 10; z-index: 10;
} }
// .d_content{ // .d_content{
// } // }
.d_footer{ .d_footer {
position: sticky; position: sticky;
bottom: 0; bottom: 0;
z-index: 10; z-index: 10;
@ -185,12 +184,14 @@ export default {
text-align: center; text-align: center;
// padding: 20px; // padding: 20px;
} }
.d_func_row{
.d_func_row {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
} }
.d_func{
.d_func {
flex: 1; flex: 1;
margin: 20px; margin: 20px;
color: #fff; color: #fff;
@ -207,15 +208,16 @@ export default {
line-height: 1; line-height: 1;
white-space: nowrap; white-space: nowrap;
cursor: pointer; cursor: pointer;
&:hover{
&:hover {
background: #68a2d5; background: #68a2d5;
border-color: #68a2d5; border-color: #68a2d5;
color: #fff; color: #fff;
} }
} }
.mt5{
.mt5 {
margin-top: 5px margin-top: 5px
} }
} }
</style> </style>

View File

@ -1,131 +1,88 @@
<template> <template>
<div class="research_login_m_content"> <div class="research_login_m_content">
<div class="title">{{ $t('trials:researchForm:title:question') }}</div> <div v-if="IsExpired"></div>
<el-form <div v-else-if="verify" class="LinkVerificationCode_content">
ref="loginForm" <el-form ref="codeForm" v-loading="loading" label-position="top" label-width="120px" :model="codeForm"
v-loading="loading" :rules="code_rules">
label-position="left" <div class="basic_content">
label-width="120px" <!-- 项目编号 -->
:model="form" <el-form-item :label="$t('trials:researchForm:message:LinkVerificationCode')" prop="LinkVerificationCode">
:rules="rules" <el-input v-model="codeForm.LinkVerificationCode" autocomplete="new-password" />
> </el-form-item>
<div class="basic_content"> </div>
<!-- 项目编号 --> </el-form>
<el-form-item <div class="submit_content">
:label="$t('trials:researchForm:form:trialId')" <el-button size="large" type="primary" @click="getLinkVerificationCodeIsEffective">
> {{ $t('common:button:submit') }}
<span>{{ form.TrialCode }}</span> </el-button>
</el-form-item>
<!-- 试验方案号 -->
<el-form-item
:label="$t('trials:researchForm:form:researchNo')"
>
<span>{{ form.ResearchProgramNo }}</span>
</el-form-item>
<!-- 试验名称 -->
<el-form-item
:label="$t('trials:researchForm:form:researchName')"
>
<span>{{ form.ExperimentName }}</span>
</el-form-item>
<!-- 适应症类型 -->
<el-form-item
:label="$t('trials:researchForm:form:decleareType')"
>
<span>{{ form.IndicationType }}</span>
</el-form-item>
</div> </div>
<div class="login_content"> </div>
<el-form-item <template v-else>
:label="$t('trials:researchForm:form:siteName')" <div class="title">{{ $t('trials:researchForm:title:question') }}</div>
prop="TrialSiteId" <el-form ref="loginForm" v-loading="loading" label-position="left" label-width="120px" :model="form"
> :rules="rules">
<el-select <div class="basic_content">
v-model="form.TrialSiteId" <!-- 项目编号 -->
filterable <el-form-item :label="$t('trials:researchForm:form:trialId')">
style="width:100%;" <span>{{ form.TrialCode }}</span>
@change="handleSiteChange" </el-form-item>
> <!-- 试验方案号 -->
<el-option <el-form-item :label="$t('trials:researchForm:form:researchNo')">
v-for="(item,index) of siteOptions" <span>{{ form.ResearchProgramNo }}</span>
:key="index" </el-form-item>
:label="item.TrialSiteAliasName" <!-- 试验名称 -->
:value="item.TrialSiteId" <el-form-item :label="$t('trials:researchForm:form:researchName')">
/> <span>{{ form.ExperimentName }}</span>
</el-select> </el-form-item>
</el-form-item> <!-- 适应症类型 -->
<el-form-item <el-form-item :label="$t('trials:researchForm:form:decleareType')">
v-if="form.TrialSiteId && isHaveSiteSurveyRecord" <span>{{ form.IndicationType }}</span>
label="" </el-form-item>
style="text-align:right;" </div>
> <div class="login_content">
<!-- 更新调研表 --> <el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
<el-link <el-select v-model="form.TrialSiteId" filterable style="width:100%;" @change="handleSiteChange">
v-if="!form.IsUpdate" <el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteAliasName"
type="primary" :value="item.TrialSiteId" />
@click="form.IsUpdate = true" </el-select>
> </el-form-item>
{{ $t('trials:researchForm:button:updateQsForm') }} <el-form-item v-if="form.TrialSiteId && isHaveSiteSurveyRecord" label="" style="text-align:right;">
</el-link> <!-- 更新调研表 -->
<!-- 取消更新调研表 --> <el-link v-if="!form.IsUpdate" type="primary" @click="form.IsUpdate = true">
<el-link {{ $t('trials:researchForm:button:updateQsForm') }}
v-else </el-link>
type="primary" <!-- 取消更新调研表 -->
@click="form.IsUpdate = false;form.ReplaceUserEmailOrPhone=''" <el-link v-else type="primary" @click="form.IsUpdate = false; form.ReplaceUserEmailOrPhone = ''">
> {{ $t('trials:researchForm:button:cancelUpdateQsForm') }}
{{ $t('trials:researchForm:button:cancelUpdateQsForm') }} </el-link>
</el-link> </el-form-item>
</el-form-item>
<!-- 原调研表填写人邮箱 --> <!-- 原调研表填写人邮箱 -->
<el-form-item <el-form-item v-if="form.IsUpdate" :label="$t('trials:researchForm:form:originalEmail')"
v-if="form.IsUpdate" prop="ReplaceUserEmailOrPhone">
:label="$t('trials:researchForm:form:originalEmail')" <el-input v-model="form.ReplaceUserEmailOrPhone" autocomplete="new-password" />
prop="ReplaceUserEmailOrPhone" </el-form-item>
> <!-- 联系邮箱 -->
<el-input <el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="EmailOrPhone">
v-model="form.ReplaceUserEmailOrPhone" <el-input v-model="form.EmailOrPhone" autocomplete="new-password" />
autocomplete="new-password" </el-form-item>
/> <el-form-item :label="$t('trials:researchForm:form:verifyCode')">
</el-form-item> <div class="code_content">
<!-- 联系邮箱 --> <el-input v-model="form.VerificationCode" autocomplete="new-password" />
<el-form-item <el-button type="primary" :disabled="sendDisabled || !form.EmailOrPhone || count > 0"
:label="$t('trials:researchForm:form:contactorEmail')" @click="handleSendCode">
prop="EmailOrPhone" {{ this.$t('trials:researchForm:button:send') }} {{ sendTitle ? `${sendTitle}` : null }}
> </el-button>
<el-input </div>
v-model="form.EmailOrPhone" </el-form-item>
autocomplete="new-password" <div class="submit_content">
/> <el-button size="large" type="primary" @click="onSubmit">
</el-form-item> {{ $t('common:button:submit') }}
<el-form-item
:label="$t('trials:researchForm:form:verifyCode')"
>
<div class="code_content">
<el-input
v-model="form.VerificationCode"
autocomplete="new-password"
/>
<el-button
type="primary"
:disabled="sendDisabled || !form.EmailOrPhone || count > 0"
@click="handleSendCode"
>
{{ this.$t('trials:researchForm:button:send') }} {{ sendTitle ? `${sendTitle}` : null }}
</el-button> </el-button>
</div> </div>
</el-form-item>
<div class="submit_content">
<el-button
size="large"
type="primary"
@click="onSubmit"
>
{{ $t('common:button:submit') }}
</el-button>
</div> </div>
</div> </el-form>
</el-form> </template>
</div> </div>
</template> </template>
<script> <script>
@ -133,6 +90,10 @@ import { sendVerifyCode, verifySendCode, getTrialSurveyInitInfo } from '@/api/re
import { getUserMenuTree, getUserPermissions } from '@/api/user' import { getUserMenuTree, getUserPermissions } from '@/api/user'
import store from '@/store' import store from '@/store'
import { mapGetters, mapMutations } from 'vuex' import { mapGetters, mapMutations } from 'vuex'
import {
getLinkLinkExpirationTime,
getLinkVerificationCodeIsEffective
} from '@/api/trials'
export default { export default {
name: 'ResearchMobileLogin', name: 'ResearchMobileLogin',
data() { data() {
@ -185,6 +146,16 @@ export default {
} }
return { return {
trialId: '', trialId: '',
IsExpired: true,
verify: true,
codeForm: {
LinkVerificationCode: null,
},
code_rules: {
LinkVerificationCode: [
{ required: true, message: this.$t('trials:researchForm:formRule:specify'), trigger: ['blur'] }
],
},
form: { form: {
Sponsor: null, // Sponsor: null, //
ResearchProgramNo: null, // ResearchProgramNo: null, //
@ -239,16 +210,119 @@ export default {
]) ])
}, },
mounted() { mounted() {
this.$i18n.locale = this.$route.query.lang let lang = this.$route.query.lang
this.setLanguage(this.$route.query.lang) if (!lang) {
this.$updateDictionary() const language = navigator.language
if (this.$route.query.trialId) { lang = 'en'
this.trialId = this.$route.query.trialId if (language.includes("zh")) {
this.initPage() lang = 'zh'
}
} }
this.$i18n.locale = lang
this.setLanguage(lang)
this.$updateDictionary()
this.getLinkTimeIsExpired()
}, },
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: 'lang/setLanguage' }),
async getLinkTimeIsExpired() {
try {
let data = {
TrialId: this.$route.query.trialId,
}
let res = await getLinkLinkExpirationTime(data)
if (res.IsSuccess) {
if (res.Result.IsExpired) {
return this.$router.replace('/link_expired')
// return this.$confirm(this.$t("trials:researchForm:confirm:linkIsExpired"), '', {
// type: 'warning'
// })
// return this.IsExpired = true
}
// this.customPrompt()
this.IsExpired = false
}
} catch (err) {
console.log(err)
}
},
async getLinkVerificationCodeIsEffective() {
try {
let validate = await this.$refs.codeForm.validate()
if (!validate) return false
let data = {
TrialId: this.$route.query.trialId,
LinkVerificationCode: this.codeForm.LinkVerificationCode
}
let res = await getLinkVerificationCodeIsEffective(data)
if (res.IsSuccess) {
if (!res.Result.IsEffective) {
return false
}
this.verify = false
if (this.$route.query.trialId) {
this.trialId = this.$route.query.trialId
this.initPage()
}
if (this.$route.query.isUpload) {
this.isUpload = true
this.form.IsUpdate = true
let { email, oldEMail, trialSiteId } = this.$route.query
if (trialSiteId) this.form.TrialSiteId = trialSiteId
if (oldEMail) this.form.ReplaceUserEmailOrPhone = oldEMail
if (email && email !== 'null') {
this.form.EmailOrPhone = email
} else {
this.form.EmailOrPhone = oldEMail
}
if ((email && email !== 'null') || (oldEMail && oldEMail !== 'null')) {
this.isNeedUpload = false
}
}
}
return true
} catch (err) {
return false
console.log(err)
}
},
async customPrompt(name) {
try {
const that = this
//
let message = this.$t('trials:researchForm:message:LinkVerificationCode')
const { value } = await this.$prompt(message, '', {
showClose: false,
cancelButtonText: this.$t('common:button:cancel'),
confirmButtonText: this.$t('trials:researchForm:button:saveLinkCode'),
showCancelButton: false,
closeOnClickModal: false,
closeOnPressEscape: false,
inputValue: name,
beforeClose: async (action, instance, done) => {
if (action === 'confirm') {
const value = instance.inputValue
if (!value) {
that.$message.error(this.$t('trials:researchForm:error:noValue'))
} else {
let flag = await this.getLinkVerificationCodeIsEffective(value)
if (!flag) {
that.$message.error(this.$t('trials:researchForm:confirm:isEffective'))
} else {
done()
}
}
} else {
done()
}
}
})
this.getLinkVerificationCodeIsEffective(value)
} catch (err) {
console.log(err)
return null
}
},
// //
async initPage() { async initPage() {
try { try {
@ -292,8 +366,18 @@ export default {
if (res.IsSuccess) { if (res.IsSuccess) {
zzSessionStorage.clear() zzSessionStorage.clear()
this.$i18n.locale = this.$route.query.lang // this.$i18n.locale = this.$route.query.lang
this.setLanguage(this.$route.query.lang) // this.setLanguage(this.$route.query.lang)
let lang = this.$route.query.lang
if (!lang) {
const language = navigator.language
lang = 'en'
if (language.includes("zh")) {
lang = 'zh'
}
}
this.$i18n.locale = lang
this.setLanguage(lang)
store.dispatch('user/setToken', res.Result.Token) store.dispatch('user/setToken', res.Result.Token)
zzSessionStorage.setItem('TokenKey', res.Result.Token) zzSessionStorage.setItem('TokenKey', res.Result.Token)
var permissions = await getUserPermissions() var permissions = await getUserPermissions()
@ -363,9 +447,10 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.research_login_m_content{ .research_login_m_content {
background-color:#f5f7fa; background-color: #f5f7fa;
.title{
.title {
margin-bottom: 5px; margin-bottom: 5px;
line-height: 80px; line-height: 80px;
font-size: 28px; font-size: 28px;
@ -373,27 +458,33 @@ export default {
text-align: center; text-align: center;
background: #fff; background: #fff;
} }
.basic_content{
.basic_content {
padding: 0 20px; padding: 0 20px;
background: #fff; background: #fff;
} }
.login_content{
.login_content {
padding: 5px 20px; padding: 5px 20px;
margin-top: 5px; margin-top: 5px;
background: #fff; background: #fff;
::v-deep .el-form-item { ::v-deep .el-form-item {
padding-bottom: 20px; padding-bottom: 20px;
} }
} }
.code_content{
display:flex; .code_content {
display: flex;
flex-direction: row; flex-direction: row;
justify-content: flex-start; justify-content: flex-start;
.el-input{
.el-input {
margin-right: 10px; margin-right: 10px;
} }
} }
.submit_content{
.submit_content {
margin-top: 20px; margin-top: 20px;
text-align: center; text-align: center;
} }
@ -402,11 +493,20 @@ export default {
margin-bottom: 0px; margin-bottom: 0px;
padding-top: 5px; padding-top: 5px;
border-bottom: 1px solid #f5f7fa; border-bottom: 1px solid #f5f7fa;
.el-form-item__content{
.el-form-item__content {
color: #82848a; color: #82848a;
} }
} }
} }
.LinkVerificationCode_content {
position: fixed;
top: 40%;
bottom: 40%;
right: 0;
left: 0;
}
</style> </style>

View File

@ -412,6 +412,7 @@ export default {
// //
handleSave(isAutoCommit, isCheck = false) { handleSave(isAutoCommit, isCheck = false) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
isCheck = false
if (this.IsOnlyUploadFile && !isCheck) { if (this.IsOnlyUploadFile && !isCheck) {
if (!this.form.UserName) { if (!this.form.UserName) {
this.$message.warning(this.$t("trials:researchForm:message:notUserName")) this.$message.warning(this.$t("trials:researchForm:message:notUserName"))

View File

@ -191,7 +191,6 @@ export default {
EquipmentControlFieldList.forEach(item => { EquipmentControlFieldList.forEach(item => {
this.EquipmentControlFieldList.push(item.FiledName) this.EquipmentControlFieldList.push(item.FiledName)
}) })
console.log(this.EquipmentControlFieldList, 'this.EquipmentControlFieldList')
this.list = TrialSiteEquipmentSurveyList this.list = TrialSiteEquipmentSurveyList
this.state = trialSiteSurvey.State this.state = trialSiteSurvey.State
this.$forceUpdate() this.$forceUpdate()

View File

@ -16,9 +16,9 @@
<el-table-column v-for="(item, index) in tableKey" :key="item.key" :prop="item.key" :label="item.title"> <el-table-column v-for="(item, index) in tableKey" :key="item.key" :prop="item.key" :label="item.title">
<template slot-scope="scope"> <template slot-scope="scope">
<span :class="{ IsHighlight: scope.row.IsHighlight.includes(item.key) }">{{ scope.row[item.key] <span :class="{ IsHighlight: scope.row.IsHighlight.includes(item.key) }">{{ scope.row[item.key]
}}</span> }}</span>
<el-button icon="el-icon-view" circle v-if="index > 0" size="mini" style="margin-left: 5px;" <el-button icon="el-icon-view" circle v-if="index > 0 && scope.row[item.key]" size="mini"
:title="$t('common:button:view')" style="margin-left: 5px;" :title="$t('common:button:view')"
@click="lookReadingResults(scope.row.VisitTaskId[item.key])"></el-button> @click="lookReadingResults(scope.row.VisitTaskId[item.key])"></el-button>
</template> </template>
</el-table-column> </el-table-column>