Merge branch 'uat'
continuous-integration/drone/push Build is passing Details

uat
wangxiaoshuang 2025-09-16 14:41:19 +08:00
commit 3b8505ba3a
11 changed files with 286 additions and 220 deletions

View File

@ -34,6 +34,7 @@ const getters = {
paymentHistoryQuery: state => state.financials.paymentHistoryQuery,
revenusQuery: state => state.financials.revenusQuery,
visitTaskList: state => state.reading.visitTaskList,
BodyPart: state => state.reading.BodyPart,
organList: state => state.reading.organList,
seriesStack: state => state.reading.seriesStack,
activeHangingAgreement: state => state.reading.activeHangingAgreement,

View File

@ -32,7 +32,8 @@ const getDefaultState = () => {
lastCanvasTaskId: '',
imageQuality: null,
imageQualityIssues: null,
currentLoadIns: []
currentLoadIns: [],
BodyPart: []
}
}
function getQuestions(questions) {
@ -171,6 +172,28 @@ function getQuestionAnswer(questions, questionMark, answers) {
return ''
}
}
async function getBodyPart(bodyPart, other) {
if (!bodyPart && !other) return ''
var separator = ','
if (bodyPart.indexOf('|') > -1) {
separator = '|'
} else if (bodyPart.indexOf(',') > -1) {
separator = ','
} else if (bodyPart.indexOf('') > -1) {
separator = ''
}
let BodyPart = {}
BodyPart.Bodypart = await Vue.prototype.$getBodyPart(Vue.prototype.$route.query.trialId)
var arr = bodyPart.split(separator)
var newArr = arr.map((i) => {
return Vue.prototype.$fd('Bodypart', i.trim(), 'Code', BodyPart, 'Name')
})
if (other) {
newArr.push(other)
}
newArr = newArr.filter(Boolean)
return newArr
}
// function getKeySeriesInfo(keyInstance, series) {
// const obj = {}
// const set = new Set()
@ -850,6 +873,14 @@ const actions = {
var studyList = []
var keyImages = []
getReadingVisitStudyList(obj.trialId, obj.subjectVisitId, obj.visitTaskId).then(res => {
try {
res.Result.forEach(async item => {
let arr = await getBodyPart(item.BodyPartForEdit, item.BodyPartForEditOther)
state.BodyPart[item.StudyId] = arr
})
} catch (err) {
console.log(err)
}
const i = res.Result.findIndex(i => i.IsCriticalSequence)
if (i > -1) {
const seriesList = res.Result[i].SeriesList && res.Result[i].SeriesList

View File

@ -47,7 +47,7 @@
<el-table-column prop="Name" :label="$t('trials:self-attachment:table:fileName')" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('trials:self-attachment:table:AttachmentCount')" prop="AttachmentCount"
show-overflow-tooltip sortable="custom">
show-overflow-tooltip>
<template slot-scope="scope">
<el-button type="text" @click.stop="openAttachment(scope.row, true)">{{ scope.row.AttachmentCount
}}</el-button>

View File

@ -7,7 +7,12 @@
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:clinicalData')" placement="bottom">
<svg-icon icon-class="documentation" class="svg-icon" />
</el-tooltip>
</div>
<!-- 检查部位 -->
<div v-else-if="CriterionType == 19 || CriterionType == 20" class="info-cd" @click.stop="handleViewBP($event)">
<el-tooltip class="item" effect="dark" :content="$t('trials:reading:button:BodyPart')" placement="bottom">
<svg-icon icon-class="documentation" class="svg-icon" />
</el-tooltip>
</div>
<!-- 切换访视 -->
<div v-if="stack.imageRendered && isReadingTaskViewInOrder === 1" class="info-visit"
@ -35,7 +40,8 @@
</div>
<div class="info-image">
<div v-show="mousePosition.mo">
Pos: {{ mousePosition.x ? mousePosition.x.toFixed(0) : '' }}, {{ mousePosition.y ? mousePosition.y.toFixed(0) : '' }}
Pos: {{ mousePosition.x ? mousePosition.x.toFixed(0) : '' }}, {{ mousePosition.y ? mousePosition.y.toFixed(0) :
'' }}
</div>
<div
v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo">
@ -2004,8 +2010,13 @@ export default {
e.stopImmediatePropagation()
e.stopPropagation()
e.preventDefault()
},
handleViewBP(e) {
DicomEvent.$emit('previewBP', this.series.studyId)
e.stopImmediatePropagation()
e.stopPropagation()
e.preventDefault()
}
}
}
</script>

View File

@ -1,57 +1,44 @@
<template>
<div ref="container" style="width:100%;height:100%" class="dicom-container">
<!-- 访视阅片 -->
<div v-if="readingCategory === 1 && (CriterionType === 7 || ((CriterionType === 1 || CriterionType === 0) && readingVersionEnum === 1)) " class="reading-wrapper">
<div
v-if="readingCategory === 1 && (CriterionType === 7 || ((CriterionType === 1 || CriterionType === 0) && readingVersionEnum === 1))"
class="reading-wrapper">
<VisitReview :reading-tool="readingTool" />
</div>
<div v-else-if="(isReadingTaskViewInOrder === 1 || ((isReadingTaskViewInOrder !== 1) && isShow)) && readingCategory=== 1 && CriterionType !== 0" class="reading-wrapper">
<div
v-else-if="(isReadingTaskViewInOrder === 1 || ((isReadingTaskViewInOrder !== 1) && isShow)) && readingCategory === 1 && CriterionType !== 0"
class="reading-wrapper">
<el-tabs v-model="activeName" v-loading="loading" :before-leave="beforeLeave">
<!-- 阅片 -->
<el-tab-pane :label="$t('trials:reading:tabTitle:review')" name="read">
<ReadPage
v-if="tabs.includes('read')"
:trial-id="trialId"
:visit-task-id="visitTaskId"
:subject-id="subjectId"
:subject-code="subjectCode"
:is-show="isShow"
:question-form-change-state="questionFormChangeState"
:question-form-change-num="questionFormChangeNum"
<ReadPage v-if="tabs.includes('read')" :trial-id="trialId" :visit-task-id="visitTaskId"
:subject-id="subjectId" :subject-code="subjectCode" :is-show="isShow"
:question-form-change-state="questionFormChangeState" :question-form-change-num="questionFormChangeNum"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
:is-exists-clinical-data="isExistsClinicalData"
:is-exists-no-dicom-file="isExistsNoDicomFile"
:is-exists-manual="isExistsManual"
:ise-c-r-f-show-in-dicom-reading="IseCRFShowInDicomReading"
@previewCD="previewCD"
/>
:is-reading-task-view-in-order="isReadingTaskViewInOrder" :is-exists-clinical-data="isExistsClinicalData"
:is-exists-no-dicom-file="isExistsNoDicomFile" :is-exists-manual="isExistsManual"
:ise-c-r-f-show-in-dicom-reading="IseCRFShowInDicomReading" @previewCD="previewCD" />
</el-tab-pane>
<!-- 报告 -->
<el-tab-pane v-if="!IseCRFShowInDicomReading" :label="$t('trials:reading:tabTitle:report')" name="report">
<ReportPage v-if="tabs.includes('report') && isShow" ref="reportPage" :question-form-change-state="questionFormChangeState" :visit-task-id="visitTaskId" />
<ReportPage v-if="tabs.includes('report') && isShow" ref="reportPage"
:question-form-change-state="questionFormChangeState" :visit-task-id="visitTaskId" />
</el-tab-pane>
</el-tabs>
</div>
<div v-else-if="(isReadingTaskViewInOrder === 1 || ((isReadingTaskViewInOrder !== 1) && isShow)) && readingCategory=== 1 && CriterionType === 0" class="reading-wrapper">
<div
v-else-if="(isReadingTaskViewInOrder === 1 || ((isReadingTaskViewInOrder !== 1) && isShow)) && readingCategory === 1 && CriterionType === 0"
class="reading-wrapper">
<el-tabs v-model="activeName" v-loading="loading" :before-leave="beforeLeaveCustomize">
<!-- 阅片 -->
<el-tab-pane :label="$t('trials:reading:tabTitle:review')" name="read">
<CustomizeReadPage
v-if="tabs.includes('read')"
:trial-id="trialId"
:trial-reading-criterion-id="TrialReadingCriterionId"
:visit-task-id="visitTaskId"
:subject-id="subjectId"
:subject-code="subjectCode"
:is-show="isShow"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
<CustomizeReadPage v-if="tabs.includes('read')" :trial-id="trialId"
:trial-reading-criterion-id="TrialReadingCriterionId" :visit-task-id="visitTaskId" :subject-id="subjectId"
:subject-code="subjectCode" :is-show="isShow" :is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-task-view-in-order="isReadingTaskViewInOrder"
:ise-c-r-f-show-in-dicom-reading="IseCRFShowInDicomReading"
:is-exists-clinical-data="isExistsClinicalData"
:is-exists-no-dicom-file="isExistsNoDicomFile"
:is-exists-manual="isExistsManual"
@previewCD="previewCD"
/>
:ise-c-r-f-show-in-dicom-reading="IseCRFShowInDicomReading" :is-exists-clinical-data="isExistsClinicalData"
:is-exists-no-dicom-file="isExistsNoDicomFile" :is-exists-manual="isExistsManual" @previewCD="previewCD" />
</el-tab-pane>
<!-- 报告 -->
<el-tab-pane v-if="!IseCRFShowInDicomReading" :label="$t('trials:reading:tabTitle:report')" name="report">
@ -60,70 +47,40 @@
</el-tabs>
</div>
<!-- 全局阅片 -->
<GlobalReview
v-else-if="isShow && readingCategory === 2"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
<GlobalReview v-else-if="isShow && readingCategory === 2" :trial-id="trialId" :subject-id="subjectId"
:visit-task-id="visitTaskId" :reading-category="readingCategory" :subject-code="subjectCode"
:task-blind-name="taskBlindName" :is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
:is-exists-clinical-data="isExistsClinicalData" />
<!-- 裁判阅片 -->
<AdReview
v-else-if="isShow && readingCategory === 4"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
<AdReview v-else-if="isShow && readingCategory === 4" :trial-id="trialId" :subject-id="subjectId"
:visit-task-id="visitTaskId" :reading-category="readingCategory" :subject-code="subjectCode"
:task-blind-name="taskBlindName" :is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
:is-exists-clinical-data="isExistsClinicalData" />
<!-- 肿瘤学阅片 -->
<OncologyReview
v-else-if="isShow && readingCategory === 5"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="visitTaskId"
:reading-category="readingCategory"
:subject-code="subjectCode"
:task-blind-name="taskBlindName"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
<OncologyReview v-else-if="isShow && readingCategory === 5" :trial-id="trialId" :subject-id="subjectId"
:visit-task-id="visitTaskId" :reading-category="readingCategory" :subject-code="subjectCode"
:task-blind-name="taskBlindName" :is-reading-show-subject-info="isReadingShowSubjectInfo"
:is-reading-show-previous-results="isReadingShowPreviousResults"
:is-exists-clinical-data="isExistsClinicalData"
/>
:is-exists-clinical-data="isExistsClinicalData" />
<el-dialog
:visible.sync="dialogVisible"
:custom-class="isFullscreen?'full-dialog-container':'dialog-container'"
:show-close="false"
:close-on-click-modal="false"
:fullscreen="isFullscreen"
>
<el-dialog :visible.sync="dialogVisible" :custom-class="isFullscreen ? 'full-dialog-container' : 'dialog-container'"
:show-close="false" :close-on-click-modal="false" :fullscreen="isFullscreen">
<span slot="title" class="dialog-footer">
<!-- 当前阅片任务存在临床数据请查看若已查看请点击确认 -->
<span v-if="!closeCDVisible">{{ $t('trials:reading:dagTitle:msg1') }}</span>
<div style="position: absolute;right: 20px;top: 10px;">
<svg-icon :icon-class="isFullscreen?'exit-fullscreen':'fullscreen'" style="cursor: pointer;font-size: 20px;" @click="isFullscreen=!isFullscreen" />
<svg-icon v-if="closeCDVisible" icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;" @click="dialogVisible = false" />
<svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
style="cursor: pointer;font-size: 20px;" @click="isFullscreen = !isFullscreen" />
<svg-icon v-if="closeCDVisible" icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
@click="dialogVisible = false" />
</div>
</span>
<div style="height: 100%;margin:0;display: flex;flex-direction: column;">
<ClinicalData
v-if="dialogVisible"
style="flex: 1"
:trial-id="trialId"
:subject-id="subjectId"
:visit-task-id="cdVisitTaskId"
:is-reading-show-subject-info="isReadingShowSubjectInfo"
/>
<ClinicalData v-if="dialogVisible" style="flex: 1" :trial-id="trialId" :subject-id="subjectId"
:visit-task-id="cdVisitTaskId" :is-reading-show-subject-info="isReadingShowSubjectInfo" />
<div v-if="!closeCDVisible" style="text-align:right">
<!-- 确认 -->
<el-button type="primary" @click="handleConfirmCD">{{ $t('trials:reading:button:confirm') }}</el-button>
@ -131,12 +88,7 @@
</div>
</el-dialog>
<el-dialog
:visible.sync="tipVisible"
:show-close="false"
:close-on-click-modal="false"
width="500px"
>
<el-dialog :visible.sync="tipVisible" :show-close="false" :close-on-click-modal="false" width="500px">
<span slot="title" class="dialog-footer">
<!-- 提示 -->
{{ $t('trials:iRecist:warnning:msg44') }}
@ -169,7 +121,27 @@
<el-button type="primary" @click="tipVisible = false">{{ $t('trials:reading:button:confirm') }}</el-button>
</span>
</el-dialog>
<el-dialog :visible.sync="dialogBodyPartVisible"
:custom-class="isFullscreen ? 'full-dialog-container' : 'dialog-container'" :show-close="false"
:close-on-click-modal="false" :fullscreen="isFullscreen">
<span slot="title" class="dialog-footer">
<!-- <span>{{ $t('trials:reading:dagTitle:msg1') }}</span> -->
<div style="position: absolute;right: 20px;top: 10px;">
<svg-icon :icon-class="isFullscreen ? 'exit-fullscreen' : 'fullscreen'"
style="cursor: pointer;font-size: 20px;" @click="isFullscreen = !isFullscreen" />
<svg-icon icon-class="dClose" style="cursor: pointer;font-size: 25px;margin-left: 10px;"
@click="dialogBodyPartVisible = false" />
</div>
</span>
<div style="height: 100%;margin:0;display: flex;flex-direction: column;">
<span>{{ Array.isArray(this.BodyPartForEdit) ? this.BodyPartForEdit.join("|") : '' }}</span>
<div style="text-align:right">
<!-- 确认 -->
<el-button type="primary" @click="dialogBodyPartVisible = false">{{ $t('trials:reading:button:confirm')
}}</el-button>
</div>
</div>
</el-dialog>
</div>
</template>
<script>
@ -188,6 +160,7 @@ import store from '@/store'
// import { getToken } from '@/utils/auth'
import { changeURLStatic } from '@/utils/history.js'
import requestPoolManager from '@/utils/request-pool'
import { mapGetters } from 'vuex'
export default {
name: 'Reading',
components: {
@ -235,9 +208,14 @@ export default {
tipVisible: false,
closeCDVisible: false,
cdVisitTaskId: '',
readingVersionEnum: null
readingVersionEnum: null,
dialogBodyPartVisible: false,
BodyPartForEdit: []
}
},
computed: {
...mapGetters(['BodyPart'])
},
mounted() {
requestPoolManager.resetRequestPool()
requestPoolManager.setSortType(0)
@ -264,6 +242,12 @@ export default {
this.dialogVisible = true
this.cdVisitTaskId = taskId
})
DicomEvent.$on('previewBP', (studyId) => {
console.log(this.BodyPart, 'this.BodyPart')
this.BodyPartForEdit = this.BodyPart[studyId]
this.isFullscreen = false
this.dialogBodyPartVisible = true
})
this.activeName = this.$router.currentRoute.query.tabName ? this.$router.currentRoute.query.tabName : 'read'
this.tabs.push(this.activeName)
this.trialId = this.$router.currentRoute.query.trialId
@ -514,98 +498,115 @@ export default {
}
</script>
<style lang="scss" scoped>
::v-deep.el-message-box__headerbtn{
::v-deep.el-message-box__headerbtn {
display: none;
}
.dicom-container{
.reading-wrapper{
width: 100%;
height: 100%;
padding: 0 5px;
box-sizing: border-box;
background-color: #000;
::v-deep.el-tabs{
box-sizing: border-box;
.dicom-container {
.reading-wrapper {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
.el-tabs__item{
color: #fff;
}
.el-tabs__header{
height: 50px;
margin:0px;
padding: 0 5px;
box-sizing: border-box;
background-color: #000;
::v-deep.el-tabs {
box-sizing: border-box;
}
.el-tabs__content{
flex: 1;
margin:0px;
box-sizing: border-box;
}
.el-tabs__item{
color: #fff;
}
.el-tab-pane{
height: 100%;
display: flex;
flex-direction: column;
.el-tabs__item {
color: #fff;
}
.el-tabs__header {
height: 50px;
margin: 0px;
box-sizing: border-box;
}
.el-tabs__content {
flex: 1;
margin: 0px;
box-sizing: border-box;
}
.el-tabs__item {
color: #fff;
}
.el-tab-pane {
height: 100%;
}
}
}
::v-deep.hot-keys-label{
color: #dfdfdf !important;
}
::v-deep.shortcut-key-input span{
color: #dfdfdf !important;
}
// ::v-deep .el-dialog{
// background: #1e1e1e;
// ::v-deep .el-dialog__body{
// padding: 10px;
// }
::v-deep.hot-keys-label {
color: #dfdfdf !important;
}
// }
::v-deep.el-dialog{
::v-deep.shortcut-key-input span {
color: #dfdfdf !important;
}
// ::v-deep .el-dialog{
// background: #1e1e1e;
// ::v-deep .el-dialog__body{
// padding: 10px;
// }
// }
::v-deep.el-dialog {
background: #1e1e1e;
border: 1px solid #ddd;
color: #ddd;
.el-dialog__title{
color:#fff;
.el-dialog__title {
color: #fff;
}
.el-input .el-input__inner{
.el-input .el-input__inner {
background-color: transparent;
color: #ddd;
border: 1px solid #5e5e5e;
}
.el-input.is-disabled .el-input__inner{
.el-input.is-disabled .el-input__inner {
background-color: #646464a1;
}
.el-form-item__label{
.el-form-item__label {
color: #dfdfdf
}
}
}
::v-deep.dialog-container{
margin-top: 50px !important;
width:75%;
height:80%;
}
::v-deep.el-dialog__body{
padding: 20px;
height: calc(100% - 70px);
}
.el-dialog__header{
::v-deep.dialog-container {
margin-top: 50px !important;
width: 75%;
height: 80%;
}
::v-deep.el-dialog__body {
padding: 20px;
height: calc(100% - 70px);
}
.el-dialog__header {
position: relative;
}
}
::v-deep .el-radio__input.is-disabled.is-checked .el-radio__inner {
background-color: #428bca;
border-color: #428bca;
}
.full-dialog-container{
::v-deep.is-fullscreen .el-dialog__body{
.full-dialog-container {
::v-deep.is-fullscreen .el-dialog__body {
height: calc(100% - 70px);
}
}
</style>

View File

@ -147,7 +147,6 @@
prop="UserType"
:label="$t('trials:staff:table:userType')"
show-overflow-tooltip
sortable
width="160"
>
<template slot-scope="scope">

View File

@ -1,60 +1,39 @@
<template>
<el-form
ref="subjectStatusForm"
v-loading="loading"
:model="form"
:rules="rules"
size="small"
label-width="160px"
>
<el-form ref="subjectStatusForm" v-loading="loading" :model="form" :rules="rules" size="small" label-width="160px">
<div class="base-dialog-body">
<!-- Status -->
<el-form-item :label="$t('trials:subject:table:status')" prop="Status">
<el-radio-group v-model="form.Status" :disabled="originalStatus === 2">
<el-radio v-for="item of $d.Subject_Visit_Status" :label="item.value" :key="item.id">{{item.label}}</el-radio>
<el-radio-group v-model="form.Status" :disabled="originalStatus === 2" @change="handleChange">
<el-radio v-for="item of $d.Subject_Visit_Status" :label="item.value" :key="item.id">
{{ item.label }}</el-radio>
</el-radio-group>
</el-form-item>
<!-- Out Visit Date -->
<el-form-item v-if="form.Status== 2" :label="$t('trials:subject:table:outVisitDate')" prop="VisitOverTime">
<el-date-picker
v-model="form.VisitOverTime"
type="date"
:picker-options="pickerOption"
value-format="yyyy-MM-dd"
format="yyyy-MM-dd"
/>
<el-form-item v-if="form.Status == 2" :label="$t('trials:subject:table:outVisitDate')" prop="VisitOverTime">
<el-date-picker v-model="form.VisitOverTime" type="date" :picker-options="pickerOption"
value-format="yyyy-MM-dd" format="yyyy-MM-dd" />
</el-form-item>
<!-- 末次访视 -->
<el-form-item v-if="form.Status===2" :label="$t('trials:subject:table:finalSubjectVisit')" prop="FinalSubjectVisitId">
<el-select
v-model="form.FinalSubjectVisitId"
clearable
filterable
style="width:100%"
:disabled="originalStatus === 2"
>
<el-option
v-for="item in subjectVisitOptions"
:key="item.Id"
:label="item.VisitName"
:value="item.Id"
/>
<el-form-item v-if="form.Status === 2" :label="$t('trials:subject:table:finalSubjectVisit')"
prop="FinalSubjectVisitId">
<el-select v-model="form.FinalSubjectVisitId" clearable filterable style="width:100%"
:disabled="originalStatus === 2">
<el-option v-for="item in subjectVisitOptions" :key="item.Id" :label="item.VisitName" :value="item.Id" />
</el-select>
</el-form-item>
<!-- 结束访视的原因 -->
<el-form-item v-if="form.Status===2" :label="$t('trials:subject:table:outVisitReason')" prop="Reason">
<el-form-item v-if="form.Status === 2" :label="$t('trials:subject:table:outVisitReason')" prop="Reason">
<el-input v-model="form.Reason" type="textarea" autosize />
</el-form-item>
<!-- 访视中止的原因 -->
<el-form-item v-if="form.Status === 3" :label="$t('trials:subject:table:outVisitReason')" prop="SuspendReason">
<el-input v-model="form.SuspendReason" type="textarea" autosize />
</el-form-item>
</div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<el-form-item style="text-align:right;">
<!-- 取消 -->
<el-button
:disabled="btnLoading"
size="small"
type="primary"
@click="handleCancel"
>
<el-button :disabled="btnLoading" size="small" type="primary" @click="handleCancel">
{{ $t('common:button:cancel') }}
</el-button>
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">
@ -83,12 +62,14 @@ export default {
OutEnrollmentTime: '',
Reason: '',
VisitOverTime: '',
FinalSubjectVisitId: ''
FinalSubjectVisitId: '',
SuspendReason: ''
},
rules: {
OutEnrollmentTime: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] }],
FinalSubjectVisitId: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] }],
Reason: [{ max: 500, message: `${this.$t('common:ruleMessage:maxLength')} 500` }],
SuspendReason: [{ max: 500, message: `${this.$t('common:ruleMessage:maxLength')} 500` }],
VisitOverTime: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] }]
},
pickerOption: {
@ -108,6 +89,9 @@ export default {
this.initForm()
},
methods: {
handleChange() {
if (this.form.Status !== 3) this.form.SuspendReason = ''
},
async initForm() {
this.loading = true
const { Result } = await getSubjectVisitSelectOptions(this.data.Id)

View File

@ -356,7 +356,14 @@ export default {
} else {
this.searchData.Asc = false
}
this.searchData.SortField = column.prop
let prop = column.prop
if (prop === 'TotalImageSizeStr') {
prop = 'TotalImageSize'
}
if (prop === 'TotalReadingImageSizeStr') {
prop = 'TotalReadingImageSize'
}
this.searchData.SortField = prop
this.searchData.PageIndex = 1
this.getList()
},

View File

@ -70,7 +70,7 @@
<el-table-column prop="BodyPartForEdit" :label="$t('trials:uploadedDicoms:table:bodyPart')" min-width="100"
show-overflow-tooltip sortable>
<template slot-scope="scope">
{{ getBodyPart(scope.row.BodyPartForEdit) }}
{{ getBodyPart(scope.row.BodyPartForEdit, scope.row.BodyPartForEditOther) }}
</template>
</el-table-column>
<!-- 序列数量 -->
@ -499,7 +499,7 @@
<!-- 检查部位 -->
<el-form-item :label="$t('trials:audit:table:bodyPart')" prop="BodyPartForEdit" :rules="[
{
required: true,
required: studyForm.BodyPartForEditOther ? false : true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
@ -508,6 +508,8 @@
<el-checkbox v-for="bodyPart in trialBodyPartTypes" :key="bodyPart" :label="bodyPart">{{
$fd('Bodypart', bodyPart, 'Code', BodyPart, 'Name')
}}</el-checkbox>
<el-input :placeholder="$t('trials:audit:placeholder:BodyPartForEditOther')"
v-model="studyForm.BodyPartForEditOther" style="width:150px;margin-left: 30px;"></el-input>
</el-checkbox-group>
</el-form-item>
<!-- 序列数量 -->
@ -604,6 +606,7 @@ export default {
BodyPartForEdit: [],
SeriesCount: null,
StudyTime: '',
BodyPartForEditOther: ''
},
uploadQueues: dicomStore.studyList, //
selectArr: [], //
@ -709,6 +712,7 @@ export default {
modality: this.studyForm.Modality,
bodyPart: this.studyForm.BodyPart,
StudyName: this.studyForm.StudyName,
BodyPartForEditOther: this.studyForm.BodyPartForEditOther,
}
updateModality(this.trialId, params)
.then((res) => {
@ -1441,7 +1445,7 @@ export default {
seriesInstanceUid: v.seriesUid,
SOPClassUID: o.SOPClassUID,
TransferSytaxUID: o.TransferSytaxUID,
MediaStorageSOPInstanceUID:o.MediaStorageSOPInstanceUID,
MediaStorageSOPInstanceUID: o.MediaStorageSOPInstanceUID,
MediaStorageSOPClassUID: o.MediaStorageSOPClassUID,
sopInstanceUid: o.instanceUid,
instanceNumber: o.instanceNumber,
@ -1530,7 +1534,7 @@ export default {
seriesInstanceUid: v.seriesUid,
SOPClassUID: o.SOPClassUID,
TransferSytaxUID: o.TransferSytaxUID,
MediaStorageSOPInstanceUID:o.MediaStorageSOPInstanceUID,
MediaStorageSOPInstanceUID: o.MediaStorageSOPInstanceUID,
MediaStorageSOPClassUID: o.MediaStorageSOPClassUID,
sopInstanceUid: o.instanceUid,
instanceNumber: o.instanceNumber,
@ -1867,8 +1871,8 @@ export default {
return ''
}
},
getBodyPart(bodyPart) {
if (!bodyPart) return ''
getBodyPart(bodyPart, other) {
if (!bodyPart && !other) return ''
var separator = ','
if (bodyPart.indexOf('|') > -1) {
separator = '|'
@ -1881,6 +1885,10 @@ export default {
var newArr = arr.map((i) => {
return this.$fd('Bodypart', i.trim(), 'Code', this.BodyPart, 'Name')
})
if (other) {
newArr.push(other)
}
newArr = newArr.filter(Boolean)
return newArr.join(' | ')
},
},

View File

@ -24,7 +24,7 @@
<!-- 检查部位 -->
<el-table-column prop="BodyPart" :label="$t('trials:uploadNonDicoms:table:bodyPart')" sortable>
<template slot-scope="scope">
{{ getBodyPart(scope.row.BodyPart) }}
{{ getBodyPart(scope.row.BodyPart, scope.row.BodyPartForEditOther) }}
</template>
</el-table-column>
<!-- 文件 -->
@ -163,7 +163,7 @@
<!-- 检查部位 -->
<el-form-item :label="$t('trials:uploadNonDicoms:table:bodyPart')" prop="BodyParts" :rules="[
{
required: true,
required: form.BodyPartForEditOther ? false : true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
@ -172,6 +172,8 @@
<el-checkbox v-for="bodyPart in trialBodyPartTypes" :key="bodyPart" :label="bodyPart">{{
$fd('Bodypart', bodyPart, 'Code', BodyPart, 'Name')
}}</el-checkbox>
<el-input :placeholder="$t('trials:audit:placeholder:BodyPartForEditOther')"
v-model="form.BodyPartForEditOther" style="width:150px;margin-left: 30px;"></el-input>
</el-checkbox-group>
</el-form-item>
<!-- 检查日期 -->
@ -381,6 +383,7 @@ export default {
Modality: '',
ImageDate: '',
StudyName: '',
BodyPartForEditOther: ""
},
pickerOption: {
disabledDate: (time) => {
@ -484,12 +487,13 @@ export default {
this.form.StudyName = ''
this.form.ImageDate = ''
this.form.BodyParts = []
this.form.BodyPartForEditOther = ''
this.dialogVisible = true
},
//
handleEdit(row) {
this.title = this.$t('trials:uploadNonDicoms:dialogTitle:edit')
const { CodeView, Id, BodyPart, Modality, ImageDate, StudyName } = {
const { CodeView, Id, BodyPart, Modality, ImageDate, StudyName, BodyPartForEditOther } = {
...row,
}
this.form.CodeView = CodeView
@ -499,6 +503,7 @@ export default {
this.form.StudyName = StudyName
this.form.ImageDate = ImageDate
this.form.BodyParts = this.form.BodyPart.split(', ')
this.form.BodyPartForEditOther = BodyPartForEditOther
this.dialogVisible = true
},
// Dicom
@ -1018,8 +1023,8 @@ export default {
})
window.open(routeData.href, '_blank')
},
getBodyPart(bodyPart) {
if (!bodyPart) return ''
getBodyPart(bodyPart, other) {
if (!bodyPart && !other) return ''
var separator = ','
if (bodyPart.indexOf('|') > -1) {
separator = '|'
@ -1032,6 +1037,10 @@ export default {
var newArr = arr.map((i) => {
return this.$fd('Bodypart', i.trim(), 'Code', this.BodyPart, 'Name')
})
if (other) {
newArr.push(other)
}
newArr = newArr.filter(Boolean)
return newArr.join(' | ')
},
//

View File

@ -100,7 +100,7 @@
<i class="el-icon-warning" style="color: #f44336; font-size: 16px" />
</el-tooltip>
<span v-else>{{
getBodyPart(scope.row.BodyPartForEdit)
getBodyPart(scope.row.BodyPartForEdit, scope.row.BodyPartForEditOther)
}}</span>
</template>
</el-table-column>
@ -284,7 +284,7 @@
<!-- 检查部位 -->
<el-table-column prop="BodyPart" :label="$t('trials:audit:table:nonDicomsBodypart')" sortable>
<template slot-scope="scope">
{{ getBodyPart(scope.row.BodyPart) }}
{{ getBodyPart(scope.row.BodyPart, scope.row.BodyPartForEditOther) }}
</template>
</el-table-column>
<!-- 文件 -->
@ -635,7 +635,7 @@
<!-- 检查部位 -->
<el-form-item :label="$t('trials:audit:table:bodyPart')" prop="BodyPartForEdit" :rules="[
{
required: true,
required: studyForm.BodyPartForEditOther ? false : true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
@ -644,6 +644,8 @@
<el-checkbox v-for="bodyPart in trialBodyPartTypes" :key="bodyPart" :label="bodyPart">{{
$fd('Bodypart', bodyPart, 'Code', BodyPart, 'Name')
}}</el-checkbox>
<el-input :placeholder="$t('trials:audit:placeholder:BodyPartForEditOther')"
v-model="studyForm.BodyPartForEditOther" style="width:150px;margin-left: 30px;"></el-input>
</el-checkbox-group>
</el-form-item>
<!-- 序列数量 -->
@ -742,7 +744,7 @@
<!-- 检查部位 -->
<el-form-item :label="$t('trials:audit:table:nonDicomsBodypart')" prop="BodyParts" :rules="[
{
required: true,
required: noneDicomForm.BodyPartForEditOther ? false : true,
message: $t('common:ruleMessage:specify'),
trigger: 'blur',
},
@ -751,6 +753,8 @@
<el-checkbox v-for="bodyPart in trialBodyPartTypes" :key="bodyPart" :label="bodyPart">{{
$fd('Bodypart', bodyPart, 'Code', BodyPart, 'Name')
}}</el-checkbox>
<el-input :placeholder="$t('trials:audit:placeholder:BodyPartForEditOther')"
v-model="noneDicomForm.BodyPartForEditOther" style="width:150px;margin-left: 30px;"></el-input>
</el-checkbox-group>
</el-form-item>
<!-- 检查日期 -->
@ -1018,7 +1022,8 @@ export default {
BodyPartForEdit: [],
SeriesCount: null,
StudyTime: '',
ModifyReason: ''
ModifyReason: '',
BodyPartForEditOther: ''
},
currentQCRow: {},
isAudit: false, //
@ -1037,7 +1042,8 @@ export default {
Modality: '',
ImageDate: '',
StudyName: '',
ModifyReason: ''
ModifyReason: '',
BodyPartForEditOther: ''
},
subjectClinicalData: {},
moment,
@ -2155,7 +2161,9 @@ export default {
this.$set(this.studyForm, 'Modality', row.ModalityForEdit)
// this.studyForm.Modality = row.ModalityForEdit
this.studyForm.BodyPartForEdit = bodyPart
// this.studyForm.BodyPartForEditOther = BodyPartForEditOther
this.$set(this.studyForm, 'ModifyReason', '')
console.log(this.studyForm, 'this.studyForm')
},
// /
handleUpdateStudyInfo() {
@ -2171,6 +2179,7 @@ export default {
modality: this.studyForm.Modality,
bodyPart: this.studyForm.BodyPart,
StudyName: this.studyForm.StudyName,
BodyPartForEditOther: this.studyForm.BodyPartForEditOther,
}
if (this.isAuditToEdit) {
this.btnLoading = false
@ -2206,6 +2215,7 @@ export default {
ModifyReason: this.studyForm.ModifyReason,
Modality: this.studyForm.Modality,
BodyPart: this.studyForm.BodyPart,
BodyPartForEditOther: this.studyForm.BodyPartForEditOther,
},
signInfo
}
@ -2241,7 +2251,7 @@ export default {
// Dicom
handleEditNoneDicomInfo(row) {
const { CodeView, Id, BodyPart, Modality, ImageDate, StudyName } = {
const { CodeView, Id, BodyPart, Modality, ImageDate, StudyName, BodyPartForEditOther } = {
...row,
}
this.noneDicomForm.StudyName = StudyName
@ -2252,6 +2262,7 @@ export default {
this.noneDicomForm.ImageDate = ImageDate
this.noneDicomForm.BodyParts = BodyPart.split(', ')
this.noneDicomForm.ModifyReason = null
this.noneDicomForm.BodyPartForEditOther = BodyPartForEditOther
this.editNoneDicomVisible = true
},
// Dicom/
@ -2434,8 +2445,8 @@ export default {
})
this.open = window.open(routeData.href, '_blank')
},
getBodyPart(bodyPart) {
if (!bodyPart) return ''
getBodyPart(bodyPart, other) {
if (!bodyPart && !other) return ''
var separator = ','
if (bodyPart.indexOf('|') > -1) {
separator = '|'
@ -2448,6 +2459,10 @@ export default {
var newArr = arr.map((i) => {
return this.$fd('Bodypart', i.trim(), 'Code', this.BodyPart, 'Name')
})
if (other) {
newArr.push(other)
}
newArr = newArr.filter(Boolean)
return newArr.join(' | ')
},
openManuals() {