调研表历史日志预览
continuous-integration/drone/push Build is passing Details

uat_us^2
wangxiaoshuang 2026-08-12 14:28:19 +08:00
parent 0bbb93d663
commit 967688e94e
5 changed files with 197 additions and 181 deletions

View File

@ -228,6 +228,12 @@ export const constantRoutes = [
component: () => import('@/views/research/form'),
hidden: true
},
{
path: '/researchLog',
name: 'researchLog',
component: () => import('@/views/research/form'),
hidden: true
},
{
path: '/researchLogin_m',
name: 'researchLogin_m',

View File

@ -1,2 +1,2 @@
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/link_expired', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms', '/ecrfList']
const WHITELIST = ['/', "/curriculumVitae", 'researchDetail_m', '/researchForm', '/ReviewersResearch', '/login', '/link_expired', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/researchLogin_m', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms', '/ecrfList', '/researchLog']
export default WHITELIST

View File

@ -1,65 +1,29 @@
<template>
<div class="log-list">
<el-table
v-loading="loading"
:data="tableData"
v-adaptive="{ bottomOffset: 40 }"
height="100"
style="width: 100%"
>
<el-table-column
prop="CreateTime"
label="时间"
min-width="120"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ scope.row.CreateTime ? moment(scope.row.CreateTime).format('YYYY-MM-DD HH:MM:SS') : '' }}
</template>
<el-table v-loading="loading" :data="tableData" v-adaptive="{ bottomOffset: 40 }" height="100" style="width: 100%">
<el-table-column prop="CreateTime" :label="时间" min-width="120" show-overflow-tooltip>
<template slot-scope="scope">
{{ scope.row.CreateTime ? moment(scope.row.CreateTime).format('YYYY-MM-DD HH:MM:SS') : '' }}
</template>
</el-table-column>
<el-table-column
prop="Name"
label="姓名"
min-width="100"
show-overflow-tooltip
>
<el-table-column prop="Name" label="姓名" min-width="100" show-overflow-tooltip>
</el-table-column>
<el-table-column
prop="UserType"
label="角色"
min-width="100"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ $fd('UserType', scope.row.IsJoin) }}
</template>
<el-table-column prop="UserType" label="角色" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ $fd('UserType', scope.row.IsJoin) }}
</template>
</el-table-column>
<el-table-column
prop="OptType"
label="操作"
min-width="100"
show-overflow-tooltip
>
<template slot-scope="scope">
{{ $fd('SiteSurveyOptTyp', scope.row.IsJoin) }}
</template>
<el-table-column prop="OptType" label="操作" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
{{ $fd('SiteSurveyOptTyp', scope.row.IsJoin) }}
</template>
</el-table-column>
<el-table-column
prop="Json"
label="详情"
min-width="100"
show-overflow-tooltip
>
<template slot-scope="scope">
<el-button v-if="scope.row.Json" type="text"></el-button>
</template>
<el-table-column prop="Json" label="详情" min-width="100" show-overflow-tooltip>
<template slot-scope="scope">
<el-button v-if="scope.row.Json" type="text" @click="openLog(scope.row)"></el-button>
</template>
</el-table-column>
<el-table-column
prop="Reason"
label="备注"
min-width="140"
show-overflow-tooltip
>
<el-table-column prop="Reason" label="备注" min-width="140" show-overflow-tooltip>
</el-table-column>
</el-table>
</div>
@ -67,6 +31,7 @@
<script>
import { getSiteSurveyLogList } from '@/api/research'
import moment from 'moment'
import { getToken } from '@/utils/auth'
export default {
name: 'LogList',
props: {
@ -79,7 +44,8 @@ export default {
return {
loading: false,
tableData: [],
moment
moment,
openWindow: null
}
},
mounted() {
@ -93,11 +59,20 @@ export default {
if (res.IsSuccess) {
this.tableData = res.Result
}
} catch(e) {
} catch (e) {
console.log(e)
} finally {
this.loading = false
}
},
openLog(row) {
if (this.openWindow) {
this.openWindow.close()
}
var token = getToken()
var path = `/researchLog?trialId=${this.$route.query.trialId}&trialSiteSurveyId=${this.trialSiteSurveyId}&logId=${row.Id}&TokenKey=${token}`
this.openWindow = window.open(path, '_blank')
}
}
}

View File

@ -8,7 +8,7 @@
<!-- <TopLang style="position: fixed;top: 40px;right: 40px" /> -->
<div style="display: flex;justify-content: space-between;" v-if="!isPreview">
<div>{{ $t('trials:researchForm:title:researchSurveyStatus') }} <el-tag>{{ $fd('ResearchRecord', state)
}}</el-tag></div>
}}</el-tag></div>
<div>
<!-- 提交 -->
<el-button v-if="(state === 0 && userTypeEnumInt === 0)" type="primary" size="small"
@ -36,7 +36,7 @@
{{ $t('trials:researchForm:button:historicalRecord') }}
</el-button>
<!-- 操作日志 -->
<el-button type="primary" size="small" @click="viewLog">
<el-button type="primary" size="small" v-if="!isLog" @click="viewLog">
{{ $t('trials:researchForm:button:log') }}
</el-button>
<!-- 退出 -->
@ -166,8 +166,8 @@
</div>
</template>
<script>
import { getSiteSurveyInfo, trialSurveySubmit, submissionRejection } from '@/api/research'
import { getQueryString } from '@/utils/history.js'
import { getSiteSurveyInfo, trialSurveySubmit, submissionRejection, getSiteSurveyLogList } from '@/api/research'
import { getQueryString, changeURLStatic } from '@/utils/history.js'
import BaseInfo from './components/BaseInfo'
import HistoricalParticipant from './components/HistoricalParticipant'
import ParticipantList from './components/ParticipantList'
@ -176,6 +176,7 @@ import { mapMutations } from 'vuex'
import TopLang from './topLang'
import HistoricalRecord from './components/HistoricalRecord'
import LogList from './components/LogList'
import store from '@/store'
export default {
name: 'QuestionForm',
components: { BaseInfo, HistoricalParticipant, ParticipantList, EquipmentList, TopLang, HistoricalRecord, LogList },
@ -202,7 +203,9 @@ export default {
siteSurveyNoteInfo: {},
IsSupportUploadFile: false,
IsOnlyUploadFile: false,
logVisible: false
logVisible: false,
isLog: false,
logId: null
}
},
mounted() {
@ -218,6 +221,12 @@ export default {
this.setLanguage(lang)
this.$updateDictionary()
this.trialSiteSurveyId = getQueryString('trialSiteSurveyId')
this.logId = getQueryString('logId')
if (this.logId) this.isLog = true
if (this.$router.currentRoute.query.TokenKey) {
store.dispatch('user/setToken', this.$router.currentRoute.query.TokenKey)
changeURLStatic('TokenKey', '')
}
this.initPage()
if (zzSessionStorage.getItem('userTypeEnumInt')) {
this.userTypeEnumInt = zzSessionStorage.getItem('userTypeEnumInt') * 1
@ -233,36 +242,75 @@ export default {
//
initPage() {
this.loading = true
getSiteSurveyInfo(this.trialId, this.trialSiteSurveyId).then(res => {
if (res.Result) {
// this.trialSiteSurveyEquipmentType = res.Result.TrialInfo.TrialSiteSurveyEquipmentType
// this.trialSiteSurveyUserRoles = res.Result.TrialInfo.TrialSiteSurveyUserRoles
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
this.$refs['baseResearchInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null)
var historicalArr = []
var newArr = []
res.Result.TrialSiteUserSurveyList.map(i => {
if (i.IsHistoryUser) {
historicalArr.push(i)
} else {
newArr.push(i)
if (this.isLog) {
getSiteSurveyLogList({ trialSiteSurveyId: this.trialSiteSurveyId, Id: this.logId }).then(r => {
if (r.Result && r.Result[0].Json) {
let res = {
Result: JSON.parse(r.Result[0].Json)
}
})
if (res.Result) {
// this.trialSiteSurveyEquipmentType = res.Result.TrialInfo.TrialSiteSurveyEquipmentType
// this.trialSiteSurveyUserRoles = res.Result.TrialInfo.TrialSiteSurveyUserRoles
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 = 3
this.siteId = res.Result.TrialSiteSurvey.TrialSiteId
this.$refs['baseResearchInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null)
var historicalArr = []
var newArr = []
res.Result.TrialSiteUserSurveyList.map(i => {
if (i.IsHistoryUser) {
historicalArr.push(i)
} else {
newArr.push(i)
}
})
this.$refs['historicalParticipant'].initList(historicalArr, res.Result.TrialSiteSurvey)
this.$refs['researchParticipants'].initList(newArr, res.Result.TrialSiteSurvey)
this.$refs['researchEquipments'].initList(res.Result.TrialSiteEquipmentSurveyList, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig.EquipmentControlFieldList)
this.isExistIncorrect = res.Result.TrialSiteUserSurveyList.every(item => item.IsCorrect === false)
}
this.loading = false
}
}).catch((err) => { console.log(err); this.loading = false })
} else {
getSiteSurveyInfo(this.trialId, this.trialSiteSurveyId).then(res => {
if (res.Result) {
// this.trialSiteSurveyEquipmentType = res.Result.TrialInfo.TrialSiteSurveyEquipmentType
// this.trialSiteSurveyUserRoles = res.Result.TrialInfo.TrialSiteSurveyUserRoles
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
this.$refs['baseResearchInfo'].initForm(res.Result.TrialInfo, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig ? res.Result.SiteSurveyFiledConfig.NotShowFieldList : null)
var historicalArr = []
var newArr = []
res.Result.TrialSiteUserSurveyList.map(i => {
if (i.IsHistoryUser) {
historicalArr.push(i)
} else {
newArr.push(i)
}
})
this.$refs['historicalParticipant'].initList(historicalArr, res.Result.TrialSiteSurvey)
this.$refs['researchParticipants'].initList(newArr, res.Result.TrialSiteSurvey)
this.$refs['researchEquipments'].initList(res.Result.TrialSiteEquipmentSurveyList, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig.EquipmentControlFieldList)
this.isExistIncorrect = res.Result.TrialSiteUserSurveyList.every(item => item.IsCorrect === false)
}
this.loading = false
}).catch(() => { this.loading = false })
}
this.$refs['historicalParticipant'].initList(historicalArr, res.Result.TrialSiteSurvey)
this.$refs['researchParticipants'].initList(newArr, res.Result.TrialSiteSurvey)
this.$refs['researchEquipments'].initList(res.Result.TrialSiteEquipmentSurveyList, res.Result.TrialSiteSurvey, res.Result.SiteSurveyFiledConfig.EquipmentControlFieldList)
this.isExistIncorrect = res.Result.TrialSiteUserSurveyList.every(item => item.IsCorrect === false)
}
this.loading = false
}).catch(() => { this.loading = false })
},
//
handleSubmit(type) {

View File

@ -1,39 +1,22 @@
<template>
<BaseContainer>
<div class="step-wrapper">
<el-steps
:active="activeStatus"
align-center
:space="300"
>
<el-steps :active="activeStatus" align-center :space="300">
<!-- 中心填写 -->
<el-step
:title="$t('trials:siteResearch:timeline:step1')"
class="click_cursor"
@click.native="handleClick(0)"
/>
<el-step :title="$t('trials:siteResearch:timeline:step1')" class="click_cursor"
@click.native="handleClick(0)" />
<!-- SPM审核 -->
<el-step
v-show="isSPMJoin"
:title="$t('trials:siteResearch:timeline:step2')"
class="click_cursor"
@click.native="handleClick(1)"
/>
<el-step v-if="isSPMJoin" :title="$t('trials:siteResearch:timeline:step2')" class="click_cursor"
@click.native="handleClick(1)" />
<!-- PM审核 -->
<el-step
:title="$t('trials:siteResearch:timeline:step3')"
class="click_cursor"
@click.native="handleClick(2)"
/>
<el-step :title="$t('trials:siteResearch:timeline:step3')" class="click_cursor"
@click.native="handleClick(2)" />
<!-- 审核完毕 -->
<el-step
:title="$t('trials:siteResearch:timeline:step14')"
class="click_cursor"
@click.native="handleClick(3)"
/>
<el-step :title="$t('trials:siteResearch:timeline:step14')" class="click_cursor"
@click.native="handleClick(3)" />
</el-steps>
<div class="step-content">
<ResearchList ref="researchList"/>
<ResearchList ref="researchList" />
</div>
</div>
</BaseContainer>
@ -59,92 +42,96 @@ export default {
deep: true,
immediate: true,
handler(v) {
this.$nextTick(() =>{
this.$nextTick(() => {
this.$refs['researchList'].searchData.State = v
this.$refs['researchList'].getList()
})
}
}
},
mounted() {
this.getTrialIsSPMJoin()
if (this.hasPermi(['role:pm'])) this.activeStatus = 2
if (this.hasPermi(['role:spm'])) this.activeStatus = 1
},
methods: {
async getTrialIsSPMJoin() {
try {
let trialId = this.$route.query.trialId
if (!trialId) return
let res = await getTrialIsSPMJoin( trialId )
let res = await getTrialIsSPMJoin(trialId)
this.isSPMJoin = res.Result
} catch(e) {
} catch (e) {
console.log(e)
}
},
handleClick(step) {
this.activeStatus = step
},
}
}
</script>
<style lang="scss" scoped>
.step-wrapper {
height: 100%;
flex: 1;
display: flex;
flex-direction: column;
padding: 0;
margin: 0;
background-color: #fff;
}
.el-steps {
height: 80px;
justify-content: center;
}
.step-content {
flex: 1;
}
// .underline {
// // .el-step__title {
// // text-decoration: underline
// // }
// .el-step__title,
// .el-step__title.is-process,
// .el-step__title.is-finish {
// text-decoration: underline;
// }
// }
// .noneUnderline {
// .el-step__title {
// text-decoration: none;
// }
// }
// .el-step__head.is-process,
// .el-step__title.is-process,
// .el-step__description.is-process {
// color: #428bca;
// border-color: #428bca;
// }
// .el-step__head.is-process .el-step__line {
// background-color: #428bca;
// }
// .el-step__head.is-finish,
// .el-step__title.is-finish,
// .el-step__description.is-finish {
// color: #303133;
// border-color: #303133;
// }
// .el-step__title.is-process,
// .el-step__title.is-finish {
// text-decoration: none;
// }
// .el-step__head.is-finish .el-step__line {
// background-color: #303133;
// }
.click_cursor {
cursor: pointer;
}
.step-wrapper {
height: 100%;
flex: 1;
display: flex;
flex-direction: column;
padding: 0;
margin: 0;
background-color: #fff;
}
.el-steps {
height: 80px;
justify-content: center;
}
.step-content {
flex: 1;
}
// .underline {
// // .el-step__title {
// // text-decoration: underline
// // }
// .el-step__title,
// .el-step__title.is-process,
// .el-step__title.is-finish {
// text-decoration: underline;
// }
// }
// .noneUnderline {
// .el-step__title {
// text-decoration: none;
// }
// }
// .el-step__head.is-process,
// .el-step__title.is-process,
// .el-step__description.is-process {
// color: #428bca;
// border-color: #428bca;
// }
// .el-step__head.is-process .el-step__line {
// background-color: #428bca;
// }
// .el-step__head.is-finish,
// .el-step__title.is-finish,
// .el-step__description.is-finish {
// color: #303133;
// border-color: #303133;
// }
// .el-step__title.is-process,
// .el-step__title.is-finish {
// text-decoration: none;
// }
// .el-step__head.is-finish .el-step__line {
// background-color: #303133;
// }
.click_cursor {
cursor: pointer;
}
</style>