15 Commits

Author SHA1 Message Date
caiyiling a66e15eb39 MRI-PDFF测量逻辑更改
continuous-integration/drone/push Build encountered an error
2025-06-04 16:25:48 +08:00
caiyiling 895e3a6bed MRI-PDFF更改
continuous-integration/drone/push Build encountered an error
2025-06-04 13:35:42 +08:00
caiyiling 9dddc0c012 MRI-PDFF测量逻辑更改
continuous-integration/drone/push Build encountered an error
2025-06-04 10:53:45 +08:00
caiyiling a965f08a1e MRI-PDFF标准更改
continuous-integration/drone/push Build encountered an error
2025-06-04 09:24:41 +08:00
caiyiling 9962b1a829 反色bug修复
continuous-integration/drone/push Build encountered an error
2025-05-28 18:46:53 +08:00
caiyiling 049128b90e 添加阅片完成支持添加临时标注(历史标注不允许更改)功能及阅片页面双击放大缺陷修复
continuous-integration/drone/push Build encountered an error
2025-05-28 15:44:38 +08:00
wangxiaoshuang 45e6a20988 Merge branch 'uat'
continuous-integration/drone/push Build encountered an error
# Conflicts:
#	src/utils/metaDataProvider.js
2025-05-26 12:30:44 +08:00
wangxiaoshuang 5141eb5cbd 发布配置修改
continuous-integration/drone/push Build is passing
2025-05-23 18:12:49 +08:00
wangxiaoshuang 073b06a76f 1
continuous-integration/drone/push Build is passing
2025-05-23 17:10:45 +08:00
wangxiaoshuang 20723e8d2c 1
continuous-integration/drone/push Build is passing
2025-05-23 16:25:30 +08:00
wangxiaoshuang fba00157a1 crc一致性核查回复弹窗添加取消按钮
continuous-integration/drone/push Build is passing
2025-05-23 16:06:12 +08:00
wangxiaoshuang e0321bae72 影像预览问题解决
continuous-integration/drone/push Build encountered an error
2025-04-12 12:04:20 +08:00
wangxiaoshuang 1e720e399d 确认收入项,修改选项后,其他文件也改了
continuous-integration/drone/push Build encountered an error
2025-04-03 11:15:54 +08:00
wangxiaoshuang 1368397da9 项目总览—>上传记录:中心编号 查询条件,查询结果不对 2025-04-03 11:15:36 +08:00
wangxiaoshuang c8c049b5d0 DICOM影像中,存在Tag最大像素值、最小像素值等,但是和实际的数据统计结果不同 2025-04-03 11:15:22 +08:00
12 changed files with 336 additions and 147 deletions
+137 -10
View File
@@ -39,6 +39,108 @@ function getNumberValues(dataSet, tag, minimumLength) {
return values;
}
function getLutDescriptor(dataSet, tag) {
if (!dataSet.elements[tag] || dataSet.elements[tag].length !== 6) {
return;
}
return [
dataSet.uint16(tag, 0),
dataSet.uint16(tag, 1),
dataSet.uint16(tag, 2),
];
}
function getLutData(lutDataSet, tag, lutDescriptor) {
const lut = [];
const lutData = lutDataSet.elements[tag];
for (let i = 0; i < lutDescriptor[0]; i++) {
// Output range is always unsigned
if (lutDescriptor[2] === 16) {
lut[i] = lutDataSet.uint16(tag, i);
} else {
lut[i] = lutDataSet.byteArray[i + lutData.dataOffset];
}
}
return lut;
}
function populateSmallestLargestPixelValues(dataSet, imagePixelModule) {
const pixelRepresentation = dataSet.uint16('x00280103');
if (pixelRepresentation === 0) {
imagePixelModule.smallestPixelValue = dataSet.uint16('x00280106');
imagePixelModule.largestPixelValue = dataSet.uint16('x00280107');
} else {
imagePixelModule.smallestPixelValue = dataSet.int16('x00280106');
imagePixelModule.largestPixelValue = dataSet.int16('x00280107');
}
imagePixelModule.largestPixelValue = imagePixelModule.largestPixelValue === 0 ? undefined : imagePixelModule.largestPixelValue;
}
function populatePaletteColorLut(dataSet, imagePixelModule) {
imagePixelModule.redPaletteColorLookupTableDescriptor = getLutDescriptor(
dataSet,
'x00281101'
);
imagePixelModule.greenPaletteColorLookupTableDescriptor = getLutDescriptor(
dataSet,
'x00281102'
);
imagePixelModule.bluePaletteColorLookupTableDescriptor = getLutDescriptor(
dataSet,
'x00281103'
);
// The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table.
// When the number of table entries is equal to 2ˆ16 then this value shall be 0.
// See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5
if (imagePixelModule.redPaletteColorLookupTableDescriptor[0] === 0) {
imagePixelModule.redPaletteColorLookupTableDescriptor[0] = 65536;
imagePixelModule.greenPaletteColorLookupTableDescriptor[0] = 65536;
imagePixelModule.bluePaletteColorLookupTableDescriptor[0] = 65536;
}
// The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data.
// It shall take the value of 8 or 16.
// The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1.
// The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors.
//
// Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits;
// this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry.
// The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16.
const numLutEntries =
imagePixelModule.redPaletteColorLookupTableDescriptor[0];
const lutData = dataSet.elements.x00281201;
const lutBitsAllocated = lutData.length === numLutEntries ? 8 : 16;
// If the descriptors do not appear to have the correct values, correct them
if (
imagePixelModule.redPaletteColorLookupTableDescriptor[2] !==
lutBitsAllocated
) {
imagePixelModule.redPaletteColorLookupTableDescriptor[2] = lutBitsAllocated;
imagePixelModule.greenPaletteColorLookupTableDescriptor[2] =
lutBitsAllocated;
imagePixelModule.bluePaletteColorLookupTableDescriptor[2] =
lutBitsAllocated;
}
imagePixelModule.redPaletteColorLookupTableData = getLutData(
dataSet,
'x00281201',
imagePixelModule.redPaletteColorLookupTableDescriptor
);
imagePixelModule.greenPaletteColorLookupTableData = getLutData(
dataSet,
'x00281202',
imagePixelModule.greenPaletteColorLookupTableDescriptor
);
imagePixelModule.bluePaletteColorLookupTableData = getLutData(
dataSet,
'x00281203',
imagePixelModule.bluePaletteColorLookupTableDescriptor
);
}
function metaDataProvider(type, imageId) {
const parsedImageId = parseImageId(imageId);
const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(parsedImageId.url);
@@ -100,7 +202,7 @@ function metaDataProvider(type, imageId) {
};
}
if (type === 'imagePixelModule') {
return {
const imagePixelModule = {
samplesPerPixel: dataSet.uint16('x00280002'),
photometricInterpretation: dataSet.string('x00280004'),
rows: dataSet.uint16('x00280010'),
@@ -110,16 +212,41 @@ function metaDataProvider(type, imageId) {
highBit: dataSet.uint16('x00280102'),
pixelRepresentation: dataSet.uint16('x00280103'),
planarConfiguration: dataSet.uint16('x00280006'),
pixelAspectRatio: dataSet.uint16('x00280034'),
smallestPixelValue: null,
largestPixelValue: null,
redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'),
greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'),
bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'),
redPaletteColorLookupTableData: dataSet.string('x00281201'),
greenPaletteColorLookupTableData: dataSet.string('x00281202'),
bluePaletteColorLookupTableData: dataSet.string('x00281203')
pixelAspectRatio: dataSet.string('x00280034'),
};
populateSmallestLargestPixelValues(dataSet, imagePixelModule);
if (
imagePixelModule.photometricInterpretation === 'PALETTE COLOR' &&
dataSet.elements.x00281101
) {
populatePaletteColorLut(dataSet, imagePixelModule);
}
return imagePixelModule;
}
// if (type === 'imagePixelModule') {
// return {
// samplesPerPixel: dataSet.uint16('x00280002'),
// photometricInterpretation: dataSet.string('x00280004'),
// rows: dataSet.uint16('x00280010'),
// columns: dataSet.uint16('x00280011'),
// bitsAllocated: dataSet.uint16('x00280100'),
// bitsStored: dataSet.uint16('x00280101'),
// highBit: dataSet.uint16('x00280102'),
// pixelRepresentation: dataSet.uint16('x00280103'),
// planarConfiguration: dataSet.uint16('x00280006'),
// pixelAspectRatio: dataSet.uint16('x00280034'),
// smallestPixelValue: null,
// largestPixelValue: null,
// // smallestPixelValue: dataSet.uint16('x00280106'),
// // largestPixelValue: dataSet.uint16('x00280107'),
// redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'),
// greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'),
// bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'),
// redPaletteColorLookupTableData: dataSet.string('x00281201'),
// greenPaletteColorLookupTableData: dataSet.string('x00281202'),
// bluePaletteColorLookupTableData: dataSet.string('x00281203')
// }
// }
}
export default metaDataProvider;
@@ -124,7 +124,7 @@
<el-table-column prop="Name" :label="$t('trials:signRecords:table:fileName')" show-overflow-tooltip
sortable="custom" />
<el-table-column :label="$t('trials:signRecords:table:AttachmentCount')" prop="AttachmentCount"
show-overflow-tooltip sortable="custom">
show-overflow-tooltip>
<template slot-scope="scope">
<el-button type="text" @click.stop="openAttachment(scope.row, true)">{{ scope.row.AttachmentCount
}}</el-button>
@@ -263,7 +263,7 @@ export default {
series: '',
ToolStateManager: null,
renderedMeasured: [],
measuredTools: ['Length', 'Bidirectional', 'ArrowAnnotate', 'RectangleRoi'],
measuredTools: ['Length', 'Bidirectional', 'ArrowAnnotate', 'RectangleRoi', 'Probe'],
measureData: [],
selectedLesion: null,
activeTool: 0, // 0:enable 1:passive 2:active
@@ -303,8 +303,8 @@ export default {
],
scrollSyncInfo: { offset: 0 },
hideMeasureArr: []
hideMeasureArr: [],
isInitWwwc: true
}
},
computed: {
@@ -565,7 +565,6 @@ export default {
e.stopPropagation()
e.preventDefault()
} else if (this.activeToolName === 'Length' || this.activeToolName === 'Bidirectional' && this.readingTaskState < 2) {
console.log(e.detail.image)
if (!e.detail.image.columnPixelSpacing || !e.detail.image.rowPixelSpacing) {
// '该影像不具备测量长度所需的必要数据,不能进行长度测量。请选择其他工具进行标注。'
this.$confirm(this.$t('trials:reading:warnning:msg56'), '', {
@@ -578,6 +577,13 @@ export default {
e.stopPropagation()
e.preventDefault()
}
} else if (this.CriterionType === 21 && this.activeToolName === 'Probe' && this.readingTaskState < 2) {
if (!(e.detail.image.imageFrame.photometricInterpretation === 'MONOCHROME1' || e.detail.image.imageFrame.photometricInterpretation === 'MONOCHROME2')) {
this.$alert(this.$t('trials:MRIPDFF:message:message5'))
e.stopImmediatePropagation()
e.stopPropagation()
e.preventDefault()
}
}
},
pointNearTool(e) {
@@ -607,7 +613,11 @@ export default {
if ((i.LesionType === 0 || i.LesionType === 1 || i.LesionType === 7) && i.IsFirstChangeTask) {
arr.push(i.OrderMarkName)
}
if (i.Id && this.readingTaskState >= 2) {
arr.push(i.OrderMarkName)
}
})
console.log(arr)
return arr
},
getMergeMarks(measureDatas) {
@@ -616,6 +626,9 @@ export default {
if ((i.LesionType === 0) && i.SplitOrMergeType === 1) {
arr.push(i.OrderMarkName)
}
if (i.Id && this.readingTaskState >= 2) {
arr.push(i.OrderMarkName)
}
})
return arr
},
@@ -661,7 +674,7 @@ export default {
},
sliderMousemove(e) {
if (!this.sliderInfo.isMove) return
console.log('sliderMousemove')
// console.log('sliderMousemove')
var PX = this.sliderInfo.oldB - (this.sliderInfo.oldM - e.clientY)
var boxHeight = this.$refs['sliderBox'].clientHeight
if (PX < 0) return
@@ -692,7 +705,7 @@ export default {
} else if (criterionType === 2) {
this.disabledMarks = this.getMergeMarks(this.visitTaskList[idx].MeasureData)
} else {
this.disabledMarks = []
this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData)
}
return true
},
@@ -785,6 +798,8 @@ export default {
} else if (toolType === 'Length') {
// toolState.data[i].length = this.calculateLenth(toolState.data[i])
}
measureData.largestPixelValue = image.imageFrame.largestPixelValue
measureData.imageId = imageId
measureData.studyId = this.stack.studyId
measureData.seriesId = this.stack.seriesId
measureData.instanceId = instanceId
@@ -901,6 +916,9 @@ export default {
}
} else if (this.activeTool === 1 && this.readingTaskState < 2) {
cornerstoneTools.setToolPassiveForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
} else if (this.readingTaskState >= 2 && this.isCurrentTask) {
// setToolPassiveForElement
cornerstoneTools.setToolEnabledForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
} else {
cornerstoneTools.setToolEnabledForElement(element, data.MeasureData.type, { mouseButtonMask: 1 })
}
@@ -919,6 +937,9 @@ export default {
}
}
})
if (this.readingTaskState >= 2 && this.activeToolName && this.isCurrentTask) {
cornerstoneTools.setToolActiveForElement(element, this.activeToolName, { mouseButtonMask: 1 })
}
},
setMeasureDataVisible() {
if (this.readingTaskState >= 2) return
@@ -986,6 +1007,7 @@ export default {
}
},
mouseClick(e) {
if (this.readingTaskState >= 2) return
const { element, currentPoints, image, viewport } = e.detail
var imageId = image.imageId
const imageInfo = this.getInstanceInfo(imageId)
@@ -1010,6 +1032,8 @@ export default {
var questionInfo = this.measureData[idx]
// const canvas = this.canvas.querySelector('canvas')
// measureData.pictureBaseStr = canvas.toDataURL('image/png', 1)
measureData.largestPixelValue = image.imageFrame.largestPixelValue
measureData.imageId = imageId
measureData.studyId = this.stack.studyId
measureData.seriesId = this.stack.seriesId
measureData.instanceId = instanceId
@@ -1035,6 +1059,7 @@ export default {
},
loadImageStack(dicomSeries) {
return new Promise(resolve => {
this.isInitWwwc = true
this.isCurrentTask = dicomSeries.isCurrentTask
this.isBaseline = dicomSeries.isBaseLineTask
this.readingTaskState = dicomSeries.readingTaskState
@@ -1073,7 +1098,8 @@ export default {
} else if (criterionType === 2) {
this.disabledMarks = this.getMergeMarks(this.visitTaskList[idx].MeasureData)
} else {
this.disabledMarks = []
// this.disabledMarks = []
this.disabledMarks = this.getDisabledMarks(this.visitTaskList[idx].MeasureData)
}
this.maxVistNum = this.visitTaskList[this.visitTaskList.length - 1].VisitTaskNum
@@ -1202,7 +1228,7 @@ export default {
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
this.stack.instanceId = instanceId
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
// this.resetWwwc()
resolve()
})
},
@@ -1300,6 +1326,9 @@ export default {
this.scrollSyncInfo.offset = 0
}
this.renderMeasuredData(e)
if (this.isInitWwwc) {
this.resetWwwc()
}
},
getOrientationMarker(element) {
const enabledElement = cornerstone.getEnabledElement(element)
@@ -1336,6 +1365,8 @@ export default {
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
if (e.detail.toolName === 'Length' || e.detail.toolName === 'ArrowAnnotate' || e.detail.toolName === 'RectangleRoi') {
const measureData = {}
measureData.largestPixelValue = element.image.imageFrame.largestPixelValue
measureData.imageId = imageId
measureData.studyId = this.stack.studyId
measureData.seriesId = this.stack.seriesId
measureData.instanceId = instanceId
@@ -1353,6 +1384,8 @@ export default {
cornerstoneTools.setToolPassiveForElement(this.canvas, e.detail.toolName)
} else if (e.detail.toolName === 'Bidirectional') {
const measureData = {}
measureData.largestPixelValue = element.image.imageFrame.largestPixelValue
measureData.imageId = imageId
measureData.studyId = this.stack.studyId
measureData.seriesId = this.stack.seriesId
measureData.instanceId = instanceId
@@ -1369,6 +1402,8 @@ export default {
cornerstoneTools.setToolPassiveForElement(this.canvas, e.detail.toolName)
} else if (e.detail.toolName === 'Probe') {
const measureData = {}
measureData.largestPixelValue = element.image.imageFrame.largestPixelValue
measureData.imageId = imageId
measureData.studyId = this.stack.studyId
measureData.seriesId = this.stack.seriesId
measureData.instanceId = instanceId
@@ -1478,6 +1513,8 @@ export default {
var questionInfo = this.measureData[idx]
// const canvas = this.canvas.querySelector('canvas')
// measureData.pictureBaseStr = canvas.toDataURL('image/png', 1)
measureData.largestPixelValue = element.image.imageFrame.largestPixelValue
measureData.imageId = imageId
measureData.studyId = this.stack.studyId
measureData.seriesId = this.stack.seriesId
measureData.instanceId = instanceId
@@ -1669,6 +1706,8 @@ export default {
},
resetWwwc() {
// console.log('resetWwwc')
this.isInitWwwc = true
this.toolState.viewportInvert = false
var viewport = cornerstone.getViewport(this.canvas)
// viewport.invert = false
@@ -1679,7 +1718,7 @@ export default {
},
setWwwc(ww, wc) {
// console.log('setWwwc', ww, wc)
this.isInitWwwc = false
var viewport = cornerstone.getViewport(this.canvas)
viewport.voi.windowWidth = ww
viewport.voi.windowCenter = wc
@@ -416,7 +416,7 @@
<dicom-canvas
v-if="canvasW"
:ref="`dicomCanvas${i-1}`"
:style="{width:canvasW,height: canvasH}"
:style="{width: fullScreenIndex === i-1 ? fullScreenWidth : canvasW,height: fullScreenIndex === i-1 ? fullScreenHeight : canvasH}"
:canvas-index="i-1"
:is-active="i-1===currentDicomCanvasIndex"
:is-scroll-sync="isScrollSync"
@@ -989,7 +989,10 @@ export default {
signVisible: false,
signCode: null,
currentUser: zzSessionStorage.getItem('userName'),
tmpData: null
tmpData: null,
fullScreenIndex: -1,
fullScreenWidth: window.innerWidth - 570 + 'px',
fullScreenHeight: window.innerHeight - 130 + 'px'
}
},
@@ -1379,22 +1382,25 @@ export default {
this.personalConfigDialog.visible = true
},
setCornerstoneStyle(i) {
if (this.layoutCol === 1 && this.layoutRow === 1) {
this.fullScreenIndex = -1
return
}
if (this.cornerstoneStyle.position) {
this.cornerstoneStyle = {}
this.setCanvasStyle()
this.fullScreenIndex = -1
} else {
this.cornerstoneStyle = {
position: 'absolute',
top: '72px',
top: '67px',
left: '0px',
right: '350px',
zIndex: 10
zIndex: 10,
}
this.canvasW = window.innerWidth - 570 + 'px'
this.canvasH = window.innerHeight - 130 + 'px'
this.fullScreenIndex = this.currentDicomCanvasIndex
}
this.$nextTick(() => {
// this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].reloadCanvas()
for (var i = 0; i < this.maxCanvas; i++) {
this.$refs[`dicomCanvas${i}`][0].reloadCanvas()
}
@@ -1941,6 +1947,7 @@ export default {
},
// 切换布局
changeLayout(name) {
this.fullScreenIndex = -1
if (this.activeTool) {
if (this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].isCurrentTask && this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].readingTaskState < 2) {
this.$nextTick(() => {
@@ -2043,14 +2050,17 @@ export default {
if (i === -1) return
var isCurrentTask = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].isCurrentTask
var readingTaskState = this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].readingTaskState
if (!isCurrentTask || readingTaskState >= 2) {
if (!isCurrentTask) {
this.measuredTools[i].isDisabled = true
e.target.style.cursor = 'not-allowed'
if (this.activeTool) {
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolEnabled(toolName)
this.activeTool = ''
}
} else {
} else if (isCurrentTask && readingTaskState >= 2) {
this.measuredTools[i].isDisabled = false
e.target.style.cursor = 'pointer'
} else if (isCurrentTask && readingTaskState < 2) {
// var obj = this.$refs['measurementList'].isCanActiveTool(toolName, true)
var obj = this.$refs['measurementList'].isCanActiveTool(toolName, true)
this.measuredTools[i].disabledReason = obj.reason
@@ -2087,7 +2097,7 @@ export default {
var toolObj = this.measuredTools.find(i => i.toolName === toolName)
if (!toolObj || toolObj.isDisabled) return
var dicomSeries = this.canvasObj[this.currentDicomCanvasIndex]
if (dicomSeries.isCurrentTask && isMeasuredTool && dicomSeries.readingTaskState < 2) {
if (dicomSeries.isCurrentTask && isMeasuredTool) {
if (this.activeTool) {
this.measuredTools.forEach(item => {
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].setToolPassive(item.toolName)
@@ -2248,13 +2258,14 @@ export default {
this.customWwc.visible = false
},
toggleInvert() {
if (this.activeTool === 'reversecolor') {
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetWwwc()
this.activeTool = ''
} else {
this.activeTool = 'reversecolor'
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
}
// if (this.activeTool === 'reversecolor') {
// this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetWwwc()
// this.activeTool = ''
// } else {
// this.activeTool = 'reversecolor'
// this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
// }
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
},
setImageIndexSync() {
this.isScrollSync = !this.isScrollSync
@@ -205,6 +205,7 @@
import { saveTableQuestionMark, submitTaskRowInfo, deleteTableQuestionMark, deleteSingleTableQuestionMark } from '@/api/reading'
import DicomEvent from './../DicomEvent'
import store from '@/store'
import * as cornerstone from 'cornerstone-core'
export default {
name: 'MeasurementForm',
props: {
@@ -444,7 +445,12 @@ export default {
// 维护标记信息
measureData.data.remark = this.getLesionName(this.orderMark, this.activeQuestionMark)
}
const val = measureData.data.cachedStats.mean / 10
// const val = measureData.data.cachedStats.mean / 10
let val = parseFloat(measureData.data.cachedStats.mean)
// let imagePixelModule = cornerstone.metaData.get('imagePixelModule', measureData.imageId)
if (measureData.largestPixelValue >= 500) {
val = val / 10
}
this.$set(this.questionForm, measureData.tableQuestionId, val.toFixed(this.digitPlaces))
data = {
Id: '',
@@ -574,14 +580,26 @@ export default {
let params = {}
if (i > -1 && this.markList[i].measureData && this.markList[i].measureData.MeasureData) {
const measureData = this.markList[i].measureData.MeasureData
const tableQuestionId = this.markList[i].tableQuestionId
if (this.questionForm[tableQuestionId] > 100) {
const confirm = await this.$confirm(
this.$t('trials:MRIPDFF:message:message4'),
{
type: 'warning',
distinguishCancelAndClose: true
}
)
if (confirm !== 'confirm') return
}
// 上传截图
DicomEvent.$emit('getScreenshots', { questionId: this.parentQsId, rowIndex: this.questionForm.RowIndex, visitTaskId: this.visitTaskId, lesionName: measureData.OrderMarkName, lesionType: null, isMarked: !!measureData }, async val => {
params = Object.assign({}, this.markList[i].measureData)
if (val) {
const pictureObj = await this.uploadScreenshots(`${new Date().getTime()}`, val)
params.PicturePath = pictureObj.isSuccess ? this.$getObjectName(pictureObj.result.url) : ''
}
const tableQuestionId = this.markList[i].tableQuestionId
params.Answer = this.questionForm[tableQuestionId]
params.MeasureData = JSON.stringify(this.markList[i].measureData.MeasureData)
loading.close()
@@ -264,7 +264,6 @@ export default {
if (item.Type === 'table' && item.Id === obj.questionId) {
var idx = item.TableQuestions.Answers.findIndex(i => i.RowIndex === obj.rowIndex)
item.TableQuestions.Answers[idx].isMeasurable = obj.isMeasurable
console.log(obj.isMeasurable)
item.TableQuestions.Answers[idx].mean = obj.mean
item.TableQuestions.Answers[idx].saveTypeEnum = obj.saveTypeEnum
@@ -556,7 +556,7 @@
<dicom-canvas
v-if="canvasW"
:ref="`dicomCanvas${i - 1}`"
:style="{ width: canvasW, height: canvasH }"
:style="{width: fullScreenIndex === i-1 ? fullScreenWidth : canvasW,height: fullScreenIndex === i-1 ? fullScreenHeight : canvasH}"
:canvas-index="i - 1"
:is-active="i - 1 === currentDicomCanvasIndex"
:is-scroll-sync="isScrollSync"
@@ -895,6 +895,9 @@ export default {
uploadTrialCriterion: {},
uploadStatus: 'upload',
taskId: '',
fullScreenIndex: -1,
fullScreenWidth: window.innerWidth - 570 + 'px',
fullScreenHeight: window.innerHeight - 128 + 'px'
}
},
@@ -1314,22 +1317,25 @@ export default {
this.personalConfigDialog.visible = true
},
setCornerstoneStyle(i) {
if (this.layoutCol === 1 && this.layoutRow === 1) {
this.fullScreenIndex = -1
return
}
if (this.cornerstoneStyle.position) {
this.cornerstoneStyle = {}
this.setCanvasStyle()
this.fullScreenIndex = -1
} else {
this.cornerstoneStyle = {
position: 'absolute',
top: '72px',
top: '70px',
left: '205px',
right: '350px',
zIndex: 10,
}
this.canvasW = window.innerWidth - 570 + 'px'
this.canvasH = window.innerHeight - 130 + 'px'
this.fullScreenIndex = this.currentDicomCanvasIndex
}
this.$nextTick(() => {
// this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].reloadCanvas()
for (var i = 0; i < this.maxCanvas; i++) {
this.$refs[`dicomCanvas${i}`][0].reloadCanvas()
}
@@ -1928,6 +1934,7 @@ export default {
},
// 切换布局
changeLayout(name) {
this.fullScreenIndex = -1
if (this.activeTool) {
if (
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0]
@@ -2301,15 +2308,16 @@ export default {
this.customWwc.visible = false
},
toggleInvert() {
if (this.activeTool === 'reversecolor') {
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetWwwc()
this.activeTool = ''
} else {
this.activeTool = 'reversecolor'
this.$refs[
`dicomCanvas${this.currentDicomCanvasIndex}`
][0].toggleInvert()
}
// if (this.activeTool === 'reversecolor') {
// this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].resetWwwc()
// this.activeTool = ''
// } else {
// this.activeTool = 'reversecolor'
// this.$refs[
// `dicomCanvas${this.currentDicomCanvasIndex}`
// ][0].toggleInvert()
// }
this.$refs[`dicomCanvas${this.currentDicomCanvasIndex}`][0].toggleInvert()
},
setImageIndexSync() {
this.isScrollSync = !this.isScrollSync
@@ -359,7 +359,6 @@ export default {
status: 'add',
upload: null,
},
DATA: {},
doctorList: [],
}
},
@@ -632,12 +631,6 @@ export default {
},
immediate: true,
},
rowData: {
handler() {
this.DATA = Object.assign({}, this.rowData)
},
immediate: true,
},
},
created() {
let typeArr = ['', 'Report', 'Doc', 'Record', 'Reviewer', 'Template']
@@ -1,11 +1,11 @@
<template>
<div v-loading="loading" class="chat-wrapper">
<div v-if="recordContent.length>0" class="chat-content">
<div v-for="(record,index) in recordContent" :key="`${record.CreateTime}${index}`">
<div v-if="recordContent.length > 0" class="chat-content">
<div v-for="(record, index) in recordContent" :key="`${record.CreateTime}${index}`">
<div v-if="!record.IsCurrentUser" class="word">
<img v-if="record.UserTypeEnum*1 === 8" :src="adminAvatar" alt="Admin">
<img v-else-if="record.UserTypeEnum*1 === 1" :src="pmAvatar" alt="PM">
<img v-else-if="record.UserTypeEnum*1 === 2" :src="crcAvatar" alt="CRC">
<img v-if="record.UserTypeEnum * 1 === 8" :src="adminAvatar" alt="Admin">
<img v-else-if="record.UserTypeEnum * 1 === 1" :src="pmAvatar" alt="PM">
<img v-else-if="record.UserTypeEnum * 1 === 2" :src="crcAvatar" alt="CRC">
<div class="info">
<p class="user-info">
<span style="font-weight:700;">{{ record.CreateUserName }} </span>
@@ -24,9 +24,9 @@
<div class="info-content" v-html="record.TalkContent" />
</div>
<!-- <img :src="record.headUrl"> -->
<img v-if="record.UserTypeEnum*1 === 8" :src="adminAvatar" alt="Admin">
<img v-else-if="record.UserTypeEnum*1 === 1" :src="pmAvatar" alt="PM">
<img v-else-if="record.UserTypeEnum*1 === 2" :src="crcAvatar" alt="CRC">
<img v-if="record.UserTypeEnum * 1 === 8" :src="adminAvatar" alt="Admin">
<img v-else-if="record.UserTypeEnum * 1 === 1" :src="pmAvatar" alt="PM">
<img v-else-if="record.UserTypeEnum * 1 === 2" :src="crcAvatar" alt="CRC">
</div>
</div>
</div>
@@ -36,83 +36,50 @@
</div>
<div v-if="checkChallengeState !== 3 && checkState !== 11" class="chat-message">
<div class="message">
<el-input
v-model="newMessage"
v-hasPermi="['trials:trials-panel:visit:consistency-check:fallback']"
type="textarea"
:rows="2"
/>
<el-input v-model="newMessage" v-hasPermi="['trials:trials-panel:visit:consistency-check:fallback']"
type="textarea" :rows="2" />
</div>
<div class="function">
<!-- 申请回退 -->
<el-button
v-hasPermi="['trials:trials-panel:visit:consistency-check:apply-fallback']"
type="primary"
<el-button v-hasPermi="['trials:trials-panel:visit:consistency-check:apply-fallback']" type="primary"
:disabled="!(checkState === 10 && (requestBackState === 0 || requestBackState === 3))"
@click="handleApplyBack"
>
@click="handleApplyBack">
{{ $t('trials:consistencyCheck:action:applyFallback') }}
</el-button>
<!-- 拒绝回退 -->
<el-button
v-hasPermi="['trials:trials-panel:visit:consistency-check:fallback']"
type="primary"
:disabled="!(requestBackState === 1)"
@click="handleRejectBack"
>
<el-button v-hasPermi="['trials:trials-panel:visit:consistency-check:fallback']" type="primary"
:disabled="!(requestBackState === 1)" @click="handleRejectBack">
{{ $t('trials:consistencyCheck:button:rejectBack') }}
</el-button>
<!-- 回退 -->
<el-button
v-hasPermi="['trials:trials-panel:visit:consistency-check:fallback']"
type="primary"
:disabled="!(requestBackState === 1)"
@click="handleBack"
>
<el-button v-hasPermi="['trials:trials-panel:visit:consistency-check:fallback']" type="primary"
:disabled="!(requestBackState === 1)" @click="handleBack">
{{ $t('trials:consistencyCheck:action:fallback') }}
</el-button>
<!-- 发送 -->
<el-button
v-hasPermi="['role:pm']"
:disabled="!(checkState === 10 && checkChallengeState !== 3) || newMessage === ''"
type="primary"
:loading="btnLoading"
@click="handleReply()"
>
<el-button v-hasPermi="['role:pm']"
:disabled="!(checkState === 10 && checkChallengeState !== 3) || newMessage === ''" type="primary"
:loading="btnLoading" @click="handleReply()">
{{ $t('trials:consistencyCheck:button:sendMessage') }}
</el-button>
<!-- 回复 -->
<el-button
v-hasPermi="['role:crc']"
<el-button v-hasPermi="['role:crc']" type="primary"
:disabled="!(checkState === 10 && checkChallengeState !== 3) || (recordContent && recordContent.length > 0 ? recordContent[recordContent.length - 1].UserTypeEnum * 1 === 2 : false)"
type="primary"
:loading="btnLoading"
@click="handleCRCReply"
>
:loading="btnLoading" @click="handleCRCReply">
{{ $t('trials:consistencyCheck:title:reply') }}
</el-button>
<!-- 关闭 -->
<el-button
type="primary"
:loading="btnLoading"
@click="close"
>
<el-button type="primary" :loading="btnLoading" @click="close">
{{ $t('trials:consistencyCheck:title:close') }}
</el-button>
</div>
</div>
<!-- 回复一致性核查 -->
<el-dialog
v-if="sendMessageCRCVisible"
v-dialogDrag
:visible.sync="sendMessageCRCVisible"
:close-on-click-modal="false"
append-to-body
custom-class="base-dialog-wrapper"
:width="'600px'"
:title="$t('trials:consistencyCheck:title:replyConsistency')"
>
<crcSendMessage :crc-message-info="crcMessageInfo" @sendMessage="handleReply" />
<el-dialog v-if="sendMessageCRCVisible" v-dialogDrag :visible.sync="sendMessageCRCVisible"
:close-on-click-modal="false" append-to-body custom-class="base-dialog-wrapper" :width="'600px'"
:title="$t('trials:consistencyCheck:title:replyConsistency')">
<crcSendMessage :crc-message-info="crcMessageInfo" :visible.sync="sendMessageCRCVisible"
@sendMessage="handleReply" />
</el-dialog>
</div>
</template>
@@ -277,46 +244,54 @@ export default {
}
</script>
<style lang="scss">
.chat-wrapper{
::-webkit-scrollbar {
.chat-wrapper {
::-webkit-scrollbar {
width: 7px;
height: 7px;
}
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.chat-content{
width:100%;
.chat-content {
width: 100%;
padding: 20px;
height: 500px;
overflow-y: auto;
.word{
.word {
display: flex;
margin-bottom: 20px;
img{
width:40px;
img {
width: 40px;
height: 40px;
border-radius: 50%;
}
.info{
.info {
margin-left: 10px;
.user-info{
.user-info {
font-size: 12px;
color:rgba(51,51,51,0.8);
margin:0;
color: rgba(51, 51, 51, 0.8);
margin: 0;
height: 20px;
line-height: 20px;
margin-top: -5px;
}
.info-content{
.info-content {
padding: 10px;
font-size: 14px;
background-color: #ebeef5;
position: relative;
margin-top: 8px;
}
.info-content::before{
.info-content::before {
position: absolute;
left: -8px;
top: 8px;
@@ -327,29 +302,34 @@ export default {
}
}
}
.word-my{
.word-my {
display: flex;
justify-content: flex-end;
margin-bottom: 20px;
img{
img {
width: 40px;
height: 40px;
border-radius: 50%;
}
.info{
.info {
width: 90%;
margin-left: 10px;
text-align: right;
.user-info{
.user-info {
font-size: 12px;
color: rgba(51,51,51,0.8);
color: rgba(51, 51, 51, 0.8);
margin: 0;
height: 20px;
line-height: 20px;
margin-top: -5px;
margin-right: 10px;
}
.info-content{
.info-content {
position: relative;
max-width: 70%;
padding: 10px;
@@ -361,7 +341,8 @@ export default {
color: #fff;
text-align: left;
}
.info-content::after{
.info-content::after {
position: absolute;
right: -8px;
top: 8px;
@@ -373,9 +354,11 @@ export default {
}
}
}
.chat-message{
.chat-message {
padding: 0 50px;
.function{
.function {
margin-top: 10px;
text-align: right;
}
@@ -71,6 +71,10 @@
</div>
</div>
<div class="function">
<!-- 取消 -->
<el-button @click="close">
{{ $t('common:button:cancel') }}
</el-button>
<!-- 发送 -->
<el-button type="primary" @click="handleReply">
{{ $t('trials:consistencyCheck:button:sendMessage') }}
@@ -118,6 +122,10 @@ export default {
TalkContent: null
}
}
},
visible: {
type: Boolean,
default: false
}
},
data() {
@@ -149,6 +157,9 @@ export default {
this.compareStudy()
},
methods: {
close() {
this.$emit('update:visible', false)
},
compareStudy() {
var isLackOf = false
this.IRCList = []
@@ -194,10 +194,10 @@
<template slot="dialog-body">
<el-form ref="imageBackform" :model="form" class="demo-form-inline" :rules="rules"
:label-width="isEN ? '150px' : '100px'">
<el-form-item :label="$t('trials:reuploadAudit:table:Matters') + ': '" prop="Matters">
<el-form-item :label="$t('trials:reuploadAudit:table:Matters')" prop="Matters">
<span>{{ rowData.title }}</span>
</el-form-item>
<el-form-item :label="$t('trials:reuploadAudit:table:ApplyReason') + ': '" prop="ApplyReason">
<el-form-item :label="$t('trials:reuploadAudit:form:ApplyReason')" prop="ApplyReason">
<span>{{ rowData.ApplyReason }}</span>
</el-form-item>
<el-form-item :label="$t('trials:reuploadAudit:form:IsAgree')" prop="IsAgree">
@@ -206,7 +206,7 @@
<el-radio :label="false">{{ $t('trials:reuploadAudit:button:auditNo') }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="$t('trials:reuploadAudit:table:ResultRemark') + ': '" prop="ResultRemark">
<el-form-item :label="$t('trials:reuploadAudit:form:ResultRemark')" prop="ResultRemark">
<el-input type="textarea" :autosize="{ minRows: 2, maxRows: 4 }" placeholder=""
v-model="form.ResultRemark">
</el-input>
+1 -1
View File
@@ -97,7 +97,7 @@ module.exports = defineConfig({
]
}),
// new BundleAnalyzerPlugin(),
process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'prod' || process.env.NODE_ENV === 'production' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function () { }
process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'production' || process.env.VUE_APP_OSS_CONFIG_BUCKET === 'zyypacs-usa' ? function () { }
: new WebpackAliyunOss({
from: ['./dist/**'],
dist: process.env.VUE_APP_OSS_PATH + distDate,