意见反馈
continuous-integration/drone/push Build is passing Details

uat_us
DESKTOP-6C3NK6N\WXS 2024-08-01 09:31:58 +08:00
parent fc6d0c7b35
commit c13fe6b521
7 changed files with 223 additions and 83 deletions

View File

@ -3,15 +3,16 @@ import FEEDBACKCOMP from "./index.vue";
const FBConstructor = Vue.extend(FEEDBACKCOMP); const FBConstructor = Vue.extend(FEEDBACKCOMP);
const FB = options => { const FB = options => {
const { cancelBack } = options; const { type, cancelBack, trialId = null, Id = null } = options;
// if (!UserId) throw `UserId is requred.but ${UserId}` if (!type) throw `type is requred.but ${type}`
const id = `FB${new Date().getTime()}`; const id = `FB${new Date().getTime()}`;
const instance = new FBConstructor(); const instance = new FBConstructor();
instance.id = id; instance.id = id;
instance.vm = instance.$mount(); instance.vm = instance.$mount();
if (instance.vm.visible) return; if (instance.vm.visible) return;
document.body.appendChild(instance.vm.$el); document.body.appendChild(instance.vm.$el);
instance.vm.open(); console.log(type);
instance.vm.open({ type, trialId, Id });
instance.vm.$on("success", (Id) => { instance.vm.$on("success", (Id) => {
}); });
instance.vm.$on("closed", () => { instance.vm.$on("closed", () => {

View File

@ -18,6 +18,7 @@
:model="form" :model="form"
:inline="true" :inline="true"
class="trialsForm" class="trialsForm"
v-if="type === 'detail'"
> >
<el-form-item :label="$t('feedBack:trials:code')"> <el-form-item :label="$t('feedBack:trials:code')">
<span>2024-06-28 15:00</span> <span>2024-06-28 15:00</span>
@ -41,7 +42,7 @@
label-width="100px" label-width="100px"
> >
<!-- 影像异常tip --> <!-- 影像异常tip -->
<p class="tip"> <p class="tip" v-if="type === 'imgfail'">
<i <i
class="el-icon-warning-outline" class="el-icon-warning-outline"
style="color: #f56c6c; font-size: 24px" style="color: #f56c6c; font-size: 24px"
@ -49,16 +50,27 @@
<span> 影像异常导致无法阅片</span> <span> 影像异常导致无法阅片</span>
</p> </p>
<!-- 问题反馈 --> <!-- 问题反馈 -->
<el-form-item :label="$t('feedBack:form:feedBack')" prop="feedBack"> <el-form-item
<el-select v-model="form.value" style="width: 100%"> :label="$t('feedBack:form:feedBack')"
prop="feedBack"
v-if="type === 'feedback' && trialId"
>
<el-select v-model="form.type" style="width: 100%">
<el-option <el-option
v-for="item in options" v-for="item in options"
:key="item.value" :key="item.id"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
> >
</el-option> </el-option>
</el-select> </el-select>
</el-form-item>
<!-- 问题反馈 -->
<el-form-item
:label="$t('feedBack:form:feedBack')"
prop="feedBack"
v-if="type === 'detail'"
>
<span>影像异常导致无法阅片</span> <span>影像异常导致无法阅片</span>
</el-form-item> </el-form-item>
<!-- 问题描述 --> <!-- 问题描述 -->
@ -66,21 +78,34 @@
:label="$t('feedBack:form:description')" :label="$t('feedBack:form:description')"
prop="description" prop="description"
> >
<el-input v-model="form.Code" type="textarea" :rows="4" /> <el-input
v-model="form.Code"
type="textarea"
:rows="4"
:disabled="type === 'detail'"
/>
</el-form-item> </el-form-item>
<!-- 截图 --> <!-- 截图 -->
<el-form-item :label="$t('feedBack:form:screenshot')" prop="screenshot"> <el-form-item :label="$t('feedBack:form:screenshot')" prop="screenshot">
<uploadImage <uploadImage
:path.sync="form.HospitalLogoPath" :path.sync="form.HospitalLogoPath"
:disabled="disabled" :disabled="type === 'detail'"
/> />
</el-form-item> </el-form-item>
<!-- 反馈时间 --> <!-- 反馈时间 -->
<el-form-item :label="$t('feedBack:form:time')" prop="screenshot"> <el-form-item
:label="$t('feedBack:form:time')"
prop="screenshot"
v-if="type === 'detail'"
>
<span>2024-06-28 15:00</span> <span>2024-06-28 15:00</span>
</el-form-item> </el-form-item>
<!-- 状态 --> <!-- 状态 -->
<el-form-item :label="$t('feedBack:form:status')" prop="screenshot"> <el-form-item
:label="$t('feedBack:form:status')"
prop="screenshot"
v-if="type === 'detail'"
>
<el-switch <el-switch
v-model="form.status" v-model="form.status"
active-color="#13ce66" active-color="#13ce66"
@ -89,11 +114,12 @@
:inactive-value="false" :inactive-value="false"
:active-text="$fd('FeedBackStatus', true)" :active-text="$fd('FeedBackStatus', true)"
:inactive-text="$fd('FeedBackStatus', false)" :inactive-text="$fd('FeedBackStatus', false)"
:disabled="level < 8"
> >
</el-switch> </el-switch>
</el-form-item> </el-form-item>
</el-form> </el-form>
<div slot="footer"> <div slot="footer" v-if="type !== 'detail'">
<!-- 取消 --> <!-- 取消 -->
<el-button size="small" @click.stop="cancel"> <el-button size="small" @click.stop="cancel">
{{ $t("feedBack:button:cancel") }} {{ $t("feedBack:button:cancel") }}
@ -122,11 +148,16 @@ export default {
visible: false, visible: false,
loading: false, loading: false,
options: [], options: [],
type: null, // detail feedback imgfail
trialId: null,
Id: null,
form: { form: {
Code: null, Code: null,
UserId: null, UserId: null,
EMail: null, EMail: null,
username: null, username: null,
HospitalLogoPath: [],
type: 0,
}, },
rules: { rules: {
Code: [ Code: [
@ -154,13 +185,30 @@ export default {
}; };
}, },
computed: { computed: {
disabled() { level() {
return false; if (this.hasPermi(["role:dev", "role:admin"])) {
return 9;
}
if (this.hasPermi(["role:pm"])) {
return 8;
}
if (this.hasPermi(["role:ir", "role:crc"])) {
return 7;
}
return 0;
}, },
}, },
methods: { methods: {
open(data) { open(data) {
let { type, trialId, Id } = data;
this.type = type;
this.trialId = trialId;
this.Id = Id;
this.visible = true; this.visible = true;
if (!Id) {
this.title = this.setTitle();
}
this.setTypeOption();
}, },
cancel() { cancel() {
this.visible = false; this.visible = false;
@ -169,6 +217,21 @@ export default {
async save() { async save() {
this.cancel(); this.cancel();
}, },
setTypeOption() {
if (!this.trialId) return (this.options = []);
if (this.hasPermi(["role:ir"]))
return (this.option = this.$d.FeedBackTypeToIR);
if (this.hasPermi(["role:crc"]))
return (this.option = this.$d.FeedBackTypeToCRC);
},
setTitle(code, name) {
if (this.hasPermi(["role:pm"])) {
return `${this.$t("feedBack:form:title:pm")}(${code},${name})`;
}
if (this.hasPermi(["role:ir", "role:crc"])) {
return `${this.$t("feedBack:form:title")}`;
}
},
}, },
}; };
</script> </script>

View File

@ -4,6 +4,7 @@
class="upload-demo" class="upload-demo"
:class="{ uploadDisabled: disabled ? true : false }" :class="{ uploadDisabled: disabled ? true : false }"
action action
multiple
:http-request="uploadFile" :http-request="uploadFile"
:before-upload="beforeUpload" :before-upload="beforeUpload"
:file-list="fileList" :file-list="fileList"
@ -70,7 +71,7 @@ export default {
}, },
methods: { methods: {
remove(file, fileList) { remove(file, fileList) {
this.$emit("update:path", null); // this.$emit("update:path", null);
}, },
fileToBlob(file) { fileToBlob(file) {
// FileReader // FileReader
@ -125,6 +126,11 @@ export default {
let res = await this.uploadToOSS(fileName, file); let res = await this.uploadToOSS(fileName, file);
this.btnDisabled = false; this.btnDisabled = false;
if (!res) return; if (!res) return;
this.fileList.push({
url: this.OSSclientConfig.basePath + res.name,
path: res.name,
uid: param.file.uid,
});
this.$emit("update:path", [...this.path, res.name]); this.$emit("update:path", [...this.path, res.name]);
return false; return false;
}, },
@ -159,7 +165,7 @@ export default {
handleRemove(file) { handleRemove(file) {
let index = this.fileList.findIndex((item) => item.uid === file.uid); let index = this.fileList.findIndex((item) => item.uid === file.uid);
this.fileList.splice(index, 1); this.fileList.splice(index, 1);
let arr = this.fileList.map((item) => item.name); let arr = this.fileList.map((item) => item.path);
this.$emit("update:path", arr); this.$emit("update:path", arr);
}, },
}, },

View File

@ -294,7 +294,7 @@ export default {
], ],
data() { data() {
return { return {
list: [], list: [{ PublishUserName: 1 }],
total: 0, total: 0,
loading: false, loading: false,
datetimerange: [], datetimerange: [],
@ -357,8 +357,11 @@ export default {
this.getList(); this.getList();
}, },
// //
getDetail() { getDetail(row) {
this.$FB(); this.$FB({
type: "detail",
Id: row.Id,
});
}, },
}, },
}; };

View File

@ -59,6 +59,8 @@ export default {
openFeedBack() { openFeedBack() {
this.lock = true; this.lock = true;
this.$FB({ this.$FB({
type: "feedback",
trialId: this.$route.query.trialId,
cancelBack: () => { cancelBack: () => {
this.lock = false; this.lock = false;
}, },

View File

@ -140,6 +140,7 @@
align="center" align="center"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<i class="el-icon-question fbBox" @click.stop="openFeedBack(scope.row)"></i>
<!-- <el-tag v-if="scope.row.IsUrgent" type="danger">{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag> <!-- <el-tag v-if="scope.row.IsUrgent" type="danger">{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag>
<el-tag v-else type="primary">{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag> --> <el-tag v-else type="primary">{{ $fd('YesOrNo', scope.row.IsUrgent) }}</el-tag> -->
<el-tooltip placement="top"> <el-tooltip placement="top">
@ -1075,6 +1076,13 @@ export default {
} }
}, },
methods: { methods: {
//
openFeedBack(row){
this.$FB({
type:"detail",
Id:row.Id
})
},
handleExport() { handleExport() {
this.exportVisible = true this.exportVisible = true
}, },
@ -1334,4 +1342,10 @@ export default {
/deep/ .el-descriptions-item__label.has-colon:after{ /deep/ .el-descriptions-item__label.has-colon:after{
display: none; display: none;
} }
.fbBox{
float: left;
font-size: 32px;
color:#F56C6C;
cursor: pointer;
}
</style> </style>

View File

@ -1,20 +1,30 @@
<template> <template>
<div class="trial-information"> <div class="trial-information">
<el-descriptions :column="2" border style="width:1000px;"> <el-descriptions :column="2" border style="width: 1000px">
<el-descriptions-item :label="$t('trials:trials-list:form:trialId')"> <el-descriptions-item :label="$t('trials:trials-list:form:trialId')">
{{ trialInfo.TrialCode }} {{ trialInfo.TrialCode }}
<el-tag v-show="trialInfo.TrialStatusStr" size="small" style="margin-left:10px;"> <el-tag
( {{ $fd('TrialStatusEnum',trialInfo.TrialStatusStr) }} ) v-show="trialInfo.TrialStatusStr"
size="small"
style="margin-left: 10px"
>
( {{ $fd("TrialStatusEnum", trialInfo.TrialStatusStr) }} )
</el-tag> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:trialType')"> <el-descriptions-item :label="$t('trials:trials-list:form:trialType')">
{{ $fd('TrialType', trialInfo.TrialType) }} {{ $fd("TrialType", trialInfo.TrialType) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:experimentName')" :contentStyle="{'max-width': '300px'}"> <el-descriptions-item
:label="$t('trials:trials-list:form:experimentName')"
:contentStyle="{ 'max-width': '300px' }"
>
{{ trialInfo.ExperimentName }} {{ trialInfo.ExperimentName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:researchNumber')" :contentStyle="{'max-width': '300px'}"> <el-descriptions-item
:label="$t('trials:trials-list:form:researchNumber')"
:contentStyle="{ 'max-width': '300px' }"
>
{{ trialInfo.ResearchProgramNo }} {{ trialInfo.ResearchProgramNo }}
</el-descriptions-item> </el-descriptions-item>
@ -32,18 +42,27 @@
{{ trialInfo.CRO }} {{ trialInfo.CRO }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:declarationType')"> <el-descriptions-item
<span v-if="trialInfo.DeclarationTypeEnumList">{{trialInfo.DeclarationTypeEnumList.map(v => $fd('DeclarationType', v)).join(', ')}}</span> :label="$t('trials:trials-list:form:declarationType')"
>
<span v-if="trialInfo.DeclarationTypeEnumList">{{
trialInfo.DeclarationTypeEnumList.map((v) =>
$fd("DeclarationType", v)
).join(", ")
}}</span>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:phase')"> <el-descriptions-item :label="$t('trials:trials-list:form:phase')">
{{ trialInfo.Phase }} {{ trialInfo.Phase }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:indicationType')"> <el-descriptions-item
{{$fd('IndicationType', trialInfo.IndicationTypeId, 'id')}} :label="$t('trials:trials-list:form:indicationType')"
>
{{ $fd("IndicationType", trialInfo.IndicationTypeId, "id") }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:indication')"> <el-descriptions-item :label="$t('trials:trials-list:form:indication')">
{{$fd('Indication', trialInfo.IndicationEnum)}}{{trialInfo.Indication}} {{ $fd("Indication", trialInfo.IndicationEnum)
}}{{ trialInfo.Indication }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:modality')"> <el-descriptions-item :label="$t('trials:trials-list:form:modality')">
{{ trialInfo.Modalitys }} {{ trialInfo.Modalitys }}
@ -55,16 +74,23 @@
<el-descriptions-item :label="$t('trials:trials-list:form:patientsNum')"> <el-descriptions-item :label="$t('trials:trials-list:form:patientsNum')">
{{ trialInfo.ExpectedPatients }} {{ trialInfo.ExpectedPatients }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:timePointsPerPatient')"> <el-descriptions-item
:label="$t('trials:trials-list:form:timePointsPerPatient')"
>
{{ trialInfo.TimePointsPerPatient }} {{ trialInfo.TimePointsPerPatient }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :span="2" :label="$t('trials:trials-list:form:visitCount')"> <el-descriptions-item
:span="2"
:label="$t('trials:trials-list:form:visitCount')"
>
{{ trialInfo.PlanVisitCount }} {{ trialInfo.PlanVisitCount }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item
<el-descriptions-item :span="2" :label="$t('trials:trials-list:form:criterion')"> :span="2"
:label="$t('trials:trials-list:form:criterion')"
>
{{ trialInfo.Criterion }} {{ trialInfo.Criterion }}
</el-descriptions-item> </el-descriptions-item>
<!-- <el-descriptions-item :label="$t('trials:trials-list:form:reviewMode')">--> <!-- <el-descriptions-item :label="$t('trials:trials-list:form:reviewMode')">-->
@ -72,61 +98,81 @@
<!-- </el-descriptions-item>--> <!-- </el-descriptions-item>-->
<el-descriptions-item :label="$t('trials:trials-list:form:expedited')"> <el-descriptions-item :label="$t('trials:trials-list:form:expedited')">
{{$fd('YesOrNoForInt', trialInfo.Expedited)}} {{ $fd("YesOrNoForInt", trialInfo.Expedited) }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:projectCycle')"> <el-descriptions-item :label="$t('trials:trials-list:form:projectCycle')">
{{ trialInfo.ProjectCycle }} {{ trialInfo.ProjectCycle }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:totalReviewers')"> <el-descriptions-item
:label="$t('trials:trials-list:form:totalReviewers')"
>
{{ trialInfo.TotalReviewers }} {{ trialInfo.TotalReviewers }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item :label="$t('trials:trials-list:form:typeofReviewers')"> <el-descriptions-item
<span v-if="trialInfo.AttendedReviewerTypeEnumList">{{trialInfo.AttendedReviewerTypeEnumList.map(v => $fd('AttendedReviewerType', v)).join(', ')}}</span> :label="$t('trials:trials-list:form:typeofReviewers')"
>
<span v-if="trialInfo.AttendedReviewerTypeEnumList">{{
trialInfo.AttendedReviewerTypeEnumList.map((v) =>
$fd("AttendedReviewerType", v)
).join(", ")
}}</span>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<el-badge :value="200" :max="99" class="inBox">
<i class="el-icon-message" @click.stop="openFeedBack"></i>
</el-badge>
</div> </div>
</template> </template>
<script> <script>
import { getTrialInfo } from '@/api/trials' import { getTrialInfo } from "@/api/trials";
export default { export default {
data() { data() {
return { return {
trialInfo: {}, trialInfo: {},
trialId: '', trialId: "",
trialStatus: '', trialStatus: "",
formLoading: false formLoading: false,
} };
}, },
mounted() { mounted() {
this.trialId = this.$route.query.trialId this.trialId = this.$route.query.trialId;
this.initForm() this.initForm();
}, },
methods: { methods: {
initForm() { initForm() {
this.formLoading = true this.formLoading = true;
getTrialInfo(this.trialId).then(res => { getTrialInfo(this.trialId)
this.formLoading = false .then((res) => {
this.trialInfo = res.Result this.formLoading = false;
this.trialInfo.ReviewTypeList = this.trialInfo.ReviewTypeList.length > 0 ? this.trialInfo.ReviewTypeList.join(', ') : '' this.trialInfo = res.Result;
var modalityArr = [] this.trialInfo.ReviewTypeList =
res.Result.ModalityIds.map(i=>{ this.trialInfo.ReviewTypeList.length > 0
modalityArr.push(this.$fd('Modality',i,'id')) ? this.trialInfo.ReviewTypeList.join(", ")
}) : "";
this.trialInfo.ModalityList = modalityArr.join(', ') var modalityArr = [];
this.trialInfo.Criterion = res.Result.CriterionList && res.Result.CriterionList.length > 0 res.Result.ModalityIds.map((i) => {
? res.Result.CriterionList.join(', ') modalityArr.push(this.$fd("Modality", i, "id"));
: '' });
this.trialInfo.ModalityList = modalityArr.join(", ");
this.trialInfo.Criterion =
res.Result.CriterionList && res.Result.CriterionList.length > 0
? res.Result.CriterionList.join(", ")
: "";
// this.trialInfo.Expedited = this.$fd('Trial_BasicInfo', res.Result.Expedited) // this.trialInfo.Expedited = this.$fd('Trial_BasicInfo', res.Result.Expedited)
// this.trialInfo.AttendedReviewerType = this.$fd('Trial_BasicInfo', res.Result.AttendedReviewerType) // this.trialInfo.AttendedReviewerType = this.$fd('Trial_BasicInfo', res.Result.AttendedReviewerType)
}).catch(() => { this.formLoading = false }) })
} .catch(() => {
} this.formLoading = false;
} });
},
//
openFeedBack() {
this.$FBT();
},
},
};
</script> </script>
<style lang="scss"> <style lang="scss">
.trial-information { .trial-information {
@ -134,4 +180,9 @@ export default {
padding: 10px 0 0 10px; padding: 10px 0 0 10px;
background: #fff; background: #fff;
} }
.inBox {
font-size: 32px;
margin-top: 30px;
cursor: pointer;
}
</style> </style>