待阅列表添加标注tab;修改检查页面添加排序;修改项目状态签名bug修复

main
caiyiling 2024-04-23 13:44:48 +08:00
parent c2f5c2238f
commit 6a6048ee31
4 changed files with 392 additions and 341 deletions

View File

@ -67,7 +67,7 @@
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${ currentUser })` }}</span>
</div>
<SignForm ref="signForm" :trial-id="trialId" :sign-code-enum="signCode" @close="closeSignDialog" />
<SignForm ref="signForm" :trial-id="trialId" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog>
</div>
</template>

View File

@ -33,6 +33,8 @@
:data="topList"
stripe
height="30vh"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'StudyTime', order: 'ascending' }"
>
<!-- <el-table-column type="selection" align="center" width="45" /> -->
<!--患者编号-->
@ -41,6 +43,7 @@
prop="PatientIdStr"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
sortable="custom"
></el-table-column>
<!--检查类型-->
<el-table-column
@ -48,6 +51,7 @@
prop="Modalities"
:label="$t('trials:audit:table:modality')"
show-overflow-tooltip
sortable="custom"
></el-table-column>
<!--序列数量-->
<el-table-column
@ -55,6 +59,7 @@
prop="SeriesCount"
:label="$t('trials:audit:table:seriesCount')"
show-overflow-tooltip
sortable="custom"
></el-table-column>
<!--图像数量-->
<el-table-column
@ -62,6 +67,7 @@
prop="InstanceCount"
:label="$t('trials:audit:table:instanceCount')"
show-overflow-tooltip
sortable="custom"
></el-table-column>
<!--检查日期-->
<el-table-column
@ -69,6 +75,7 @@
prop="StudyTime"
:label="$t('trials:audit:table:studyDate')"
show-overflow-tooltip
sortable="custom"
></el-table-column>
<!--所属访视-->
<el-table-column
@ -76,6 +83,7 @@
prop="VisitName"
:label="$t('trials:hirVisit:table:ownershipVisit')"
show-overflow-tooltip
sortable="custom"
></el-table-column>
<!--操作-->
<el-table-column

View File

@ -0,0 +1,338 @@
<template>
<BaseContainer
v-loading="loading"
style="background-color: #fff"
>
<div slot="search-container">
<el-form :inline="true">
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:reviewTrack:table:subjectCode')">
<el-input v-model="searchData.SubjectCode" style="width: 100px" />
</el-form-item>
<!-- 患者编号 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input v-model="searchData.PatientIdStr" style="width: 140px" />
</el-form-item>
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.PatientName" style="width: 140px" />
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t("common:button:search") }}
</el-button>
<!-- 重置 -->
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
{{ $t("common:button:reset") }}
</el-button>
</el-form-item>
</el-form>
</div>
<div slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
>
<el-table-column type="index" width="40" align="left" />
<!-- 受试者编号 -->
<el-table-column
prop="SubjectCode"
min-width="100"
:label="$t('trials:reviewTrack:table:subjectCode')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 患者编号 -->
<el-table-column
prop="PatientIdStr"
min-width="100"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
v-for="(item, index) in scope.row.PatientList"
:key="`${index}${item.PatientId}`"
>
{{
index === scope.row.PatientList.length - 1
? item.PatientIdStr
: `${item.PatientIdStr}, `
}}
</span>
</template>
</el-table-column>
<!-- 患者姓名 -->
<el-table-column
prop="SubjectShortName"
min-width="100"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 剩余阅片量 -->
<el-table-column
prop="UnReadCanReadTaskCount"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 建议完成时间 -->
<el-table-column
prop="SuggesteFinishedTime"
min-width="100"
:label="
$t('trials:pendingReadingTasks:table:suggestedCompletionTime')
"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{
scope.row.SuggesteFinishedTime
? scope.row.SuggesteFinishedTime.split(":")[0] + ":00:00"
: ""
}}
</template>
</el-table-column>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
width="250"
fixed="right"
>
<template slot-scope="scope">
<!-- 阅片 -->
<el-button
:disabled="
scope.row.ExistReadingApply ||
(scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
circle
:title="
scope.row.ExistReadingApply
? $t('trials:pendingReadingTasks:button:ExistReadingApply')
: $t('trials:pendingReadingTasks:button:review')
"
icon="el-icon-edit-outline"
@click="handleReadImage(scope.row)"
/>
<!-- 释放 -->
<el-button
:disabled="
!scope.row.ClaimUserId ||
(scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
circle
:title="$t('trials:pendingReadingTasks:button:release')"
icon="el-icon-s-release"
@click="handleReleaseTasks(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</div>
</BaseContainer>
</template>
<script>
import {
getIRUnReadSubjectTaskList,
verifyReadingRestTime,
} from "@/api/trials";
import { getTrialCriterionList } from "@/api/trials/reading";
import { claimOrCancelSubject } from "@/api/reading";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import { getToken } from "@/utils/auth";
const searchDataDefault = () => {
return {
SubjectCode: "",
PatientIdStr: null,
PatientName: null,
PageIndex: 1,
PageSize: 20,
};
};
export default {
name: "ReadingTaskList",
props: {
trialCriterionInfo: {
type: Object,
required: true
}
},
components: { BaseContainer, Pagination },
data() {
return {
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
trialId: "",
isReadingTaskViewInOrder: null,
randomReadInfo: {},
isRender: false,
isTableShow: true,
readingTool: null,
criterionType: null,
openWindow: null,
userId: zzSessionStorage.getItem("userId"),
};
},
mounted() {
window.addEventListener("message", this.receiveMsg);
this.trialId = this.$route.query.trialId;
this.getList()
},
beforeDestroy() {
window.removeEventListener("message", this.receiveMsg);
if (this.openWindow) {
this.openWindow.close();
}
},
methods: {
getList() {
this.loading = true;
this.searchData.TrialId = this.trialId;
this.searchData.TrialReadingCriterionId = this.trialCriterionInfo.TrialReadingCriterionId;
this.isRender = false;
getIRUnReadSubjectTaskList(this.searchData)
.then((res) => {
this.isReadingTaskViewInOrder =
res.OtherInfo.IsReadingTaskViewInOrder;
this.readingTool = res.OtherInfo.ReadingTool;
this.criterionType = res.OtherInfo.CriterionType;
if (res.OtherInfo.IsReadingTaskViewInOrder) {
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
} else {
this.randomReadInfo = res.OtherInfo.RandomReadInfo;
}
this.isRender = true;
this.loading = false;
})
.catch(() => {
this.isRender = true;
this.loading = false;
});
},
//
handleReleaseTasks(row) {
this.loading = true;
var params = {
isInOrder: true,
subejctId: row.SubjectId,
isClaim: false,
trialReadingCriterionId: this.trialCriterionInfo.TrialReadingCriterionId
};
claimOrCancelSubject(params)
.then((res) => {
// '!'
this.$message.success(
this.$t("trials:pendingReadingTasks:message:released")
);
this.loading = false;
this.getList();
})
.catch(() => {
this.loading = false;
});
},
handleSearch() {
this.searchData.PageIndex = 1;
this.getList();
},
handleReset() {
this.searchData = searchDataDefault();
this.getList();
},
handleReadImage(row) {
if (this.openWindow) {
this.openWindow.close();
}
this.loading = true;
verifyReadingRestTime()
.then((_) => {
this.loading = false;
window.localStorage.setItem(
"TrialReadingCriterionId",
this.trialCriterionInfo.TrialReadingCriterionId
);
var token = getToken();
var path = "";
var criterionName = this.trialCriterionInfo.TrialReadingCriterionName;
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.trialCriterionInfo.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`;
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.trialCriterionInfo.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`;
}
var routeData = this.$router.resolve({ path });
this.openWindow = window.open(routeData.href, "_blank");
})
.catch(() => {
this.loading = false;
});
},
handleOutOfOrderReading() {
if (this.openWindow) {
this.openWindow.close();
}
this.loading = true;
verifyReadingRestTime()
.then((_) => {
this.loading = false;
window.localStorage.setItem(
"TrialReadingCriterionId",
this.TrialReadingCriterionId
);
var token = getToken();
var path = "";
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
}
var routeData = this.$router.resolve({ path });
this.openWindow = window.open(routeData.href, "_blank");
})
.catch(() => {
this.loading = false;
});
},
receiveMsg(event) {
if (event.data === "refreshTaskList") {
this.getList();
}
},
//
handleSortChange(column) {
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
},
};
</script>

View File

@ -1,352 +1,57 @@
<template>
<BaseContainer
v-loading="loading"
style="height: 100%; background-color: #fff"
>
<div slot="search-container">
<el-form :inline="true">
<!-- 受试者编号 -->
<el-form-item :label="$t('trials:reviewTrack:table:subjectCode')">
<el-input v-model="searchData.SubjectCode" style="width: 100px" />
</el-form-item>
<!-- 患者编号 -->
<el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input v-model="searchData.PatientIdStr" style="width: 140px" />
</el-form-item>
<!-- 患者姓名 -->
<el-form-item :label="$t('trials:uploadDicomList:table:patientName')">
<el-input v-model="searchData.PatientName" style="width: 140px" />
</el-form-item>
<el-form-item>
<!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch">
{{ $t("common:button:search") }}
</el-button>
<!-- 重置 -->
<el-button
type="primary"
icon="el-icon-refresh-left"
@click="handleReset"
>
{{ $t("common:button:reset") }}
</el-button>
</el-form-item>
</el-form>
</div>
<div slot="main-container">
<el-table
v-adaptive="{ bottomOffset: 75 }"
:data="list"
stripe
height="100"
@sort-change="handleSortChange"
<div>
<el-tabs v-model="activeName" type="border-card">
<!-- <el-tab-pane :label="$t('trials:study:tabpane:notBind')" name="notBind">
<notBindStudyList
activeName="notBind"
v-if="activeName === 'notBind'"
/>
</el-tab-pane> -->
<el-tab-pane
v-for="i in trialCriterionList"
:key="i.TrialReadingCriterionId"
:label="i.TrialReadingCriterionName"
:name="i.TrialReadingCriterionId"
>
<el-table-column type="index" width="40" align="left" />
<!-- 受试者编号 -->
<el-table-column
prop="SubjectCode"
min-width="100"
:label="$t('trials:reviewTrack:table:subjectCode')"
show-overflow-tooltip
sortable="custom"
<TaskList
v-if="activeName === i.TrialReadingCriterionId"
:trial-criterion-info="i"
/>
<!-- 患者编号 -->
<el-table-column
prop="PatientIdStr"
min-width="100"
:label="$t('trials:uploadDicomList:table:pId')"
show-overflow-tooltip
>
<template slot-scope="scope">
<span
v-for="(item, index) in scope.row.PatientList"
:key="`${index}${item.PatientId}`"
>
{{
index === scope.row.PatientList.length - 1
? item.PatientIdStr
: `${item.PatientIdStr}, `
}}
</span>
</template>
</el-table-column>
<!-- 患者姓名 -->
<el-table-column
prop="SubjectShortName"
min-width="100"
:label="$t('trials:uploadDicomList:table:patientName')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 剩余阅片量 -->
<el-table-column
prop="UnReadCanReadTaskCount"
min-width="100"
:label="$t('trials:pendingReadingTasks:table:remainingReadingVolume')"
show-overflow-tooltip
sortable="custom"
/>
<!-- 建议完成时间 -->
<el-table-column
prop="SuggesteFinishedTime"
min-width="100"
:label="
$t('trials:pendingReadingTasks:table:suggestedCompletionTime')
"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
{{
scope.row.SuggesteFinishedTime
? scope.row.SuggesteFinishedTime.split(":")[0] + ":00:00"
: ""
}}
</template>
</el-table-column>
<!--操作-->
<el-table-column
:label="$t('common:action:action')"
width="250"
fixed="right"
>
<template slot-scope="scope">
<!-- 阅片 -->
<el-button
:disabled="
scope.row.ExistReadingApply ||
(scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
circle
:title="
scope.row.ExistReadingApply
? $t('trials:pendingReadingTasks:button:ExistReadingApply')
: $t('trials:pendingReadingTasks:button:review')
"
icon="el-icon-edit-outline"
@click="handleReadImage(scope.row)"
/>
<!-- 释放 -->
<el-button
:disabled="
!scope.row.ClaimUserId ||
(scope.row.ClaimUserId && scope.row.ClaimUserId !== userId)
"
circle
:title="$t('trials:pendingReadingTasks:button:release')"
icon="el-icon-s-release"
@click="handleReleaseTasks(scope.row)"
/>
</template>
</el-table-column>
</el-table>
<pagination
class="page"
:total="total"
:page.sync="searchData.PageIndex"
:limit.sync="searchData.PageSize"
@pagination="getList"
/>
</div>
</BaseContainer>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import {
getIRUnReadSubjectTaskList,
verifyReadingRestTime,
} from "@/api/trials";
import { getTrialCriterionList } from "@/api/trials/reading";
import { claimOrCancelSubject } from "@/api/reading";
import BaseContainer from "@/components/BaseContainer";
import Pagination from "@/components/Pagination";
import { getToken } from "@/utils/auth";
const searchDataDefault = () => {
return {
SubjectCode: "",
PatientIdStr: null,
PatientName: null,
PageIndex: 1,
PageSize: 20,
};
};
import { getTrialCriterionList } from '@/api/trials/reading'
import TaskList from './components/TaskList'
export default {
name: "ReadingTaskList",
components: { BaseContainer, Pagination },
name: 'ReadingTask',
components: {
TaskList
},
data() {
return {
searchData: searchDataDefault(),
list: [],
total: 0,
loading: false,
trialId: "",
isReadingTaskViewInOrder: null,
randomReadInfo: {},
isRender: false,
trialCriterionList: [],
TrialReadingCriterionId: "",
isTableShow: true,
readingTool: null,
criterionType: null,
openWindow: null,
userId: zzSessionStorage.getItem("userId"),
};
},
watch: {
TrialReadingCriterionId(v) {
if (!v) return;
this.getList();
},
},
mounted() {
window.addEventListener("message", this.receiveMsg);
this.trialId = this.$route.query.trialId;
// this.getList()
this.getTrialCriterionList();
},
beforeDestroy() {
window.removeEventListener("message", this.receiveMsg);
if (this.openWindow) {
this.openWindow.close();
activeName: '',
trialId: '',
trialCriterionList: []
}
},
methods: {
getTrialCriterionList() {
getTrialCriterionList(this.trialId)
.then((res) => {
this.trialCriterionList = res.Result;
this.TrialReadingCriterionId =
this.trialCriterionList[0].TrialReadingCriterionId;
})
.catch(() => {});
},
getList() {
this.loading = true;
this.searchData.TrialId = this.trialId;
this.searchData.TrialReadingCriterionId = this.TrialReadingCriterionId;
this.isRender = false;
getIRUnReadSubjectTaskList(this.searchData)
.then((res) => {
this.isReadingTaskViewInOrder =
res.OtherInfo.IsReadingTaskViewInOrder;
this.readingTool = res.OtherInfo.ReadingTool;
this.criterionType = res.OtherInfo.CriterionType;
if (res.OtherInfo.IsReadingTaskViewInOrder) {
this.list = res.Result.CurrentPageData;
this.total = res.Result.TotalCount;
} else {
this.randomReadInfo = res.OtherInfo.RandomReadInfo;
}
this.isRender = true;
this.loading = false;
})
.catch(() => {
this.isRender = true;
this.loading = false;
});
},
//
handleReleaseTasks(row) {
this.loading = true;
var params = {
isInOrder: true,
subejctId: row.SubjectId,
isClaim: false,
trialReadingCriterionId: this.TrialReadingCriterionId,
};
claimOrCancelSubject(params)
.then((res) => {
// '!'
this.$message.success(
this.$t("trials:pendingReadingTasks:message:released")
);
this.loading = false;
this.getList();
})
.catch(() => {
this.loading = false;
});
},
handleSearch() {
this.searchData.PageIndex = 1;
this.getList();
},
handleReset() {
this.searchData = searchDataDefault();
this.getList();
},
handleReadImage(row) {
if (this.openWindow) {
this.openWindow.close();
}
this.loading = true;
verifyReadingRestTime()
.then((_) => {
this.loading = false;
window.localStorage.setItem(
"TrialReadingCriterionId",
this.TrialReadingCriterionId
);
var token = getToken();
var path = "";
var criterionName = this.trialCriterionList.find(
(i) => i.TrialReadingCriterionId === this.TrialReadingCriterionId
).TrialReadingCriterionName;
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`;
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&subjectCode=${row.SubjectCode}&subjectId=${row.SubjectId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&criterionName=${criterionName}&readingTool=${this.readingTool}&TokenKey=${token}`;
}
var routeData = this.$router.resolve({ path });
this.openWindow = window.open(routeData.href, "_blank");
})
.catch(() => {
this.loading = false;
});
},
handleOutOfOrderReading() {
if (this.openWindow) {
this.openWindow.close();
}
this.loading = true;
verifyReadingRestTime()
.then((_) => {
this.loading = false;
window.localStorage.setItem(
"TrialReadingCriterionId",
this.TrialReadingCriterionId
);
var token = getToken();
var path = "";
if (this.readingTool === 0) {
path = `/readingDicoms?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
} else {
path = `/noneDicomReading?TrialReadingCriterionId=${this.TrialReadingCriterionId}&trialId=${this.trialId}&isReadingTaskViewInOrder=${this.isReadingTaskViewInOrder}&criterionType=${this.criterionType}&readingTool=${this.readingTool}&TokenKey=${token}`;
}
var routeData = this.$router.resolve({ path });
this.openWindow = window.open(routeData.href, "_blank");
})
.catch(() => {
this.loading = false;
});
},
receiveMsg(event) {
if (event.data === "refreshTaskList") {
this.getList();
}
},
//
handleSortChange(column) {
if (column.order === "ascending") {
this.searchData.Asc = true;
} else {
this.searchData.Asc = false;
}
this.searchData.SortField = column.prop;
this.searchData.PageIndex = 1;
this.getList();
},
mounted() {
this.trialId = this.$route.query.trialId
this.getTrialCriterionList()
},
};
methods: {
async getTrialCriterionList() {
try {
const res = await getTrialCriterionList(this.trialId)
if (res.IsSuccess) {
this.trialCriterionList = res.Result
this.activeName = this.trialCriterionList.length > 0 ? this.trialCriterionList[0].TrialReadingCriterionId : ''
}
} catch (err) {
console.log(err)
}
}
}
}
</script>