From f617273cecdb7c764f45e48d76135590d6a7ca9f Mon Sep 17 00:00:00 2001 From: chin Date: Tue, 6 Jun 2023 19:11:16 +0800 Subject: [PATCH] feat: #10 --- config-class.js | 14 ++++++ models/mongodb/models/dicom.js | 71 ++++++++++++++++------------ models/mongodb/models/dicomSeries.js | 8 ++++ models/mongodb/models/dicomStudy.js | 8 ++++ 4 files changed, 70 insertions(+), 31 deletions(-) diff --git a/config-class.js b/config-class.js index eaba6304..9ac79535 100644 --- a/config-class.js +++ b/config-class.js @@ -75,6 +75,16 @@ class DicomDimseConfig { return bindInfo.split(":").pop(); } + getAeTitle() { + let bindArgIndex = this.dcm4cheQrscpArgv.findIndex(v => v === "-b"); + /** @type {string} */ + let bindInfo = this.dcm4cheQrscpArgv[bindArgIndex + 1]; + + let aeTitleAndIp = bindInfo.split(":").shift(); + let aeTitle = aeTitleAndIp.includes("@") ? aeTitleAndIp.split("@").shift() : aeTitleAndIp; + return aeTitle; + } + } class FhirConfig { @@ -100,6 +110,10 @@ class RaccoonConfig { /** @type {string} */ this.mediaStorageID = this.mongoDbConfig.dbName; + + this.aeTitle = this.dicomDimseConfig.enableDimse ? this.dicomDimseConfig.getAeTitle() : this.dicomWebConfig.aeTitle; + if (!this.aeTitle) + throw new Error("Missing required config `aeTitle`"); } } diff --git a/models/mongodb/models/dicom.js b/models/mongodb/models/dicom.js index 6a7c59ea..df8d4770 100644 --- a/models/mongodb/models/dicom.js +++ b/models/mongodb/models/dicom.js @@ -1,3 +1,4 @@ +const _ = require("lodash"); const mongoose = require("mongoose"); const { dicomJsonAttributeSchema, @@ -7,6 +8,8 @@ const { } = require("../schema/dicomJsonAttribute"); const { getStoreDicomFullPath, IncludeFieldsFactory } = require("../service"); const { logger } = require("../../../utils/logs/log"); +const { raccoonConfig } = require("@root/config-class"); +const { dictionary } = require("@models/DICOM/dicom-tags-dic"); let dicomModelSchema = new mongoose.Schema( { @@ -319,16 +322,16 @@ dicomModelSchema.statics.getDicomJson = async function (queryOptions) { try { let docs = await mongoose - .model("dicom") - .find(queryOptions.query, { - ...instanceFields - }) - .setOptions({ - strictQuery: false - }) - .limit(queryOptions.limit) - .skip(queryOptions.skip) - .exec(); + .model("dicom") + .find(queryOptions.query, { + ...instanceFields + }) + .setOptions({ + strictQuery: false + }) + .limit(queryOptions.limit) + .skip(queryOptions.skip) + .exec(); let instanceDicomJson = docs.map(v => { let obj = v.toObject(); @@ -340,15 +343,21 @@ dicomModelSchema.statics.getDicomJson = async function (queryOptions) { `${queryOptions.retrieveBaseUrl}/${obj["0020000D"]["Value"][0]}/series/${obj["0020000E"]["Value"][0]}/instances/${obj["00080018"]["Value"][0]}` ] }; + + _.set(obj, dictionary.keyword.RetrieveAETitle, { + ...dictionary.tagVR[dictionary.keyword.RetrieveAETitle], + Value: [raccoonConfig.aeTitle] + }); + return obj; }); return instanceDicomJson; - } catch(e) { + } catch (e) { throw e; } - + }; /** @@ -358,22 +367,22 @@ dicomModelSchema.statics.getDicomJson = async function (queryOptions) { * @param {string} iParam.seriesUID * @param {string} iParam.instanceUID */ -dicomModelSchema.statics.getPathOfInstance = async function(iParam) { +dicomModelSchema.statics.getPathOfInstance = async function (iParam) { let { studyUID, seriesUID, instanceUID } = iParam; try { let query = { - $and: [ - { - studyUID: studyUID - }, - { - seriesUID: seriesUID - }, - { - instanceUID: instanceUID - } - ] + $and: [ + { + studyUID: studyUID + }, + { + seriesUID: seriesUID + }, + { + instanceUID: instanceUID + } + ] }; let doc = await mongoose.model("dicom").findOne(query, { @@ -413,13 +422,13 @@ dicomModelSchema.statics.getInstanceOfMedianIndex = async function (query) { instanceUID: 1, instancePath: 1 }) - .sort({ - studyUID: 1, - seriesUID: 1 - }) - .skip(instanceCountOfStudy >> 1) - .limit(1) - .exec(); + .sort({ + studyUID: 1, + seriesUID: 1 + }) + .skip(instanceCountOfStudy >> 1) + .limit(1) + .exec(); }; /** diff --git a/models/mongodb/models/dicomSeries.js b/models/mongodb/models/dicomSeries.js index e2d64da3..d5dd56ee 100644 --- a/models/mongodb/models/dicomSeries.js +++ b/models/mongodb/models/dicomSeries.js @@ -3,6 +3,8 @@ const _ = require("lodash"); const { tagsNeedStore } = require("../../DICOM/dicom-tags-mapping"); const { getVRSchema } = require("../schema/dicomJsonAttribute"); const { getStoreDicomFullPathGroup, IncludeFieldsFactory } = require("../service"); +const { dictionary } = require("@models/DICOM/dicom-tags-dic"); +const { raccoonConfig } = require("@root/config-class"); let dicomSeriesSchema = new mongoose.Schema( { @@ -95,6 +97,12 @@ dicomSeriesSchema.statics.getDicomJson = async function(queryOptions) { `${queryOptions.retrieveBaseUrl}/${obj["0020000D"]["Value"][0]}/series/${obj["0020000E"]["Value"][0]}` ] }; + + _.set(obj, dictionary.keyword.RetrieveAETitle, { + ...dictionary.tagVR[dictionary.keyword.RetrieveAETitle], + Value: [raccoonConfig.aeTitle] + }); + return obj; }); diff --git a/models/mongodb/models/dicomStudy.js b/models/mongodb/models/dicomStudy.js index 9c851a78..96a8e034 100644 --- a/models/mongodb/models/dicomStudy.js +++ b/models/mongodb/models/dicomStudy.js @@ -10,6 +10,8 @@ const { const { tagsOfRequiredMatching } = require("../../DICOM/dicom-tags-mapping"); +const { raccoonConfig } = require("../../../config-class"); +const { dictionary } = require("@models/DICOM/dicom-tags-dic"); let dicomStudySchema = new mongoose.Schema( { @@ -74,6 +76,12 @@ dicomStudySchema.statics.getDicomJson = async function (queryOptions) { vr: "UR", Value: [`${queryOptions.retrieveBaseUrl}/${obj["0020000D"]["Value"][0]}`] }; + + _.set(obj, dictionary.keyword.RetrieveAETitle, { + ...dictionary.tagVR[dictionary.keyword.RetrieveAETitle], + Value: [raccoonConfig.aeTitle] + }); + return obj; });