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

uat_us
wangxiaoshuang 2025-01-03 09:19:12 +08:00
commit 907371b693
7 changed files with 357 additions and 105 deletions

View File

@ -252,17 +252,25 @@ export function uploadOCTLipidAngleTemplate(param) {
}) })
} }
export function saveTableQuestionMark(param) { export function saveTableQuestionMark(param, type) {
return request({ return request({
url: `/ReadingImageTask/saveTableQuestionMark`, url: `/saveTableQuestionMark/${type}`,
method: 'post', method: 'post',
data: param data: param
}) })
} }
export function deleteTableQuestionMark(param) { export function deleteTableQuestionMark(param, type) {
return request({ return request({
url: `/ReadingImageTask/deleteTableQuestionMark`, url: `/deleteTableQuestionMark/${type}`,
method: 'post',
data: param
})
}
export function submitTaskRowInfo(param, type) {
return request({
url: `/SubmitTaskRowInfo/${type}`,
method: 'post', method: 'post',
data: param data: param
}) })

View File

@ -3931,4 +3931,23 @@ export function updateTrialUserRole(data) {
method: 'put', method: 'put',
data data
}) })
}
// 获取报表配置
export function getTrialQuestionExportResult(data) {
return request({
url: `/ReadingQuestion/getTrialQuestionExportResult`,
method: 'post',
data
})
}
// 修改报表配置
export function setTrialQuestionExportResult(data) {
return request({
url: `/ReadingQuestion/SetTrialQuestionExportResult`,
method: 'post',
data
})
} }

View File

@ -202,8 +202,8 @@
</el-form> </el-form>
</template> </template>
<script> <script>
import { submitTableQuestion } from '@/api/trials' // import { submitTableQuestion } from '@/api/trials'
import { saveTableQuestionMark, deleteTableQuestionMark } from '@/api/reading' import { saveTableQuestionMark, submitTaskRowInfo, deleteTableQuestionMark } from '@/api/reading'
import DicomEvent from './../DicomEvent' import DicomEvent from './../DicomEvent'
import store from '@/store' import store from '@/store'
export default { export default {
@ -328,6 +328,7 @@ export default {
if (!isNaN(parseInt(isMeasurable)) && parseInt(isMeasurable) === 1) { if (!isNaN(parseInt(isMeasurable)) && parseInt(isMeasurable) === 1) {
this.isDisabledMeasurableRadio = true this.isDisabledMeasurableRadio = true
} }
i.MeasureData = JSON.parse(i.MeasureData)
} }
this.markList.push({tableQuestionId: i.TableQuestionId, measureData: i, saveEnum: 1}) this.markList.push({tableQuestionId: i.TableQuestionId, measureData: i, saveEnum: 1})
}) })
@ -581,7 +582,7 @@ export default {
async saveTableQuestionInfo(params, qs) { async saveTableQuestionInfo(params, qs) {
const loading = this.$loading({ fullscreen: true }) const loading = this.$loading({ fullscreen: true })
try { try {
let res = await saveTableQuestionMark(params) let res = await saveTableQuestionMark(params, 11)
if (res.IsSuccess) { if (res.IsSuccess) {
// //
let i = this.markList.findIndex(i=>i.tableQuestionId === qs.Id) let i = this.markList.findIndex(i=>i.tableQuestionId === qs.Id)
@ -702,7 +703,7 @@ export default {
try { try {
let isResetMarks = this.markList.findIndex(i=>i.measureData && i.measureData.MeasureData) > -1 ? true : false let isResetMarks = this.markList.findIndex(i=>i.measureData && i.measureData.MeasureData) > -1 ? true : false
if (parseInt(this.questionForm[this.isMeasurableId]) === 0 && this.isExitsMarks) { if (parseInt(this.questionForm[this.isMeasurableId]) === 0 && this.isExitsMarks) {
await deleteTableQuestionMark({rowId: this.questionForm.RowId}) await deleteTableQuestionMark({rowId: this.questionForm.RowId}, 11)
this.markList.forEach(i => { this.markList.forEach(i => {
if (i.measureData && i.measureData.MeasureData) { if (i.measureData && i.measureData.MeasureData) {
i.measureData = '' i.measureData = ''
@ -729,7 +730,7 @@ export default {
answerList: answers, answerList: answers,
isDicomReading: true isDicomReading: true
} }
const res = await submitTableQuestion(params) const res = await submitTaskRowInfo(params, 11)
if (res.IsSuccess) { if (res.IsSuccess) {
// //
this.$message.success(this.$t('common:message:savedSuccessfully')) this.$message.success(this.$t('common:message:savedSuccessfully'))

View File

@ -0,0 +1,123 @@
<template>
<div style="text-align: right">
<el-tabs v-model="activeName">
<el-tab-pane
label="报表导出"
name="report"
>
<el-tabs type="border-card" v-model="reportCriterionId">
<el-tab-pane
:label="i.TrialReadingCriterionName"
:name="i.TrialReadingCriterionId"
v-for="i of trialCriterionList"
:key="i.TrialReadingCriterionId"
>
<exportList
v-if="reportCriterionId === i.TrialReadingCriterionId && activeName === 'report'"
:trialReadingCriterionId="i.TrialReadingCriterionId"
:data="data"
/>
</el-tab-pane>
</el-tabs>
</el-tab-pane>
<el-tab-pane
label="CDISC导出"
name="CDISC"
>
</el-tab-pane>
<el-tab-pane
label="报表导出配置"
name="reportConfig"
>
<el-tabs type="border-card" v-model="reportConfigCriterionId">
<el-tab-pane
:label="i.TrialReadingCriterionName"
:name="i.TrialReadingCriterionId"
v-for="i of trialCriterionList"
:key="i.TrialReadingCriterionId"
>
<configList
v-if="reportConfigCriterionId === i.TrialReadingCriterionId && activeName === 'reportConfig'"
:trialReadingCriterionId="i.TrialReadingCriterionId"
:exportType="0"
/>
</el-tab-pane>
</el-tabs>
</el-tab-pane>
<el-tab-pane
label="CDISC导出配置"
name="CDISCConfig"
>
<el-tabs type="border-card" v-model="CDISCCriterionId">
<el-tab-pane
:label="i.TrialReadingCriterionName"
:name="i.TrialReadingCriterionId"
v-for="i of trialCriterionList"
:key="i.TrialReadingCriterionId"
>
<configList
v-if="CDISCCriterionId === i.TrialReadingCriterionId && activeName === 'CDISCConfig'"
:trialReadingCriterionId="i.TrialReadingCriterionId"
:exportType="1"
/>
</el-tab-pane>
</el-tabs>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import { getTrialCriterionList } from '@/api/trials/reading'
import exportList from './exportList'
import configList from './configList'
export default {
name: 'ReviewResults',
components: {
exportList,
configList
},
data() {
return {
loading: false,
trialCriterionList: [],
reportCriterionId: null,
trialId: null,
activeName: 'report',
reportConfigCriterionId: '',
CDISCCriterionId: ''
}
},
props: {
data: {
type: Object,
default() {
return {}
},
},
},
mounted() {
this.trialId = this.$route.query.trialId
this.getTrialCriterionList()
},
methods: {
async getTrialCriterionList() {
try {
let res = await getTrialCriterionList(this.trialId)
if (res.IsSuccess) {
this.trialCriterionList = res.Result
this.reportCriterionId = this.trialCriterionList[0].TrialReadingCriterionId
this.reportConfigCriterionId = this.trialCriterionList[0].TrialReadingCriterionId
this.CDISCCriterionId = this.trialCriterionList[0].TrialReadingCriterionId
}
} catch(e) {
console.log(e)
}
},
},
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,127 @@
<template>
<div>
<el-button type="primary" size="mini" @click="submit" style="margin-bottom: 5px;">提交</el-button>
<el-table
v-loading="loading"
:data="exportInfo.QuestionList"
height="500"
row-key="Id"
border
default-expand-all
:tree-props="{ children: 'Children', hasChildren: 'hasChildren' }"
>
<el-table-column
prop="QuestionName"
label="问题名称"
width="300">
</el-table-column>
<el-table-column
v-for="item in exportInfo.DicList"
:key="item.Code"
:label="item.ValueCN" >
<template v-slot="scope">
<el-checkbox
@change="() => changeState(scope, item.Code)"
:checked="getCheckState(scope, item.Code)">
</el-checkbox>
</template>
</el-table-column>
<el-table-column
v-if="exportType === 1"
prop="CDISCCode"
label="CDISC编码"
width="500"
>
<template v-slot="scope">
<el-input v-model="scope.row.CDISCCode" placeholder="CDISC编码"></el-input>
</template>
</el-table-column>
</el-table>
</div>
</template>
<script>
import { getTrialQuestionExportResult, setTrialQuestionExportResult } from '@/api/trials'
export default {
name: 'configList',
props: {
trialReadingCriterionId: {
type: String,
required: true
},
exportType: {
type: Number,
required: true
}
},
data() {
return {
loading: false,
exportInfo: []
}
},
mounted() {
this.getConfigInfo()
},
methods: {
async getConfigInfo() {
try {
this.loading = true
let res = await getTrialQuestionExportResult({trialReadingCriterionId: this.trialReadingCriterionId})
if (res.IsSuccess) {
this.exportInfo = res.Result
}
this.loading = false
} catch(e) {
this.loading = false
console.log(e)
}
},
async submit() {
this.loading = true
try {
let params= {
exportType: this.exportType,
questionList: [],
tableQuestionList: []
}
params.questionList = this.exportInfo.QuestionList.map(i => {
return {
questionId: i.QuestionId,
tableQuestionId: i.TableQuestionId,
exportResult: i.ExportResult,
CDISCCode: i.CDISCCode
}
})
this.exportInfo.QuestionList.forEach(i => {
let childlist = i.Children.map(k => {
return {
questionId: i.QuestionId,
tableQuestionId: k.TableQuestionId,
exportResult: k.ExportResult,
CDISCCode: k.CDISCCode
}
})
params.tableQuestionList = params.tableQuestionList.concat(childlist)
})
let res = await setTrialQuestionExportResult(params)
if (res.IsSuccess) {
this.$message.success(this.$t('common:message:savedSuccessfully'))
}
this.loading = false
} catch(e) {
this.loading = false
console.log(e)
}
},
//
getCheckState(item, code) {
return item.row.ExportResult.indexOf(code) > -1
},
//
changeState(item, code) {
item.row.ExportResult.indexOf(code) > -1 ? item.row.ExportResult.splice(item.row.ExportResult.indexOf(code), 1) : item.row.ExportResult.push(code);
},
}
}
</script>

View File

@ -1,58 +1,41 @@
<template> <template>
<div style="text-align: right"> <el-table
<!--导出--> v-loading="loading"
<el-button :data="list"
type="primary" border
:disabled="!(trialCriterionList.length > 0)" stripe
icon="el-icon-download" height="500">
size="mini" <el-table-column label="" :min-width="50">
@click="handleExport(0)" <template slot-scope="scope">
style="margin-bottom: 10px" {{ scope.$index + 1 }}
</template>
</el-table-column>
<!-- 文件名称 -->
<el-table-column
:label="$t('trials:reviewTrack:title:fileName')"
:min-width="50"
> >
{{ $t('common:button:export') }} <template slot-scope="scope">
</el-button> {{ scope.row.FileName }}
<el-tabs type="border-card" v-model="TrialReadingCriterionId"> </template>
<el-tab-pane </el-table-column>
:label="i.TrialReadingCriterionName" <el-table-column
:name="i.TrialReadingCriterionId" prop=""
v-for="i of trialCriterionList" :label="$t('common:action:action')"
:key="i.TrialReadingCriterionId" min-width="80"
> >
<el-table v-loading="loading" :data="list" border stripe> <template slot-scope="scope">
<el-table-column label="" :min-width="50"> <!-- 下载 -->
<template slot-scope="scope"> <el-button
{{ scope.$index + 1 }} icon="el-icon-download"
</template> circle
</el-table-column> :title="$t('trials:reviewTrack:title:download')"
<!-- 文件名称 --> size="mini"
<el-table-column @click="handleExport(scope.row.ExportCatogory)"
:label="$t('trials:reviewTrack:title:fileName')" />
:min-width="50" </template>
> </el-table-column>
<template slot-scope="scope"> </el-table>
{{ scope.row.FileName }}
</template>
</el-table-column>
<el-table-column
prop=""
:label="$t('common:action:action')"
min-width="80"
>
<template slot-scope="scope">
<!-- 下载 -->
<el-button
icon="el-icon-download"
circle
:title="$t('trials:reviewTrack:title:download')"
size="mini"
@click="handleExport(scope.row.ExportCatogory)"
/>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
</template> </template>
<script> <script>
@ -65,51 +48,49 @@ import {
getEvaluationOfTumorEfficacy_Export, getEvaluationOfTumorEfficacy_Export,
getDetailedOfEvaluatedLesion_Export, getDetailedOfEvaluatedLesion_Export,
} from '@/api/export' } from '@/api/export'
import { getTrialCriterionList } from '@/api/trials/reading'
export default { export default {
name: 'exportList', name: 'exportList',
data() {
return {
loading: false,
trialCriterionList: [],
TrialReadingCriterionId: null,
trialId: null,
list: [],
}
},
props: { props: {
trialReadingCriterionId: {
type: String,
required: true
},
data: { data: {
type: Object, type: Object,
default() { default() {
return {} return {}
}, }
}, }
}, },
watch: { data() {
TrialReadingCriterionId(v) { return {
if (v === '0') return loading: false,
this.loading = true trialId: null,
getTrialReadingCriterionCanExportDocumentList({ list: []
TrialReadingCriterionId: v, }
})
.then((res) => {
this.list = res.Result
this.loading = false
})
.catch(() => {
this.loading = true
})
},
}, },
mounted() { mounted() {
this.trialId = this.$route.query.trialId this.getList()
this.getTrialCriterionList()
}, },
methods: { methods: {
async getList() {
this.loading = true
try {
let res = await getTrialReadingCriterionCanExportDocumentList({
TrialReadingCriterionId: this.trialReadingCriterionId,
})
if (res.IsSuccess) {
this.list = res.Result
}
this.loading = false
} catch(e) {
console.log(e)
this.loading = false
}
},
handleExport(type) { handleExport(type) {
var searchData = { ...this.data } var searchData = { ...this.data }
searchData.TrialReadingCriterionId = this.TrialReadingCriterionId searchData.TrialReadingCriterionId = this.trialReadingCriterionId
switch (type) { switch (type) {
case 0: case 0:
getReadingTaskList_Export(searchData) getReadingTaskList_Export(searchData)
@ -183,15 +164,6 @@ export default {
break break
} }
}, },
getTrialCriterionList() {
getTrialCriterionList(this.trialId)
.then((res) => {
this.trialCriterionList = res.Result
this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId
})
.catch(() => {})
},
}, },
} }
</script> </script>

View File

@ -833,11 +833,13 @@
</el-dialog> </el-dialog>
<el-dialog <el-dialog
v-if="exportVisible" v-if="exportVisible"
v-dialogDrag
:title="$t('trials:reviewTrack:button:export')" :title="$t('trials:reviewTrack:button:export')"
:visible.sync="exportVisible" :visible.sync="exportVisible"
:close-on-click-modal="false" :close-on-click-modal="false"
width="60%"
append-to-body> append-to-body>
<exportList :trial-reading-criterion-id="TrialReadingCriterionId" :data="searchData" /> <ReviewResults :data="searchData" />
</el-dialog> </el-dialog>
@ -946,7 +948,7 @@ import { changeURLStatic } from '@/utils/history.js'
import BaseContainer from '@/components/BaseContainer' import BaseContainer from '@/components/BaseContainer'
import Pagination from '@/components/Pagination' import Pagination from '@/components/Pagination'
import RefereeRules from './components/RefereeRules.vue' import RefereeRules from './components/RefereeRules.vue'
import exportList from './components/exportList.vue' import ReviewResults from './components/ReviewResults'
import ClinicalData from "../../subject/reading-period/components/ClinicalData" import ClinicalData from "../../subject/reading-period/components/ClinicalData"
import RecordList from './components/RecordList.vue' import RecordList from './components/RecordList.vue'
const searchDataDefault = () => { const searchDataDefault = () => {
@ -978,7 +980,7 @@ const searchDataDefault = () => {
} }
export default { export default {
name: 'TrialsNotice', name: 'TrialsNotice',
components: { BaseContainer, Pagination, RefereeRules, ClinicalData, exportList, RecordList }, components: { BaseContainer, Pagination, RefereeRules, ClinicalData, ReviewResults, RecordList },
props: { props: {
AllocationReadingCategory: { AllocationReadingCategory: {
type: String type: String