diff --git a/core/term/controller/snomed.controller.ts b/core/term/controller/snomed.controller.ts index 8ad0d109e3..f7441f3d14 100644 --- a/core/term/controller/snomed.controller.ts +++ b/core/term/controller/snomed.controller.ts @@ -24,7 +24,7 @@ export interface ISnomedController { * Busca un array de conceptos SNOMED. */ - getConcepts(conceptsIds: String[]); + getConcepts(conceptsIds: String[], form?: String); /** * Busca conceptos por un texto. diff --git a/core/term/controller/snomed.snowstorm.ts b/core/term/controller/snomed.snowstorm.ts index a1d4dff63f..3d05f7b7c1 100644 --- a/core/term/controller/snomed.snowstorm.ts +++ b/core/term/controller/snomed.snowstorm.ts @@ -115,7 +115,7 @@ export async function getChildren(sctid, { all = false, completed = true, leaf = return null; } -export async function getConcepts(conceptsIds: string[]) { +export async function getConcepts(conceptsIds: string[], form = 'stated') { const response = await httpGetSnowstorm(`${snomed.snowstormBranch}/concepts`, { limit: 1000, conceptIds: conceptsIds @@ -123,7 +123,7 @@ export async function getConcepts(conceptsIds: string[]) { if (response) { const items = response.items; const ps = items.map(async (concept) => { - const parents = await httpGetSnowstorm(`browser/${snomed.snowstormBranch}/concepts/${concept.conceptId}/parents`, { limit: 1000, form: 'stated' }); + const parents = await httpGetSnowstorm(`browser/${snomed.snowstormBranch}/concepts/${concept.conceptId}/parents`, { limit: 1000, form }); if (parents) { concept.relationships = parents; concept.relationships = filterRelationships(concept, { parent: true }); diff --git a/core/term/routes/snomed.ts b/core/term/routes/snomed.ts index 7da4bcabe4..05c57603d9 100644 --- a/core/term/routes/snomed.ts +++ b/core/term/routes/snomed.ts @@ -3,8 +3,8 @@ import * as express from 'express'; import * as utils from '../../../utils/utils'; import * as cie10 from '../schemas/cie10'; import { SnomedCIE10Mapping } from './../controller/mapping'; - import { SnomedCtr } from '../controller/snomed.controller'; +import { ECLQueriesCtr } from './../../../core/tm/eclqueries.routes'; const router = express.Router(); @@ -37,6 +37,34 @@ router.get('/snomed', async (req, res, next) => { } }); +/** * Busca medicamentos genéricos y comerciales por termino */ +router.get('/snomed/medicamentos', async (req, res, next) => { + const term = req.query.term as string; + if (!term) { + return res.json([]); + } + try { + const ecl = await ECLQueriesCtr.findOne({ key: 'receta:buscarTerminos' }); + const expression = ecl.valor; + const results = await SnomedCtr.searchTerms(term, { expression, languageCode: 'es', semanticTags: ['fármaco de uso clínico', 'fármaco de uso clínico comercial'] }); + const ids = results.slice(0, 20).map(r => r.conceptId); + if (ids.length > 0) { + const concepts = await SnomedCtr.getConcepts(ids, 'inferred'); + concepts.forEach(concept => { + if (concept.relationships) { + const generic = concept.relationships.find(r => r.term.includes('(fármaco de uso clínico)')); + if (generic) { + concept.generic = { ...generic, fsn: generic.fsn.term }; + } + } + }); + return res.json(concepts); + } + return res.json([]); + } catch (e) { + return next(e); + } +}); /** * Mapea un concepto de snomed * diff --git a/core/term/routes/snomedv2.ts b/core/term/routes/snomedv2.ts index bb0a28efb9..abf656eabb 100644 --- a/core/term/routes/snomedv2.ts +++ b/core/term/routes/snomedv2.ts @@ -107,4 +107,46 @@ router.get('/snomed/relationships', async (req, res, next) => { } }); +/** + * Busca medicamentos por nombre comercial y devuelve el concepto con sus padres (genéricos) + */ +router.get('/snomed/medicamentos/comercial', async (req, res, next) => { + const term = req.query.term as string; + if (!term) { + return res.json([]); + } + try { + const results = await SnomedCtr.searchTerms(term, { expression: '<<373873005', languageCode: 'es' }); + const ids = results.slice(0, 20).map(r => r.conceptId); + if (ids.length > 0) { + const concepts = await SnomedCtr.getConcepts(ids); + return res.json(concepts); + } + return res.json([]); + } catch (e) { + return next(e); + } +}); + +/** + * Busca el concepto genérico asociado a un concepto comercial + */ +router.get('/snomed/medicamentos/comercial/:sctid/generico', async (req, res, next) => { + const sctid = req.params.sctid; + try { + const concepts = await SnomedCtr.getConcepts([sctid], 'inferred'); + if (concepts && concepts.length > 0) { + const concept = concepts[0]; + if (concept.relationships && concept.relationships.length > 0) { + const parentIds = concept.relationships.map(r => r.conceptId); + const generics = await SnomedCtr.getConcepts(parentIds, 'inferred'); + return res.json(generics); + } + } + return res.json([]); + } catch (e) { + return next(e); + } +}); + export = router;