hir_web/src/views/trials/trials-inspection/components/add-trials-list.vue

487 lines
14 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:fullscreen="true"
custom-class="upload-dialog"
:before-close="beforeCloseStudyDig"
>
<span slot="title"
>{{ $t("trials:inspection:button:addTrials") }}{{
$t("trials:uploadDicomList:table:patientInfo")
}}{{ Patient.PatientIdStr }}{{ Patient.PatientName }}</span
>
<div class="top">
<p class="line">{{ $t("trials:inspection:message:checkAddTrials") }}</p>
<el-form
ref="submitMessageForm"
:inline="true"
:model="submitMessage"
class="demo-form-inline"
:rules="rules"
label-width="130px"
>
<div>
<!--项目-->
<el-form-item
:label="$t('trials:workbench:label:trialsStats')"
prop="TrialId"
label-width="50px"
>
<trialsSelect
:options="trialList"
:data.sync="submitMessage"
:status="status"
/>
</el-form-item>
<div style="display: inline-block">
<!--受试者编号-->
<el-form-item
:label="$t('trials:crcQuestion:table:subjectId')"
prop="SubjectId"
>
<el-select
v-model="submitMessage.SubjectId"
clearable
filterable
:disabled="status === 'visit' || !submitMessage.TrialId"
style="width: 300px"
>
<el-option
v-for="item in subjectIdList"
:key="item.SubejctId"
:label="
item.ShortName || item.Sex
? `${item.SubjectCode}${item.ShortName}${
item.Sex ? $fd('sex', item.Sex) : ''
}`
: item.SubjectCode
"
:value="item.SubejctId"
>
</el-option>
</el-select>
</el-form-item>
<!--添加受试者-->
<el-button
type="primary"
v-if="status === 'trial' && submitMessage.TrialId"
@click="addSubject_model.visible = true"
>
{{ $t("trials:selectSubject:button:add") }}
</el-button>
<div>
<el-form-item
:label="$t('trials:study:tabpane:bindPatient')"
:style="{ opacity: bindPatientTip ? 1 : 0 }"
>
<span v-if="bindPatientTip">{{
bindPatientTip.map((item) => item.PatientIdStr).join(", ")
}}</span>
</el-form-item>
</div>
</div>
<div class="btnBox">
<!--确认添加按钮-->
<el-button
type="primary"
v-if="status === 'trial'"
@click="addTrials"
:loading="btnLoading"
>
{{ $t("trials:addRP:button:confirmAddPR") }}
</el-button>
<!--移除按钮-->
<el-button
type="primary"
v-else
@click="remove"
:loading="btnLoading"
>
{{ $t("common:button:remove") }}
</el-button>
</div>
</div>
</el-form>
</div>
<confirmVisitList
ref="confirmVisit"
:Patient="PatientData"
:submitMessage="submitMessage"
:status="status"
@close="beforeCloseStudyDig"
/>
<base-model v-if="addSubject_model.visible" :config="addSubject_model">
<template slot="dialog-body">
<el-form
ref="addSubjectForm"
:inline="true"
:model="addSubjectForm"
class="demo-form-inline"
:rules="addSubjectrules"
>
<!--受试者编号-->
<el-form-item
:label="$t('trials:addSuject:form:subjectCode')"
prop="SubjectCode"
label-width="150px"
>
<el-input
v-model="addSubjectForm.SubjectCode"
:maxlength="14"
clearable
@input="
addSubjectForm.SubjectCode = addSubjectForm.SubjectCode.replace(
/[^0-9a-zA-Z]/g,
''
)
"
@focus="errMessage = null"
></el-input>
<span class="errTip" v-if="errMessage">{{ errMessage }}</span>
</el-form-item>
</el-form>
</template>
<template slot="dialog-footer">
<el-button type="primary" @click="addSubject">
{{ $t("common:button:confirm") }}
</el-button>
<el-button @click="addSubject_model.visible = false">
{{ $t("common:button:cancel") }}
</el-button>
</template>
</base-model>
</el-dialog>
</template>
<script>
import Pagination from "@/components/Pagination";
import trialsSelect from "./trials-select.vue";
import confirmVisitList from "./confirm-visit-list.vue";
import BaseModel from "@/components/BaseModel";
import {
getPatientJoinTrialInitSelectList,
getTrialSubejctSelectList,
addSubjectPatientBinding,
deleteSubjectPatientBinding,
verifyTrialSubject,
} from "@/api/inspection.js";
export default {
name: "addTrialsList",
components: { Pagination, trialsSelect, confirmVisitList, BaseModel },
props: {
visible: {
required: true,
default: false,
},
Patient: {
required: true,
default: () => {
return {};
},
},
},
data() {
return {
// 绑定项目相关提交数据
status: "trial", // 页面当前状态 trial 绑定项目 visit 确认访视
trialList: [],
btnLoading: false,
submitMessage: {
SubjectId: null,
TrialId: null,
TrialCode: null,
ResearchProgramNo: null,
},
PatientData: {},
subjectIdList: [], // 受试者列表
rules: {
TrialId: [
{
required: true,
message: this.$t("trials:inspection:message:checkAddTrials"),
trigger: "change",
},
],
SubjectId: [
{
required: true,
message: this.$t("trials:inscept:rules:selectOrInputSubject"),
trigger: "change",
},
],
},
// 新增受试者
addSubject_model: {
visible: false,
title: this.$t("trials:selectSubject:button:add"),
width: "500px",
appendToBody: true,
},
addSubjectForm: {
SubjectCode: null,
},
addSubjectrules: {
SubjectCode: [
{
required: true,
message: this.$t("trials:subject:format:notSubject"),
trigger: ["blur", "change"],
},
{
validator: (rule, value, callback) => {
let flag = this.subjectIdList.some(
(item) => item.SubjectCode === value
);
if (flag) {
callback(
new Error(this.$t("trials:addSubject:format:hasSubject"))
);
} else {
callback();
}
},
message: this.$t("trials:addSubject:format:hasSubject"),
trigger: ["blur", "change"],
},
],
},
errMessage: null,
};
},
computed: {
bindPatientTip() {
if (!this.submitMessage.SubjectId) return false;
let PatientList = [];
this.subjectIdList.some((item) => {
if (
item.SubejctId === this.submitMessage.SubjectId &&
item.PatientList &&
item.PatientList.length > 0
) {
PatientList.push(...item.PatientList);
}
});
if (PatientList.length <= 0) return false;
return PatientList;
},
},
created() {
this.getTrialList();
},
watch: {
"submitMessage.TrialId": {
handler() {
if (this.submitMessage.TrialId) {
this.getTrialSubejctSelectList(this.submitMessage.TrialId);
} else {
this.subjectIdList = [];
}
},
},
"addSubject_model.visible": {
handler() {
if (!this.addSubject_model.visible) {
this.addSubjectForm.SubjectCode = null;
}
},
},
},
methods: {
// 新增受试者(前端操作未同步后端)
async addSubject() {
try {
this.errMessage = null;
let validate = await this.$refs.addSubjectForm.validate();
if (!validate) return;
let data = {
TrialId: this.submitMessage.TrialId,
SubjectCode: this.addSubjectForm.SubjectCode,
};
let res = await verifyTrialSubject(data);
if (res.IsSuccess) {
let subject = {
SubjectCode: this.addSubjectForm.SubjectCode,
SubejctId: this.addSubjectForm.SubjectCode,
};
this.subjectIdList.unshift(subject);
this.submitMessage.SubjectId = this.addSubjectForm.SubjectCode;
this.addSubject_model.visible = false;
}
} catch (err) {
console.log(err);
if (err.Code === 5) {
this.getTrialSubejctSelectList(this.submitMessage.TrialId, null);
this.$emit("getList");
this.errMessage = err.ErrorMessage;
}
}
},
// 获取受试者列表
async getTrialSubejctSelectList(id, SubjectId = null) {
let data = {
TrialId: id,
};
try {
let res = await getTrialSubejctSelectList(data);
if (res.IsSuccess) {
this.subjectIdList = res.Result || [];
this.submitMessage.SubjectId = SubjectId;
if (SubjectId) {
this.$nextTick(() => {
Object.keys(this.Patient).forEach((key) => {
this.PatientData[key] = this.Patient[key];
});
let patient = this.bindPatientTip
? this.bindPatientTip.map((item) => item.PatientId)
: [];
this.PatientData.PatientId = [this.Patient.PatientId, ...patient];
this.$refs.confirmVisit.getList(true);
this.$refs.confirmVisit.getSubjectVisitSelectList();
});
}
}
} catch (err) {
console.log(err);
}
},
// 关闭弹框
beforeCloseStudyDig() {
this.$emit("update:visible", false);
},
// 加入项目
async addTrials() {
if (this.btnLoading) return;
try {
let validate = await this.$refs.submitMessageForm.validate();
if (!validate) return;
let data = {
TrialId: this.submitMessage.TrialId,
PatientIdList: [this.Patient.PatientId],
};
if (this.submitMessage.SubjectId.length === 36) {
data.SubjectId = this.submitMessage.SubjectId;
} else {
data.SubjectCode = this.submitMessage.SubjectId;
}
this.btnLoading = true;
let res = await addSubjectPatientBinding(data);
this.btnLoading = false;
if (res.IsSuccess) {
this.submitMessage.SubjectId = res.Result;
this.getTrialSubejctSelectList(
this.submitMessage.TrialId,
res.Result
);
this.$message.success(this.$t("common:message:addedSuccessfully"));
this.status = "visit";
this.$emit("getList");
}
} catch (err) {
this.btnLoading = false;
console.log(err);
}
},
// 移除项目
async remove() {
try {
let confirm = await this.$confirm(
this.$t("trials:sitesList:message:removeSite"),
{
type: "warning",
distinguishCancelAndClose: true,
confirmButtonText: this.$t("common:button:confirm"),
cancelButtonText: this.$t("recompose:button:cancel"),
}
);
if (confirm !== "confirm") return;
let params = {
PatientId: this.Patient.PatientId,
SubjectId: this.submitMessage.SubjectId,
TrialId: this.submitMessage.TrialId,
};
this.btnLoading = true;
let res = await deleteSubjectPatientBinding(params);
this.btnLoading = false;
if (res.IsSuccess) {
this.getTrialSubejctSelectList(this.submitMessage.TrialId);
this.$refs.confirmVisit.reset(true);
this.status = "trial";
this.$message.success(this.$t("common:message:removedSuccessfully"));
this.$emit("getList");
this.$refs.confirmVisit.changeVisitStatus(true);
}
} catch (err) {
this.btnLoading = false;
console.log(err);
}
},
// 获取项目列表
async getTrialList() {
let data = {};
data.PatientId = this.Patient.PatientId;
try {
let res = await getPatientJoinTrialInitSelectList(data);
if (res.IsSuccess) {
this.trialList = res.Result;
}
} catch (err) {
console.log(err);
}
},
},
};
</script>
<style lang="scss" scoped>
.errTip {
color: #f56c6c;
font-size: 12px;
line-height: 1;
padding-top: 4px;
position: absolute;
top: 100%;
left: 0;
}
.top {
padding-top: 20px;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
}
.btnBox {
float: right;
}
.search {
display: flex;
align-items: center;
flex-wrap: wrap;
.form {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
}
}
.line {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
&::after {
display: block;
content: "";
flex: 1;
height: 1px;
border-top: 1px solid #ddd;
}
}
.selectAndBtn {
width: 100%;
display: flex;
align-items: flex-start;
justify-content: space-between;
}
.demo-form-inline {
width: 100%;
}
</style>