caiyiling 2024-04-24 09:52:18 +08:00
commit 5fe8fdedbf
17 changed files with 699 additions and 147 deletions

View File

@ -170,3 +170,12 @@ export function downLoadReadReport(data) {
data data
}) })
} }
// 预览阅片报告
export function showReadReport(data) {
return request({
url: `/ReadingImageTask/downLoadReadReport`,
method: 'post',
responseType: 'blob',
data
})
}

View File

@ -3558,24 +3558,42 @@ export function getSystemConfirmedCreiterionList() {
}) })
} }
// 获取项目授权 // 获取项目授权信息
export function getTrialAuthorizationCode(params) { export function getTrialAuthorizationInfo(params) {
return request({ return request({
url: `/Patient/getTrialAuthorizationCode`, url: `/Patient/getTrialAuthorizationInfo`,
method: 'get', method: 'get',
params params
}) })
} }
// 获取项目激活码 // 获取激活码信息
export function getTrialActivationCode(params) { export function getActivationCodeInfo(params) {
return request({ return request({
url: `/Patient/getTrialActivationCode`, url: `/Patient/getActivationCodeInfo`,
method: 'get', method: 'get',
params params
}) })
} }
// 获取项目授权码
export function getTrialAuthorizationCode(data) {
return request({
url: `/Patient/getTrialAuthorizationCode`,
method: 'post',
data
})
}
// 获取项目激活码
export function getTrialActivationCode(data) {
return request({
url: `/Patient/getTrialActivationCode`,
method: 'post',
data
})
}
// 设置项目授权信息 // 设置项目授权信息
export function activateTrial(params) { export function activateTrial(params) {
return request({ return request({
@ -3584,3 +3602,12 @@ export function activateTrial(params) {
params params
}) })
} }
// 获取项目授权码信息
export function getAuthorizationCodeInfo(params) {
return request({
url: `/Patient/getAuthorizationCodeInfo`,
method: 'get',
params
})
}

View File

@ -9,7 +9,7 @@
/> />
<!-- <embed v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" style="width: 100%; height: 100%"> --> <!-- <embed v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" style="width: 100%; height: 100%"> -->
<!-- <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" width="100%" height="100%" frameborder="0" /> --> <!-- <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" width="100%" height="100%" frameborder="0" /> -->
<iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${filePath}?userName=${currentUser}`" width="100%" height="100%" frameborder="0" /> <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="isLocal?`/static/pdfjs/web/viewer.html?file=${filePath}`:`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${filePath}?userName=${currentUser}`" width="100%" height="100%" frameborder="0" />
<!-- <pdf--> <!-- <pdf-->
<!-- v-else-if="fileType.indexOf('pdf') !== -1"--> <!-- v-else-if="fileType.indexOf('pdf') !== -1"-->
<!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">--> <!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">-->
@ -36,6 +36,10 @@ export default {
fileType: { fileType: {
type: String, type: String,
required: true required: true
},
isLocal:{
type: Boolean,
default:false
} }
}, },
data() { data() {

View File

@ -0,0 +1,47 @@
<template>
<el-dialog
:visible.sync="visible"
:title="fileData.name"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
:before-close="close"
>
<div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<PreviewFile
v-if="visible"
:file-path="fileData.path"
:file-type="fileData.name"
:isLocal="true"
/>
</div>
</el-dialog>
</template>
<script>
import PreviewFile from "@/components/PreviewFile/index";
export default {
name: "PreviewFileDialog",
components: { PreviewFile },
props: {
fileData: {
required: true,
type: Object,
default: () => {
return {};
},
},
visible: {
required: true,
type: Boolean,
default: false,
},
},
methods: {
close() {
this.$emit("update:visible", false);
},
},
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -10,7 +10,7 @@ import { OSSclient } from './utils/oss'
NProgress.configure({ showSpinner: false }) NProgress.configure({ showSpinner: false })
const whiteList = ['/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms'] const whiteList = ['/activate','/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
NProgress.start() NProgress.start()

View File

@ -221,6 +221,11 @@ export const constantRoutes = [
hidden: true, hidden: true,
component: () => import('@/views/trials/trials-panel/setting/reading-unit/preview') component: () => import('@/views/trials/trials-panel/setting/reading-unit/preview')
}, },
{
path: '/activate',
component: () => import('@/views/trials/trials-list/components/activate-page.vue'),
hidden: true
},
// { // {
// path: '/audit', // path: '/audit',
// name: 'audit', // name: 'audit',

View File

@ -5,7 +5,10 @@ import Vue from 'vue';
import { import {
getSubjectImageZipInfo, getSubjectImageZipInfo,
} from "@/api/trials/visit.js"; } from "@/api/trials/visit.js";
let flag = false;
export const downloadImage = async (id, id2) => { export const downloadImage = async (id, id2) => {
if (flag) return
flag = true
try { try {
let res = await getSubjectImageZipInfo(id, id2); let res = await getSubjectImageZipInfo(id, id2);
if (res.IsSuccess) { if (res.IsSuccess) {
@ -74,6 +77,7 @@ const setfolder = async (item) => {
}) })
.then((res) => { .then((res) => {
saveAs(res, zipName + ".zip"); // 使用FileSaver.saveAs保存文件文件名可自定义 saveAs(res, zipName + ".zip"); // 使用FileSaver.saveAs保存文件文件名可自定义
flag = false;
zipObj = null; zipObj = null;
}); });
}) })
@ -104,3 +108,13 @@ const getFileData = (fileUrl) => {
}); });
}); });
}; };
export const fileDownload = (content, filename) => {
const eleLink = document.createElement("a");
eleLink.download = filename;
eleLink.style.display = "none";
const blob = new Blob([content]);
eleLink.href = URL.createObjectURL(blob);
document.body.appendChild(eleLink);
eleLink.click();
document.body.removeChild(eleLink);
};

View File

@ -25,8 +25,8 @@
> >
<el-select v-model="searchData.NoticeTypeEnum" clearable size="small"> <el-select v-model="searchData.NoticeTypeEnum" clearable size="small">
<el-option <el-option
v-for="item of $d.NoteType" v-for="item of $d.TrialType"
:key="item.value" :key="item.id"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
/> />
@ -60,10 +60,10 @@
size="small" size="small"
> >
<el-option <el-option
v-for="item of roleList" v-for="item of $d.UserType"
:key="item.Id" :key="item.Id"
:label="item.UserTypeShortName" :label="item.label"
:value="item.Id" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>

View File

@ -197,7 +197,7 @@ export default {
UserName: "", UserName: "",
LastName: "", LastName: "",
FirstName: "", FirstName: "",
Sex: "", Sex: "9",
EMail: "", EMail: "",
Phone: "", Phone: "",
UserTypeId: "", UserTypeId: "",

View File

@ -39,6 +39,13 @@
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- 研究方案号 -->
<el-form-item
:label="$t('trials:trials-list:form:researchNumber')"
prop="ResearchProgramNo"
>
<el-input v-model="trialForm.ResearchProgramNo" clearable />
</el-form-item>
<!-- 研究名称 --> <!-- 研究名称 -->
<el-form-item <el-form-item
:label="$t('trials:trials-list:table:researchName')" :label="$t('trials:trials-list:table:researchName')"
@ -51,21 +58,11 @@
clearable clearable
/> />
</el-form-item> </el-form-item>
<!-- 研究方案号 -->
<el-form-item
:label="$t('trials:trials-list:form:researchNumber')"
prop="ResearchProgramNo"
>
<el-input v-model="trialForm.ResearchProgramNo" clearable />
</el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- 研究者 --> <!-- 药物/器械名称 -->
<el-form-item <el-form-item :label="$t('trials:trials-list:message:D/Dname')">
:label="$t('trials:trials-list:form:investigator')" <el-input v-model="trialForm.MedicineName" clearable />
prop="HeadPI"
>
<el-input v-model="trialForm.HeadPI" clearable />
</el-form-item> </el-form-item>
<!-- 申办方 --> <!-- 申办方 -->
<el-form-item <el-form-item
@ -76,16 +73,13 @@
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- CRO --> <!-- 研究者 -->
<el-form-item :label="$t('trials:trials-list:form:cro')" prop="Cro"> <el-form-item
<el-input v-model="trialForm.CRO" maxlength="200" clearable /> :label="$t('trials:trials-list:form:investigator')"
prop="HeadPI"
>
<el-input v-model="trialForm.HeadPI" clearable />
</el-form-item> </el-form-item>
<!-- 药物/器械名称 -->
<el-form-item :label="$t('trials:trials-list:message:D/Dname')">
<el-input v-model="trialForm.MedicineName" clearable />
</el-form-item>
</el-row>
<el-row>
<!-- 临床分期 --> <!-- 临床分期 -->
<el-form-item :label="$t('trials:trials-list:form:phase')" prop="PhaseId"> <el-form-item :label="$t('trials:trials-list:form:phase')" prop="PhaseId">
<el-select <el-select
@ -101,29 +95,23 @@
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-row>
<el-row>
<!-- 适应症 --> <!-- 适应症 -->
<el-form-item :label="$t('trials:trials-list:form:indication')"> <el-form-item :label="$t('trials:trials-list:form:indication')">
<el-input v-model="trialForm.Indication" clearable /> <el-input v-model="trialForm.Indication" clearable />
</el-form-item> </el-form-item>
</el-row>
<el-row>
<!-- 检查技术 -->
<el-form-item :label="$t('trials:trials-list:form:modality')">
<el-select v-model="trialForm.ModalityIds" multiple clearable>
<el-option
v-for="item of $d.Modality"
:key="item.id"
:label="item.label"
:value="item.id"
/>
</el-select>
</el-form-item>
<!-- 阅片标准 --> <!-- 阅片标准 -->
<el-form-item <el-form-item
:label="$t('trials:trials-list:form:criterion')" :label="$t('trials:trials-list:form:criterion')"
prop="CriterionTypeList" prop="CriterionTypeList"
> >
<el-select v-model="trialForm.CriterionTypeList" multiple clearable> <el-select
v-model="trialForm.CriterionTypeList"
multiple
clearable
:disabled="trialForm.Id !== ''"
>
<el-option <el-option
v-for="item of CriterionTypeList" v-for="item of CriterionTypeList"
:key="item.Id" :key="item.Id"
@ -134,19 +122,25 @@
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- CRO -->
<el-form-item :label="$t('trials:trials-list:form:cro')" prop="Cro">
<el-input v-model="trialForm.CRO" maxlength="200" clearable />
</el-form-item>
<!-- 联系人 --> <!-- 联系人 -->
<el-form-item :label="$t('trials:researchForm:form:contactor')"> <el-form-item :label="$t('trials:researchForm:form:contactor')">
<el-input v-model="trialForm.ContactUser" clearable /> <el-input v-model="trialForm.ContactUser" clearable />
</el-form-item> </el-form-item>
</el-row>
<el-row>
<!-- 电话 --> <!-- 电话 -->
<el-form-item :label="$t('trials:trials-myinfo:form:phone')"> <el-form-item :label="$t('trials:trials-myinfo:form:phone')">
<el-input v-model="trialForm.ContactPhone" type="number" clearable /> <el-input v-model="trialForm.ContactPhone" type="number" clearable />
</el-form-item> </el-form-item>
</el-row> </el-row>
<el-row> <el-row>
<!-- 授权时长 --> <!-- 项目周期 -->
<el-form-item <el-form-item
:label="$t('trials:trials-list:table:durationAuthorized')" :label="$t('trials:trials-list:form:projectCycle')"
prop="AuthorizationDuration" prop="AuthorizationDuration"
> >
<div style="position: relative"> <div style="position: relative">
@ -154,11 +148,12 @@
v-model="trialForm.AuthorizationDuration" v-model="trialForm.AuthorizationDuration"
type="number" type="number"
clearable clearable
:max="200"
:min="0"
/> />
<span style="position: absolute; right: -20px; top: 0"></span>
</div> </div>
</el-form-item> </el-form-item>
<!-- 授权时间 --> <!-- 到期日 -->
<el-form-item <el-form-item
:label="$t('trials:trials-list:table:dateAuthorized')" :label="$t('trials:trials-list:table:dateAuthorized')"
prop="visitNumberAuthorized" prop="visitNumberAuthorized"
@ -167,41 +162,12 @@
v-model="trialForm.AuthorizationDate" v-model="trialForm.AuthorizationDate"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
type="date" type="date"
placeholder="选择日期" placeholder=""
disabled
> >
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<!-- 授权访视量 -->
<!-- <el-form-item
:label="$t('trials:trials-list:table:visitNumberAuthorized')"
prop="visitNumberAuthorized"
>
<el-input
v-model="trialForm.visitNumberAuthorized"
type="number"
disabled
/>
</el-form-item> -->
</el-row> </el-row>
<el-row>
<!--项目授权码-->
<!-- <el-form-item :label="$t('trials:trials-list:form:authorizationCode')">
<el-input v-model="trialForm.authorizationCode" />
</el-form-item> -->
</el-row>
<el-row>
<!-- Timepoints Per Patient -->
<!-- <el-form-item :label="$t('trials:trials-list:form:timePointsPerPatient')">
<el-input-number
v-model="trialForm.TimePointsPerPatient"
controls-position="right"
:min="0"
@change="handleTpPerPatientChange"
/>
</el-form-item> -->
</el-row>
<el-row> </el-row>
<el-row> </el-row>
<el-row style="margin-left: 190px"> <el-row style="margin-left: 190px">
<el-form-item label=""> <el-form-item label="">
<el-button type="primary" :disabled="btnLoading" @click="handleCancel"> <el-button type="primary" :disabled="btnLoading" @click="handleCancel">

View File

@ -0,0 +1,224 @@
<template>
<el-form
ref="activateProjectForm"
:model="form"
size="small"
label-width="120px"
style="width: 500px; padding: 30px 0 0 30px"
>
<div class="base-dialog-body">
<p>授权申请信息</p>
<!-- 购买时长 -->
<el-form-item label="项目码">
<el-input v-model="data.AuthorizationCode" />
<input
type="file"
id="uploadFile"
ref="uploadFile"
@change="fileChange"
style="display: none"
/>
<label for="uploadFile" class="copy">上传</label>
</el-form-item>
<!-- 单位名称 -->
<el-form-item :label="$t('trials:trials-list:activate:organizationName')">
<span>{{ data.HospitalName }}</span>
</el-form-item>
<!-- 项目编号 -->
<el-form-item :label="$t('trials:trials-list:table:trialId')">
<span>{{ data.TrialCode }}</span>
</el-form-item>
<!-- 评估标准 -->
<el-form-item
:label="$t('trials:trials-list:activate:evaluationCriteria')"
>
<span
>{{
data.CriterionTypeList.map((item) =>
$fd("CriterionType", Number(item))
).join(",")
}}
</span>
</el-form-item>
<!-- 购买时长 -->
<el-form-item :label="$t('trials:trials-list:activate:purchaseDuration')">
<span>{{ data.PurchaseDuration }}</span>
</el-form-item>
<p>生成激活码信息</p>
<!-- 单位名称 -->
<el-form-item :label="$t('trials:trials-list:activate:organizationName')">
<span>{{ data.HospitalName }}</span>
</el-form-item>
<!-- 项目编号 -->
<el-form-item :label="$t('trials:trials-list:table:trialId')">
<span>{{ data.TrialCode }}</span>
</el-form-item>
<!-- 评估标准 -->
<el-form-item
:label="$t('trials:trials-list:activate:evaluationCriteria')"
>
<span
>{{
data.CriterionTypeList.map((item) =>
$fd("CriterionType", Number(item))
).join(",")
}}
</span>
</el-form-item>
<!-- 授权时长 -->
<el-form-item label="授权时长" prop="Activate">
<el-input-number
v-model="form.PurchaseDuration"
:min="0"
:max="100"
></el-input-number>
</el-form-item>
<!-- 激活码 -->
<el-form-item label="激活码">
<span>{{ form.code }}</span>
</el-form-item>
</div>
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
<el-form-item>
<!-- 取消 -->
<el-button
size="small"
type="primary"
@click.stop="getTrialActivationCode"
>
生成
</el-button>
<!-- 保存 -->
<el-button size="small" type="primary" @click.stop="copy">
复制
</el-button>
<el-button size="small" type="primary" @click.stop="downloadXmlFile">
下载
</el-button>
</el-form-item>
</div>
</el-form>
</template>
<script>
import { fileDownload } from "@/utils/uploadZip.js";
import {
getAuthorizationCodeInfo,
getTrialActivationCode,
} from "@/api/trials.js";
export default {
name: "activatePage",
data() {
return {
form: {
code: null,
PurchaseDuration: 0,
},
data: {
AuthorizationCode: null,
AuthorizationDeadLineDate: null,
CreateUserId: null,
CriterionTypeList: [],
HospitalName: null,
PurchaseDuration: null,
TrialCode: null,
TrialId: null,
},
};
},
watch: {
"data.AuthorizationCode": {
handler() {
if (!this.data.AuthorizationCode) return;
this.getAuthorizationCodeInfo();
},
},
},
methods: {
//
copy() {
this.$copyText(this.form.code)
.then((res) => {
//
this.$message.success(
this.$t("trials:researchRecord:message:copySuccessfully")
);
})
.catch(() => {
//
this.$alert(this.$t("trials:researchRecord:message:copyFailed"));
});
},
//
async getTrialActivationCode() {
try {
let params = {
TrialId: this.data.TrialId,
TrialCode: this.data.TrialCode,
PurchaseDuration: this.form.PurchaseDuration,
HospitalName: this.data.HospitalName,
CriterionTypeList: this.data.CriterionTypeList,
CreateUserId: this.data.CreateUserId,
AuthorizationDeadLineDate: null,
};
let res = await getTrialActivationCode(params);
if (res.IsSuccess) {
this.form.code = res.Result;
}
} catch (err) {
console.log(err);
}
},
//
async getAuthorizationCodeInfo() {
try {
let params = {
AuthorizationCode: this.data.AuthorizationCode,
};
let res = await getAuthorizationCodeInfo(params);
if (res.IsSuccess) {
Object.keys(res.Result).forEach((key) => {
this.data[key] = res.Result[key];
});
this.form.PurchaseDuration = this.data.PurchaseDuration;
}
} catch (err) {
console.log(err);
}
},
fileChange(data) {
let input = data.target;
const reader = new FileReader();
reader.readAsText(input.files[0], "utf8"); // input.files[0]
reader.onload = () => {
this.data.AuthorizationCode = reader.result; // reader.result
input.value = null;
};
},
funDownload(content, filename) {
const eleLink = document.createElement("a");
eleLink.download = filename;
eleLink.style.display = "none";
const blob = new Blob([content]);
eleLink.href = URL.createObjectURL(blob);
document.body.appendChild(eleLink);
eleLink.click();
document.body.removeChild(eleLink);
},
downloadXmlFile() {
fileDownload(this.form.code, "激活码");
},
},
};
</script>
<style lang="scss" scoped>
.copy {
cursor: pointer;
color: #409eff;
margin-left: 20px;
}
.el-form-item__content {
.el-input {
width: 60%;
}
}
</style>

View File

@ -12,24 +12,56 @@
:model="form" :model="form"
:rules="rules" :rules="rules"
size="small" size="small"
label-width="100px" label-width="120px"
> >
<div class="base-dialog-body"> <div class="base-dialog-body">
<p>授权申请信息</p>
<!-- 单位名称 -->
<el-form-item
:label="$t('trials:trials-list:activate:organizationName')"
>
<span>{{ form.HospitalName }}</span>
</el-form-item>
<!-- 项目编号 --> <!-- 项目编号 -->
<el-form-item :label="$t('trials:trials-list:table:trialId')"> <el-form-item :label="$t('trials:trials-list:table:trialId')">
<span>{{ data.TrialCode }}</span> <span>{{ form.TrialCode }}</span>
</el-form-item>
<!-- 评估标准 -->
<el-form-item
:label="$t('trials:trials-list:activate:evaluationCriteria')"
>
<span>{{
form.CriterionTypeList.map((item) =>
$fd("CriterionType", Number(item))
).join(",")
}}</span>
</el-form-item>
<!-- 购买时长 -->
<el-form-item
:label="$t('trials:trials-list:activate:purchaseDuration')"
>
<el-input-number
v-model="form.PurchaseDuration"
@change="handleChange"
:min="0"
:max="100"
step-strictly
></el-input-number>
</el-form-item> </el-form-item>
<!-- 授权码 --> <!-- 授权码 -->
<el-form-item :label="$t('trials:trials-list:form:authorizationCode')"> <el-form-item :label="$t('trials:trials-list:form:authorizationCode')">
<p v-if="data.Authorization" class="AuthorizationBox"> <p v-if="form.Authorization" class="AuthorizationBox">
<span class="Authorization" :title="data.Authorization">{{ <span class="Authorization" :title="form.Authorization">{{
data.Authorization form.Authorization
}}</span> }}</span>
<span class="copy" @click.stop="copy">{{ <span class="copy" @click.stop="copy">{{
$t("trials:trials-list:action:copy") $t("trials:trials-list:action:copy")
}}</span> }}</span>
<span class="copy" style="margin-left: 10px" @click.stop="getCode" <span
>获取</span class="copy"
style="margin-left: 10px"
@click.stop="getCode"
>{{ $t("trials:reading:button:download") }}</span
> >
</p> </p>
</el-form-item> </el-form-item>
@ -38,8 +70,57 @@
:label="$t('trials:trials-list:form:activateCode')" :label="$t('trials:trials-list:form:activateCode')"
prop="Activate" prop="Activate"
> >
<el-input v-model="form.Activate" /> <el-input v-model="form.Activate" :disabled="isActivate" />
<span
v-if="form.Activate"
class="copy"
@click.stop="getActivationCodeInfo"
style="margin-left: 10px"
>{{ $t("trials:reviewTrack:impactList:save") }}</span
>
<input
type="file"
id="uploadFileInp"
@change="uploadFile"
style="display: none"
/>
<label
class="copy"
style="margin-left: 10px"
for="uploadFileInp"
v-if="!isActivate"
>{{ $t("trials:activate:button:upload") }}</label
>
</el-form-item> </el-form-item>
<div v-if="isActivate">
<p>授权信息</p>
<!-- 单位名称 -->
<el-form-item
:label="$t('trials:trials-list:activate:organizationName')"
>
<span>{{ ActivateData.HospitalName }}</span>
</el-form-item>
<!-- 项目编号 -->
<el-form-item :label="$t('trials:trials-list:table:trialId')">
<span>{{ ActivateData.TrialCode }}</span>
</el-form-item>
<!-- 评估标准 -->
<el-form-item
:label="$t('trials:trials-list:activate:evaluationCriteria')"
>
<span>{{
ActivateData.CriterionTypeList.map((item) =>
$fd("CriterionType", Number(item))
).join(",")
}}</span>
</el-form-item>
<!-- 授权时长 -->
<el-form-item
:label="$t('trials:trials-list:activate:durationAuthorized')"
>
<span>{{ ActivateData.PurchaseDuration }}</span>
</el-form-item>
</div>
</div> </div>
<div <div
class="base-dialog-footer" class="base-dialog-footer"
@ -59,6 +140,7 @@
<el-button <el-button
size="small" size="small"
type="primary" type="primary"
:disabled="!isActivate"
:loading="btnLoading" :loading="btnLoading"
@click="handleSave" @click="handleSave"
> >
@ -70,7 +152,13 @@
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
import { activateTrial, getTrialActivationCode } from "@/api/trials.js"; import {
activateTrial,
getTrialAuthorizationCode,
getTrialAuthorizationInfo,
getActivationCodeInfo,
} from "@/api/trials.js";
import { fileDownload } from "@/utils/uploadZip.js";
export default { export default {
name: "activateProject", name: "activateProject",
props: { props: {
@ -90,6 +178,22 @@ export default {
form: { form: {
Authorization: null, // Authorization: null, //
Activate: null, // Activate: null, //
TrialId: null,
TrialCode: null,
PurchaseDuration: null,
HospitalName: null,
CriterionTypeList: [],
CreateUserId: null,
AuthorizationDeadLineDate: null,
},
ActivateData: {
TrialId: null,
TrialCode: null,
PurchaseDuration: null,
HospitalName: null,
CriterionTypeList: [],
CreateUserId: null,
AuthorizationDeadLineDate: null,
}, },
btnLoading: false, btnLoading: false,
rules: { rules: {
@ -101,17 +205,77 @@ export default {
}, },
], ],
}, },
isActivate: false,
timer: null,
}; };
}, },
created() { created() {
this.getTrialAuthorizationCode(); this.getTrialAuthorizationInfo();
},
destroyed() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
}, },
methods: { methods: {
handleCancel() { handleCancel() {
this.$emit("update:visible", false); this.$emit("update:visible", false);
}, },
//
async handleChange() {
if (this.timer) {
clearTimeout(this.timer);
this.timer = null;
}
this.timer = setTimeout(() => {
this.getTrialAuthorizationCode();
clearTimeout(this.timer);
this.timer = null;
}, 500);
},
//
async getTrialAuthorizationInfo() {
try {
let params = {
TrialId: this.data.TrialId,
};
let res = await getTrialAuthorizationInfo(params);
if (res.IsSuccess) {
Object.keys(this.form).forEach((key) => {
this.form[key] = res.Result[key];
});
this.getTrialAuthorizationCode();
}
} catch (err) {
console.log(err);
}
},
//
async getTrialAuthorizationCode() {
let params = {
TrialId: this.form.TrialId,
TrialCode: this.form.TrialCode,
PurchaseDuration: this.form.PurchaseDuration,
HospitalName: this.form.HospitalName,
CriterionTypeList: this.form.CriterionTypeList,
CreateUserId: this.form.CreateUserId,
};
try {
let res = await getTrialAuthorizationCode(params);
if (res.IsSuccess) {
this.form.Authorization = res.Result;
return true;
}
return false;
} catch (err) {
console.log(err);
return false;
}
},
// //
async handleSave() { async handleSave() {
if (!this.isActivate) return;
try { try {
let validate = this.$refs.activateProjectForm.validate(); let validate = this.$refs.activateProjectForm.validate();
if (!validate) return; if (!validate) return;
@ -136,7 +300,7 @@ export default {
}, },
// //
copy() { copy() {
this.$copyText(this.data.Authorization) this.$copyText(this.form.Authorization)
.then((res) => { .then((res) => {
// //
this.$message.success( this.$message.success(
@ -148,16 +312,34 @@ export default {
this.$alert(this.$t("trials:researchRecord:message:copyFailed")); this.$alert(this.$t("trials:researchRecord:message:copyFailed"));
}); });
}, },
// //
async getCode() { async getCode() {
let params = { fileDownload(this.form.Authorization, "项目码");
TrialId: this.data.TrialId, },
AuthorizationCode: this.data.Authorization, //
uploadFile(file) {
let input = file.target;
const reader = new FileReader();
reader.readAsText(input.files[0], "utf8"); // input.files[0]
reader.onload = () => {
this.form.Activate = reader.result; // reader.result
input.value = null;
}; };
},
//
async getActivationCodeInfo() {
try { try {
let res = await getTrialActivationCode(params); let params = {
ActivationCode: this.form.Activate,
};
let res = await getActivationCodeInfo(params);
if (res.IsSuccess) { if (res.IsSuccess) {
this.form.Activate = res.Result; if (res.IsSuccess) {
Object.keys(this.ActivateData).forEach((key) => {
this.ActivateData[key] = res.Result[key];
});
}
this.isActivate = true;
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err);
@ -169,6 +351,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .el-dialog__body { ::v-deep .el-dialog__body {
padding-bottom: 10px; padding-bottom: 10px;
padding-top: 0;
} }
.Authorization { .Authorization {
width: 70%; width: 70%;
@ -177,6 +360,11 @@ export default {
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
} }
.el-form-item__content {
.el-input {
width: 60%;
}
}
.copy { .copy {
cursor: pointer; cursor: pointer;
color: #409eff; color: #409eff;

View File

@ -225,7 +225,7 @@
<!--授权时长--> <!--授权时长-->
<el-table-column <el-table-column
prop="AuthorizationDuration" prop="AuthorizationDuration"
:label="$t('trials:trials-list:table:durationAuthorized')" :label="$t('trials:trials-list:form:projectCycle')"
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
/> />
@ -272,20 +272,13 @@
/> />
<!-- 激活 --> <!-- 激活 -->
<el-button <el-button
v-if="!scope.row.AuthorizationEncrypt"
v-hasPermi="['trials:trials-list:activate']"
circle circle
icon="el-icon-key" icon="el-icon-key"
:title="$t('trials:trials-list:action:activate')" :title="$t('trials:trials-list:action:activate')"
@click="handleActivate(scope.row)" @click="handleActivate(scope.row)"
/> />
<!-- 代办详情 -->
<!-- <el-button
v-hasPermi="['trials:trials-list:abolish']"
circle
icon="el-icon-receiving"
:disabled="scope.row.TrialStatusStr === 'Initializing'"
:title="$t('trials:trials-list:action:commission')"
@click="handleCommission(scope.row)"
/> -->
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -357,11 +350,7 @@
</BaseContainer> </BaseContainer>
</template> </template>
<script> <script>
import { import { abandonTrial, getTrialListHir } from "@/api/trials";
abandonTrial,
getTrialListHir,
getTrialAuthorizationCode,
} from "@/api/trials";
import { mapGetters } from "vuex"; import { mapGetters } from "vuex";
import Excel from "exceljs"; import Excel from "exceljs";
import BaseContainer from "@/components/BaseContainer"; import BaseContainer from "@/components/BaseContainer";
@ -477,30 +466,10 @@ export default {
} }
return true; return true;
}, },
//
async getTrialAuthorizationCode(item) {
let params = {
TrialId: item.TrialId,
};
try {
let res = await getTrialAuthorizationCode(params);
if (res.IsSuccess) {
this.currentRow.Authorization = res.Result;
return true;
}
return false;
} catch (err) {
console.log(err);
return false;
}
},
// //
async handleActivate(item) { async handleActivate(item) {
this.currentRow = item; this.currentRow = item;
let res = await this.getTrialAuthorizationCode(item);
if (res) {
this.activateVisible = true; this.activateVisible = true;
}
}, },
initPage() { initPage() {
this.getList(); this.getList();

View File

@ -201,6 +201,7 @@ export default {
this.$t("trials:trials-myinfo:message:updateSuccessfully") this.$t("trials:trials-myinfo:message:updateSuccessfully")
); );
this.$emit("getUserInfo"); this.$emit("getUserInfo");
this.logout();
}); });
}, },
setNewPhone() { setNewPhone() {
@ -250,6 +251,19 @@ export default {
}, 1000); }, 1000);
} }
}, },
async logout() {
/* eslint-disable */
var loginType = zzSessionStorage.getItem("loginType");
await this.$store.dispatch("user/logout");
if (loginType) {
this.$router.push(`/login?loginType=${loginType}`);
} else {
this.$router.push(`/login`);
}
this.$i18n.locale = "zh";
this.setLanguage("zh");
this.$updateDictionary();
},
}, },
}; };
</script> </script>

View File

@ -60,7 +60,7 @@ export default {
}; };
}, },
computed: { computed: {
...mapGetters(["userId", "name"]), ...mapGetters(["userId", "userName"]),
}, },
mounted() { mounted() {
this.getUserInfo(); this.getUserInfo();
@ -170,7 +170,7 @@ export default {
.trial-info-btn { .trial-info-btn {
position: absolute; position: absolute;
bottom: -60px; bottom: -60px;
left: calc(100% + 10px); left: 10px;
min-width: 97px; min-width: 97px;
} }
.trial-myinfo-left-bottom { .trial-myinfo-left-bottom {

View File

@ -12,6 +12,8 @@
style="margin-right:5px;" style="margin-right:5px;"
@change="handleShowDetail" @change="handleShowDetail"
/> />
<!--评估报告-->
<el-button v-if="readingTaskState>=2" type="primary" size="small" @click="showReport">{{$t('trials:dicoms:button:evaluationReport')}}</el-button>
<el-button <el-button
v-if="readingTaskState<2" v-if="readingTaskState<2"
type="primary" type="primary"
@ -256,6 +258,11 @@
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
<!--评估报告-->
<PreviewFileDialog
:visible.sync="previewFileVisible"
:fileData="fileData"
/>
</div> </div>
</template> </template>
<script> <script>
@ -269,9 +276,11 @@ import store from '@/store'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { changeURLStatic } from '@/utils/history.js' import { changeURLStatic } from '@/utils/history.js'
import AdditionalAssessment from './AdditionalAssessment' import AdditionalAssessment from './AdditionalAssessment'
import { showReadReport } from "@/api/export";
import PreviewFileDialog from "@/components/PreviewFileDialog/PreviewFileDialog.vue";
export default { export default {
name: 'ReportPage', name: 'ReportPage',
components: { SignForm, AdditionalAssessment }, components: { SignForm, AdditionalAssessment,PreviewFileDialog },
props: { props: {
visitTaskId: { visitTaskId: {
type: String, type: String,
@ -308,7 +317,11 @@ export default {
assessmentQuestions: [], assessmentQuestions: [],
tLesionCount: null, tLesionCount: null,
ntLesionCount: null, ntLesionCount: null,
openWindow: null openWindow: null,
//
previewFileVisible: false,
fileData: {},
} }
}, },
computed: { computed: {
@ -349,6 +362,24 @@ export default {
} }
}, },
methods: { methods: {
//
async showReport(){
let data = {
VisitTaskId: this.visitTaskId,
};
try {
let res = await showReadReport(data);
let urlPdf = window.URL.createObjectURL(new Blob([res]))
this.viewVisible = true
this.fileData = {
path: encodeURIComponent(urlPdf),
name:'评估报告.pdf'
};
this.previewFileVisible = true;
} catch (err) {
console.log(err);
}
},
myConfirm(msg) { myConfirm(msg) {
return new Promise(resolve => { return new Promise(resolve => {
this.$confirm(msg, { this.$confirm(msg, {

View File

@ -85,11 +85,9 @@
<el-descriptions-item :label="$t('trials:trials-myinfo:form:phone')"> <el-descriptions-item :label="$t('trials:trials-myinfo:form:phone')">
{{ trialInfo.ContactPhone }} {{ trialInfo.ContactPhone }}
</el-descriptions-item> </el-descriptions-item>
<!--授权时长--> <!--项目周期-->
<el-descriptions-item <el-descriptions-item :label="$t('trials:trials-list:form:projectCycle')">
:label="$t('trials:trials-list:table:durationAuthorized')" {{ trialInfo.AuthorizationDuration }}
>
{{ trialInfo.AuthorizationDuration }}
</el-descriptions-item> </el-descriptions-item>
<!--授权日期--> <!--授权日期-->
<el-descriptions-item <el-descriptions-item
@ -98,17 +96,68 @@
{{ trialInfo.AuthorizationDate }} {{ trialInfo.AuthorizationDate }}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<div
v-if="otherInfo && otherInfo.TrialId"
v-hasPermi="['trials:trials-list:activate']"
>
<p>项目授权信息</p>
<el-descriptions :column="2" border style="width: 1000px">
<!--单位名称-->
<el-descriptions-item
:label="$t('trials:trials-list:activate:organizationName')"
>
{{ otherInfo.HospitalName }}
</el-descriptions-item>
<!--项目编号-->
<el-descriptions-item :label="$t('trials:trials-list:table:trialId')">
{{ otherInfo.TrialCode }}
</el-descriptions-item>
<!--评估标准-->
<el-descriptions-item
:label="$t('trials:trials-list:activate:evaluationCriteria')"
>
{{
otherInfo.CriterionTypeList.map((item) =>
$fd("CriterionType", Number(item))
).join(",")
}}
</el-descriptions-item>
<!--授权时长-->
<el-descriptions-item
:label="$t('trials:trials-list:activate:durationAuthorized')"
>
{{ otherInfo.PurchaseDuration }}
</el-descriptions-item>
</el-descriptions>
<el-button
type="primary"
size="small"
style="margin-top: 10px"
@click.stop="putActivate"
>{{ $t("trials:activate:renewalAuthorization") }}</el-button
>
</div>
<activate-project
v-if="activateVisible"
:visible.sync="activateVisible"
:data="otherInfo"
@getList="initForm"
/>
</div> </div>
</template> </template>
<script> <script>
import { getTrialInfoHir } from "@/api/trials"; import { getTrialInfoHir } from "@/api/trials";
import activateProject from "@/views/trials/trials-list/components/activate-project.vue";
export default { export default {
components: { "activate-project": activateProject },
data() { data() {
return { return {
trialInfo: {}, trialInfo: {},
trialId: "", trialId: "",
trialStatus: "", trialStatus: "",
formLoading: false, formLoading: false,
otherInfo: {},
activateVisible: false,
}; };
}, },
mounted() { mounted() {
@ -116,11 +165,16 @@ export default {
this.initForm(); this.initForm();
}, },
methods: { methods: {
//
putActivate() {
this.activateVisible = true;
},
initForm() { initForm() {
this.formLoading = true; this.formLoading = true;
getTrialInfoHir(this.trialId) getTrialInfoHir(this.trialId)
.then((res) => { .then((res) => {
this.formLoading = false; this.formLoading = false;
this.otherInfo = res.OtherInfo;
this.trialInfo = res.Result; this.trialInfo = res.Result;
this.trialInfo.ReviewTypeList = this.trialInfo.ReviewTypeList =
this.trialInfo.ReviewTypeList.length > 0 this.trialInfo.ReviewTypeList.length > 0