项目授权

main
wangxiaoshuang 2024-04-19 17:08:38 +08:00
parent ab1fc82142
commit e8849ba6a5
9 changed files with 330 additions and 47 deletions

View File

@ -3556,4 +3556,22 @@ export function getSystemConfirmedCreiterionList() {
url: `/Patient/getSystemConfirmedCreiterionList`,
method: 'get'
})
}
// 获取项目授权码
export function getTrialAuthorizationCode(params) {
return request({
url: `/Patient/getTrialAuthorizationCode`,
method: 'get',
params
})
}
// 设置项目授权信息
export function activateTrial(params) {
return request({
url: `/Patient/activateTrial`,
method: 'put',
params
})
}

View File

@ -0,0 +1,40 @@
<template>
<el-dialog
:visible.sync="visible"
:title="fileData.name"
:fullscreen="true"
append-to-body
custom-class="base-dialog-wrapper"
>
<div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<PreviewFile
v-if="visible"
:file-path="fileData.path"
:file-type="fileData.name"
/>
</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,
},
},
};
</script>
<style lang="scss" scoped>
</style>

View File

@ -1,7 +1,7 @@
// eslint-disable-next-line no-undef
module.exports = {
title: 'HIRIS',
title: 'HIRS',
/**
* @type {boolean} true | false

View File

@ -61,8 +61,8 @@
>
<el-switch
v-model="user.Status"
:active-value="0"
:inactive-value="1"
:active-value="1"
:inactive-value="0"
/>
</el-form-item>
<!-- <el-form-item label="IsTestUser:">
@ -348,6 +348,7 @@ export default {
getUserInfo() {
getUser(this.userId).then((res) => {
this.user = res.Result;
this.user.Status = parseFloat(this.user.Status);
});
},
OrgnizationTypeChanged(val) {

View File

@ -153,15 +153,6 @@ export default {
sortable: "custom",
showOverflowTooltip: true,
},
{
prop: "IsTestUser",
label: this.$t("system:userlist:table:IsTestUser"),
hidden: true,
slot: "isTestUserSlot",
minWidth: 120,
sortable: "custom",
showOverflowTooltip: true,
},
{
prop: "Status",
label: this.$t("system:userlist:table:Status"),
@ -241,25 +232,6 @@ export default {
change: (scope) => "",
placeholder: "",
},
{
type: "Select",
label: this.$t("system:userlist:label:IsTestUser"),
prop: "IsTestUser",
width: "100px",
options: [
{
label: this.$t("system:userlist:label:IsTestUser:Yes"),
value: true,
},
{
label: this.$t("system:userlist:label:IsTestUser:No"),
value: false,
},
],
props: { label: "label", value: "value" },
change: (scope) => "",
placeholder: "",
},
{
type: "Select",
label: this.$t("system:userlist:label:Status"),

View File

@ -0,0 +1,185 @@
<template>
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:title="$t('trials:trials-list:action:activateProject')"
width="500px"
append-to-body
>
<el-form
ref="activateProjectForm"
:model="form"
:rules="rules"
size="small"
label-width="100px"
>
<div class="base-dialog-body">
<!-- 项目编号 -->
<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:form:authorizationCode')">
<p v-if="form.Authorization" class="AuthorizationBox">
<span class="Authorization" :title="form.Authorization">{{
form.Authorization
}}</span>
<span class="copy" @click.stop="copy">{{
$t("trials:trials-list:action:copy")
}}</span>
</p>
</el-form-item>
<!-- 激活码 -->
<el-form-item
:label="$t('trials:trials-list:form:activateCode')"
prop="Activate"
>
<el-input v-model="form.Activate" />
</el-form-item>
</div>
<div
class="base-dialog-footer"
style="text-align: right; margin-top: 10px"
>
<el-form-item>
<!-- 取消 -->
<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"
>
{{ $t("trials:trials-list:action:activate") }}
</el-button>
</el-form-item>
</div>
</el-form>
</el-dialog>
</template>
<script>
import { getTrialAuthorizationCode, activateTrial } from "@/api/trials.js";
export default {
name: "activateProject",
props: {
data: {
required: true,
default: () => {
return {};
},
},
visible: {
required: true,
default: false,
},
},
data() {
return {
form: {
Authorization: null, //
Activate: null, //
},
btnLoading: false,
rules: {
Activate: [
{
required: true,
message: this.$t("common:ruleMessage:specify"),
trigger: "blur",
},
],
},
};
},
created() {
this.getTrialAuthorizationCode();
},
methods: {
handleCancel() {
this.$emit("update:visible", false);
},
//
async handleSave() {
try {
let validate = this.$refs.activateProjectForm.validate();
if (!validate) return;
let params = {
TrialId: this.data.TrialId,
ActivationCode: this.form.Activate,
};
this.btnLoading = true;
let res = await activateTrial(params);
this.btnLoading = false;
if (res.IsSuccess) {
this.$message.success(
this.$t("trials:trials-list:action:activateSuccessfully")
);
this.$emit("getList");
this.handleCancel();
}
} catch (err) {
this.btnLoading = false;
console.log(err);
}
},
//
copy() {
this.$copyText(this.form.Authorization)
.then((res) => {
//
this.$message.success(
this.$t("trials:researchRecord:message:copySuccessfully")
);
})
.catch(() => {
//
this.$alert(this.$t("trials:researchRecord:message:copyFailed"));
});
},
//
async getTrialAuthorizationCode() {
let params = {
TrialId: this.data.TrialId,
};
try {
let res = await getTrialAuthorizationCode(params);
if (res.IsSuccess) {
this.form.Authorization = res.Result;
}
} catch (err) {
console.log(err);
}
},
},
};
</script>
<style lang="scss" scoped>
::v-deep .el-dialog__body {
padding-bottom: 10px;
}
.Authorization {
width: 70%;
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.copy {
cursor: pointer;
color: #409eff;
}
.AuthorizationBox {
padding: 0;
margin: 0;
display: flex;
align-items: center;
}
</style>

View File

@ -100,8 +100,16 @@
height="100"
@sort-change="handleSortChange"
>
<el-table-column type="selection" align="left" width="45" />
<el-table-column type="index" width="40" align="left" />
<!-- <el-table-column type="selection" align="left" width="45" /> -->
<el-table-column width="40">
<template slot-scope="scope">
<i
class="el-icon-warning-outline"
:title="$t('trials:trials-list:tipMessage:tipOne')"
style="color: red; font-size: 20px"
></i>
</template>
</el-table-column>
<el-table-column
prop="trialType"
:label="$t('trials:trials-list:form:trialType')"
@ -188,7 +196,7 @@
<template slot-scope="scope">
<span>{{
scope.row.AuthorizationDate
? scope.row.AuthorizationDate.split(" ")[0]
? moment(scope.row.AuthorizationDate)
: ""
}}</span>
</template>
@ -202,6 +210,13 @@
/>
<el-table-column label="" min-width="150" align="left" fixed="right">
<template slot-scope="scope">
<!-- 激活 -->
<el-button
circle
icon="el-icon-key"
:title="$t('trials:trials-list:action:activate')"
@click="handleActivate(scope.row)"
/>
<!-- 详情 -->
<el-button
v-hasPermi="['trials:trials-list:panel']"
@ -292,7 +307,7 @@
>
<TrialStatusForm
:data="currentRow"
@closeDialog="closeStatusDialog"
@close="closeStatusDialog"
@getList="getList"
/>
</el-dialog>
@ -311,16 +326,17 @@
@closeDialog="doneDialogVisible = false"
/>
</el-dialog>
<!--项目激活-->
<activateProject
v-if="activateVisible"
:visible.sync="activateVisible"
:data="currentRow"
@getList="getList"
/>
</BaseContainer>
</template>
<script>
import {
abandonTrial,
ifTrialCanOngoing,
getTrialToBeDoneList,
getTrialListHir,
} from "@/api/trials";
import store from "@/store";
import { abandonTrial, getTrialListHir } from "@/api/trials";
import { mapGetters } from "vuex";
import Excel from "exceljs";
import BaseContainer from "@/components/BaseContainer";
@ -328,6 +344,8 @@ import Pagination from "@/components/Pagination";
import TrialForm from "./components/TrialForm";
import TrialStatusForm from "./components/TrialStatusForm";
import DoneList from "./components/DoneList";
import activateProject from "./components/activate-project.vue";
import moment from "moment";
const searchDataDefault = () => {
return {
Code: "",
@ -361,6 +379,7 @@ export default {
TrialForm,
TrialStatusForm,
DoneList,
activateProject,
},
dicts: ["ReadingStandard", "ReviewType", "ReadingType"],
data() {
@ -407,6 +426,8 @@ export default {
}
},
},
//
activateVisible: false,
};
},
computed: {
@ -416,6 +437,28 @@ export default {
this.initPage();
},
methods: {
//
moment(data) {
return moment(data).format("YYYY-MM-DD");
},
//
trialExpired(data, isBefore = false) {
// 15
if (
isBefore &&
moment(data).isAfter(
moment(visit.VisitMaxStudyTime)
.add(15, "day")
.format("YYYY-MM-DD HH:mm:ss")
)
) {
}
},
//
handleActivate(item) {
this.currentRow = item;
this.activateVisible = true;
},
initPage() {
this.getList();
// store.dispatch("global/getSponsorList");
@ -496,6 +539,7 @@ export default {
},
closeStatusDialog() {
this.statusVisible = false;
this.activateVisible = false;
},
//
handleAbandon(row) {

View File

@ -279,11 +279,10 @@
$t("trials:trials-panel:hirVisit:ImageData")
}}</el-dropdown-item
> -->
<!--评估报告-->
<!--评估报告disabled-->
<el-dropdown-item
v-hasPermi="['trials:trials-panel:hirVisit:result']"
disabled
command="result"
command="showReport"
>{{
$t("trials:trials-panel:hirVisit:EvaluationReport")
}}</el-dropdown-item
@ -328,6 +327,11 @@
:visible.sync="visitVisible"
:rowData="rowData"
/>
<!--评估报告-->
<PreviewFileDialog
:visible.sync="previewFileVisible"
:fileData="fileData"
/>
</BaseContainer>
</template>
<script>
@ -335,6 +339,7 @@ import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import editStudyList from "./components/edit-study-list.vue";
import visitInfo from "./components/visit-info.vue";
import PreviewFileDialog from "@/components/PreviewFileDialog/PreviewFileDialog.vue";
import { deleteSubjectVisit } from "@/api/trials";
import { getPatientSubejctVisitList } from "@/api/trials/visit.js";
import { submitVisitStudyBinding } from "@/api/inspection.js";
@ -358,7 +363,13 @@ const defaultSearchData = () => {
};
export default {
name: "hirVisit",
components: { BaseContainer, Pagination, editStudyList, visitInfo },
components: {
BaseContainer,
Pagination,
editStudyList,
visitInfo,
PreviewFileDialog,
},
data() {
return {
//
@ -375,6 +386,9 @@ export default {
// 访
visitVisible: false,
rowData: {},
//
previewFileVisible: false,
fileData: {},
};
},
created() {
@ -506,6 +520,15 @@ export default {
async downloadImage(item) {
downloadImage(item.SubjectId);
},
//
showReport(item) {
this.fileData = item;
// this.fileData = {
// path: "/System/DocumentToSign/1709623358162_pdf111.pdf1709623358161",
// name: "111111111111111111.pdf",
// };
this.previewFileVisible = true;
},
},
};
</script>

View File

@ -13,7 +13,7 @@ function resolve(dir) {
return path.join(__dirname, dir)
}
const name = defaultSettings.title || 'HIRIS' // page title
const name = defaultSettings.title || 'HIRS' // page title
// eslint-disable-next-line no-undef
module.exports = {