diff --git a/.svn/pristine/a5/a510475a0912f21efb3b36f41ecdfc3f783e4b6d.svn-base b/.svn/pristine/a5/a510475a0912f21efb3b36f41ecdfc3f783e4b6d.svn-base
index 6815c09f..e36d56d5 100644
--- a/.svn/pristine/a5/a510475a0912f21efb3b36f41ecdfc3f783e4b6d.svn-base
+++ b/.svn/pristine/a5/a510475a0912f21efb3b36f41ecdfc3f783e4b6d.svn-base
@@ -10516,7 +10516,7 @@ class BaseViewer {
const pageNumber = this._currentPageNumber,
state = this.#scrollModePageState,
- viewer = this.viewer;
+ viewmr = this.viewer;
viewer.textContent = "";
state.pages.length = 0;
diff --git a/src/api/dictionary.js b/src/api/dictionary.js
index 6c432a61..59f880d3 100644
--- a/src/api/dictionary.js
+++ b/src/api/dictionary.js
@@ -1202,3 +1202,42 @@ export function deleteTrialNormalRecordList(data) {
data
})
}
+// 项目文档-培训记录列表
+export function getTrialTrianingRecordList(data) {
+ return request({
+ url: `/TrialTrianingRecord/getTrialTrianingRecordList`,
+ method: 'post',
+ data
+ })
+}
+// 项目文档-培训记录新增/修改
+export function addOrUpdateTrialTrianingRecord(data) {
+ return request({
+ url: `/TrialTrianingRecord/addOrUpdateTrialTrianingRecord`,
+ method: 'post',
+ data
+ })
+}
+// 项目文档-培训记录批量新增/修改
+export function batchAddTrialTrianingRecord(data) {
+ return request({
+ url: `/TrialTrianingRecord/batchAddTrialTrianingRecord`,
+ method: 'post',
+ data
+ })
+}
+// 项目文档-删除培训记录
+export function deleteTrialTrianingRecord(id) {
+ return request({
+ url: `/TrialTrianingRecord/deleteTrialTrianingRecord/${id}`,
+ method: 'delete',
+ })
+}
+// 项目文档-培训记录授权
+export function authorizedTrialTrianingRecord(data) {
+ return request({
+ url: `/TrialTrianingRecord/authorizedTrialTrianingRecord`,
+ method: 'post',
+ data
+ })
+}
diff --git a/src/api/trials.js b/src/api/trials.js
index f9c572d1..3f4b9dff 100644
--- a/src/api/trials.js
+++ b/src/api/trials.js
@@ -1080,7 +1080,13 @@ export function setSeriesStatus(trialId, subjectVisitId, studyId, seriesId, stat
method: 'put'
})
}
-
+export function setNodicomStudyState(params) {
+ return request({
+ url: `/QCOperation/setNodicomStudyState`,
+ method: 'put',
+ params
+ })
+}
export function setInstanceStatus(trialId, subjectVisitId, seriesId, instanceId, state) {
return request({
url: `/QCOperation/setInstanceState/${trialId}/${subjectVisitId}/${seriesId}/${instanceId}/${state}`,
diff --git a/src/components/uploadDicomAndNonedicom/dicomFile.vue b/src/components/uploadDicomAndNonedicom/dicomFile.vue
index 64a22362..57361197 100644
--- a/src/components/uploadDicomAndNonedicom/dicomFile.vue
+++ b/src/components/uploadDicomAndNonedicom/dicomFile.vue
@@ -1308,7 +1308,7 @@ export default {
o.imageColumns,
o.imageRows
)
- let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.png`
+ let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
let OSSclient = scope.OSSclient
let seriesRes = await OSSclient.put(
thumbnailPath,
@@ -1421,7 +1421,7 @@ export default {
v.instanceList[0].imageColumns,
v.instanceList[0].imageRows
)
- let thumbnailPath = `/${params.trialId}/Image/${params.trialSiteId}/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.png`
+ let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
let OSSclient = scope.OSSclient
try {
let seriesRes = await OSSclient.put(thumbnailPath, blob)
@@ -1499,8 +1499,8 @@ export default {
return new Promise((resolve) => {
cornerstone.loadImage(imageId).then(async (image) => {
let canvas = document.createElement('canvas')
- canvas.width = width
- canvas.height = height
+ canvas.width = (width * 60) / height
+ canvas.height = 60
if (image) {
cornerstone.renderToCanvas(canvas, image)
// 将 Canvas 图像对象转换为 PNG 格式
diff --git a/src/components/uploadImage/components/upload-list.vue b/src/components/uploadImage/components/upload-list.vue
index 2968add8..95465af2 100644
--- a/src/components/uploadImage/components/upload-list.vue
+++ b/src/components/uploadImage/components/upload-list.vue
@@ -567,7 +567,7 @@ export default {
for (let i = 0; i < arr.length; i++) {
let dicom = arr[i];
if (dicom.StudyInstanceUid !== StudyInstanceUid) continue;
- let thumbnailPath = `/${dicom.params.TrialId}/TaskImage/${dicom.params.SubjectId}/${dicom.params.VisitTaskId}/${dicom.StudyInstanceUid}/${dicom.SeriesInstanceUid}.png`;
+ let thumbnailPath = `/${dicom.params.TrialId}/TaskImage/${dicom.params.SubjectId}/${dicom.params.VisitTaskId}/${dicom.StudyInstanceUid}/${dicom.SeriesInstanceUid}.jpg`;
if (!studyObj[dicom.StudyId]) {
studyObj[dicom.StudyId] = {
StudyId: dicom.StudyId,
diff --git a/src/utils/parseDicom.js b/src/utils/parseDicom.js
index 562630a0..7b84e32d 100644
--- a/src/utils/parseDicom.js
+++ b/src/utils/parseDicom.js
@@ -189,8 +189,8 @@ const dicomToPng = (imageId, width, height) => {
return new Promise((resolve) => {
cornerstone.loadImage(imageId).then(async (image) => {
let canvas = document.createElement("canvas");
- canvas.width = width;
- canvas.height = height;
+ canvas.width = (width * 60) / height
+ canvas.height = 60
if (image) {
cornerstone.renderToCanvas(canvas, image);
// 将 Canvas 图像对象转换为 PNG 格式
diff --git a/src/views/none-dicom-show/index.vue b/src/views/none-dicom-show/index.vue
index 8eb0044f..96f9d2e2 100644
--- a/src/views/none-dicom-show/index.vue
+++ b/src/views/none-dicom-show/index.vue
@@ -9,9 +9,9 @@
{{ study.CodeView }}
- {{
- study.StudyName
- }}
+
+ {{ study.StudyName }}
+
{{ study.Modality }}
{{ getBodyPart(study.BodyPart) }}
@@ -23,25 +23,48 @@
{{ $t('trials:audit:message:noData') }}
-
-
- {{ `${j + 1}. ${item.FileName}` }}
-
-
-
+
+
+
{{ `${j + 1}. ${item.FileName}` }}
-
-
+
+
+ {{ `${j + 1}. ${item.FileName}` }}
+
+
+
+
+ {{ $t('trials:audit:table:isReading') }}
+
+
+
+ {{ $t('trials:audit:table:isDelete') }}
+
+
+
+
+
@@ -70,7 +93,7 @@
+
\ No newline at end of file
diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/form.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/form.vue
new file mode 100644
index 00000000..d371e9bf
--- /dev/null
+++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/form.vue
@@ -0,0 +1,299 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common:button:upload') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:rule:mustPDF') }}
+
+
+
+
+
+ {{ $t('common:button:upload') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:rule:mustZIP') }}
+
+
+
+
+
+
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:canel') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:save') }}
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue
new file mode 100644
index 00000000..a2727fd9
--- /dev/null
+++ b/src/views/trials/trials-panel/trial-summary/trial-document/components/trainRecord/index.vue
@@ -0,0 +1,948 @@
+
+
+
+ {{ TITLE }}
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+ {{ $t('common:button:edit') }}
+
+
+ {{ $t('common:button:save') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('common:button:search') }}
+
+
+ {{ $t('common:button:reset') }}
+
+
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:accredit') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:uploadFile') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:uploadFolder') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:add') }}
+
+
+ {{ $t('trials:trialDocument:trainRecord:button:downLoad') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ scope.row.TrianingDate }}
+
+
+
+
+
+
+
+
+
+
{{
+ scope.row.TrialFileRecord.FileName
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{
+ scope.row.HistoryFileRecord.FileName
+ }}
+
+
+
+
+
+
+
+
+
+
+
+ auth(false, scope.row, val)"
+ :active-value="true"
+ :inactive-value="false"
+ :active-text="$fd('YesOrNo', true)"
+ :inactive-text="$fd('YesOrNo', false)"
+ >
+
+ {{ $fd('YesOrNo', scope.row.IsAuthorizedView) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/views/trials/trials-panel/trial-summary/trial-document/index.vue b/src/views/trials/trials-panel/trial-summary/trial-document/index.vue
index 4b8f6e0b..89afb3c3 100644
--- a/src/views/trials/trials-panel/trial-summary/trial-document/index.vue
+++ b/src/views/trials/trials-panel/trial-summary/trial-document/index.vue
@@ -42,7 +42,6 @@
:rowData="rowData"
@getMenu="getMenu"
/>
-
+
+
+
@@ -59,9 +75,11 @@ import BaseContainer from '@/components/BaseContainer'
import Menu from './components/menu.vue'
import reportDoc from './components/report_doc/index.vue'
import fileRecord from './components/fileRecord/index.vue'
+import trainRecord from './components/trainRecord/index.vue'
+import temp from './components/template/index.vue'
export default {
name: 'trialDocument',
- components: { BaseContainer, Menu, reportDoc, fileRecord },
+ components: { BaseContainer, Menu, reportDoc, fileRecord, trainRecord, temp },
data() {
return {
viewStatus: false,
diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/studyInfo.vue b/src/views/trials/trials-panel/visit/crc-upload/components/studyInfo.vue
index f1a86870..4284dc7a 100644
--- a/src/views/trials/trials-panel/visit/crc-upload/components/studyInfo.vue
+++ b/src/views/trials/trials-panel/visit/crc-upload/components/studyInfo.vue
@@ -34,6 +34,7 @@
height="300"
:row-class-name="tableRowClassName"
@selection-change="handleSelectionChange"
+ :default-sort="{ prop: 'UploadedTime', order: 'ascending' }"
>
@@ -78,6 +84,7 @@
@@ -85,6 +92,7 @@
@@ -92,6 +100,7 @@
@@ -99,11 +108,20 @@
{{ moment(scope.row.StudyTime).format('YYYY-MM-DD') }}
+
+
@@ -44,6 +45,7 @@
:label="$t('trials:uploadedDicoms:table:studyId')"
min-width="80"
show-overflow-tooltip
+ sortable
>
{{ getBodyPart(scope.row.BodyPartForEdit) }}
@@ -120,6 +126,7 @@
:label="$t('trials:uploadedDicoms:table:seriesCount')"
min-width="100"
show-overflow-tooltip
+ sortable
/>
{{
@@ -143,12 +152,21 @@
}}
+
+
`
- this.$alert(
- content,
- '',
- {
- confirmButtonText: this.$t(
- 'trials:uploadDicomList:label:confirm'
- ),
- dangerouslyUseHTMLString: true,
- callback: (action) => {},
- }
- )
+ this.$alert(content, '', {
+ confirmButtonText: this.$t(
+ 'trials:uploadDicomList:label:confirm'
+ ),
+ dangerouslyUseHTMLString: true,
+ callback: (action) => {},
+ })
this.btnLoading = false
}
var results = []
@@ -1591,8 +1612,8 @@ export default {
return new Promise((resolve) => {
cornerstone.loadImage(imageId).then(async (image) => {
let canvas = document.createElement('canvas')
- canvas.width = width
- canvas.height = height
+ canvas.width = (width * 60) / height
+ canvas.height = 60
if (image) {
cornerstone.renderToCanvas(canvas, image)
// 将 Canvas 图像对象转换为 PNG 格式
@@ -1760,7 +1781,7 @@ export default {
o.imageColumns,
o.imageRows
)
- let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.png`
+ let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
let OSSclient = scope.OSSclient
let seriesRes = await OSSclient.put(
thumbnailPath,
@@ -1873,7 +1894,7 @@ export default {
v.instanceList[0].imageColumns,
v.instanceList[0].imageRows
)
- let thumbnailPath = `/${params.trialId}/Image/${params.trialSiteId}/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.png`
+ let thumbnailPath = `/${params.trialId}/Image/${params.trialSiteId}/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
let OSSclient = scope.OSSclient
try {
let seriesRes = await OSSclient.put(thumbnailPath, blob)
diff --git a/src/views/trials/trials-panel/visit/crc-upload/components/uploadNonDicomFiles.vue b/src/views/trials/trials-panel/visit/crc-upload/components/uploadNonDicomFiles.vue
index 839eae49..91b9478d 100644
--- a/src/views/trials/trials-panel/visit/crc-upload/components/uploadNonDicomFiles.vue
+++ b/src/views/trials/trials-panel/visit/crc-upload/components/uploadNonDicomFiles.vue
@@ -23,27 +23,35 @@
-
+
{{ getBodyPart(scope.row.BodyPart) }}
@@ -53,6 +61,7 @@
{{ moment(scope.row.ImageDate).format('YYYY-MM-DD') }}
@@ -174,6 +184,13 @@
+
+
diff --git a/src/views/trials/trials-panel/visit/qc-check/components/dicomFiles.vue b/src/views/trials/trials-panel/visit/qc-check/components/dicomFiles.vue
index 295c47f3..ad684982 100644
--- a/src/views/trials/trials-panel/visit/qc-check/components/dicomFiles.vue
+++ b/src/views/trials/trials-panel/visit/qc-check/components/dicomFiles.vue
@@ -19,6 +19,7 @@
height="300"
:row-class-name="tableRowClassName"
@selection-change="handleSelectionChange"
+ :default-sort="{ prop: 'UploadedTime', order: 'ascending' }"
>
@@ -51,15 +53,18 @@
v-if="relationInfo.IsShowStudyName"
prop="StudyName"
:label="$t('trials:audit:table:StudyName')"
+ sortable
/>
{{ getBodyPart(scope.row.BodyPartForEdit) }}
@@ -78,6 +84,7 @@
:label="$t('trials:audit:table:seriesCount')"
min-width="100"
show-overflow-tooltip
+ sortable
/>
{{ moment(scope.row.StudyTime).format('YYYY-MM-DD') }}
+
+
+
+
+
+
@@ -241,32 +266,41 @@
{{ $t('trials:audit:title:series') }}
-
+
@@ -277,16 +311,25 @@
}}
+
+
@@ -404,28 +447,34 @@
{{ getBodyPart(scope.row.BodyPart) }}
@@ -435,6 +484,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -1376,6 +1466,7 @@ import {
verifyCanQCPassedOrFailed,
verifyQCCanAddChallenge,
setSeriesStatus,
+ setNodicomStudyState,
addOrUpdateNoneDicomStudy,
addOrUpdateQCQuestionAnswerList,
addOrUpdateQCChallenge,
@@ -2061,7 +2152,7 @@ export default {
this.currentQCRow = { ...row }
this.chatVisible = true
},
- changeReadingStatus(callback, row) {
+ changeReadingStatus(callback, row, isNoDicom = false) {
let statusStr = ''
if (callback) {
statusStr = this.$t('trials:audit:label:setSeriesReading')
@@ -2082,6 +2173,26 @@ export default {
.then(() => {
const state = row.IsReading ? 1 : 2
this.loading = true
+ if (isNoDicom) {
+ let params = {
+ SubjectVisitId: row.SubjectVisitId,
+ NoneDicomStudyId: row.Id,
+ State: state,
+ }
+ return setNodicomStudyState(params)
+ .then((res) => {
+ this.loading = false
+ if (res.IsSuccess) {
+ this.$message.success(
+ this.$t('common:message:savedSuccessfully')
+ )
+ this.getQCInfo()
+ }
+ })
+ .catch(() => {
+ this.loading = false
+ })
+ }
setSeriesStatus(
this.trialId,
this.data.Id,
@@ -2104,7 +2215,7 @@ export default {
})
.catch(() => {})
},
- changeDeleteStatus(callback, row) {
+ changeDeleteStatus(callback, row, isNoDicom = false) {
let statusStr = ''
if (callback) {
statusStr = this.$t('trials:audit:label:setSeriesDeleted')
@@ -2125,6 +2236,26 @@ export default {
.then(() => {
const state = row.IsDeleted ? 5 : 4
this.loading = true
+ if (isNoDicom) {
+ let params = {
+ SubjectVisitId: row.SubjectVisitId,
+ NoneDicomStudyId: row.Id,
+ State: state,
+ }
+ return setNodicomStudyState(params)
+ .then((res) => {
+ this.loading = false
+ if (res.IsSuccess) {
+ this.$message.success(
+ this.$t('common:message:savedSuccessfully')
+ )
+ this.getQCInfo()
+ }
+ })
+ .catch(() => {
+ this.loading = false
+ })
+ }
setSeriesStatus(
this.trialId,
this.data.Id,
@@ -2574,7 +2705,7 @@ export default {
let trialId = this.$route.query.trialId
var token = getToken()
const routeData = this.$router.resolve({
- path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&TokenKey=${token}`,
+ path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&TokenKey=${token}&isQcCheck=1`,
})
this.open = window.open(routeData.href, '_blank')
},
@@ -2586,7 +2717,7 @@ export default {
let trialId = this.$route.query.trialId
var token = getToken()
const routeData = this.$router.resolve({
- path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&studyId=${row.Id}&TokenKey=${token}`,
+ path: `/showNoneDicoms?trialId=${trialId}&subjectVisitId=${this.data.Id}&studyId=${row.Id}&TokenKey=${token}&isQcCheck=1`,
})
this.open = window.open(routeData.href, '_blank')
},
diff --git a/static/pdfjs/web/viewer.js b/static/pdfjs/web/viewer.js
index 57914ec7..19fe569a 100644
--- a/static/pdfjs/web/viewer.js
+++ b/static/pdfjs/web/viewer.js
@@ -11760,7 +11760,7 @@ const DEFAULT_L10N_STRINGS = {
rendering_error: "An error occurred while rendering the page.",
page_scale_width: "Page Width",
page_scale_fit: "Page Fit",
- page_scale_auto: "Automatic Zoom",
+ page_scale_auto: "100%", //Automatic Zoom
page_scale_actual: "Actual Size",
page_scale_percent: "{{scale}}%",
loading: "Loading…",