中心调研支持上传文件
continuous-integration/drone/push Build is passing Details

rj
wangxiaoshuang 2026-07-01 17:24:25 +08:00
parent 4709125107
commit 5ec234c9dd
10 changed files with 399 additions and 214 deletions

View File

@ -4514,4 +4514,12 @@ export function getLinkVerificationCodeIsEffective(data) {
method: 'post',
data,
})
}
// 上传通用文件记录
export function addOrUpdateCommonUploadRecord(data) {
return request({
url: `/FileUploadRecord/addOrUpdateCommonUploadRecord`,
method: 'post',
data,
})
}

View File

@ -1,6 +1,6 @@
<template>
<el-form v-if="isShow" ref="researchBSForm" size="small" :model="form" :rules="rules" style="width:80%"
label-position="left">
label-position="left" v-loading="loading">
<!-- 项目编号 -->
<el-form-item :label="$t('trials:researchForm:form:trialId')">
<el-input v-model="form.TrialCode" disabled />
@ -20,7 +20,7 @@
<!-- 中心名称 -->
<el-form-item :label="$t('trials:researchForm:form:siteName')" prop="TrialSiteId">
<el-select v-model="form.TrialSiteId" filterable style="width:100%;"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" @change="handleSiteChange">
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" @change="handleSiteChange">
<el-option v-for="(item, index) of siteOptions" :key="index" :label="item.TrialSiteAliasName"
:value="item.TrialSiteId" />
</el-select>
@ -31,28 +31,47 @@
</el-form-item>
<!-- 联系人 -->
<el-form-item :label="$t('trials:researchForm:form:contactor')" prop="UserName">
<el-input v-model="form.UserName" :disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
<el-input v-model="form.UserName" :disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" />
</el-form-item>
<!-- 联系电话 -->
<el-form-item :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) && !isPM" />
</el-form-item>
<!-- 联系邮箱 -->
<el-form-item :label="$t('trials:researchForm:form:contactorEmail')" prop="Email">
<el-input v-model="form.Email" disabled />
</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="width: 30%;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-divider /> -->
<!-- 平均刻盘周期 -->
<el-form-item v-if="!notShowFieldList.includes('AverageEngravingCycle')"
:label="$t('trials:researchForm:form:engravingCycle')">
<el-input-number v-model="form.AverageEngravingCycle"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" controls-position="right" :min="0" />
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" controls-position="right"
:min="0" />
</el-form-item>
<!-- 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-group v-model="form.IsRoutineMRIPDEE"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM">
<el-radio v-for="item of $d.YesOrNo" :key="`IsRoutineMRIPDEE${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group>
@ -65,27 +84,29 @@
<!-- 单次检查时长分钟 -->
<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-input-number v-model="form.MRIPDFFScanTime"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" 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-input-number v-model="form.MRIPDFFLeadTime"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" 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" />
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" />
</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-group v-model="form.IsAuthorize"
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" @input="handleIsAuthorizeInput">
<el-radio label="IsAuthorizeRadiologistsParticipate">{{
$t('trials:researchForm:form:IsAuthorizeRadiologistsParticipate') }}</el-radio>
<el-radio label="AssignFixedTechnologists">{{
@ -96,7 +117,7 @@
<el-form-item v-if="!notShowFieldList.includes('IsConfirmImagingTechnologist')"
:label="$t('trials:researchForm:form:isQualified')" prop="IsConfirmImagingTechnologist">
<el-radio-group v-model="form.IsConfirmImagingTechnologist"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM">
<el-radio v-for="item of $d.YesOrNo" :key="`IsConfirmImagingTechnologist${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group>
@ -105,13 +126,13 @@
<el-form-item v-if="!notShowFieldList.includes('NotConfirmReson') && form.IsConfirmImagingTechnologist === false"
:label="$t('trials:researchForm:form:notQualifiedReason')" prop="NotConfirmReson">
<el-input v-model="form.NotConfirmReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" />
</el-form-item>
<!-- 研究单位疗效评估人员类型 -->
<el-form-item v-if="!notShowFieldList.includes('EfficacyEvaluatorType')"
:label="$t('trials:researchForm:form:staffType')">
<el-radio-group v-model="form.EfficacyEvaluatorType"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory">
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM">
<el-radio v-for="item of $d.EfficacyEvaluatorType" :key="`EfficacyEvaluatorType${item.value}`"
:label="item.value">{{ item.label }}</el-radio>
</el-radio-group>
@ -120,7 +141,7 @@
<el-form-item v-if="!notShowFieldList.includes('IsFollowStudyParameters')" prop="IsFollowStudyParameters">
<span slot="label" v-html="$t('trials:researchForm:form:isFollowStudyParam')" />
<el-radio-group v-model="form.IsFollowStudyParameters"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" style="margin-right: 10px;">
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" style="margin-right: 10px;">
<el-radio v-for="item of $d.YesOrNo" :key="`IsFollowStudyParameters${item.value}`" :label="item.value">{{
item.label }}</el-radio>
</el-radio-group>
@ -133,13 +154,13 @@
prop="NotFollowReson">
<span slot="label" v-html="$t('trials:researchForm:form:notFollowStudyParam')" />
<el-input v-model="form.NotFollowReson" type="textarea" :autosize="{ minRows: 2, maxRows: 4 }"
:disabled="!(state === 0 && userTypeEnumInt === 0) || isHistory" />
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" />
</el-form-item>
<!-- 是否严格按照影像手册参数完成刻盘 -->
<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;">
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" 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>
@ -149,7 +170,7 @@
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" />
:disabled="(!(state === 0 && userTypeEnumInt === 0) || isHistory) && !isPM" />
</el-form-item>
<el-form-item>
<!-- 保存 -->
@ -163,9 +184,10 @@
</el-form>
</template>
<script>
import { getTrialSiteSelect, getTrialDocumentList } from '@/api/trials'
import { getTrialSiteSelect, getTrialDocumentList, addOrUpdateCommonUploadRecord } from '@/api/trials'
import { addOrUpdateTrialSiteSurvey } from '@/api/research'
import attachmentPreview from '@/views/dictionary/attachment/components/SignatureTemplate/attachmentPreview'
import { downLoadFile } from '@/utils/stream.js'
export default {
name: 'QuestionForm',
components: { attachmentPreview },
@ -173,7 +195,19 @@ export default {
isHistory: {
type: Boolean,
default: false
}
},
IsOnlyUploadFile: {
type: Boolean,
default: false
},
IsSupportUploadFile: {
type: Boolean,
default: false
},
isPM: {
type: Boolean,
default: false
},
},
data() {
var checkPhone = (rule, value, callback) => {
@ -198,6 +232,7 @@ export default {
}
}
return {
loading: false,
form: {
Id: '',
Sponsor: '', //
@ -225,7 +260,9 @@ export default {
NotConfirmReson: '',
EfficacyEvaluatorType: '',
IsFollowStudyParameters: '',
NotFollowReson: ''
NotFollowReson: '',
CommonUploadRecordId: null,
SiteSurveyFile: []
},
rules: {
TrialSiteId: [
@ -281,11 +318,68 @@ export default {
}
},
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"))
return await downLoadFile(
this.OSSclientConfig.basePath + this.form.SiteSurveyFile.Path,
this.form.SiteSurveyFile.FileName
)
},
async viewManual() {
try {
let data = {
@ -316,8 +410,46 @@ export default {
}
},
//
handleSave(isAutoCommit) {
handleSave(isAutoCommit, isCheck = false) {
return new Promise((resolve, reject) => {
if (this.IsOnlyUploadFile && !isCheck) {
if (!this.form.CommonUploadRecordId) return this.$message.warning(this.$t("trials:researchForm:message:notCommonUploadRecordId"))
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 false
}
this.$refs['researchBSForm'].validate(valid => {
if (valid) {
this.btnLoading = true
@ -341,7 +473,8 @@ export default {
notConfirmReson: this.form.NotConfirmReson,
efficacyEvaluatorType: this.form.EfficacyEvaluatorType,
isFollowStudyParameters: this.form.IsFollowStudyParameters,
notFollowReson: this.form.NotFollowReson
notFollowReson: this.form.NotFollowReson,
CommonUploadRecordId: this.form.CommonUploadRecordId
}
addOrUpdateTrialSiteSurvey(param).then(res => {
this.btnLoading = false
@ -380,6 +513,9 @@ export default {
this.form.UserName = trialSiteSurvey.UserName //
this.form.Phone = trialSiteSurvey.Phone //
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.IsRoutineMRIPDEE = trialSiteSurvey.IsRoutineMRIPDEE
this.form.MRIPDFFScanTime = trialSiteSurvey.MRIPDFFScanTime
@ -410,3 +546,54 @@ export default {
}
}
</script>
<style lang="scss" scoped>
.upload {
display: inline-block;
height: 30px;
width: 90px;
padding: 2px 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: 30px;
width: 90px;
position: absolute;
overflow: hidden;
left: 0;
top: 0;
opacity: 0;
font-size: 0;
}
.btn-select {
//
width: 90px;
height: 30px;
line-height: 30px;
text-align: center;
cursor: pointer;
border-radius: 24px;
overflow: hidden;
position: absolute;
top: 0;
left: 0;
pointer-events: none; //pointer-events:none穿
}
}
.file {
::v-deep .el-form-item__content {
display: flex;
align-items: center;
}
}
</style>

View File

@ -132,7 +132,11 @@ export default {
default: () => {
return []
}
}
},
isPM: {
type: Boolean,
default: false
},
},
data() {
return {

View File

@ -2,7 +2,8 @@
<div class="equipment-wrapper">
<div class="header-wrapper">
<!-- 新增 -->
<el-button v-if="state === 0 && userTypeEnumInt === 0 && !isHistory && EquipmentControlFieldList.length > 0"
<el-button
v-if="((state === 0 && userTypeEnumInt === 0 && !isHistory) || isPM) && EquipmentControlFieldList.length > 0"
size="small" type="primary" @click="handleAdd">
{{ $t('common:button:add') }}
</el-button>
@ -82,7 +83,7 @@
<!-- 备注 -->
<el-table-column v-if="EquipmentControlFieldList.includes('Note')" min-width="120" prop="Note"
:label="$t('trials:equiptResearch:form:precautions')" show-overflow-tooltip />
<el-table-column v-if="state === 0 && userTypeEnumInt === 0 && !isHistory" fixed="right"
<el-table-column v-if="(state === 0 && userTypeEnumInt === 0 && !isHistory) || isPM" fixed="right"
:label="$t('common:action:action')" width="100">
<template slot-scope="scope">
<!-- 编辑 -->
@ -121,7 +122,11 @@ export default {
isHistory: {
type: Boolean,
default: false
}
},
isPM: {
type: Boolean,
default: false
},
},
data() {
return {

View File

@ -1,18 +1,11 @@
<template>
<div class="particiapant-wrapper">
<div class="header-wrapper" />
<el-table
v-loading="loading"
:data="list"
border
style="width: 100%"
>
<el-table-column
prop="date"
:label="$t('trials:staffResearch:form:name')"
>
<el-table v-loading="loading" :data="list" border style="width: 100%">
<el-table-column prop="date" :label="$t('trials:staffResearch:form:name')">
<template slot-scope="scope">
<el-tooltip v-if="scope.row.ErrorMessage" class="item" effect="dark" :content="scope.row.ErrorMessage" placement="bottom">
<el-tooltip v-if="scope.row.ErrorMessage" class="item" effect="dark" :content="scope.row.ErrorMessage"
placement="bottom">
<i class="el-icon-warning" style="color:red" />
</el-tooltip>
@ -29,20 +22,11 @@
</template>
</el-table-column> -->
<!-- 电话号码 -->
<el-table-column
prop="Phone"
:label="$t('trials:staffResearch:form:phone')"
/>
<el-table-column prop="Phone" :label="$t('trials:staffResearch:form:phone')" />
<!-- 邮箱 -->
<el-table-column
prop="Email"
:label="$t('trials:staffResearch:form:email')"
/>
<el-table-column prop="Email" :label="$t('trials:staffResearch:form:email')" />
<!-- 单位 -->
<el-table-column
prop="OrganizationName"
:label="$t('trials:staffResearch:form:organization')"
/>
<el-table-column prop="OrganizationName" :label="$t('trials:staffResearch:form:organization')" />
<!-- 是否生成账号 -->
<!-- <el-table-column
prop="IsGenerateAccount"
@ -53,27 +37,20 @@
</template>
</el-table-column> -->
<!-- 用户类型 -->
<el-table-column
prop="UserType"
:label="$t('trials:staffResearch:form:userType')"
/>
<el-table-column prop="UserType" :label="$t('trials:staffResearch:form:userType')" />
<!-- 原状态 -->
<el-table-column
prop="IsHistoryUserOriginDeleted"
:label="$t('trials:staffResearch:form:originalState')"
>
<el-table-column prop="IsHistoryUserOriginDeleted" :label="$t('trials:staffResearch:form:originalState')">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsHistoryUserOriginDeleted" type="info">{{ $fd('IsUserExitTrial', scope.row.IsHistoryUserOriginDeleted) }}</el-tag>
<el-tag v-if="scope.row.IsHistoryUserOriginDeleted" type="info">{{ $fd('IsUserExitTrial',
scope.row.IsHistoryUserOriginDeleted) }}</el-tag>
<el-tag v-else type="danger">{{ $fd('IsUserExitTrial', scope.row.IsHistoryUserOriginDeleted) }}</el-tag>
</template>
</el-table-column>
<!-- 更新状态 -->
<el-table-column
prop="IsHistoryUserDeleted"
:label="$t('trials:staffResearch:form:updateState')"
>
<el-table-column prop="IsHistoryUserDeleted" :label="$t('trials:staffResearch:form:updateState')">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsHistoryUserDeleted" type="info">{{ $fd('IsUserExitTrial', scope.row.IsHistoryUserDeleted) }}</el-tag>
<el-tag v-if="scope.row.IsHistoryUserDeleted" type="info">{{ $fd('IsUserExitTrial',
scope.row.IsHistoryUserDeleted) }}</el-tag>
<el-tag v-else type="danger">{{ $fd('IsUserExitTrial', scope.row.IsHistoryUserDeleted) }}</el-tag>
</template>
</el-table-column>
@ -88,14 +65,10 @@
<el-tag v-else type="danger">{{ $fd('IsJoin', scope.row.IsJoin) }}</el-tag>
</template>
</el-table-column> -->
<el-table-column
v-if="state === 0 && (userTypeEnumInt===0 ) && !isHistory"
fixed="right"
:label="$t('common:action:action')"
width="100"
>
<el-table-column v-if="(state === 0 && (userTypeEnumInt === 0) && !isHistory) || isPM" fixed="right"
:label="$t('common:action:action')" width="100">
<template slot-scope="scope">
<el-button v-if="userTypeEnumInt===0" type="text" size="small" @click="handleEdit(scope.row)">
<el-button v-if="userTypeEnumInt === 0 || isPM" type="text" size="small" @click="handleEdit(scope.row)">
{{ $t('common:button:edit') }}
</el-button>
</template>
@ -103,16 +76,9 @@
</el-table>
<!-- 新增/编辑人员信息 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="900px"
custom-class="base-dialog-wrapper"
:append-to-body="userTypeEnumInt !== 0"
>
<HistoricalParticipantForm :state="state" :data="rowData" @getList="getList" @close="closeDialog" />
<el-dialog v-if="editVisible" :visible.sync="editVisible" :close-on-click-modal="false" :title="title" width="900px"
custom-class="base-dialog-wrapper" :append-to-body="userTypeEnumInt !== 0">
<HistoricalParticipantForm :state="state" :isPM="isPM" :data="rowData" @getList="getList" @close="closeDialog" />
</el-dialog>
</div>
@ -128,7 +94,11 @@ export default {
isHistory: {
type: Boolean,
default: false
}
},
isPM: {
type: Boolean,
default: false
},
},
data() {
return {
@ -199,8 +169,8 @@ export default {
}
</script>
<style lang="scss" scoped>
.particiapant-wrapper{
.header-wrapper{
.particiapant-wrapper {
.header-wrapper {
text-align: right;
margin-bottom: 10px;
}

View File

@ -3,43 +3,32 @@
<div class="base-dialog-body">
<!-- -->
<el-form-item :label="$t('trials:staffResearch:form:lastName')" prop="LastName">
<el-input v-model="form.LastName" :disabled="!(state === 0 && userTypeEnumInt === 0)" style="width: 200px" />
<el-input v-model="form.LastName" :disabled="(!(state === 0 && userTypeEnumInt === 0))&&!isPM" style="width: 200px" />
</el-form-item>
<!-- -->
<el-form-item :label="$t('trials:staffResearch:form:firstName')" prop="FirstName">
<el-input v-model="form.FirstName" :disabled="!(state === 0 && userTypeEnumInt === 0)" style="width: 200px" />
<el-input v-model="form.FirstName" :disabled="(!(state === 0 && userTypeEnumInt === 0))&&!isPM" style="width: 200px" />
</el-form-item>
<!-- 角色 -->
<el-form-item :label="$t('trials:staffResearch:form:role')" prop="TrialRoleCode">
<el-select
v-model="form.TrialRoleCode"
style="width: 200px"
:disabled="!(state === 0 && userTypeEnumInt === 0)"
@change="handleTrialRoleChange"
>
<el-option
v-for="item of $d.SiteSurvey_UserRoles"
:key="item.id"
:label="item.label"
:value="parseInt(item.value)"
/>
<el-select v-model="form.TrialRoleCode" style="width: 200px" :disabled="(!(state === 0 && userTypeEnumInt === 0))&&!isPM"
@change="handleTrialRoleChange">
<el-option v-for="item of $d.SiteSurvey_UserRoles" :key="item.id" :label="item.label"
:value="parseInt(item.value)" />
</el-select>
</el-form-item>
<!-- 电话号码 -->
<el-form-item :label="$t('trials:staffResearch:form:phone')" prop="Phone">
<el-input v-model="form.Phone" :disabled="!(state === 0 && userTypeEnumInt === 0)" style="width: 200px" />
<el-input v-model="form.Phone" :disabled="(!(state === 0 && userTypeEnumInt === 0))&&!isPM" style="width: 200px" />
</el-form-item>
<!-- 邮箱 -->
<el-form-item :label="$t('trials:staffResearch:form:email')" prop="Email">
<el-input v-model="form.Email" :disabled="!(state === 0 && userTypeEnumInt === 0)" style="width: 200px" />
<el-input v-model="form.Email" :disabled="(!(state === 0 && userTypeEnumInt === 0))&&!isPM" style="width: 200px" />
</el-form-item>
<!-- 单位 -->
<el-form-item :label="$t('trials:staffResearch:form:organization')" prop="OrganizationName">
<el-input
v-model="form.OrganizationName"
:disabled="!(state === 0 && userTypeEnumInt === 0)"
style="width: 200px"
/>
<el-input v-model="form.OrganizationName" :disabled="(!(state === 0 && userTypeEnumInt === 0))&&!isPM"
style="width: 200px" />
</el-form-item>
<!-- <el-row>
&lt;!&ndash; 是否生成账号 &ndash;&gt;
@ -112,7 +101,11 @@ export default {
state: {
type: Number,
required: true
}
},
isPM: {
type: Boolean,
default: false
},
},
data() {
// var checkPhone = (rule, value, callback) => {

View File

@ -2,27 +2,16 @@
<div class="particiapant-wrapper">
<div class="header-wrapper">
<!-- 新增 -->
<el-button
v-if="state === 0 && userTypeEnumInt === 0 && !isHistory"
size="small"
type="primary"
@click="handleAdd"
>
<el-button v-if="(state === 0 && userTypeEnumInt === 0 && !isHistory) || isPM" size="small" type="primary"
@click="handleAdd">
{{ $t('common:button:add') }}
</el-button>
</div>
<el-table
v-loading="loading"
:data="list"
border
style="width: 100%"
>
<el-table-column
prop="date"
:label="$t('trials:staffResearch:form:name')"
>
<el-table v-loading="loading" :data="list" border style="width: 100%">
<el-table-column prop="date" :label="$t('trials:staffResearch:form:name')">
<template slot-scope="scope">
<el-tooltip v-if="scope.row.ErrorMessage" class="item" effect="dark" :content="scope.row.ErrorMessage" placement="bottom">
<el-tooltip v-if="scope.row.ErrorMessage" class="item" effect="dark" :content="scope.row.ErrorMessage"
placement="bottom">
<i class="el-icon-warning" style="color:red" />
</el-tooltip>
@ -30,29 +19,17 @@
</template>
</el-table-column>
<!-- 姓名 -->
<el-table-column
prop="TrialRoleCode"
:label="$t('trials:staffResearch:form:role')"
>
<el-table-column prop="TrialRoleCode" :label="$t('trials:staffResearch:form:role')">
<template slot-scope="scope">
{{ $fd('SiteSurvey_UserRoles',scope.row.TrialRoleCode) }}
{{ $fd('SiteSurvey_UserRoles', scope.row.TrialRoleCode) }}
</template>
</el-table-column>
<!-- 电话号码 -->
<el-table-column
prop="Phone"
:label="$t('trials:staffResearch:form:phone')"
/>
<el-table-column prop="Phone" :label="$t('trials:staffResearch:form:phone')" />
<!-- 邮箱 -->
<el-table-column
prop="Email"
:label="$t('trials:staffResearch:form:email')"
/>
<el-table-column prop="Email" :label="$t('trials:staffResearch:form:email')" />
<!-- 单位 -->
<el-table-column
prop="OrganizationName"
:label="$t('trials:staffResearch:form:organization')"
/>
<el-table-column prop="OrganizationName" :label="$t('trials:staffResearch:form:organization')" />
<!-- 是否生成账号 -->
<!-- <el-table-column
prop="IsGenerateAccount"
@ -68,33 +45,28 @@
:label="$t('trials:staffResearch:form:userType')"
/>-->
<!-- 状态 -->
<el-table-column
v-if="hasPermi(['role:pm','role:apm'])"
prop="State"
:label="$t('trials:staffResearch:form:status')"
>
<el-table-column v-if="hasPermi(['role:pm', 'role:apm'])" prop="State"
:label="$t('trials:staffResearch:form:status')">
<template slot-scope="scope">
<el-tag v-if="scope.row.IsJoin" type="info">{{ $fd('IsJoin', scope.row.IsJoin) }}</el-tag>
<el-tag v-else type="danger">{{ $fd('IsJoin', scope.row.IsJoin) }}</el-tag>
</template>
</el-table-column>
<!-- v-if="state !== 3 && (userTypeEnumInt===0 || hasPermi(['role:pm','role:apm']))" -->
<el-table-column
v-if="state === 0 && (userTypeEnumInt===0 ) && !isHistory"
fixed="right"
:label="$t('common:action:action')"
width="100"
>
<el-table-column v-if="(state === 0 && (userTypeEnumInt === 0) && !isHistory) || isPM" fixed="right"
:label="$t('common:action:action')" width="100">
<template slot-scope="scope">
<!-- 编辑 -->
<!-- <el-button type="text" size="small" :disabled="scope.row.IsGenerateSuccess || (state !== 0 && userTypeEnumInt===0) || (state !== 2 &&hasPermi(['role:pm']))" @click="handleEdit(scope.row)">
{{ $t('common:button:edit') }}
</el-button> -->
<el-button v-if="userTypeEnumInt===0" type="text" size="small" :disabled="state!==0 || scope.row.IsGenerateSuccess" @click="handleEdit(scope.row)">
<el-button v-if="userTypeEnumInt === 0 || isPM" type="text" size="small"
:disabled="(state !== 0 || scope.row.IsGenerateSuccess) && !isPM" @click="handleEdit(scope.row)">
{{ $t('common:button:edit') }}
</el-button>
<!-- 删除 -->
<el-button v-if="userTypeEnumInt===0" type="text" size="small" :disabled="state!==0 || scope.row.IsGenerateSuccess" @click="handleDelete(scope.row)">
<el-button v-if="userTypeEnumInt === 0 || isPM" type="text" size="small"
:disabled="(state !== 0 || scope.row.IsGenerateSuccess) && !isPM" @click="handleDelete(scope.row)">
{{ $t('common:button:delete') }}
</el-button>
</template>
@ -102,16 +74,9 @@
</el-table>
<!-- 新增/编辑人员信息 -->
<el-dialog
v-if="editVisible"
:visible.sync="editVisible"
:close-on-click-modal="false"
:title="title"
width="900px"
custom-class="base-dialog-wrapper"
:append-to-body="userTypeEnumInt !== 0"
>
<ParticipantForm :state="state" :data="rowData" @getList="getList" @close="closeDialog" />
<el-dialog v-if="editVisible" :visible.sync="editVisible" :close-on-click-modal="false" :title="title" width="900px"
custom-class="base-dialog-wrapper" :append-to-body="userTypeEnumInt !== 0">
<ParticipantForm :state="state" :isPM="isPM" :data="rowData" @getList="getList" @close="closeDialog" />
</el-dialog>
</div>
@ -127,7 +92,11 @@ export default {
isHistory: {
type: Boolean,
default: false
}
},
isPM: {
type: Boolean,
default: false
},
},
data() {
return {
@ -197,7 +166,7 @@ export default {
this.$message.success(this.$t('trials:staffResearch:message:delSuccessfully'))
}
}).catch(() => { this.loading = false })
}).catch(() => {})
}).catch(() => { })
},
isExistIncorrect() {
return this.list.some(item => item.IsCorrect === false)
@ -224,8 +193,8 @@ export default {
}
</script>
<style lang="scss" scoped>
.particiapant-wrapper{
.header-wrapper{
.particiapant-wrapper {
.header-wrapper {
text-align: right;
margin-bottom: 10px;
}

View File

@ -13,7 +13,8 @@
<div class="center-wrapper">
<!-- 基本信息 -->
<el-card shadow="hover">
<BaseInfo ref="baseResearchInfo" :is-history="true" />
<BaseInfo ref="baseResearchInfo" :is-history="true" :IsOnlyUploadFile="IsOnlyUploadFile"
:IsSupportUploadFile="IsSupportUploadFile" />
</el-card>
<!-- 人员调查 -->
@ -125,7 +126,7 @@ export default {
type: String,
default: ''
}
},
},
data() {
return {
trialId: this.$route.query.trialId,
@ -139,7 +140,9 @@ export default {
btnLoading: false,
isFullscreen: false,
historyVisible: false,
siteSurveyNoteInfo: {}
siteSurveyNoteInfo: {},
IsSupportUploadFile: false,
IsOnlyUploadFile: false
}
},
mounted() {
@ -154,6 +157,8 @@ export default {
this.loading = true
getSiteSurveyInfo(this.trialId, this.trialSiteSurveyId).then(res => {
if (res.Result) {
this.IsSupportUploadFile = res.Result.SiteSurveyFiledConfig.IsSupportUploadFile
this.IsOnlyUploadFile = res.Result.SiteSurveyFiledConfig.IsOnlyUploadFile
// this.trialSiteSurveyEquipmentType = res.Result.TrialInfo.TrialSiteSurveyEquipmentType
// this.trialSiteSurveyUserRoles = res.Result.TrialInfo.TrialSiteSurveyUserRoles
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {

View File

@ -45,26 +45,27 @@
<div class="center-wrapper">
<!-- 基本信息 -->
<el-card shadow="hover">
<BaseInfo ref="baseResearchInfo" :isPreview="isPreview" />
<BaseInfo ref="baseResearchInfo" :isPreview="isPreview" :IsOnlyUploadFile="IsOnlyUploadFile"
:IsSupportUploadFile="IsSupportUploadFile" :isPM="isPM" />
</el-card>
<!-- 人员调查 -->
<el-card shadow="hover" class="mt10">
<!-- 历史人员 -->
<h4>{{ $t('trials:staffResearch:title:historicalStaff') }}</h4>
<HistoricalParticipant ref="historicalParticipant" :isPreview="isPreview" @refreshPage="refreshPage"
@getList="initPage" />
<HistoricalParticipant ref="historicalParticipant" :isPreview="isPreview" :isPM="isPM"
@refreshPage="refreshPage" @getList="initPage" />
<!-- <h4>{{ $t('trials:staffResearch:title:staff') }}</h4> -->
<!-- 新增人员 -->
<h4>{{ $t('trials:staffResearch:title:newStaff') }}</h4>
<ParticipantList ref="researchParticipants" :isPreview="isPreview" @refreshPage="refreshPage"
<ParticipantList ref="researchParticipants" :isPreview="isPreview" :isPM="isPM" @refreshPage="refreshPage"
@getList="initPage" />
</el-card>
<!-- 设备调研 -->
<el-card shadow="hover" class="mt10" v-if="!siteSurveyNoteInfo.IsCloseEquipmentSurvey">
<h4>{{ $t('trials:equiptResearch:title:equiptResearch') }}</h4>
<EquipmentList ref="researchEquipments" :isPreview="isPreview" />
<EquipmentList ref="researchEquipments" :isPreview="isPreview" :isPM="isPM" />
</el-card>
<!-- 其他信息调研 -->
@ -146,7 +147,7 @@ import BaseInfo from './components/BaseInfo'
import HistoricalParticipant from './components/HistoricalParticipant'
import ParticipantList from './components/ParticipantList'
import EquipmentList from './components/EquipmentList'
import { mapMutations } from 'vuex'
import TopLang from './topLang'
import HistoricalRecord from './components/HistoricalRecord'
export default {
@ -172,17 +173,36 @@ export default {
btnLoading: false,
isFullscreen: false,
historyVisible: false,
siteSurveyNoteInfo: {}
siteSurveyNoteInfo: {},
IsSupportUploadFile: false,
IsOnlyUploadFile: false
}
},
mounted() {
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)
this.$updateDictionary()
this.trialSiteSurveyId = getQueryString('trialSiteSurveyId')
this.initPage()
if (zzSessionStorage.getItem('userTypeEnumInt')) {
this.userTypeEnumInt = zzSessionStorage.getItem('userTypeEnumInt') * 1
}
},
computed: {
isPM() {
return this.hasPermi(['role:pm', 'role:spm', 'role:cpm', 'role:apm'])
}
},
methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }),
//
initPage() {
this.loading = true
@ -193,6 +213,8 @@ export default {
if (res.Result.SiteSurveyFiledConfig && res.Result.SiteSurveyFiledConfig.ModifyFiledList.length > 0) {
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.siteId = res.Result.TrialSiteSurvey.TrialSiteId
@ -219,7 +241,7 @@ export default {
handleSubmit(type) {
if (this.userTypeEnumInt === 0) {
this.loading = true
this.$refs['baseResearchInfo'].handleSave(true).then(res => {
this.$refs['baseResearchInfo'].handleSave(true, type === 'approve').then(res => {
this.loading = false
if (res) {
this.submit(type)
@ -259,38 +281,33 @@ export default {
},
//
generateAccount() {
//
this.$confirm(this.$t('trials:researchForm:message:auditWarning'), {
type: 'warning',
distinguishCancelAndClose: true
}).then(() => {
// 1crc1SR
// var list = this.$refs['researchParticipants'].list
// var cIdx = list.findIndex(i => i.UserTypeEnum === 5)
// var sIdx = list.findIndex(i => i.UserTypeEnum === 9)
// if (cIdx === -1 || sIdx === -1) {
// this.$alert(this.$t('trials:researchForm:message:saveWarning2'))
// return
// }
this.loading = true
var param = {
TrialId: this.trialId,
TrialSiteSurveyId: this.trialSiteSurveyId,
LoginUrl: `${location.protocol}//${location.host}/login`,
BaseUrl: `${location.protocol}//${location.host}/login`,
RouteUrl: `${location.protocol}//${location.host}/email-recompose`
}
trialSurveySubmit(param).then((res) => {
this.loading = false
if (res.IsSuccess) {
this.initPage()
this.$emit('refreshPage')
this.$message.success(this.$t('common:message:approvedSuccessfully'))
this.$refs['baseResearchInfo'].handleSave(true, true).then(res => {
this.$confirm(this.$t('trials:researchForm:message:auditWarning'), {
type: 'warning',
distinguishCancelAndClose: true
}).then(() => {
if (res) {
var param = {
TrialId: this.trialId,
TrialSiteSurveyId: this.trialSiteSurveyId,
LoginUrl: `${location.protocol}//${location.host}/login`,
BaseUrl: `${location.protocol}//${location.host}/login`,
RouteUrl: `${location.protocol}//${location.host}/email-recompose`
}
this.loading = false
trialSurveySubmit(param).then((res) => {
this.loading = false
if (res.IsSuccess) {
this.initPage()
this.$emit('refreshPage')
this.$message.success(this.$t('common:message:approvedSuccessfully'))
}
}).catch(() => {
this.loading = false
})
}
}).catch(() => {
this.loading = false
})
}).catch(() => { })
})
},
//
handleReject() {

View File

@ -1,6 +1,25 @@
<template>
<div class="ImageManual">
<div class="config">
<div style="margin-bottom: 20px;font-weight: bold;">
{{ $t("trials:researchRecord:ImageManual:uploadFile") }}
</div>
<el-form size="small" :model="uploadForm" style="width:80%">
<el-form-item :label="$t('trials:researchRecord:ImageManual:IsSupportUploadFile')">
<el-radio-group v-model="uploadForm.IsSupportUploadFile"
@input="uploadForm.IsOnlyUploadFile = false">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('trials:researchRecord:ImageManual:IsOnlyUploadFile')"
v-if="uploadForm.IsSupportUploadFile">
<el-radio-group v-model="uploadForm.IsOnlyUploadFile">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div style="margin-bottom: 20px;font-weight: bold;">
{{ $t("trials:researchRecord:ImageManual:BasicQuestion") }}
</div>
@ -56,11 +75,11 @@
<el-form-item :label="$t('trials:researchRecord:ImageManual:Equipment')">
<el-radio-group v-model="form.IsCloseEquipmentSurvey" @input="handleInput">
<el-radio :label="item.value" v-for="item in $d.YesOrNo" :key="item.id">{{ item.label
}}</el-radio>
}}</el-radio>
</el-radio-group>
</el-form-item>
</el-form>
<div style="margin-bottom: 20px;font-weight: bold;">
<div style="margin-bottom: 20px;font-weight: bold;" v-if="form.IsCloseEquipmentSurvey">
{{ $t("trials:researchRecord:ImageManual:EquipmentConfig") }}
</div>
<el-form size="small" :model="EquipmentForm" style="width:80%" v-if="form.IsCloseEquipmentSurvey">
@ -192,6 +211,10 @@ export default {
HasT2R2Correction: false,
CanFullyExportPdfParameterMapsAndRawDicom: false,
},
uploadForm: {
IsSupportUploadFile: false,
IsOnlyUploadFile: false
},
obj: {
AverageEngravingCycle: false,
IsConfirmImagingTechnologist: false,
@ -206,7 +229,7 @@ export default {
IsAuthorizeRadiologistsParticipate: false,
AssignFixedTechnologists: false,
ISStrictManualBurnFlag: false,
NotStrictManualBurnFlagReason: false,
NotStrictManualBurnFlagReason: false,
},
loading: false
}
@ -241,6 +264,8 @@ export default {
}
let res = await getTrialExtralConfig(param)
if (res.IsSuccess) {
this.uploadForm.IsOnlyUploadFile = res.Result.IsOnlyUploadFile
this.uploadForm.IsSupportUploadFile = res.Result.IsSupportUploadFile
Object.keys(this.form).forEach(key => {
this.form[key] = true
if (key === 'ReplaceContent' || key === 'ReplaceContentCN') this.form[key] = ''
@ -314,6 +339,8 @@ export default {
IsOpenLostVistRead: this.form.IsOpenLostVistRead,
IsSupportQCDownloadImage: this.form.IsSupportQCDownloadImage,
IsCloseEquipmentSurvey: !this.form.IsCloseEquipmentSurvey,
IsOnlyUploadFile: this.uploadForm.IsOnlyUploadFile,
IsSupportUploadFile: this.uploadForm.IsSupportUploadFile,
ModifyFiledList: [],
NotShowFieldList: [],
EquipmentControlFieldList: []