index.js 132 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181
  1. const fs = require('fs')
  2. const request = require('request')
  3. const $orgs = JSON.parse(fs.readFileSync('./dict/org.json'))
  4. const $diagnoses = JSON.parse(fs.readFileSync('./dict/diagnoses.json'))
  5. const $projects = JSON.parse(fs.readFileSync('./dict/exam_project.json'))
  6. const $modalities = JSON.parse(fs.readFileSync('./dict/exam_modality.json'))
  7. // const $lab_items = JSON.parse(fs.readFileSync('./dict/lab_item.json'))
  8. const $lab_mx_items = JSON.parse(fs.readFileSync('./dict/lab_mx_item.json'))
  9. const $lab_xcg = JSON.parse(fs.readFileSync('./dict/lab_xcg.json'))
  10. const $lab_cnx = JSON.parse(fs.readFileSync('./dict/lab_cnx.json'))
  11. const $lab_ggn = JSON.parse(fs.readFileSync('./dict/lab_ggn.json'))
  12. const $lab_ncg = JSON.parse(fs.readFileSync('./dict/lab_ncg.json'))
  13. const $new_lab_items = JSON.parse(fs.readFileSync('./dict/new_lab_item.json'))
  14. const $lab_items = [], lab_map = {}
  15. const initLabItems = () => {
  16. let id = 200001
  17. for(const lab_item of $new_lab_items) {
  18. const keys = lab_item.tmp_xm.split('/')
  19. for(const key of keys) {
  20. if(!lab_map[key]) {
  21. lab_map[key] = {
  22. 'name': key,
  23. id: id++,
  24. ITEMTYPE: lab_item.ITEMTYPE,
  25. items: []
  26. }
  27. $lab_items.push(lab_map[key])
  28. }
  29. lab_map[key]['items'].push(lab_item)
  30. }
  31. }
  32. }
  33. initLabItems()
  34. const $doctors = JSON.parse(fs.readFileSync('./dict/doctor.json'))
  35. const $doctorMap = {}
  36. for(const doctor of $doctors) {
  37. if(!$doctorMap[doctor['ORGCODE']]) {
  38. $doctorMap[doctor['ORGCODE']] = []
  39. }
  40. $doctorMap[doctor['ORGCODE']].push(doctor)
  41. }
  42. const nowTimestamp = new Date().getTime()
  43. const startTimestamp = new Date().getTime() - 24 * 3600 * 1000
  44. const fillNumber = (str, len = 2, fill = '0') => {
  45. return str.padStart(len, fill)
  46. }
  47. const getRandomReport = () => {
  48. return getRandomVal([
  49. {
  50. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,所示诸骨骨质结构未见明显异常;双肺纹理增多、增粗,边缘模糊,以双下肺为著,双肺野未见明显实变阴影;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中,心前心后间隙未见明显异常阴影;双侧膈面光滑,位置正常,肋膈角清晰锐利,余未见明显异常征象。",
  51. "impression": "支气管炎征象,建议必要时作胸部CT进一步检查。"
  52. },
  53. {
  54. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,所示诸骨骨质结构未见明显异常;右上肺野可见大片状密度增高影,其下缘较为清楚,略呈横“S”形,同侧肺门上部增宽,结构不清,并与右上肺野阴影相延续,余肺纹理清楚,分布走行自然,未见明显异常阴影;左侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中,心前心后间隙未见明显异常阴影;双侧膈面光滑,右侧膈面位置稍上移,双侧肋膈角清晰锐利,余未见明显异常征象。",
  55. "impression": "右上肺野改变考虑右肺上叶中央型肺Ca伴右肺上叶阻塞性不张可能性大,建议作胸部CT扫描进一步检查。"
  56. },
  57. {
  58. "description": "<p>  扫描示双侧肾脏对称,位于脊柱两侧,大小正常,皮髓质分辨清楚,肾实质内未见明显局灶性密度异常,双侧肾盂、输尿管未见明显扩张,肾周脂肪囊清楚,肾旁结构未见明显异常。双侧输尿管未见扩张及异常密度影,膀胱充盈良好,壁无增厚,膀胱外脂肪间隙正常,盆腔内示见明显肿大淋巴结。</p>\n<p>  扫描双侧鼻甲及鼻道对称、正常,鼻中隔居中,双侧上颌窦、筛窦、额窦及蝶窦内气化正常,粘膜无明显增厚,鼻咽腔对称,双侧耳咽管咽口、咽隐窝基本对称,肌肉界面清楚,双侧咽旁间隙对称无狭窄,颅底骨质未见明显破坏。</p>\n<p>  扫描双侧鼻甲及鼻道对称、正常,鼻中隔居中,双侧上颌窦、筛窦、额窦及蝶窦内气化正常,粘膜无明显增厚,鼻咽腔对称,双侧耳咽管咽口、咽隐窝基本对称,肌肉界面清楚,双侧咽旁间隙对称无狭窄,颅底骨质未见明显破坏。</p>\n<p>  扫描双侧鼻甲及鼻道对称、正常,鼻中隔居中,双侧上颌窦、筛窦、额窦及蝶窦内气化正常,粘膜无明显增厚,鼻咽腔对称,双侧耳咽管咽口、咽隐窝基本对称,肌肉界面清楚,双侧咽旁间隙对称无狭窄,颅底骨质未见明显破坏。</p>",
  59. "impression": "<p>双侧肾脏及输尿管、膀胱未见明显异常。</p>\n<p>鼻、鼻窦及鼻咽部未见明显异常。</p>\n<p>鼻、鼻窦及鼻咽部未见明显异常。</p>\n<p>鼻、鼻窦及鼻咽部未见明显异常。</p>"
  60. },
  61. {
  62. "description": "双侧中上肺野可见斑片状、结节样及纤维条索状密度增高影,边缘清楚,其间可见少许钙化点,余肺野未见明显实变阴影;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中;双侧膈面光滑,位置正常,双侧肋膈角清晰锐利,余未见明显异常征象。",
  63. "impression": "双侧中上肺阴影考虑陈旧性结核灶,建议必要时作胸部CT扫描进一步检查。"
  64. },
  65. {
  66. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,所示诸骨骨质结构未见明显异常;双侧肺野可见多发大小不等之结节样密度增高影,边界清楚,以肺野外带分布为主,最大者最大直径约cm;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中,心前心后间隙未见明显异常阴影;双侧膈面光滑,位置正常,肋膈角清晰锐利,余未见明显异常征象。",
  67. "impression": "双肺转移瘤,建议作胸腹部CT扫描查找原发灶。<br />结合病史,考虑Ca伴双肺转移。"
  68. },
  69. {
  70. "description": "本片包括T12-S1,L4椎体相对于L5椎体向前移位约cm,相应节段脊柱生理曲度不自然,L4-S1椎间隙变窄,L1-5椎体左右前上下缘分别可见不同程度骨赘形成,部分椎体间可见骨桥形成,所示诸骨未见明显骨质破坏,余未见特殊。",
  71. "impression": "1、L4相对于L5向前轻度滑脱,建议必要时作相应节段脊柱CT扫描进一步检查了解相应节段椎管情况;<br />2、腰椎广泛骨质增生伴L4-S1椎间隙变窄及部分椎体间骨桥形成。"
  72. },
  73. {
  74. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,所示诸骨骨质结构未见明显异常;双侧中上肺野可见斑片状不均匀密度增高影,边缘模糊,其间可见部分结节样、纤维条索状密度增高影及少许钙化点,双上肺野部分阴影融合呈大片状,其间可见厚壁囊状透光区,其内可见一小液气平,余肺野未见明显实变阴影;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中;双侧膈面光滑,位置正常,双侧肋膈角清晰锐利,余未见明显异常征象。",
  75. "impression": "双侧中上肺阴影考虑继发性肺结核伴空洞形成,建议必要时作胸部CT扫描进一步检查或治疗后复查。"
  76. },
  77. {
  78. "description": "片纳右肩关节诸骨形态自然,未见明显骨折、脱位、骨质增生及破坏,肩关节结构正常,关节间隙清晰。",
  79. "impression": "右肩关节摄片未见明显异常。"
  80. },
  81. {
  82. "description": "左手第掌(指近中、末、节指)骨(头部、体部、基底部)可见(粉碎性)骨折,部分骨折线波及相应关节面,相应碎骨片稍有分离移位不甚明显,骨折远端稍向(前后内外)移位,并向(前后内外)倾斜成角,骨折周围软组织肿胀,余未见特殊。",
  83. "impression": "左手第掌指骨骨折(对位对线不良)。"
  84. },
  85. {
  86. "description": "左/右侧基底节区/丘脑/内囊区/外囊区可见肾形/不规则形高密度病灶,CT值 Hu,边界清楚,密度均匀,大小约为0x0 cm,周围脑组织可见低密度环影,左/右侧脑室/三脑室/四脑室内见有高密度影,CT值 Hu,有/无液平,有/无脑室铸型,有/无上位脑室扩大。",
  87. "impression": "符合xx脑出血,破入左/右侧脑室/三脑室/四脑室,必要时短期复查。"
  88. },
  89. {
  90. "description": "双侧大脑半球结构对称,各层面灰白质对比如常,未见异常密度影;脑室系统、脑池、脑裂、脑沟大小形态如常。小脑及脑干形态、密度未见异常。中线结构居中。骨窗示颅骨形态、密度、连续性均好。",
  91. "impression": "颅脑CT平扫未见明显异常。"
  92. },
  93. {
  94. "description": "右下肺野可见大片状密度增高影,其上缘较清楚,并呈外高内低之弧形,同侧心缘、心肋膈角及膈面消失,右侧中肺叶外带紧贴侧胸壁可见条带状密度增高影,其内缘欠清楚,余肺野未见明显实变阴影;双侧肺门不宽,左侧心缘形态及位置未见明显异常,主动脉影不宽,纵隔气管居中;左侧膈面光滑,位置正常,左侧肋膈角清晰锐利,余未见明显异常征象。",
  95. "impression": "右侧胸膜增厚伴近中等量游离性胸腔积液,建议必要时作胸部CT扫描进一步了解右下肺及胸膜腔情况。"
  96. },
  97. {
  98. "description": "平扫无伪影干扰部分左/右侧中脑/桥脑/延脑可见点状/不规则状高密度病影,CT值 0 Hu(低于90),密度不/较均匀,大小约为0x0cm,边界欠/尚清;环池/脚间池/桥池/小脑延髓池未/可见变窄/增宽,有/无高密度影填塞其中;四脑室未/可见变窄,有/无高密度影充填脑室内;无伪影干扰部分小脑未见异常密度影。幕上结构形态密度如常。",
  99. "impression": "符合中脑/桥脑/延脑出血,并/破入蛛网膜下腔/破入四脑室,必要时短期复查"
  100. },
  101. {
  102. "description": "平扫示:<br />  a.鞍上池/环池/四叠体池/纵裂池/左/右/双侧侧裂池/左/右/双侧额/颞/枕/顶部脑沟内/小脑幕旁铸形样高密度影,CT值0-0Hu(低于90),/左/右/双侧额/颞/枕叶近颅底侧局部浅表脑内/脑室内未/可见高密度影,CT值0-0Hu(低于90),余部脑实质未见异常密度影,中线结构居中。<br />  /b.鞍上池/环池/四叠体池/纵裂池/左/右/双侧侧裂池/左/右/双侧额/颞/枕/顶部脑沟显示欠/不清,呈近等密度样填塞,CT值30-40Hu,/脑室系统未/可见增大。脑实质区域未见异常密度影,中线结构居中。",
  103. "impression": "符合(a.)蛛网膜下腔出血,/并脑出血,/反流入脑室,建议MRI复查以期明确出血点。<br />/考虑(b.)蛛网膜下腔出血,/脑积水,请结合临床,必要时进一步检查。"
  104. },
  105. {
  106. "description": "左/右侧颞/顶/额/枕叶/无伪影干扰部分小脑左/右叶低密度影(符合血管供应分布规律),CT值 0 Hu,灰白质对比模糊/消失,约 0x0 cm,边界欠/尚清晰,邻近脑室、脑池、脑裂、脑沟可/未见受压/变形/变窄/闭塞,中线结构无/向左/右移位 0 cm。余部脑组织灰白质交界清楚,密度未见异常。",
  107. "impression": "符合xx脑梗塞,必要时短期复查。"
  108. },
  109. {
  110. "description": "  双侧脑室旁、基底节区局部可见小结节状低密度影,其余脑实质未见明显异常密度影;各脑室系统扩大,脑池、脑裂、脑沟增宽。中线结构居中。骨窗示颅骨骨质结构未见明显异常。",
  111. "impression": "脑萎缩,双侧脑室旁、基底节区局部腔隙灶可能。"
  112. },
  113. {
  114. "description": "  双侧大脑半球结构对称;各层面灰白质对比如常,未见异常密度影;双侧侧脑室脉络丛/苍白球区/尾状核区/无伪影干扰部分小脑齿状核区可见大致对称的钙质沉积影;脑室系统、脑池、脑裂、脑沟大小形态如常。幕下无伪影干扰部分小脑及脑干形态、密度亦未见异常。中线结构居中。骨窗示颅骨形态、密度、连续性均好。",
  115. "impression": "颅脑未见异常。"
  116. },
  117. {
  118. "description": "骨盆及双侧髋关节对称,所示诸骨未见明显骨折、脱位、骨质增生及破坏,所示区域软组织影未见明显异常征象,余未见特殊。",
  119. "impression": "骨盆平片未见明显异常。"
  120. },
  121. {
  122. "description": "  左/右/双侧基底节/放射冠区可见斑点状单发/多发略低密度/水样密度影,最大约 0 cm,边缘欠/较清楚,无占位效应。左/右/双侧大脑深部白质区无/可见泛发密度减低影,CT值 0 Hu,边缘欠清,与相邻灰质部对比较/欠清晰。脑室系统、脑沟、脑池、脑裂可/未见增宽/加深,程度与年龄不/基本相符合,脑脊液腔域未见异常密度影,中线结构居中。幕下无伪影区小脑、脑干及脑脊液腔域亦未见异常。骨窗示颅骨形态、密度如常。",
  123. "impression": "符合腔隙性脑梗塞,/白质疏松,/脑萎缩,必要时短期复查。"
  124. },
  125. {
  126. "description": "  平扫左/右侧颞/顶/额/枕叶见大范围跨越灰白质低密度影,约 0x0 cm,中央部/周边部夹杂斑片状密度增高影,CT值0 - 0Hu,边界欠/尚清晰,邻近脑室/脑池/脑裂/脑沟可见受压/变形/变窄/闭塞,中线结构向左/右移位 0 cm。余部脑组织灰白质对比如常,密度未见异常。",
  127. "impression": "符合左/右侧颞/顶/额/枕叶出血性脑梗塞,建议短期复查。"
  128. },
  129. {
  130. "description": "  a.左/右/双额、顶叶皮质下带状密度减低影,CT值 0 Hu,边缘较清楚,邻近脑沟无/轻度增宽。<br />  b.左/右/双额、顶叶交界区近似三角形密度减低影,CT值 0 Hu,边缘欠清楚。<br />  c..左/右/双颞、顶、枕叶交界区近似三角形密度减低影,CT值 0 Hu,边缘欠清楚。<br />  脑室系统/脑裂、脑池、脑沟可/未见增宽/加深,程度与年龄不/基本相符合,中线结构居中。骨窗示颅骨形态、密度如常。",
  131. "impression": "符合a.前/b.上/c.下分水岭脑梗塞,必要时短期复查。"
  132. },
  133. {
  134. "description": "  左/右侧额/颞/顶/枕叶见一规则/不规则形等/低/略高密度影,其内可见不规则水样/钙质样/混杂密度影;CT值 0-0-0 Hu,有轻/中/重度占位效应;边界较/欠/不清楚;大小约为 0x0 cm。周围无/有轻/中/重度水肿样低密度区。中线结构居中/向左/向右侧偏移,邻近脑室/侧裂池/脑沟推移/变形/偏移。",
  135. "impression": "左/右侧额/颞/顶/枕叶占位,考虑胶质瘤可能性大,建议进一步检查。"
  136. },
  137. {
  138. "description": "  幕下无伪影干扰层面,小脑蚓部/四脑室后方示一类圆形略高/等密度占位影,/其内未/可见水样/钙质样密度影,CT值 0-0 Hu,大小约 0 cm。周围可见水肿样低密度影。四脑室向前移位变形,幕上脑室轻度/明显扩张。",
  139. "impression": "  幕下中线占位,考虑髓母细胞瘤可能性大,不除外室管膜瘤,建议进一步检查。"
  140. },
  141. {
  142. "description": "  幕下无伪影干扰层面,左/右侧桥脑小脑角区示一结节状/卵圆形且与内听道紧连的等/低/略高密度影,中央可/未见更低密度影,CT值 0-0 Hu,边界较/欠清楚,大小约为 0x0 cm。同侧桥脑小脑角池轻度/明显增宽;桥脑/四脑室可/未见受压变形/移位;毗邻脑组织未/可见水肿样低密度影。幕上脑室系统可/未见对称性扩张。骨窗示同侧内听道口扩大/骨质破坏。",
  143. "impression": "符合左/右侧听神经瘤,建议进一步检查。"
  144. },
  145. {
  146. "description": "  幕下无伪影干扰层面,小脑中线旁示一类圆形囊性低/等/混杂密度占位影,CT值 0-0 Hu,大小约 0 cm。边缘清楚。囊壁可见单/多个软组织密度结节影,周围无水肿样低密度影。四脑室变形/闭塞,幕上脑室轻度/明显扩张。(壁结节/实性瘤体明显强化)",
  147. "impression": "  幕下占位,考虑血管母细胞瘤可能性大,建议进一步检查。"
  148. },
  149. {
  150. "description": "  矢状面定位像示蝶鞍呈椭圆形/圆形,前后径约 0 mm(参考均值约12mm),深径约 0 mm(参考均值约9.6mm)。<br />  横轴位鞍内/及鞍上可见类圆形/分叶状/不规则状占位灶影,密度较/不均匀,CT值 0-0 Hu,约达 0x0 cm大小,边界较/欠清楚,垂体柄可/未见显示,/向左/右侧偏移约 0 mm,视交叉可/未见受压,鞍上池可/未见变形,三脑室及双侧脑室可/未见对称性增大。骨窗示鞍结节/前床突/鞍底/鞍背骨质变薄/凹陷/侵蚀/吸收。",
  151. "impression": "考虑垂体腺瘤,建议进一步检查。"
  152. },
  153. {
  154. "description": "  颅内左/右侧额/颞/顶/枕部大脑凸面/镰旁/蝶骨嵴/桥脑小脑角见一类圆形呈等/略高密度灶,CT值 0 Hu,密度均匀/基本均匀,其内可/未见少量斑点样钙化,大小约为 0x0 cm,边界清楚,毗邻脑组织可见白质塌陷征,水肿较轻,呈宽基底与大脑镰/颅骨相连,可见脑膜尾征。",
  155. "impression": "  考虑脑外占位,脑膜瘤可能性大,建议进一步检查。"
  156. },
  157. {
  158. "description": "  大脑半球结构对称;灰白质对比如常,脑实质未见异常密度影,颅骨内板下未见形态、密度异常改变;脑室系统、脑池、脑裂、脑沟大小形态如常。幕下无伪影干扰部分小脑及脑干亦未见异常。中线结构居中。骨窗示颅骨连续;额/颞/顶/枕部头皮可/未见增厚隆起。",
  159. "impression": "颅内未见明显出血征象,骨窗未见明显骨折征象,建议短期复查除外迟发征象。<br />"
  160. },
  161. {
  162. "description": "  以大脑白质区为著的弥漫性/多发性斑片状密度减低影,其内无/可散见斑点状高密度影,CT值 0-0 Hu,脑室系统/脑裂/脑池/脑沟移位/变窄/闭塞。(骨窗请追加(颅骨骨折)模板)。",
  163. "impression": "  符合颅脑弥漫性轴索损伤,/颅内压增高,建议短期复查。"
  164. },
  165. {
  166. "description": "  左/右侧额/颞/顶/枕叶内见片状低密度影(不符合血管供应分布规律),其内混杂不规则点/斑片状高密度影,CT值0-0Hu(低于90),边缘欠/较清晰;高密度影约 0x0 cm;左/右侧脑室系统/脑池/脑裂/脑沟受压变窄/变形/闭塞,中线结构居中/向左/右移位,约0cm。左/右侧额/颞/顶/枕部颅骨内板下可见双凸形/单凸形致密高密度影(不跨越颅缝),最厚处约达 0 cm,CT值约0Hu(低于100),密度欠/较均匀,边界清楚,颅骨内板与脑组织间隙增宽,脑白质塌陷,同侧侧脑室受压变形,中线结构向对侧移位约 0 cm。骨窗见左/右侧额/颞/顶/枕部颅骨连续性中断/碎裂/颅缝增宽,无/分离,约 0 mm,无/局部凹陷,约深达 0 mm,相邻头皮组织层次清晰/模糊,无/增厚,皮下可/未见气体样/软组织样/钙质样/金属样密度影。",
  167. "impression": "1.符合左/右侧额/颞/顶/枕叶脑挫裂伤,/脑内血肿,/并颅内压增高,建议短期复查。<br />2.左/右侧额/颞/顶/枕/颅底部骨折,/头皮血肿/异物。"
  168. },
  169. {
  170. "description": "  左/右侧额/颞/顶/枕部颅骨内板下可见双凸形/单凸形致密高密度影(不跨越颅缝),最厚处约达 0 cm,CT值约0Hu(低于100),密度欠/较均匀,边界清楚,颅骨内板与脑组织间隙增宽,脑白质塌陷,同侧侧脑室受压变形,中线结构向对侧移位约 0 cm,骨窗见左/右侧额/颞/顶/枕部颅骨连续性中断/碎裂/颅缝增宽,无/分离,约 0 mm,无/局部凹陷,约深达 0 mm,相邻头皮组织层次清晰/模糊,无/增厚,皮下可/未见气体样/软组织样/钙质样/金属样密度影。",
  171. "impression": "  符合 左/右侧额/颞/顶/枕部硬膜外血肿,建议短期复查。<br />  符合左/右侧额/颞/顶/枕部颅骨骨折,/头皮血肿/异物。"
  172. },
  173. {
  174. "description": "  左/右侧额/颞/顶部颅骨内板下方可见一新月形高密度影(可跨越颅缝),CT值 0 Hu(低于90),密度略不/较均匀,边界欠/较清楚,最厚处约达 0 cm,颅骨内板与脑组织间隔增宽,邻近脑室/脑裂/脑沟受压变形/缩窄,中线结构无/有向对侧移位约 0 cm。(骨窗请追加(颅骨骨折)模板)。",
  175. "impression": "  符合左/右侧额/颞/顶部硬膜下血肿,建议短期复查。"
  176. },
  177. {
  178. "description": "双侧胸廓对称,所示诸骨骨质结构未见明显异常;双肺纹理清楚,分布走行自然,未见明显异常阴影;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中;双侧膈面光滑,位置正常,双侧肋膈角清晰锐利,余未见明显异常征象。",
  179. "impression": "胸部正位片未见明显异常。"
  180. },
  181. {
  182. "description": "  纵膈窗示胸廓对称;胸壁软组织层次清楚;气管及邻近甲状腺、血管、食管、心脏大血管位置、形态、密度、毗邻关系均未见异常;腔静脉后区、隆突下区、奇食窝区、肺门区、主动脉窗区未见淋巴结增大影;双肺门影清楚,胸膜影未见异常。<br />  肺窗示双肺野透光度匀称,各级肺动、静脉血管影及可辨认支气管影清楚,分支延续滑顺规整,走行自然顺畅。下舌段未见纤维条索影;斜裂未见显示;肋膈角/心隔角清楚。<br />  骨窗示胸骨/脊椎骨及双侧肋骨/锁骨/肩胛骨/肱骨头骨质形态/纹理/密度/连续性均未见异常。  <br />  膈下肝脏/胆囊/胰腺/脾脏/双肾及肾上腺未见异常。",
  183. "impression": "  胸部未见异常。"
  184. },
  185. {
  186. "description": "  骨窗见左/右侧额/颞/顶/枕/颅底部骨质连续性中断/碎裂/错位/颅缝增宽,无/有分离约 0 mm;局部无/可见凹陷,深度约 0 mm;邻近头皮组织层次清晰/模糊,并/无增厚约达 0 mm;皮下可/未见气体样/软组织样/钙质样/金属样密度影。",
  187. "impression": "左/右侧额/颞/顶/枕/颅底部骨折,/头皮血肿/异物。"
  188. },
  189. {
  190. "description": "片纳右肘关节诸骨形态自然,未见明显骨折、脱位,肘关节结构正常,关节间隙清晰。",
  191. "impression": "右肘关节摄片未见明显异常,请结合临床,必要时请复查。"
  192. },
  193. {
  194. "description": "  左/右颞/顶/额叶内可见一/多发/a灰白质交界区片状不规则略低密度影,CT值 0 Hu;边界不清/对比模糊;邻近脑沟变浅/消失;可见轻度占位;周围白质密度减低,CT值 0 Hu;灰白质对比清楚。(增强扫描可见脑回状或斑片状强化,不符合血管供应分布规律)<br />/b低/等密度影,CT值 0 Hu;中央为低密度,CT值 0 Hu;边缘欠/不清楚;大小约为 0x0 cm;周围白质密度减低,CT值 0 Hu;灰白质对比清楚;轻度/明显占位效应;中线结构向左/右侧偏移。(增强扫描呈均匀环形强化,环内壁光滑,厚薄均匀一致,无壁结节影;周围白质低密度无强化)。<br />  (临床有发热、头痛、精神症状、神经系统体征)",
  195. "impression": "  左/右侧颞/顶/额叶一/多发占位性病变,结合临床,考虑a脑炎,/b脑脓肿。建议增强CT扫描或其他进一步检查。"
  196. },
  197. {
  198. "description": "  肺窗示左肺/右肺上叶/中叶/下叶/舌叶可见斑片状密度增高影,边缘模糊,密度不均,其内可见充气的支气管影像,同时可见少许/较多纤维样灶,余肺野清晰,未见异常密度影。纵隔窗示病灶区呈稀疏散在斑点、条索状影,未见明显实性团块影,纵隔内未见肿大淋巴结,心影及大血管形态正常。",
  199. "impression": "  肺炎<br />  必要时进一步检查"
  200. },
  201. {
  202. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,所示诸骨骨质结构未见明显异常;双侧肺野可见弥漫分布之小片状及斑点样密度增高影,其大小、密度及分布不均匀;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中,心前心后间隙未见明显异常阴影;双侧膈面光滑,位置正常,肋膈角清晰锐利,余未见明显异常征象。",
  203. "impression": "双肺改变考虑亚急性血行播散性肺结核,建议作胸部CT进一步检查。"
  204. },
  205. {
  206. "description": "  肺窗示左/右肺门增大,并见不规则软组织密度块影,右/左主支气管/右肺上叶/中间支气管/左肺上叶/下叶支气管管腔狭窄/闭塞,右肺上叶/中叶/下叶/左肺上叶/下叶可见致密影与肺门相连,呈“S”形边缘,纵隔窗示右/左主支气管/右肺上叶/中间支气管/左肺上叶/下叶支气管管壁增厚,管腔狭窄/闭塞,左/右/双侧肺门及纵隔内可见多个肿大淋巴结。左/右侧胸腔内可见弧形水样密度影,心影及大血管如常。",
  207. "impression": "  符合中心型肺癌<br />  纵隔淋巴结转移<br />  胸水<br />  建议增强CT扫描,或其他检查"
  208. },
  209. {
  210. "description": "  胸廓对称,肋骨及胸壁软组织未见异常。支气管通畅,走行自然,肺野透光度良好,未见异常密度影,双肺门不大。纵隔窗示纵隔无偏移,心影及大血管形态正常,纵隔内未见肿块及肿大淋巴结。双侧胸腔未见明显积气积液。双侧胸膜未见明显增厚。",
  211. "impression": "胸部CT平扫未见明显异常"
  212. },
  213. {
  214. "description": "  肺窗示右肺上叶尖段/后段/前段|中叶内侧段/外侧段|下叶前/外/后/内基底段/背段|左肺上叶尖后段/前段/舌段|下叶前外/后/内/基底段/背段/可见孤立性肿块/结节影,大小约为 x cm,边缘毛糙,可见分叶及细小毛刺,密度均匀/不均匀,CT值0Hu,其内可见偏心性空洞,肿块内无钙化/点状少量钙化,纵隔窗示纵隔内可见多个肿大淋巴结影。左/右侧胸腔内可见弧形低密度影,心影及大血管如常。",
  215. "impression": "符合周围型肺癌<br />纵隔淋巴结转移<br />胸水<br />建议增强CT扫描,或其他检查"
  216. },
  217. {
  218. "description": "  胸廓对称,但前后径增大,肺窗示双肺野透亮度增高,肺纹理稀疏,左/右/双肺上/中/下叶可见纤维条索状影,双肺门略/明显增大,左/右/双肺上/中/下叶可见一/多个无纹理空泡影,纵隔窗肺野内未见明显实性密度影,各大血管结构正常,未见/可见个别小淋巴结,左/右/双侧上/下胸膜增厚",
  219. "impression": "符合慢支、肺气肿。"
  220. },
  221. {
  222. "description": "  肺窗示左/右肺尖 左/右肺上叶后段/下叶背段可见一球形/类圆形/不规则形高密度影,大小约为 X cm, CT值为 Hu,边缘光滑,未见明显毛刺,纵隔窗其内可见点/斑片状钙化灶,余肺野未见明显实变。纵隔内见数个小淋巴结,部分可见钙化。心影及大血管形态正常。",
  223. "impression": "  左/右肺尖 左/右肺上叶后段/下叶背段结核球。"
  224. },
  225. {
  226. "description": "  肺窗示左/右肺尖 左/右肺上叶后段/下叶背段可见条索状及斑片状密度增高影,纵隔窗病灶密度偏高,可见点状钙化,余肺野未见明显异常。纵隔内未见/可见数个直径约1cm左右淋巴结,部分可见钙化。心影及大血管形态正常。",
  227. "impression": "  左/右肺尖 左/右肺上叶后段/下叶背段结核陈旧性结核球。"
  228. },
  229. {
  230. "description": "  肺窗示左肺上叶中叶/下叶|右肺上叶/下叶/双肺可见一个/多个弥漫分布/散在分布类圆形/不规则形肿块/结节影,边缘清楚,呈绵花团状,无明显分叶及毛刺。双肺门影增大。纵隔窗示纵隔内可见/ 未见多个肿大淋巴结。心影及大血管形态正常。",
  231. "impression": "1.左/右肺上叶/中叶/下叶转移瘤/转移性结节,肺门及纵隔淋巴结转移。<br />2.双肺多发转移瘤,肺门及纵隔淋巴结转移。"
  232. },
  233. {
  234. "description": "  肺窗示左/右肺尖 左/右肺上叶后段/下叶背段可见斑片状密度增高影,周围有多个卫星灶。余肺野未见明显实变。纵隔内见多个肿大淋巴结,部分可见钙化。心影及大血管形态正常。",
  235. "impression": "  左/右肺尖 左/右肺上叶后段/下叶背段结核/结核球并纵隔淋巴结肿大。"
  236. },
  237. {
  238. "description": "  肺窗示左/右肺上叶/中叶/下叶 段可见一类圆形病灶,大小约为 X cm,呈分叶状,边缘光滑/毛糙,未见/可见细小/粗大毛刺,纵隔窗示病灶密度均匀/不均匀,CT值为Hu,其内可见钙化灶,邻近肺组织未见异常/肺纹理增粗,纵隔内未见/可见直径约为1cm肿大淋巴结。",
  239. "impression": "  1.左/右肺上叶/中叶/下叶 段占位性病变,良恶性等鉴别,建议穿刺活检。<br />  2.左/右肺上叶/中叶/下叶 段占位性病变,炎症可能性大,建议冶疗后复查后复查除外肺癌。"
  240. },
  241. {
  242. "description": "  前纵隔可见一圆形/类圆形/分叶状厚壁囊性/实质性软组织肿块影,其内密度不均匀,可见钙化及脂肪性低密度区。纵隔内大血管受推移移位。增强扫描,肿块实质部分呈轻度/中度/明显强化。双肺门不大,纵隔内未见明显肿大淋巴结。双肺野未见异常。",
  243. "impression": "  前纵隔占位性病变,考虑畸胎瘤。"
  244. },
  245. {
  246. "description": "中下腹部可见明显肠腔积气与积液,其间可见多发长短不一、高低不等之液气平,以小肠为主,部分充气肠管“弹簧”征,扩张之肠管最大直径约6.5cm,双侧膈下未见明显游离气体影;所示腰椎及骨盆诸骨未见明显骨折、脱位、骨质增生及破坏,余未见特殊。",
  247. "impression": "小肠梗阻,建议必要时作腹部CT扫描进一步检查。"
  248. },
  249. {
  250. "description": "  前上纵隔胸廓入口处可见一类圆形/不规则形软组织密度影,其内密度均匀/不均匀,肿块与周围结构分界清楚。增强扫描,肿块实质部分明显强化,低密度区无强化。上下层面追踪观察见该软组织影与颈部甲状腺相连,其密度改变与其类似。双肺门不大,纵隔内未见明显肿大淋巴结。双肺野未见异常。",
  251. "impression": "  胸骨后甲状腺肿/腺瘤"
  252. },
  253. {
  254. "description": "  于后纵隔相当于T12椎体平面,椎体左/右旁见一类圆形占位性病变,大小约为 X cm,平扫呈等密度,密度尚均匀/不均匀,其内可见低密度囊变区,边界清楚,增强扫描后病灶实质部分呈明显强化,囊性部分不强化,纵隔结构向前推移。双肺未见明显异常。",
  255. "impression": "  T12椎体平面椎体左/右旁占位性病变,性质考虑为神经鞘瘤。"
  256. },
  257. {
  258. "description": "  食道癌术后复杳示原食道肿瘤已切除,食道上/中段胸腔胃,吻合口处粘膜稍/明显均匀/不规则增厚,边界清楚/不清楚,邻近胸腔胃区肺纹理较增粗,呈条索状/斑片状高密度影,纵隔内可见数个小淋巴结,最大直径约为1cm左右,余未见特殊。",
  259. "impression": "食道癌术后改变,未见明显肿瘤复发。<br />食道癌术后吻合口处粘膜增厚,建议胃镜进一步检查除外肿瘤复发。"
  260. },
  261. {
  262. "description": "  扫描肺窗示左/右下肺致密影,邻近肺组织纹理增粗,软组织窗示左/右侧胸腔少/中/大量胸腔积液,呈弧形,呈液性低密度,CT值为 Hu,密度均匀,胸膜增厚/无增厚,未见明显结节影。余肺野未见明显异常密度影,纵隔内未见/可见个别小淋巴结。胸廓未见异常。",
  263. "impression": "  左/右侧胸腔积液(大/中/少量)"
  264. },
  265. {
  266. "description": "左侧股骨头明显变扁,骨质密度减低,边缘明显不规整,相应股骨颈相对粗短,左侧髋臼上部骨质密度稍增高,其边缘可见少许骨赘形成,相应髋关节间隙变窄,整个左髋关节形态结构失常,左侧臀部软组织相对变薄,余所示诸骨及相应区域软组织影未见明显异常征象,余未见特殊。",
  267. "impression": "左侧股骨头缺血坏死,建议必要时作髋关节CT扫描进一步检查。"
  268. },
  269. {
  270. "description": "常规准备及透视监视下,经导管注入适量碘海醇,并适时点片示:子宫腔显影良好,其大小形态及位置未见明显异常,双侧输卵管充盈显影良好,未见明显扩张及狭窄,造影剂经双侧输卵管弥散入腹腔顺利,余未见特殊。",
  271. "impression": "子宫输卵管造影未见明显异常。"
  272. },
  273. {
  274. "description": "  肺窗示双侧肺野清晰,肺纹理正常,双肺门不大,左/右肺上/中/下胸膜呈幕状/条索状高密度改变,纵隔窗示局部胸膜增厚,表现欠光滑,纵隔内未见明显肿大淋巴结/可见个别小淋巴结,未见胸腔积液。",
  275. "impression": "  左/右上/下胸膜肥厚、粘连。"
  276. },
  277. {
  278. "description": "  于前上纵隔胸腺位置,胸腺体积较大,约为左右径: cm, 厚 cm,但保持正常胸腺的形态,边界清楚,呈软组织密度,密度均匀,与周围血管结构分界清楚,增强扫描后呈均匀轻中度强化,双肺及余纵隔内未见其它异常。",
  279. "impression": "  胸腺体积增大,考虑胸腺增生。"
  280. },
  281. {
  282. "description": "  纵隔窗示中纵隔内可见圆形/类圆形水样低密度影,边界清楚,增强扫描未见强化。纵隔内未见肿大淋巴结。肺窗示双肺无实变,肺纹理清晰,走行自然。",
  283. "impression": "  中纵隔囊性占位性病变,考虑支气管囊肿。"
  284. },
  285. {
  286. "description": "  于前上纵隔胸腺位置可见一圆形/类圆形/分叶状软组织肿块,边界清楚,大小约为 X X cm,密度均匀/略不均匀,增强扫描后病灶呈中度均匀强化,肿块与纵隔内血管影分界清楚,纵隔内其它结构未见异常。",
  287. "impression": "  前上纵隔占位性病变,性质考虑为胸腺瘤。"
  288. },
  289. {
  290. "description": "  于前上纵隔胸腺位置可见不规则形软组织肿块,边界不清楚,大小约为 X X cm,密度不均匀,内部可见囊性低密度影,增强扫描后病灶呈中度不均匀强化,肿块与纵隔内血管影分界不清楚/粘连紧密,包绕大血管/血管推压移位。心包未见增厚,双肺未见明显异常。",
  291. "impression": "  前上纵隔占位性病变,考虑恶性胸腺瘤。"
  292. },
  293. {
  294. "description": "  胸廓对称,右上纵膈旁可见巨大软组织肿块,且横跨纵膈内外,范围 x x cm,其内密度不均匀,大部分CT值 Hu左右,中央可见片状更低密度坏死区,肿块外侧缘肺-瘤界面可见浅分叶及短毛刺症,临近胸膜局部增厚粘连呈尾巴症,内侧缘轻度压迫主动脉,腔静脉、血管前间隙显示不清,其余双侧肺野纹理清晰,双肺门不大,心影不大,形态自然,膈面光滑,肋膈角锐利。",
  295. "impression": "  考虑纵膈型肺癌,建议增强CT或病理活检进一步检查。"
  296. },
  297. {
  298. "description": "  于前、中纵隔可见多发大小不等结节影,主要位于双肺门及支气管隆突下方,部分病灶相互融合,平扫呈等密度,增强扫描后病灶呈轻中度强化,正常血管明显强化,分界清楚,部分血管受压,双侧肺内未见明显肿块影。",
  299. "impression": "  前中纵隔占位性病变,考虑纵隔淋巴瘤。"
  300. },
  301. {
  302. "description": "  胸廓两侧不对称,双上肺见斑片状、纤维条索状、网格状等多形性改变,余肺亦见斑片索条影,部分支气管牵拉变形,肺门及纵隔未见肿大淋巴结,心影狭长,冠脉见不均匀钙质沉积,双侧胸腔内可见液性密度区,CT值约为0-0Hu,部分呈包裹性,边缘清晰,程度不等胸膜增厚牵拉,左肋膈角闭塞。左肾外侧可见类圆形低密度影,边缘清晰,呈水样密度,直径约为 cm大小,余未见异常。",
  303. "impression": "  符合肺部、胸膜腔TB病变,请结合临床。"
  304. },
  305. {
  306. "description": "  肝左叶/右叶胆管局灶性扩张,最宽处达 mm,其内可见多发斑块状高密度影,CT值约0-00Hu,肝门区左/右肝管/总肝管无/亦扩张,最宽处达 mm,未见/并可见高密度影,CT值约0-00Hu,胆总管扩张,最宽处达 mm,可见圆形高密度影,CT值约0-00Hu。肝内未见其它实性病灶,脾不大/稍大,胆囊壁稍/明显增厚,体积稍/增大,最大经线约达 mm,其内可/未见高密度影,CT值约0-00Hu。胰腺轮廓不/清晰,密度减低/增高/正常,CT值约0-00Hu,胰管有/无增粗,最宽处达 mm,腹膜后未见明显肿大淋巴结。",
  307. "impression": "1.肝左/右叶肝内胆管结石局灶性胆管扩张。<br />2.左/右肝管/肝总管/胆总管结石并胆管扩张。<br />3.慢/急性胆囊炎。<br />4.慢/急性胰腺炎。"
  308. },
  309. {
  310. "description": "  左右肝叶比例失调,轮廓不规整,肝裂增宽,肝右/左叶见一占位性病变,边界尚/欠清楚,有/无包膜,大小约为 x x cm,平扫呈略低密度,CT值约0-00Hu,密度均匀/略不均匀,中央有/无水样密度区。门静脉可/未见增粗,肝门部有/无淋巴结影,胆囊大小及形态正常,胆囊壁略厚,脾大约达 个肋单元,脾厚约达0cm,胰腺无异常,肝脾周可见水样密度影,腹膜后未见肿大淋巴结/可见个别小淋巴结。",
  311. "impression": "1.肝右/左叶占位性病变,考虑肝癌。<br />2.肝硬化,脾大,腹水。<br />3.不除外门静脉癌栓形成。<br />4.建议增强CT扫描,或行其他检查。"
  312. },
  313. {
  314. "description": "  肝脏轮廓光整,各叶比例适当,肝裂不宽,肝实质密度均匀。胆囊大小形态正常,壁不厚;脾脏轮廓光,密度及厚度如常。胰腺轮廓清楚,体积与年龄相符合,密度均匀,胰周脂肪间隙无混浊征。双侧肾脏大小、位置及形态如常,肾实质厚度、密度未见异常,肾盂肾盏结构清晰,无扩张挤变形,内无异常密度影,肾周脂肪间隙清晰,肾筋膜无增厚。双侧肾上腺位置、形态、密度未见异常,周围脂肪间隙清晰。双侧输尿管走行区未见明显异常,腹腔内肠道清洁欠佳/较好,肠壁未见明显增厚,肠腔未见明显扩张、积气及液平影。盆腔内膀胱充盈良好,壁光滑无增厚,a.前列腺形态密度未见异常,双侧精囊腺角清晰,未见异常密度影;b.子宫形态密度如常,附件区未见囊样影。直肠壁未见明显增厚,腹膜后、盆腔内未见明显肿大淋巴结影。腹盆腔区未见积液征象。所见胸、腰椎缘可见/未见骨赘影,双侧髋关节、骶髂关节在位,间隙如常,未见骨小梁稀疏征,骨质密度未见减低。",
  315. "impression": "腹盆部CT平扫未见明显异常。"
  316. },
  317. {
  318. "description": "  胆囊不大/略大,约达0x00mm,壁稍增厚,胆囊内可见点状/圆形/团块状致密高密度影,最大径为 cm,边缘光滑/毛糙,肝脏大小形态正常,未见局灶性密度异常,胆管无扩张,脾不大/稍大,胰腺大小形态及密度正常,腹膜后未见明显肿大淋巴结。",
  319. "impression": "  胆结石,慢性胆囊炎。"
  320. },
  321. {
  322. "description": "  肝脏体积较小,边缘呈波浪状不平,肝各叶比例失调,左叶明显增大,右叶缩小,肝内密度欠均匀,呈多发小结节状,但未见明显局灶性占位病变,脾大0个肋单元,肝脏外缘可见弧形水样密度影。脾门及胃底、食道周围可见多个粗大迂曲血管影。",
  323. "impression": "符合肝硬化,脾大,腹水,门脉高压。<br />建议增强CT扫描,或其他检查。"
  324. },
  325. {
  326. "description": "  肝脏大小、形态正常,肝内密度均匀,未见局灶性密度异常,肝内血管走行正常,肝内外胆管无扩张。胆囊不大,壁不厚,腔内密度均匀。脾不大,密度均匀。胰腺大小形态及密度正常。双侧肾脏对称,大小及形态正常,未见局灶性密度异常。腹膜后未见肿大淋巴结。",
  327. "impression": "  肝、胆、脾、胰、双肾未见明显异常。"
  328. },
  329. {
  330. "description": "  扫描示肝右/左叶见一巨大占位性病变,边界欠清楚,形状不规则,大小约为 X X cm,平扫呈略低密度,CT值为 Hu,密度不均匀,其内可见裂隙状更低密度区,动态增强扫描动脉期病灶不均匀强化,门脉期强化程度下降,延迟扫描病灶呈低信号,邻近血管受压推移呈抱球状,门静脉主干/左/右支可见充盈缺损,肝内胆管无扩张,肝左/右叶尚可见一较小类似以上密度改变病灶,脾大个肋单元,肝周可见弧形液性密度影,胆囊大小及形态正常,胰腺无异常,腹膜后未见肿大淋巴结/可见数个肿大淋巴结。",
  331. "impression": "1.肝右/左叶占位性病变,考虑为原发性巨块型肝癌并门静脉癌栓/肝内子灶/腹膜后淋巴结转移<br />2.肝硬化,脾大,腹水。"
  332. },
  333. {
  334. "description": "(无老片对比)右胫骨骨折整复内固定术后,骨折断端对位、对线良好,骨折线模糊,局部见钢板、螺钉内固定中,片包跟骨局部亦见内固定件影;右踝关节间隙显示模糊,局部骨质呈疏松改变,关节结构关系如常。",
  335. "impression": "1.右胫骨骨折整复内固定术后,请结合临床及前片。\n2.右踝关节退行性改变?"
  336. },
  337. {
  338. "description": "  肝癌手术后复查示原左/右叶肝癌已切除,局部肝表现略凹陷,呈水样裂隙状/条索状低密度改变,肝比例失调,但肝内未见明显其它局灶性异常密度影,肝内胆管无扩张,增强扫描后原手术区未见异常强化影,胆囊不大,壁稍增厚,脾大个肋单元,胰腺正常。腹膜后未见明显肿大淋巴结。",
  339. "impression": "1.符合肝癌术后改变,未见明显复发。<br />2.肝硬化。"
  340. },
  341. {
  342. "description": "  扫描示肝右/左叶弥漫性低密度,密度不均匀,可见更低密度液化坏死区,其内可见少许正常残瘤肝组织密度,动态增强扫描动脉期病灶有强化,门脉期强化程度下降,延迟扫描病灶呈低信号,门静脉主干/左/右支可见充盈缺损,肝内胆管无扩张,脾大个肋单元,肝周可见弧形液性密度影,胆囊大小及形态正常,胰腺无异常,腹膜后可直径为 cm的肿大淋巴结。",
  343. "impression": "1.肝右/左叶占位性病变,性质考虑为弥漫型肝癌并门静脉癌栓/肝内子灶/腹膜后淋巴结转移。<br />2.肝硬化,脾大,腹水。"
  344. },
  345. {
  346. "description": "  肝癌碘油介入治疗后复查,平扫示病灶大小约为 X cm,碘油沉积良好/不良,呈均匀完全沉积/不均匀斑片状沉积,内部可见低密度影,增强扫描后病灶未见明显强化/病灶内部低密度区/边缘可见强化,门静脉主干/左/右支可见充盈缺损,肝内胆管无扩张,脾大0个肋单元,肝周可见弧形液性密度影,胆囊大小及形态正常,胰腺无异常,腹膜后可见数个直径为0cm的肿大淋巴结。",
  347. "impression": "1.肝右/左叶肝癌碘油栓塞术后碘油沉积良好,肿瘤坏死。<br />肝右/左叶肝癌碘油栓塞术后碘油沉积不良,肿瘤部分存活。<br />2.门静脉癌栓/肝内子灶/腹膜后淋巴结转移。<br />肝硬化,脾大,腹水。"
  348. },
  349. {
  350. "description": "  于肝左叶/肝门区见占位性病变,平扫呈略不均匀低密度,病灶边界欠清,大小约为 X X cm,肝门区及肝左叶胆管扩张,动态增强扫描动脉期病灶强化不明显,静脉期病灶有轻度不规则强化,延迟后增强较明显,胆囊不大,胰腺大小形态正常,脾不大,腹膜后未见肿大淋巴结。",
  351. "impression": "  肝左叶/肝门区占位性病变,考虑胆管细胞癌并肝左叶胆管扩张。"
  352. },
  353. {
  354. "description": "  扫描示肝内多发类圆形病变,边界尚清楚,最大者约为 X cm, 平扫呈略低密度,CT值为 Hu,密度均匀/略不均匀,动态增强扫描动脉期病变边缘呈结节状强化,随时间推移,病灶强化范围扩大,延迟扫描病灶基本/大部分充填,肝内胆管无扩张,脾不大,胆囊大小及形态正常,胰腺无异常,腹膜后未见肿大淋巴结。 ",
  355. "impression": "  肝内多发占位性病变,考虑多发海绵状血管瘤。"
  356. },
  357. {
  358. "description": "  肝脏肝脏大小、形态正常,于肝右/左叶可见一/多个高密度钙化样密度影,未见其它局灶性密度异常,肝内血管走行正常,肝内外胆管无扩张,脾不大,胆囊不大,胰腺大小形态正常,腹膜后未见肿大淋巴结,增强扫描后未见异常强化。",
  359. "impression": "1.肝内钙化点。<br />2.胆、脾、胰未见明显异常。"
  360. },
  361. {
  362. "description": "  扫描示肝右/左叶见一类圆形病灶,边界尚清楚,大小约为 X cm,平扫呈略低密度,CT值为 Hu,密度均匀/略不均匀,动态增强扫描动脉期病灶边缘呈结节状强化,随时间推移,病灶强化范围扩大,延迟扫描病灶基本/大部分充填,肝内胆管无扩张,脾不大,胆囊大小及形态正常,胰腺无异常,腹膜后未见肿大淋巴结。 ",
  363. "impression": "  考虑肝右/左叶海绵状血管瘤。"
  364. },
  365. {
  366. "description": "  于肝内见多发大小不等类圆形病变,边界清楚,最大者大小约为 X cm, 平扫呈均匀低密度,CT值为 Hu,增强扫描扫描病变无强化,边界更清楚,余肝内密度无异常,血管影走行正常,肝内胆管无扩张,脾不大,胆囊大小及形态正常,胰腺无异常,腹膜后未见肿大淋巴结。 ",
  367. "impression": "  符合肝内多发囊肿。"
  368. },
  369. {
  370. "description": "  肝右/左叶见一类圆形病变,边界清楚,光滑锐利,大小约为 X cm,平扫呈均匀低密度,CT值为 Hu,增强扫描扫描病变无强化,边界更清楚,余肝内密度未见异常,血管影走行正常,肝内胆管无扩张,脾不大,胆囊大小及形态正常,胰腺无异常,腹膜后未见肿大淋巴结。",
  371. "impression": "  符合肝右/左叶肝囊肿。"
  372. },
  373. {
  374. "description": "  扫描示肝内胆管扩张呈圆形断面及管状,平扫呈低密度,肝门区肝总管及左右肝管亦扩张,胆总管扩张并呈渐近性,胰头段胆总管仍见扩张,于胆总管下段可见圆形高密度影,边界清楚,胆囊明显扩大。胰头不大,腹膜后未见明显占位性病变。增强扫描未见明显异常强化影。腹膜后未见明显肿大淋巴结。",
  375. "impression": "  符合胆总管下段结石并梗阻性胆管扩张。"
  376. },
  377. {
  378. "description": "  胰腺体积不规则增大,以胰头/体部/尾部明显增大形成肿块,大小约为 X cm, 平扫呈等/低密度,密度不均匀,其内可见液化坏死,病灶与周围正常胰腺组织分界欠清,增强扫描病灶呈不规则强化,胰周围组织界面不清楚,胆总管扩张,在胰头段突然中断,肝内及肝门区胆管明显扩张,腹膜后可见结节状软组织影。",
  379. "impression": "胰头/体部占位性病变,性质考虑为胰腺癌并梗阻性胆管扩张。<br />腹膜后淋巴结转移。"
  380. },
  381. {
  382. "description": "  扫描示胰腺体积明显普遍性增大,边缘模糊,密度均匀减低,胰周可见多处液性低密度渗出性改变,胰管不/可见扩张,肝脏大小形态正常,胆囊不大/略大,壁稍厚。脾不大,腹膜后未见明显淋巴结。",
  383. "impression": "符合急性胰腺炎改变。建议短期复查。"
  384. },
  385. {
  386. "description": "  扫描示胰腺体积尚正常/萎缩变细,胰腺内可见多发点状钙化/结石,胰管轻度/明显迂曲扩张,于胰腺体/尾部可见一类圆形囊性病灶,CT值 Hu,呈均匀水样密度,囊壁较薄/厚,边界清楚,胰周未见明显异常,增强扫描后囊肿内无强化,囊壁轻度强化,腹膜后未见明显肿大淋巴结,肝脏大小形态正常,胆囊不大,壁稍增厚,脾不大。",
  387. "impression": "胰腺改变,考虑慢性胰腺炎并假性囊肿形成。 <br />慢性胆囊炎。"
  388. },
  389. {
  390. "description": "扫描示肝左中/右叶/全肝密度普遍性减低,CT值为 Hu, 脾脏CT值为 Hu,肝脏密度接近/低于脾脏,肝内血管走行清晰显示,增强扫描后肝内血管影走行正常,密度高于肝组织,未见局灶性异常强化影,脾不大,胆囊不大,壁稍增厚,胰腺大小形态正常,腹膜后未见明显肿大淋巴结。",
  391. "impression": "1.脂肪肝(肝右叶/普遍性)。<br />2.慢性胆囊炎。"
  392. },
  393. {
  394. "description": "  扫描示双侧肾脏对称,位于脊柱两侧,大小正常,皮髓质分辨清楚,肾实质内未见明显局灶性密度异常,双侧肾盂、输尿管未见明显扩张,肾周脂肪囊清楚,肾旁结构未见明显异常。腹膜后未见明显肿大淋巴结。",
  395. "impression": "双侧肾脏未见明显异常。"
  396. },
  397. {
  398. "description": "  扫描示双侧肾脏对称,位于脊柱两侧,大小正常,皮髓质分辨清楚,肾实质内未见明显局灶性密度异常,双侧肾盂、输尿管未见明显扩张,肾周脂肪囊清楚,肾旁结构未见明显异常。双侧输尿管未见扩张及异常密度影,膀胱充盈良好,壁无增厚,膀胱外脂肪间隙正常,盆腔内示见明显肿大淋巴结。",
  399. "impression": "双侧肾脏及输尿管、膀胱未见明显异常。"
  400. },
  401. {
  402. "description": "  平扫于左/右/双侧肾盂内可见斑块状致密高密度影,大小约为 X X cm ,边界清楚,表面光滑/毛糙,左/右/双侧肾盂轻/中/重度扩张积水,双侧输尿管未见明显扩张积水。",
  403. "impression": "左/右/双侧肾结石。"
  404. },
  405. {
  406. "description": "  膀胱充盈良好/欠佳,膀胱左/右/后壁局灶性增厚,并可见菜花状软组织密度影突入膀胱内,平扫肿块呈等密度,可见斑点状致密钙化灶,增强扫描后病灶轻中度强化,延迟增强扫扫描肿块表现为膀胱内造影剂充盈缺损,膀胱壁外缘尚光滑/不光滑,周围脂肪间隙清楚/不清楚,膀胱精囊三角区正常/消失。盆腔内未见明显肿大淋巴结。盆腔内其它结构未见明显侵犯。",
  407. "impression": "膀胱内占位性病变,考虑膀胱癌。"
  408. },
  409. {
  410. "description": "  平扫示左/右/双侧输尿管上/中/下段平面可见一类圆形致密高密度影,直径约为 cm,此平面以上左/右/双侧输尿管及肾盂轻/中/重度扩张积水。双肾实质未见异常密度影,腹膜后未见肿大淋巴结。",
  411. "impression": "左/右/双侧输尿管上/中/下段结石并肾盂输尿管积水。"
  412. },
  413. {
  414. "description": "  于左/右侧肾上极见一不规则形/类圆形病灶,大小约为 cmX cm ,CT值为 Hu,边界尚清,增强扫描后病灶无明显/轻度强化,正常肾脏明显强化,对比明显,肾周及腹膜后未见明显异常。",
  415. "impression": "  左/右侧肾上极占位性病变,考虑错构瘤。"
  416. },
  417. {
  418. "description": "  左/右侧肾体积增大,表面不规则隆起,内可见一类圆形占位性病变,边界欠清,大小约为 X X cm,病灶不规则,平扫呈低/等密度,信号欠均匀,其内可见更低密度囊变坏死区,增强扫描后动脉期病灶明显强化,静脉期及肾实质期正常肾脏明显强化,病灶与正常肾脏对比增强。病灶未/已经突破肾脂肪囊。肾盂肾盏变形。腹膜后未/可见明显肿大淋巴结。腹主动脉周围可见直径约为0cm肿大淋巴结。",
  419. "impression": "左/右肾实质内占位性病变,考虑肾细胞癌。并腹膜后转移。"
  420. },
  421. {
  422. "description": "  于左/右侧肾上/中/下极肾实质内可见一类圆形小病灶,直径约为 cm,边界清楚锐利,平扫呈水样均匀低密度,增强扫描病灶无强化,正常肾脏明显强化,对比明显,病灶边界更清楚。肾盂肾盏无异常。",
  423. "impression": "左/右肾肾囊肿。"
  424. },
  425. {
  426. "description": "  左/右侧肾体积明显增大,外形不规则,内可见一较大不规则型占位性病变,边界欠清,大小约为 X X cm,平扫呈低/等密度,信号欠均匀,其内可见更低密度囊变坏死区,正常肾实质受压变薄,增强扫描后动脉期病灶明显强化,静脉期及肾实质期正常肾脏明显环强化。病灶突破肾脂肪囊。腹主动脉周围可见直径约为1cm肿大淋巴结。",
  427. "impression": "左/右肾实质内巨大占位性病变,考虑肾母细胞癌。并腹膜后淋巴结转移。"
  428. },
  429. {
  430. "description": "  于左/右/双侧肾实质内可见多发大小不等类圆形病灶,部分突出肾外,最大者约为 X X cm,平扫呈水样均匀低密度,边界清楚,增强扫描后病灶无强化,正常肾实质明显强化,对比明显,病灶边界更清楚,肾旁及肾周组织未见明显异常。",
  431. "impression": "左/右/双侧肾脏多发肾囊肿。"
  432. },
  433. {
  434. "description": "  扫描示左/右/双侧肾盏扩张呈水样低密度,肾盂不扩张,在扩张积水的肾盏内可见散在点、块状高密度钙化,肾皮质变薄,增强扫描后正常肾实质呈明显强化,左/右/双侧输尿管轻度扩张,管壁明显增厚。腹膜后未见肿大淋巴结。",
  435. "impression": "左/右/双侧肾及输尿管改变,符合肾、输尿管结核。"
  436. },
  437. {
  438. "description": "  于左/右侧附件区可见一不规则形病灶,大小约为 X X cm,其内密度不均匀,大部分呈囊性低密度,部分呈实性等密度,增强扫描后病灶实性部分呈不均匀强化,囊壁强化,病灶与周围组织分界不清楚,子宫、膀胱明显受压移位,盆腔内及下腹部可见少/大量积液。",
  439. "impression": "1. 左/右侧附件区囊实性占位性病变,考虑卵巢癌。<br />2..腹水及盆腔积液。"
  440. },
  441. {
  442. "description": "  扫描示前列腺形态不规则,局部隆起,于前列腺外周带见一小结节影,大小约为 X X cm,增扫呈等/略低密度,增强扫描后结节呈中度强化,左/右侧膀胱精囊角变浅/消失,盆腔内可见一直径约为1cm左右的淋巴结,左/右侧髂骨骨质破坏。",
  443. "impression": "1.前列腺形状不规则,其外周带小结节影,考虑前列腺癌。<br />2.盆腔淋巴结及髂骨转移。"
  444. },
  445. {
  446. "description": "  扫描示左/右/双侧肾体积增大,肾盂明显扩张积水,呈水样低密度,肾实质变薄,但肾实质内未见明显高密度结石影及其它异常密度影,输尿管无/亦扩张。输尿管行程中未见明显高密度结石影。",
  447. "impression": "左/右/双侧肾盂积水。"
  448. },
  449. {
  450. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,肋间隙相对增宽,所示诸骨骨质结构未见明显异常;双侧肺野整体透光度增高,肺纹理增多、边缘模糊,分布走行紊乱,部分区域呈网状改变,双下肺野中内带可见小片状不均匀密度增高影,边缘模糊,以右侧为著,余肺野未见明显实变阴影;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中,心前心后间隙未见明必显异常阴影;双侧膈面光滑,位置稍低,肋膈角清晰,余未见明显异常征象。",
  451. "impression": "慢性支气管炎肺气肿伴双下肺感染征象,建议作胸部CT进一步检查。"
  452. },
  453. {
  454. "description": "  于左/右侧附件区可见一类圆形病灶,大小约为 X X cm,平扫呈低密度,CT值为 Hu,增强扫描后病灶无明显强化,密度均匀,边界光滑,与周围组织分界清楚,对侧附件区未见异常,子宫大小形态正常,密度无异常,盆腔其它结构未见明显异常。",
  455. "impression": "左/右侧附件区囊性病灶,考虑卵巢囊肿。"
  456. },
  457. {
  458. "description": "  于左/右侧附件区可见一类圆形病灶,大小约为 X X cm,平扫呈低密度/等密度,其内密度尚均匀/欠均匀,可见分隔,增强扫描后包膜及其内分隔有强化,边界尚光滑,与周围组织分界清楚,对侧附件区未见异常,子宫大小形态正常,密度无异常,盆腔其它结构未见明显异常。",
  459. "impression": "左/右侧附件区囊性占位性病变,考虑卵巢囊腺瘤。"
  460. },
  461. {
  462. "description": "  扫描示膀胱充盈良好,膀胱壁光滑、均匀,前列腺大小形态属于正常范围,呈等密度,未见局灶性密度异常,双侧精囊腺对称,大小形态正常,膀胱精囊角对称,直肠内造影剂充盈良好,直肠周围脂肪间隙正常。盆壁结构正常,未见肿大淋巴结。",
  463. "impression": "盆腔各脏器未见明显异常。"
  464. },
  465. {
  466. "description": "  扫描示前腺列体积增大,大小为:左右径 cm,上下径 cm,前后径 cm, 耻骨联合上10cm处仍可见前列腺,部分突入膀胱内,前列腺外形尚正常,边界清楚,呈等密度,未见局灶性密度异常,双侧膀胱精囊角对称、正常,盆腔内未见肿大淋巴结。",
  467. "impression": "前列腺体积增大,考虑为良性前列腺增生。"
  468. },
  469. {
  470. "description": "  子宫体积增大,外形不规则,局部隆起,于子宫前壁/后壁可见一/多发类圆形影,大小约为 X cm,边界清楚,与子宫肌层相比,平扫呈等/略低密度,增强扫描后轻度/明显强化,与子宫肌层强化程度接近,双侧卵巢附件区未见明显异常,膀胱充盈良好,壁光滑,盆腔内其它结构未见异常。",
  471. "impression": "子宫内占位性病变,考虑子宫肌瘤。"
  472. },
  473. {
  474. "description": "aaa\r<br> bbb\r<br> ccc",
  475. "impression": "阿斯蒂"
  476. },
  477. {
  478. "description": "  扫描示子宫体积稍增大,平扫子宫内膜增厚,约为 cm,呈低密度,不均匀,子宫浆膜层界线尚清楚/不清楚,双侧卵巢附件区示见明显异常,膀胱充盈良好,壁光滑,盆壁未见肿大淋巴结/可见直径1cm左右肿大淋巴结。",
  479. "impression": "子宫内膜增厚,结合临床考虑为子宫内膜腺癌。"
  480. },
  481. {
  482. "description": "  扫描示子宫颈体积增大,超过3.5cm,呈不规则低密度改变/局部软组织肿块隆起,与宫颈肌层密度相比,平扫呈等密度/低密度,宫颈内膜增厚,浆膜面不光滑,子宫未见受累/受累,双侧附件区未见明显异常,盆腔内可见一1cm直径小淋巴结。",
  483. "impression": "子宫颈所见,结合临床符合宫颈癌改变。"
  484. },
  485. {
  486. "description": "  扫描示膀胱充盈良好,膀胱壁光滑、均匀,子宫大小形态正常,宫腔内膜厚度正常,呈均匀等密度,宫颈大小形态及密度正常,子宫直肠窝未见异常密度影,盆壁结构正常,盆腔内未见肿大淋巴结。",
  487. "impression": "盆腔各结构未见异常。"
  488. },
  489. {
  490. "description": "  颈部软组织结构对称,无异常肿块影,右侧颈静脉较左侧略粗,为正常变异,气管居中,甲状腺无增大,双侧对称,颈部肌肉组织无异常。",
  491. "impression": "颈部未见明显异常。"
  492. },
  493. {
  494. "description": "  扫描双侧鼻甲及鼻道对称、正常,鼻中隔居中,双侧上颌窦、筛窦、额窦及蝶窦内气化正常,粘膜无明显增厚,鼻咽腔对称,双侧耳咽管咽口、咽隐窝基本对称,肌肉界面清楚,双侧咽旁间隙对称无狭窄,颅底骨质未见明显破坏。",
  495. "impression": "鼻、鼻窦及鼻咽部未见明显异常。"
  496. },
  497. {
  498. "description": "  双侧桥脑小脑角对称,未见局灶性密度异常,骨窗双侧内听道开口对称,无明显扩大及骨质破坏,双侧桥脑小脑角池大小形态正常,四脑室大小形态正常,小脑脑干无异常。增强扫描未见异常强化影。",
  499. "impression": "双侧桥脑小脑角及内听道未见明显异常。"
  500. },
  501. {
  502. "description": "  扫描示双侧上颌骨对称,面部肌肉及软组织结构未见明显异常,双侧腮腺对称,大小及形态正常,呈均匀低密度,未见局灶性密度异常,双侧颌下腺对称无异常,双侧颞下窝结构正常。",
  503. "impression": "颌面部CT扫描未见明显异常。"
  504. },
  505. {
  506. "description": "  扫描示喉腔对称无狭窄,双侧声带对称,无明显增厚,声门裂正常,双侧假声带对称无异常,会厌软骨形态及密度正常,会厌前间隙脂肪密度正常,双侧喉旁间隙及犁状隐窝对称,未见局灶性异常。诸喉软骨未见骨质破坏。",
  507. "impression": "喉部未见明显异常。"
  508. },
  509. {
  510. "description": "  扫描示双侧眼眶及眼球对称,大小形态正常,球内玻璃体、晶状体密度正常,眼球壁均匀光滑,球后脂肪呈均匀低密度,眼外肌无明显增粗,泪腺无增大,视神经走行正常,密度均匀,边界清楚,眶尖及眶周结构未见明显异常。",
  511. "impression": "眼球及眼眶未见明显异常。"
  512. },
  513. {
  514. "description": "  颞骨高分辨率薄层扫描横断/冠状面示双侧外耳道通畅,走行正常,双侧中耳鼓室腔大小对称,密度正常,豉室内听小骨各结构无异常,鼓室窦正常,双侧鼓窦入口无明显扩大,乳突气化良好,耳蜗、前庭及各半规管结构未见明显异常。",
  515. "impression": "双侧外耳、中耳及内耳结构未见明显异常。"
  516. },
  517. {
  518. "description": "  扫描示右/左/双侧上/下直肌明显增粗,且以肌腹增粗明显,肌腱附着处增粗不明显,内/外直肌增粗/无增粗,双侧视神经走行及密度正常,未见局灶性异常,双侧球后脂肪密度正常,余无特殊。",
  519. "impression": "右/左/双侧上/下直肌明显增粗,符合Grave眼病。"
  520. },
  521. {
  522. "description": "  于左/右侧眼眶外上象限泪腺窝内可见一椭圆形占位性病变,大小约为 X cm,平扫呈低密度,增强扫描病灶中度强化,眼球向内下方移位、突出,眼腺窝扩大,骨质结构未见明显破坏。",
  523. "impression": "左/右侧眼眶外上象限泪腺窝占位性病变,考虑泪腺混合瘤。"
  524. },
  525. {
  526. "description": "  于左/右侧眼球内眼环后部局部增厚,并可见一隆起性病变,呈团块状,大小约为 X cm,与眼环相比,平扫呈等密度,其内可见斑块状致密钙化灶,增强扫描后病灶呈轻中度强化,该侧眼球轻度肿大,球后未见明显异常,颅内结构无异常。对侧眼球及球后结构正常。",
  527. "impression": "左/右侧眼球内占位性病变,性质考虑为视网膜母细胞瘤。"
  528. },
  529. {
  530. "description": "  左/右侧上颌窦窦腔增大,其内可见一占位性病变,大小约为 X cm,平扫呈不均匀等密度,其内可见点状高密度影,增强扫描后病灶不均匀强化,病灶向后外侵犯翼腭窝,向前侵犯面部软组织,向后外侵犯颞下窝,上颌窦内侧/后/前窦壁骨质破坏。",
  531. "impression": "左/右侧上颌窦占位性病变,考虑上颌窦癌。"
  532. },
  533. {
  534. "description": "  于左/右侧眼眶内球后肌圆锥内可见一类圆形占位性病变,边界清楚,大小约为 X cm,与眼环相比,平扫呈等密度,信号尚均匀,可见细小点状钙化,增强扫描后病灶强化明显,延迟扫描病灶仍明显强化,视神经受压移位,眼外肌亦受压移位。眼眶内质未见明显破坏。",
  535. "impression": "左/右侧眼眶内球后肌圆锥内占位性病变,性质考虑为眼眶血管瘤。"
  536. },
  537. {
  538. "description": "  扫描示双侧鼻甲明显肥大,左/右/双侧上颌窦/筛窦/额窦/蝶窦粘膜增厚;上颌窦/筛窦/蝶窦/额窦/窦腔内积液,窦腔密度增高,并可见气液平面。窦壁骨质未见明显异常。",
  539. "impression": "左/右/双侧上颌窦/筛窦/额窦/蝶窦炎症。"
  540. },
  541. {
  542. "description": "  左/右侧上颌窦/筛窦内可见半圆形信号异常,大小约为 X cm,位于上颌窦下壁,呈软组织样等密度,密度均匀,窦腔未见明显扩大,窦壁骨质未见明显破坏。",
  543. "impression": "左/右侧上颌窦/筛窦粘膜囊肿。"
  544. },
  545. {
  546. "description": "  扫描示鼻咽腔不对称,轻/重度狭窄/闭塞,左/右侧咽隐窝变浅/消失,局部软组织肿块,鼻咽左/右侧壁增厚形成肿块,突入鼻咽腔,肿块平扫呈等密度,增强扫描后轻中度强化,肿块向深部侵润,左/右侧翼内外肌受侵,左/右侧咽旁间隙变窄/闭塞;向后生长,头长肌界线欠清,向后上生长侵犯同侧颈动脉鞘区,局部可见类圆形病灶,颈静脉周围可见类圆形病灶,平扫等密度,增强扫描后轻度强化。",
  547. "impression": "鼻咽癌并颈深上组淋巴结转移。"
  548. },
  549. {
  550. "description": "  扫描示鼻咽腔不对称,轻/重度狭窄/闭塞,左/右侧咽隐窝变浅/消失,局部软组织肿块,鼻咽左/右侧壁增厚形成肿块,突入鼻咽腔,肿块平扫呈等密度,增强扫描后轻中度强化,肿块向深部侵润,左/右侧翼内外肌受侵,左/右侧咽旁间隙变窄/闭塞;向后生长,头长肌界线欠清,向后上生长侵犯同侧颈动脉鞘区。",
  551. "impression": "鼻咽癌。"
  552. },
  553. {
  554. "description": "双侧中下肺野中内带可见片状不均匀密度增高影,边缘不清,双侧中上肺野外带可见无纹理均匀透光区,其内侧可见被压缩之肺组织边缘,余肺野透光度稍减低,双侧肋膈角变钝;肺门、气管、纵膈、心脏大血管影及膈面未见明显异常;左侧第3-7肋及右侧第4-8肋近腋中线处可见骨折,部分骨折两端稍有移位,余所示诸骨未见明显骨折及脱位;左侧胸壁皮下软组织内可见分层状气体影,余未见特殊。",
  555. "impression": "1、左侧第3-7肋及右侧第4-8肋骨折伴双侧液气胸(少许积液,中等量气胸,肺组织被压缩约60%);<br />2、双侧中下肺阴影考虑肺挫伤;<br />3、左侧胸壁皮下气肿;<br />4、建议必要时作胸部及上腹部CT扫描进一步检查。"
  556. },
  557. {
  558. "description": "双侧胸廓对称,所示肋骨走行及胸段脊柱生理曲度自然,所示诸骨骨质结构未见明显异常;双肺纹理清楚,分布走行自然,未见明显异常阴影;双侧肺门不宽,心影大小形态及位置未见明显异常,主动脉影不宽,纵隔气管居中,心前心后间隙未见明显异常阴影;双侧膈面光滑,位置正常,肋膈角清晰锐利,余未见明显异常征象。",
  559. "impression": "胸部正侧位片未见明显异常。"
  560. },
  561. {
  562. "description": "<p>印象</p>\n<p>双侧大脑半球结构对称,各层面灰白质对比如常,未见异常密度影;脑室系统、脑池、脑裂、脑沟大小形态如常。小脑及脑干形态、密度未见异常。中线结构居中。骨窗示颅骨形态、密度、连续性均好。</p>",
  563. "impression": "<p>检查所见</p>\n<p>颅脑CT平扫未见明显异常。</p>"
  564. },
  565. {
  566. "description": "  扫描示鼻咽腔不对称,轻/重度狭窄/闭塞,左/右侧咽隐窝变浅/消失,局部软组织肿块,鼻咽左/右侧壁增厚形成肿块,突入鼻咽腔,肿块平扫呈等密度,增强扫描后轻中度强化,肿块向深部侵润,左/右侧翼内外肌受侵,左/右侧咽旁间隙变窄/闭塞;向后生长,头长肌界线欠清,向后上生长侵犯同侧颈动脉鞘区。左/右/双侧海绵窦增宽,内见软组织影与鼻咽部肿块相连,增强扫描后明显强化。",
  567. "impression": "鼻咽癌并颅内侵犯(左/右/双侧海绵窦)。"
  568. },
  569. {
  570. "description": "  于左/右侧鼻腔内可见一团块状软组织病灶,平扫呈略不均匀等密度,增强扫描后病灶有强化,同侧鼻道变窄,肿块向前生长入鼻前庭,向后长入后鼻孔区,鼻甲/鼻上隔骨质有破坏。",
  571. "impression": "左/右侧鼻腔内占位性病变,考虑鼻腔癌。"
  572. },
  573. {
  574. "description": "  于左/右侧胸锁乳头肌深面,颈动脉鞘区,颈内静脉后/外/内方见一类圆形肿块,大小约为 X cm,平扫呈等密度,中央液化囊变呈更低密度,增强扫描实性部分强化较明显,囊变部分不强化,与血管对比清楚,血管受压移,但未见明显侵犯征象。",
  575. "impression": "左/右侧颈动脉鞘后方占位性病变,考虑神经鞘瘤。"
  576. },
  577. {
  578. "description": "  于左/右/双侧颈部胸锁乳肌深面,颈动脉鞘区、颈内静脉前/后/外侧可见类圆形软组织肿块,大小约为 X cm,平扫呈等密度,内部密度欠均匀,可见更低密度液化坏死区,增强扫描轻中度强化不规则环形强化,与血管对比清楚。血管受压移位。",
  579. "impression": "左/右侧颈动脉鞘区占位性病变,性质考虑为淋巴结转移。"
  580. },
  581. {
  582. "description": "  于左/右颈总动脉分叉附近见一类圆形病灶,大小约为 X cm,平扫呈等密度,边界欠规整,增强扫描后呈强化明显,近似邻近血管的强化程度,CT值 Hu, 颈内外动脉分离移位,周围组织受推挤。",
  583. "impression": "左/右颈部占位性病变,考虑颈动脉体瘤。"
  584. },
  585. {
  586. "description": "  扫描示双侧声带不对称,左/右侧声带明显增厚/形成肿块,肿块平扫呈等密度,增强扫描后呈不均匀强化,边界欠清,与周围组织分界不清,前联合增厚肿瘤侵犯,对侧声带亦受侵,左/右侧喉旁间隙受累呈软组织密度。",
  587. "impression": "左/右侧喉癌(声门型)。"
  588. },
  589. {
  590. "description": "  扫描示双侧梨状窝不对称,右/左侧梨状窝周壁粘膜不规则增厚,致右/左侧梨状窝狭窄或闭塞,肿瘤向内侧沿杓会厌皱襞侵犯同侧喉腔侧壁,室带增宽,喉旁间隙受侵,声门向对称侧移位,肿瘤侵犯咽后壁及环后区,致椎体与环状软骨或环杓关节间隙增宽,超过1cm,右/左侧颈部可见肿大类圆形淋巴结影。",
  591. "impression": "左/右侧梨状窝癌并颈部淋巴结转移。"
  592. },
  593. {
  594. "description": "  扫描示左/右侧腮腺体积明显增大,其内可见一肿块影,平扫呈等密度,形态欠规则,边界欠清,密度不均匀,增强扫描后呈不均匀强化,同侧咽旁间隙受压向内侧移位。",
  595. "impression": "左/右侧腮腺内占位性病变,考虑腮腺癌。"
  596. },
  597. {
  598. "description": "&nbsp; &nbsp; 双膈下未见游离气体,小肠内未见明显积气、气液平,双肾区及输尿管经路、膀胱区未见明显阳性高密影,余未见明显异常",
  599. "impression": "腹部平片未见明显异常。"
  600. },
  601. {
  602. "description": "  扫描示左/右侧腮腺体积略增大,其内可见一类圆形病灶,平扫呈等密度,边界清楚,密度均匀,增强扫描后呈均匀强化。",
  603. "impression": "左/右侧腮腺内占位性病变,考虑腮腺混合瘤。"
  604. },
  605. {
  606. "description": "  薄层高分辨率颞骨扫描示左/右/双侧乳突气房密度增高,粘膜增厚,中耳鼓室内密度增高,粘膜增厚,听小骨结构大致正常,未见骨质破坏,鼓窦入口及乳突气房骨质结构未见明显异常。对侧中耳乳突未见明显异常。",
  607. "impression": "左/右/双侧慢性中耳乳突炎。"
  608. },
  609. {
  610. "description": "  鼻咽部结构对称,组织界面清晰,咽隐窝、咽旁间隙无狭窄及移位,双侧颈动脉鞘区无异常,鞍旁及相应颅内结构未见异常;骨窗像示颅底骨质无破坏。",
  611. "impression": "鼻咽部未见异常。"
  612. },
  613. {
  614. "description": "  扫描示鼻咽腔不对称,轻/重度狭窄/闭塞,左/右侧咽隐窝变浅/消失,局部软组织肿块,鼻咽左/右侧壁增厚形成肿块,突入鼻咽腔,肿块平扫呈等密度,增强扫描后轻中度强化,肿块向深部侵润,左/右侧翼内外肌受侵,左/右侧咽旁间隙变窄/闭塞;向后生长,头长肌界线欠清,向后上生长侵犯同侧颈动脉鞘区,破裂孔/斜坡/岩骨/蝶骨翼板骨皮质不连续。",
  615. "impression": "鼻咽癌并颅底骨质破坏。"
  616. },
  617. {
  618. "description": "  双侧乳突呈气化型,蜂房气化发育良好,两侧听小骨形态、结构正常,双中耳、乳突未见异常密度灶,组成骨骨质未见破坏征象。",
  619. "impression": "双侧乳突未见异常。"
  620. },
  621. {
  622. "description": "  各鼻旁窦气化良好,鼻窦内粘膜无增厚,密度无升高,鼻窦内未见积液及软组织块影,各鼻旁窦骨质结构对称,未见破坏征象。",
  623. "impression": "各鼻旁窦未见异常。"
  624. },
  625. {
  626. "description": "  于左/右/双侧乳突气化较差,鼓窦入口扩大,乳突气房骨质破坏,部分融合成较大气房影,周围有骨质硬化边缘,边缘清楚,内见软组织密度病灶,增强化扫描后病灶无明显强化,对侧中乳突未见明显异常。",
  627. "impression": "左/右/双侧乳突胆脂瘤。"
  628. },
  629. {
  630. "description": "  左/右/双侧髋关节对称,髋臼前壁/后壁/中间壁/前柱/后柱/股骨头/颈诸构成骨骨质密度/连续性如常;关节面边缘无硬化、变尖;股骨头星芒状骨纹理清晰;股骨头完整;关节间隙正常。关节囊内未见水样密度影,周围肌肉间脂肪隙清楚。<br />  扫描野内双侧耻骨/坐骨/髂骨/部分骶骨骨质连续,双侧骶髂关节对称,关节间隙未见增宽,关节面清晰,骨质结构正常。",
  631. "impression": "左/右/双侧髋关节未见异常。"
  632. },
  633. {
  634. "description": "  双侧甲状腺大小形态正常,双侧甲状腺内见弥漫分布斑片状低密度影,边界不清;甲状腺边界清楚;双侧颈部未见明显肿大淋巴结,软组织未见明显异常。",
  635. "impression": "双侧甲状腺炎。"
  636. },
  637. {
  638. "description": "  左/右/双侧髋关节对称/不对称,髋臼前壁/后壁/中间壁/前柱/后柱构成骨硬化/侵蚀/囊样变,关节面边缘变尖/花边样变;股骨头星芒状骨纹理模糊/消失,骨质硬化/疏松/囊样变,股骨头破碎/塌陷/吸收/变扁,关节间隙/增宽/狭窄/消失。关节囊内可/未见水样密度影,周围软组织有/无增厚/变薄,肌肉间脂肪界限清楚/模糊。左/右/双侧耻骨上下支/坐骨/髂骨/骶骨骨质连续,双侧骶髂关节对称/不对称,关节间隙未/可见增宽,骶骨/髂骨耳状关节面清晰/欠/不清晰,骨质结构正常/不正常。",
  639. "impression": "符合左/右侧股骨头无菌性坏死改变,必要时进一步检查。"
  640. },
  641. {
  642. "description": "  定位片示颈椎生理曲度正常,椎体排列规整,各椎间隙未见变窄,椎缘未见毛糙/变尖。<br />  轴位断面示C3/4,C4/5,C5/6,C6/7间盘后缘未见向后突出,椎体后缘及钩突未见增生,硬脊膜囊未见推压,椎管前后径如常/约 0 mm(参考正常值大于11mm);黄韧带未见增厚/厚度约 0 mm(参考正常值小于2.5mm);椎旁未见异常软组织影。",
  643. "impression": "颈椎未见异常。"
  644. },
  645. {
  646. "description": "  定位相示腰椎生理曲度如常,椎体边缘骨质增生,各椎间隙未见变窄。横轴位断面示L3/4、L4/5、L5/S1椎间盘未见明显突出或膨出,L3/4、L4/5、L5/S1椎间盘后缘局限性向后突出,硬膜囊受压,双侧侧隐窝狭窄,双侧神经根受压;椎管前后径变窄,黄韧带未见增厚,椎旁软组织未见明显异常。",
  647. "impression": "L3/4、L4/5、L5/S1椎间盘突出。"
  648. },
  649. {
  650. "description": "  定位片示颈椎生理曲度正常,各椎间隙未见明显变窄。轴位断面示C4/5、C5/6、C6/7椎间盘后缘向后局限性突出,硬脊膜囊受压;椎管前后径未见明显狭窄;黄韧带未见肥厚;部分椎体周边可见不规则增生;椎旁未见异常软组织影。",
  651. "impression": "1、C4/5、C5/6、C6/7椎间盘突出。2、颈椎退行性变;请结合临床。<br />"
  652. },
  653. {
  654. "description": "  双侧膝关节结构对称/不对称,左/右侧股骨内、外侧髁/左/右侧胫骨内、外侧髁/左/右侧髁间隆起/左/右侧胫骨平台/左/右侧髌骨内/外侧缘未/可见变尖/骨赘/硬化/囊变,左/右侧膝/股髌/胫腓关节间隙/增宽/如常/变窄/消失,左/右侧膝关节囊内可/未见积液/游离体,周围/腘窝软组织层次清楚/不清楚,肌肉间脂肪隙清楚/模糊,可/未见囊样/水样密度影。",
  655. "impression": "膝关节未见异常。"
  656. },
  657. {
  658. "description": "  双侧膝关节结构对称/不对称,左/右侧股骨内、外侧髁/左/右侧胫骨内、外侧髁/左/右侧髁间隆起/左/右侧胫骨平台/左/右侧髌骨/左/右侧腓骨小头骨质形态/纹理/密度/连续性均示如常。左/右侧股骨内、外侧髁/左/右侧胫骨内、外侧髁/左/右侧髁间隆起/左/右侧胫骨平台/左/右侧髌骨内/外侧缘未/可见变尖/骨赘/硬化/囊变。囊变区可/威廉硬化缘,约达 0 mm ,囊内CT值约 0 Hu。/左/右侧膝关节/股髌间隙增宽/如常/变窄/消失;左/右侧关节囊内可/未见积液/游离体。周围软组织层次清楚/不清楚,可/未见增厚,肌肉间脂肪隙清楚/模糊。腘窝区肌肉腱膜可/未见类圆形/梭形/囊样/水样密度影,边缘欠/较清楚,最大约达 0 mmm,CT值 0 Hu。",
  659. "impression": "符合膝关节退变;<br />符合髌骨软化症;<br />符合关节积液;<br />符合腘窝囊肿。<br />必要时治疗后复查。"
  660. },
  661. {
  662. "description": "  定位片示腰椎生理曲度、椎间隙宽度均正常,椎体排列规整。<br />  横断面示L3/4,L4/5,L5/S1椎间盘密度均匀,周缘未见超越椎体终板范围的明显膨、突出征象;硬膜囊前脂肪间隙存在;硬膜囊呈光整类圆形;双侧侧隐窝未见变窄;神经根形态及走行如常。骨窗示椎体及附件骨纹理形态、骨质密度及连续性均未见异常。",
  663. "impression": "腰椎未见异常。"
  664. }
  665. ])
  666. }
  667. const getRandomDoctor = ORGCODE => {
  668. // const arr = $doctorMap[ORGCODE]
  669. // return arr[Math.floor(Math.random() * arr.length)]
  670. // console.log('$doctorMap[ORGCODE]', $doctorMap[ORGCODE], ORGCODE)
  671. return getRandomVal($doctorMap[ORGCODE])
  672. }
  673. const getRandomVal = (arr, len) => {
  674. if(len) {
  675. return arr[Math.floor(Math.random() * Math.min(len, arr.length))]
  676. }
  677. const _random = Math.random()
  678. if(_random <= 0.33) {
  679. return arr[Math.floor(Math.random() * arr.length / 3)]
  680. }
  681. if(_random <= 0.66) {
  682. return arr[Math.floor(Math.random() * arr.length / 2)]
  683. }
  684. return arr[Math.floor(Math.random() * arr.length)]
  685. }
  686. const getRandomBoolean = () => {
  687. return Math.random() <= 0.5
  688. }
  689. const getRandomValArray = (arr, len = 4) => {
  690. const data = [getRandomVal(arr)]
  691. while(data.length < len && getRandomBoolean()) {
  692. data.push(getRandomVal(arr))
  693. }
  694. return data
  695. }
  696. const getSingleRandomValArray = (arr, len = 4, keyName) => {
  697. const items = getRandomValArray(arr, len)
  698. const keySet = new Set()
  699. const data = []
  700. for(const item of items) {
  701. if(keySet.has(item[keyName])) {
  702. continue
  703. }
  704. data.push(item)
  705. keySet.add(item[keyName])
  706. }
  707. return data
  708. }
  709. const $orgs_3 = $orgs.filter(org => org.ORGTYPE == '三级医院')
  710. const $orgs_2 = $orgs.filter(org => org.ORGTYPE == '二级医院')
  711. const $orgs_1 = $orgs.filter(org => org.ORGTYPE == '乡镇卫生院')
  712. /**
  713. *
  714. * @returns 获取随机医院
  715. */
  716. const getRandomORG = () => {
  717. if(Math.random() <= 0.5) {
  718. return getRandomVal($orgs_3)
  719. }
  720. if(Math.random() <= 0.5) {
  721. return getRandomVal($orgs_2)
  722. }
  723. return getRandomVal($orgs_1)
  724. // return getRandomVal($orgs)
  725. }
  726. const getRandomDIAGNOSES = () => {
  727. return getSingleRandomValArray($diagnoses, 6, 'DIAGNOSECODE')
  728. }
  729. const getRandomCHIEFCOMPLAINT = () => {
  730. return getRandomVal([
  731. "头痛持续了三天,伴有恶心和呕吐",
  732. "胸部疼痛,尤其是在深呼吸时加剧",
  733. "胃部不适,伴有消化不良和胃痛",
  734. "近期体重急剧下降,没有明显原因",
  735. "持续性咳嗽,伴有绿色痰液",
  736. "视力模糊,伴有眼痛",
  737. "耳鸣,伴有听力下降",
  738. "皮肤出现红疹,伴有瘙痒",
  739. "关节疼痛和肿胀,尤其是手指和膝盖",
  740. "持续的疲劳感,无法通过休息得到缓解",
  741. "记忆力减退,伴有注意力不集中",
  742. "呼吸困难,尤其是在平躺时",
  743. "心悸,伴有胸痛",
  744. "腿部肿胀,伴有疼痛",
  745. "尿痛,伴有尿频",
  746. "月经不规律,伴有痛经",
  747. "便秘,伴有腹痛",
  748. "腹泻,伴有体重下降",
  749. "失眠,伴有焦虑",
  750. "口干,伴有口渴",
  751. "喉咙痛,伴有吞咽困难",
  752. "背部疼痛,尤其是在早晨起床时",
  753. "皮肤黄疸,伴有乏力",
  754. "口腔溃疡,反复发作",
  755. "肌肉疼痛,尤其是在运动后",
  756. "皮肤干燥,伴有脱屑",
  757. "脱发,伴有头皮瘙痒",
  758. "情绪低落,伴有兴趣丧失",
  759. "皮肤出血点,伴有瘀伤",
  760. "腿部无力,伴有步态不稳",
  761. "食欲减退,伴有体重下降",
  762. "皮肤色素沉着,伴有色素减退",
  763. "持续性腹痛,伴有腹泻",
  764. "声音嘶哑,伴有咽喉痛",
  765. "持续性发热,伴有寒战",
  766. "皮肤皮疹,伴有疼痛",
  767. "持续性鼻塞,伴有打喷嚏",
  768. "眼睛干涩,伴有视力模糊",
  769. "持续性胸闷,伴有呼吸困难",
  770. "持续性腹痛,伴有便秘",
  771. "皮肤瘙痒,伴有皮疹",
  772. "持续性关节疼痛,伴有肿胀",
  773. "持续性头痛,伴有视觉障碍",
  774. "持续性心悸,伴有晕厥",
  775. "持续性耳鸣,伴有听力下降",
  776. "持续性口干,伴有口渴",
  777. "持续性胃痛,伴有反酸",
  778. "持续性背痛,伴有肌肉僵硬",
  779. "持续性皮肤干燥,伴有脱屑",
  780. "持续性脱发,伴有头皮瘙痒",
  781. "持续性月经不规律,伴有痛经",
  782. "持续性尿痛,伴有尿频",
  783. "持续性便秘,伴有腹痛",
  784. "持续性腹泻,伴有体重下降",
  785. "持续性失眠,伴有焦虑",
  786. "持续性口干,伴有口渴",
  787. "持续性喉咙痛,伴有吞咽困难",
  788. "持续性背部疼痛,尤其是在早晨起床时",
  789. "持续性皮肤黄疸,伴有乏力",
  790. "持续性口腔溃疡,反复发作",
  791. "持续性肌肉疼痛,尤其是在运动后",
  792. "持续性皮肤干燥,伴有脱屑",
  793. "持续性脱发,伴有头皮瘙痒",
  794. "持续性情绪低落,伴有兴趣丧失",
  795. "持续性皮肤出血点,伴有瘀伤",
  796. "持续性腿部无力,伴有步态不稳",
  797. "持续性食欲减退,伴有体重下降",
  798. "持续性皮肤色素沉着,伴有色素减退",
  799. "持续性腹痛,伴有腹泻",
  800. "持续性声音嘶哑,伴有咽喉痛",
  801. "持续性发热,伴有寒战",
  802. "持续性皮肤皮疹,伴有疼痛",
  803. "持续性鼻塞,伴有打喷嚏",
  804. "持续性眼睛干涩,伴有视力模糊",
  805. "持续性胸闷,伴有呼吸困难",
  806. "持续性腹痛,伴有便秘",
  807. "持续性皮肤瘙痒,伴有皮疹",
  808. "持续性关节疼痛,伴有肿胀",
  809. "持续性头痛,伴有视觉障碍",
  810. "持续性心悸,伴有晕厥",
  811. "持续性耳鸣,伴有听力下降",
  812. "持续性口干,伴有口渴",
  813. "持续性胃痛,伴有反酸",
  814. "持续性背痛,伴有肌肉僵硬",
  815. "持续性皮肤干燥,伴有脱屑",
  816. "持续性脱发,伴有头皮瘙痒",
  817. "持续性月经不规律,伴有痛经",
  818. "持续性尿痛,伴有尿频",
  819. "持续性便秘,伴有腹痛",
  820. "持续性腹泻,伴有体重下降",
  821. "持续性失眠,伴有焦虑",
  822. "持续性口干,伴有口渴",
  823. "持续性喉咙痛,伴有吞咽困难",
  824. "持续性背部疼痛,尤其是在早晨起床时",
  825. "持续性皮肤黄疸,伴有乏力",
  826. "持续性口腔溃疡,反复发作",
  827. "持续性肌肉疼痛,尤其是在运动后",
  828. "持续性皮肤干燥,伴有脱屑",
  829. "持续性脱发,伴有头皮瘙痒",
  830. "持续性情绪低落,伴有兴趣丧失"
  831. ])
  832. }
  833. const getRandomProject = () => {
  834. const _project = getRandomVal($projects)
  835. const project = {
  836. BODYSITE_CATEG: _project.BW,
  837. BODYSITE_CATEG_CODE: _project.BW_CODE,
  838. EXAM_ITEMNAME: _project.XM,
  839. EXAM_ITEMNAME_CODE: _project.XM_CODE,
  840. }
  841. const modality = getDEVICETYPE(project.EXAM_ITEMNAME)
  842. project.DEVICETYPE = modality.DEVICETYPE
  843. project.DEVICETYPE_CODE = modality.DEVICETYPE_CODE
  844. project.EXAM_METHOD = getEXAM_METHOD(project.EXAM_ITEMNAME)
  845. project.BODYSITE = getBODYSITE(project.EXAM_ITEMNAME, project.DEVICETYPE_CODE, project.EXAM_METHOD) || project.BODYSITE_CATEG
  846. return project
  847. }
  848. const getBODYSITE = (EXAM_ITEMNAME, DEVICETYPE_CODE, EXAM_METHOD) => {
  849. const a = _getBODYSITE(EXAM_ITEMNAME, DEVICETYPE_CODE)
  850. const b = _getBODYSITE(EXAM_ITEMNAME, EXAM_METHOD)
  851. if(!a || !b) {
  852. return a || b || ''
  853. }
  854. return a.length > b.length ? b : a;
  855. }
  856. const _getBODYSITE = (EXAM_ITEMNAME, key) => {
  857. if(!key) {
  858. return ''
  859. }
  860. const arr = EXAM_ITEMNAME.split(key)
  861. if(arr.length === 1) {
  862. return ''
  863. }
  864. return arr[0]
  865. }
  866. const getDEVICETYPE = (EXAM_ITEMNAME) => {
  867. for(const modality of $modalities) {
  868. if(EXAM_ITEMNAME.indexOf(modality.modality) != -1) {
  869. return {
  870. DEVICETYPE: modality.poject,
  871. DEVICETYPE_CODE: modality.modality
  872. }
  873. }
  874. }
  875. return {
  876. DEVICETYPE: '',
  877. DEVICETYPE_CODE: ''
  878. }
  879. }
  880. const getEXAM_METHOD = (EXAM_ITEMNAME) => {
  881. const EXAM_METHODS = [ '正位',
  882. '侧位',
  883. '正侧位',
  884. '侧卧位',
  885. '斜位',
  886. '过伸过屈位',
  887. '切线位',
  888. '轴位',
  889. '出口位',
  890. '穿胸位',
  891. '负重位',
  892. // '正位(骨龄)',
  893. '平扫',
  894. '增强',
  895. '造影',
  896. '仿真肠镜',
  897. '灌注',
  898. '血管成像',
  899. '功能成像',
  900. '水成像',
  901. 'CE MRA',
  902. 'CE MRV',
  903. 'TOF MRA',
  904. 'HRMR-VWI',
  905. 'DTI',
  906. 'ASL',
  907. 'DWI',
  908. 'SWI',
  909. 'MRS',
  910. '黑血成像',
  911. '脂肪定量']
  912. EXAM_METHODS.sort((a, b) => b.length - a.length)
  913. for(const EXAM_METHOD of EXAM_METHODS) {
  914. if(EXAM_ITEMNAME.indexOf(EXAM_METHOD) !== -1) {
  915. return EXAM_METHOD
  916. }
  917. }
  918. return ''
  919. }
  920. const getRandomLAB_ITEM = () => {
  921. let lab_item;
  922. if(Math.random() <= 0.4) {
  923. lab_item = getRandomVal($lab_items, 4)
  924. } else {
  925. lab_item = getRandomVal($lab_items)
  926. }
  927. let SPECIMEN_TYPE = '血'
  928. if(lab_item.name.indexOf('尿') !== -1) {
  929. SPECIMEN_TYPE = '尿'
  930. }
  931. if(lab_item.name.indexOf('便') !== -1) {
  932. SPECIMEN_TYPE = '便'
  933. }
  934. return {
  935. "LAB_ITEMNAME": lab_item.name,
  936. "LAB_ITEMNAME_CODE": lab_item.id + '',
  937. "LAB_HR_ITEMNAME_CODE": lab_item.id % 2 ? (lab_item.id + ''): '',
  938. "SPECIMEN_TYPE": SPECIMEN_TYPE,
  939. }
  940. }
  941. const getINSPECT_REPORT_ITEMS = (LAB_ITEMNAME) => {
  942. console.log('items', LAB_ITEMNAME)
  943. if(LAB_ITEMNAME === '血常规') {
  944. return getINSPECT_REPORT_ITEMS_XCG()
  945. }
  946. if(LAB_ITEMNAME === '出凝血') {
  947. return getINSPECT_REPORT_ITEMS_CNX()
  948. }
  949. if(LAB_ITEMNAME === '肝功能') {
  950. return getINSPECT_REPORT_ITEMS_GGN()
  951. }
  952. if(LAB_ITEMNAME === '尿常规') {
  953. return getINSPECT_REPORT_ITEMS_NCG()
  954. }
  955. const lab = lab_map[LAB_ITEMNAME]
  956. const arr = []
  957. for(const item of lab.items) {
  958. const ranges = [Math.random() * 100, Math.random() * 100 , Math.random() * 100, Math.random() * 100].map(f => f.toFixed(2))
  959. ranges.sort((a, b) => a - b)
  960. const LAB_ITEMDETAILVALUE = (Math.random() * 100).toFixed(2)
  961. let LAB_ITEMDETAILINTERPRETATION = ''
  962. if(LAB_ITEMDETAILVALUE < ranges[0]) {
  963. LAB_ITEMDETAILINTERPRETATION = '↓↓'
  964. } else if (LAB_ITEMDETAILVALUE < ranges[1]) {
  965. LAB_ITEMDETAILINTERPRETATION = '↓'
  966. } else if (LAB_ITEMDETAILVALUE > ranges[2]) {
  967. LAB_ITEMDETAILINTERPRETATION = '↑'
  968. } else if (LAB_ITEMDETAILVALUE > ranges[3]) {
  969. LAB_ITEMDETAILINTERPRETATION = '↑↑'
  970. }
  971. const tmp = {
  972. LAB_ITEMDETAILNAME: item.xmmc,
  973. // LAB_ITEMDETAILNAME_EN: item.
  974. LAB_ITEMDETAILNAME_CODE: item.BSYBBM,
  975. LAB_ITEMDETAILNAME_NUMBER: item.xh || '',
  976. LAB_ITEMDETAILVALUE: LAB_ITEMDETAILVALUE,
  977. LAB_ITEMDETAILSPEC: 'mmol/ml',
  978. LAB_ITEMDETAILINTERPRETATION: LAB_ITEMDETAILINTERPRETATION,
  979. LAB_ITEMDETAILRANGE: `${ranges[1]}-${ranges[2]}`,
  980. CRITICAL_RANGE: `${ranges[0]}-${ranges[3]}`,
  981. LAB_HR_ITEMDETAIL_STATUS: item.xmmc ? '1': '0',
  982. LAB_HR_ITEMDETAILNAME: item.xmmc || '',
  983. LAB_HR_ITEMDETAILNAME_CODE: item.BSYBBM,
  984. }
  985. arr.push(tmp)
  986. }
  987. return arr
  988. }
  989. const getINSPECT_REPORT_ITEMS_XCG = () => {
  990. return _getINSPECT_REPORT_ITEMS_DEMO($lab_xcg)
  991. }
  992. const getINSPECT_REPORT_ITEMS_CNX = () => {
  993. return _getINSPECT_REPORT_ITEMS_DEMO($lab_cnx)
  994. }
  995. const getINSPECT_REPORT_ITEMS_GGN = () => {
  996. return _getINSPECT_REPORT_ITEMS_DEMO($lab_ggn)
  997. }
  998. const getINSPECT_REPORT_ITEMS_NCG = () => {
  999. return _getINSPECT_REPORT_ITEMS_DEMO($lab_ncg)
  1000. }
  1001. const _getINSPECT_REPORT_ITEMS_DEMO = (items) => {
  1002. const arr = []
  1003. for(const item of items) {
  1004. // "xh": 1,
  1005. // "en": "WBC",
  1006. // "xmmc": "白细胞",
  1007. // "unit": "10~9/L",
  1008. // "fw": "4-10",
  1009. // "bsybbm": "0025010101500000100"
  1010. // },
  1011. const fw = item.fw
  1012. let LAB_ITEMDETAILVALUE = ''
  1013. let LAB_ITEMDETAILINTERPRETATION = ''
  1014. if(fw) {
  1015. const fws = fw.split('-')
  1016. if(fws.length === 2) {
  1017. const v1 = Number(fws[0])
  1018. const v2 = Number(fws[1])
  1019. if(!isNaN(v1) && !isNaN(v2)) {
  1020. LAB_ITEMDETAILVALUE = (v1 + ((v2 - v1) * (-2.5 + Math.random() * 5))).toFixed(2)
  1021. if(LAB_ITEMDETAILVALUE > v2) {
  1022. LAB_ITEMDETAILINTERPRETATION = '↑'
  1023. }
  1024. if(LAB_ITEMDETAILVALUE < v1) {
  1025. LAB_ITEMDETAILINTERPRETATION = '↓'
  1026. }
  1027. }
  1028. }
  1029. }
  1030. const tmp = {
  1031. LAB_ITEMDETAILNAME: item.xmmc,
  1032. LAB_ITEMDETAILNAME_EN: item.en,
  1033. // LAB_ITEMDETAILNAME_EN: item.
  1034. LAB_ITEMDETAILNAME_CODE: item.xh,
  1035. LAB_ITEMDETAILNAME_NUMBER: item.xh || '',
  1036. LAB_ITEMDETAILVALUE: LAB_ITEMDETAILVALUE,
  1037. LAB_ITEMDETAILSPEC: item.unit,
  1038. LAB_ITEMDETAILINTERPRETATION: LAB_ITEMDETAILINTERPRETATION,
  1039. LAB_ITEMDETAILRANGE: item.fw,
  1040. CRITICAL_RANGE: item.fw,
  1041. LAB_HR_ITEMDETAIL_STATUS: item.bsybbm ? '1': '0',
  1042. LAB_HR_ITEMDETAILNAME: item.xmmc || '',
  1043. LAB_HR_ITEMDETAILNAME_CODE: item.bsybbm || '',
  1044. }
  1045. arr.push(tmp)
  1046. }
  1047. return arr
  1048. }
  1049. const getRandomINSPECT_REPORT_ITEM = () => {
  1050. const lab_mx_item = getRandomVal($lab_mx_items)
  1051. const ranges = [Math.random() * 100 - 50, Math.random() * 100 - 50, Math.random() * 100 - 50, Math.random() * 100 - 50].map(f => f.toFixed(2))
  1052. ranges.sort((a, b) => a - b)
  1053. const LAB_ITEMDETAILVALUE = (Math.random() * 200 - 100).toFixed(2)
  1054. let LAB_ITEMDETAILINTERPRETATION = ''
  1055. if(LAB_ITEMDETAILVALUE < ranges[0]) {
  1056. LAB_ITEMDETAILINTERPRETATION = '↓↓'
  1057. } else if (LAB_ITEMDETAILVALUE < ranges[1]) {
  1058. LAB_ITEMDETAILINTERPRETATION = '↓'
  1059. } else if (LAB_ITEMDETAILVALUE > ranges[2]) {
  1060. LAB_ITEMDETAILINTERPRETATION = '↑'
  1061. } else if (LAB_ITEMDETAILVALUE > ranges[3]) {
  1062. LAB_ITEMDETAILINTERPRETATION = '↑↑'
  1063. }
  1064. return {
  1065. LAB_ITEMDETAILNAME: lab_mx_item.XMMC,
  1066. LAB_ITEMDETAILNAME_CODE: lab_mx_item.BSYBBM,
  1067. LAB_ITEMDETAILNAME_NUMBER: lab_mx_item.HRXMXH || '',
  1068. LAB_ITEMDETAILVALUE: LAB_ITEMDETAILVALUE,
  1069. LAB_ITEMDETAILSPEC: 'mmol/ml',
  1070. LAB_ITEMDETAILINTERPRETATION: LAB_ITEMDETAILINTERPRETATION,
  1071. LAB_ITEMDETAILRANGE: `${ranges[1]}-${ranges[2]}`,
  1072. CRITICAL_RANGE: `${ranges[0]}-${ranges[3]}`,
  1073. LAB_HR_ITEMDETAIL_STATUS: lab_mx_item.HRJYXMMC ? '1': '0',
  1074. LAB_HR_ITEMDETAILNAME: lab_mx_item.HRJYXMMC || '',
  1075. LAB_HR_ITEMDETAILNAME_CODE: lab_mx_item.BJSHRBM,
  1076. }
  1077. }
  1078. const getRandomName = () => {
  1079. const x = '赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁'
  1080. const m = '伟芳娜敏静丽强磊军洋杰瑞华文莉艳梅燕芬英杰萍芳芹丽娜宇轩成亮华敏娜思宇文静怡婷瑞雯佳欣雨婷玉莹嘉诚子涵思远文博雯丽雅静宇航浩然天宇俊杰文慧欣怡佳佳子轩晓东晓丽晓梅宇轩思远'
  1081. return getRandomVal(x) + getRandomValArray(m, 3).join('')
  1082. }
  1083. const getRandomGENDER = () => {
  1084. return getRandomVal([
  1085. {
  1086. 'CODE': '1',
  1087. 'NAME': '男'
  1088. },
  1089. {
  1090. 'CODE': '2',
  1091. 'NAME': '女'
  1092. },
  1093. ])
  1094. }
  1095. const getRandomMARITAL_STATUS = () => {
  1096. return getRandomVal([
  1097. {
  1098. 'CODE': '10',
  1099. 'NAME': '未婚'
  1100. },
  1101. {
  1102. 'CODE': '20',
  1103. 'NAME': '已婚'
  1104. },
  1105. {
  1106. 'CODE': '30',
  1107. 'NAME': '丧偶'
  1108. },
  1109. {
  1110. 'CODE': '40',
  1111. 'NAME': '离婚'
  1112. },
  1113. {
  1114. 'CODE': '90',
  1115. 'NAME': '未说明的婚姻状况'
  1116. },
  1117. ])
  1118. }
  1119. const getRandomDEPTNAME = () => {
  1120. return getRandomVal(['神经内科', '神经外科', '眼科', '口腔科', '耳鼻喉科', '放射科'])
  1121. }
  1122. const getRandomCLASS = () => {
  1123. return getRandomVal([
  1124. {
  1125. 'CODE': '1',
  1126. 'NAME': '门诊'
  1127. },
  1128. {
  1129. 'CODE': '2',
  1130. 'NAME': '急诊'
  1131. },
  1132. {
  1133. 'CODE': '3',
  1134. 'NAME': '住院'
  1135. },
  1136. {
  1137. 'CODE': '4',
  1138. 'NAME': '体检'
  1139. },
  1140. {
  1141. 'CODE': '9',
  1142. 'NAME': '其他'
  1143. },
  1144. ])
  1145. }
  1146. // const nowTimestamp = new Date().getTime()
  1147. // const startTimestamp = nowTimestamp - 500 * 24 * 3600 * 1000
  1148. const getRandomTimestamp = (start = startTimestamp, end = nowTimestamp) => {
  1149. const timestamp = start + Math.round(Math.random() * (end - start))
  1150. return timestamp
  1151. }
  1152. const timestamp2Day = timestamp => {
  1153. const date = new Date(timestamp)
  1154. return fillNumber(date.getFullYear() + '', 4) + fillNumber(date.getMonth() + 1 + '') + fillNumber(date.getDate() + '')
  1155. }
  1156. const timestamp2YYYYmmddHHiiss = timestamp => {
  1157. const date = new Date(timestamp)
  1158. return fillNumber(date.getFullYear() + '', 4) + '-'
  1159. + fillNumber(date.getMonth() + 1 + '') + '-'
  1160. + fillNumber(date.getDate() + '') + ' '
  1161. + fillNumber(date.getHours() + '') + ':'
  1162. + fillNumber(date.getMinutes() + '') + ':'
  1163. + fillNumber(date.getSeconds() + '')
  1164. }
  1165. const getRandomID_CARDNUM = (BIRTH_DATE, GENDER) => {
  1166. // const s_6 = (Math.round(Math.random() * 999999) + '').padStart(6, '1')
  1167. const s_6 = '371600'
  1168. let m_3 = Math.round(Math.random() * 498) * 2
  1169. if(GENDER == '男') {
  1170. m_3 += 1
  1171. }
  1172. m_3 = (m_3 + '').padStart(3, '0')
  1173. const e_1 = '0123456789X'[Math.round(Math.random() * 10)]
  1174. return {
  1175. ID_CARD_CODE: '01',
  1176. ID_CARD: '居民身份证',
  1177. ID_CARDNUM: s_6 + BIRTH_DATE.replace(/-/g, ''). substr(0, 8) + m_3 + e_1
  1178. }
  1179. }
  1180. class PATIENT {
  1181. constructor() {
  1182. this.NAME = '';
  1183. this.INSUR_CARD_NO = '';
  1184. this.ID_CARD_CODE = '';
  1185. this.ID_CARD = '';
  1186. this.ID_CARDNUM = '';
  1187. this.GENDER = '';
  1188. this.GENDER_CODE = '';
  1189. this.BIRTH_DATE = '';
  1190. this.MARITAL_STATUS_CODE = '';
  1191. this.MARITAL_STATUS = '';
  1192. this.ADDRESS = '';
  1193. this.ECARD_NO = '';
  1194. this._init()
  1195. }
  1196. _delete() {
  1197. delete this._BIRTH_DATE
  1198. }
  1199. _init() {
  1200. this._initNAME()
  1201. this._initBIRTH_DATE()
  1202. this._initGENDER()
  1203. this._initID_CARD()
  1204. this._initMARITAL_STATUS()
  1205. this._initECARD_NO()
  1206. }
  1207. _initNAME() {
  1208. this.NAME = getRandomName()
  1209. }
  1210. _initBIRTH_DATE() {
  1211. if(Math.random() <= 0.6) {
  1212. this._BIRTH_DATE = getRandomTimestamp(nowTimestamp - 365 * 70 * 24 * 3600 * 1000, nowTimestamp - 365 * 40 * 24 * 3600 * 1000)
  1213. } else {
  1214. this._BIRTH_DATE = getRandomTimestamp(nowTimestamp - 36500 * 24 * 3600 * 1000, nowTimestamp)
  1215. }
  1216. // this.BIRTH_DATE = timestamp2Day(this._BIRTH_DATE)
  1217. this.BIRTH_DATE = timestamp2YYYYmmddHHiiss(this._BIRTH_DATE)
  1218. // timestamp2YYYYmmddHHiiss
  1219. }
  1220. _initGENDER() {
  1221. const gender = getRandomGENDER()
  1222. this.GENDER = gender['NAME']
  1223. this.GENDER_CODE = gender['CODE']
  1224. }
  1225. _initID_CARD() {
  1226. const idcrad = getRandomID_CARDNUM(this.BIRTH_DATE, this.GENDER)
  1227. this['ID_CARD_CODE'] = idcrad['ID_CARD_CODE']
  1228. this['ID_CARD'] = idcrad['ID_CARD']
  1229. this['ID_CARDNUM'] = idcrad['ID_CARDNUM']
  1230. }
  1231. _initMARITAL_STATUS() {
  1232. const marital = getRandomMARITAL_STATUS()
  1233. this.MARITAL_STATUS = marital['NAME']
  1234. this.MARITAL_STATUS_CODE = marital['CODE']
  1235. }
  1236. _initECARD_NO() {
  1237. this.ECARD_NO = this.ID_CARDNUM
  1238. this.INSUR_CARD_NO = this.ID_CARDNUM
  1239. }
  1240. }
  1241. class MEDICAL_INFORMATION {
  1242. constructor(PATIENT) {
  1243. this.SERIESNUM = '';
  1244. this.CLASS_CODE = '';
  1245. this.CLASS = '';
  1246. this.ENCOUNTER_CARD_NO = '';
  1247. this.RECORD_CODE = '';
  1248. this.HOS_EMPI = '';
  1249. this.NAME = '';
  1250. this.ENCOUNTER_DATE = '';
  1251. this.DEPTNAME = '';
  1252. this.CHIEFCOMPLAINT = '';
  1253. this.ORGCODE = '';
  1254. this.ORGNAME = '';
  1255. this.AGE = '';
  1256. this.GENDER = '';
  1257. this.GENDER_CODE = '';
  1258. this.DOCTOR = null;
  1259. this._init(PATIENT)
  1260. }
  1261. _delete() {
  1262. delete this._ENCOUNTER_DATE
  1263. }
  1264. _init(PATIENT) {
  1265. this._initPATIENT(PATIENT)
  1266. this._initENCOUNTER_DATE(PATIENT._BIRTH_DATE)
  1267. this._initAGE(PATIENT._BIRTH_DATE)
  1268. this._initCLASS()
  1269. this._initSERIESNUM()
  1270. this._initORG()
  1271. this._initDEPTNAME()
  1272. this._initOtherCode()
  1273. this.CHIEFCOMPLAINT = getRandomCHIEFCOMPLAINT()
  1274. this.DOCTOR = getRandomDoctor(this.ORGCODE)
  1275. }
  1276. _initORG() {
  1277. const org = getRandomORG()
  1278. this.HOS_EMPI = org.HOS_EMPI
  1279. this.ORGCODE = org.ORGCODE
  1280. this.ORGNAME = org.ORGNAME
  1281. }
  1282. _initDEPTNAME() {
  1283. this.DEPTNAME = getRandomDEPTNAME()
  1284. }
  1285. _initOtherCode() {
  1286. this.ENCOUNTER_CARD_NO = this.SERIESNUM
  1287. this.RECORD_CODE = this.SERIESNUM
  1288. }
  1289. _initSERIESNUM() {
  1290. this.SERIESNUM = timestamp2Day(this._ENCOUNTER_DATE) + fillNumber(Math.round(Math.random() * 99999999) + '', 8)
  1291. }
  1292. _initCLASS() {
  1293. const _class = getRandomCLASS()
  1294. this.CLASS = _class['NAME']
  1295. this.CLASS_CODE = _class['CODE']
  1296. }
  1297. _initAGE(_BIRTH_DATE) {
  1298. const age = Math.round((this._ENCOUNTER_DATE - _BIRTH_DATE) / 1000 / 3600 / 24 / 365)
  1299. this.AGE = fillNumber(age + '', 3) + 'Y'
  1300. }
  1301. _initENCOUNTER_DATE(_BIRTH_DATE) {
  1302. this._ENCOUNTER_DATE = getRandomTimestamp(Math.max(_BIRTH_DATE, startTimestamp))
  1303. this._fix_ENCOUNTER_DATE()
  1304. this.ENCOUNTER_DATE = timestamp2YYYYmmddHHiiss(this._ENCOUNTER_DATE)
  1305. }
  1306. _fix_ENCOUNTER_DATE() {
  1307. const date = new Date(this._ENCOUNTER_DATE)
  1308. if(date.getHours() < 6) {
  1309. this._ENCOUNTER_DATE += (6 * 3600 * 1000)
  1310. }
  1311. if(date.getHours() > 17 ) {
  1312. this._ENCOUNTER_DATE -= (6 * 3600 * 1000)
  1313. }
  1314. }
  1315. _initPATIENT(PATIENT) {
  1316. this.NAME = PATIENT.NAME
  1317. this.GENDER = PATIENT.GENDER
  1318. this.GENDER_CODE = PATIENT.GENDER_CODE
  1319. }
  1320. }
  1321. class DIAGNOSE {
  1322. constructor(DIAGNOSECODE, DIAGNOSENAME) {
  1323. this.DIAGNOSECODE = DIAGNOSECODE
  1324. this.DIAGNOSENAME = DIAGNOSENAME
  1325. }
  1326. }
  1327. class EXAM_APPLICATION {
  1328. constructor(MEDICAL_INFORMATION, no) {
  1329. this.REQUESTID = ''
  1330. this.NAME = ''
  1331. this.SERIESNUM = ''
  1332. this.DEVICETYPE = ''
  1333. this.DEVICETYPE_CODE = ''
  1334. this.EXAM_ITEMNAME = ''
  1335. this.EXAM_ITEMNAME_CODE = ''
  1336. this.BODYSITE_CATEG = ''
  1337. this.BODYSITE_CATEG_CODE = ''
  1338. this.BODYSITE = ''
  1339. this.EXAM_METHOD = ''
  1340. this.ORGCODE = ''
  1341. this.ORGNAME = ''
  1342. this.DEPTNAME = ''
  1343. this.PRACTITIONERNAME = ''
  1344. this.REQUESTTIME = ''
  1345. this.AGE = ''
  1346. this.GENDER = ''
  1347. this.GENDER_CODE = ''
  1348. this._init(MEDICAL_INFORMATION, no)
  1349. }
  1350. _delete() {
  1351. delete this._REQUESTTIME
  1352. }
  1353. _init(MEDICAL_INFORMATION, no) {
  1354. this._initMEDICAL_INFORMATION(MEDICAL_INFORMATION, no)
  1355. this._initExamProject()
  1356. this._initName()
  1357. this._initREQUESTTIME(MEDICAL_INFORMATION._ENCOUNTER_DATE)
  1358. }
  1359. _initREQUESTTIME(_ENCOUNTER_DATE) {
  1360. this._REQUESTTIME = getRandomTimestamp(_ENCOUNTER_DATE, _ENCOUNTER_DATE + 3600 * 12)
  1361. this.REQUESTTIME = timestamp2YYYYmmddHHiiss(this._REQUESTTIME)
  1362. }
  1363. _initName() {
  1364. this.PRACTITIONERNAME = getRandomName()
  1365. }
  1366. _initExamProject() {
  1367. const project = getRandomProject()
  1368. this.DEVICETYPE = project.DEVICETYPE
  1369. this.DEVICETYPE_CODE = project.DEVICETYPE_CODE
  1370. this.EXAM_ITEMNAME = project.EXAM_ITEMNAME
  1371. this.EXAM_ITEMNAME_CODE = project.EXAM_ITEMNAME_CODE
  1372. this.BODYSITE_CATEG = project.BODYSITE_CATEG
  1373. this.BODYSITE_CATEG_CODE = project.BODYSITE_CATEG_CODE
  1374. this.BODYSITE = project.BODYSITE
  1375. this.EXAM_METHOD = project.EXAM_METHOD
  1376. }
  1377. _initMEDICAL_INFORMATION(MEDICAL_INFORMATION, no) {
  1378. this.NAME = MEDICAL_INFORMATION.NAME
  1379. this.SERIESNUM = MEDICAL_INFORMATION.SERIESNUM
  1380. this.ORGCODE = MEDICAL_INFORMATION.ORGCODE
  1381. this.ORGNAME = MEDICAL_INFORMATION.ORGNAME
  1382. this.DEPTNAME = MEDICAL_INFORMATION.DEPTNAME
  1383. this.AGE = MEDICAL_INFORMATION.AGE
  1384. this.GENDER = MEDICAL_INFORMATION.GENDER
  1385. this.GENDER_CODE = MEDICAL_INFORMATION.GENDER_CODE
  1386. this.REQUESTID = 'JC-' + MEDICAL_INFORMATION.SERIESNUM + fillNumber(no + '', 3)
  1387. }
  1388. }
  1389. class MEDICAL_ORDER {
  1390. constructor(MEDICAL_INFORMATION, no) {
  1391. this.ORDERID = ''
  1392. this.NAME = ''
  1393. this.SERIESNUM = ''
  1394. this.LAB_ITEMNAME = ''
  1395. this.LAB_ITEMNAME_CODE = ''
  1396. this.LAB_HR_ITEMNAME_CODE = ''
  1397. this.SPECIMEN_TYPE = ''
  1398. this.SPECIMEN_NUM = ''
  1399. this.SPECIMEN_STATUS = ''
  1400. this.SPECIMEN_COLLETIME = ''
  1401. this.SPECIMEN_RECEITIME = ''
  1402. this.ORGCODE = ''
  1403. this.ORGNAME = ''
  1404. this.DEPTNAME = ''
  1405. this.PRACTITIONERNAME = ''
  1406. this.REQUESTTIME = ''
  1407. this.REPORTSTATUS = ''
  1408. this.REPORTSTATUS_CODE = ''
  1409. this.AGE = ''
  1410. this.GENDER = ''
  1411. this.GENDER_CODE = ''
  1412. this._init(MEDICAL_INFORMATION, no)
  1413. }
  1414. _delete() {
  1415. delete this._REQUESTTIME
  1416. delete this._SPECIMEN_COLLETIME
  1417. delete this._SPECIMEN_RECEITIME
  1418. }
  1419. _init(MEDICAL_INFORMATION, no) {
  1420. this._initMEDICAL_INFORMATION(MEDICAL_INFORMATION, no)
  1421. this._initNAME()
  1422. this._initLAB_ITEMNAME()
  1423. this._initTIME(MEDICAL_INFORMATION._ENCOUNTER_DATE)
  1424. this._initREPORTSTATUS()
  1425. }
  1426. _initREPORTSTATUS() {
  1427. this.REPORTSTATUS = '已发布'
  1428. this.REPORTSTATUS_CODE = '3'
  1429. this.SPECIMEN_STATUS = '已发布'
  1430. }
  1431. _initLAB_ITEMNAME() {
  1432. const LAB_ITEM = getRandomLAB_ITEM()
  1433. this.LAB_ITEMNAME = LAB_ITEM.LAB_ITEMNAME
  1434. this.LAB_ITEMNAME_CODE = LAB_ITEM.LAB_ITEMNAME_CODE
  1435. this.SPECIMEN_TYPE = LAB_ITEM.SPECIMEN_TYPE
  1436. this.LAB_HR_ITEMNAME_CODE = LAB_ITEM.LAB_HR_ITEMNAME_CODE
  1437. // "LAB_ITEMNAME": "血常规",
  1438. // "LAB_ITEMNAME_CODE": "001",
  1439. // "SPECIMEN_TYPE": "血",
  1440. // "SPECIMEN_NUM": "202407290001002",
  1441. }
  1442. _initTIME(_ENCOUNTER_DATE) {
  1443. this._SPECIMEN_COLLETIME = getRandomTimestamp(_ENCOUNTER_DATE, _ENCOUNTER_DATE + 3600 * 1000 * 12)
  1444. this._SPECIMEN_RECEITIME = getRandomTimestamp(this._SPECIMEN_COLLETIME, this._SPECIMEN_COLLETIME + 1800 * 1000)
  1445. this._REQUESTTIME = getRandomTimestamp(this._SPECIMEN_RECEITIME, this._SPECIMEN_RECEITIME + 1800 * 1000)
  1446. this.SPECIMEN_COLLETIME = timestamp2YYYYmmddHHiiss(this._SPECIMEN_COLLETIME)
  1447. this.SPECIMEN_RECEITIME = timestamp2YYYYmmddHHiiss(this._SPECIMEN_RECEITIME)
  1448. this.REQUESTTIME = timestamp2YYYYmmddHHiiss(this._REQUESTTIME)
  1449. }
  1450. _initNAME() {
  1451. this.PRACTITIONERNAME = getRandomName()
  1452. }
  1453. _initMEDICAL_INFORMATION(MEDICAL_INFORMATION, no) {
  1454. this.NAME = MEDICAL_INFORMATION.NAME
  1455. this.SERIESNUM = MEDICAL_INFORMATION.SERIESNUM
  1456. this.ORGCODE = MEDICAL_INFORMATION.ORGCODE
  1457. this.ORGNAME = MEDICAL_INFORMATION.ORGNAME
  1458. this.DEPTNAME = MEDICAL_INFORMATION.DEPTNAME
  1459. this.AGE = MEDICAL_INFORMATION.AGE
  1460. this.GENDER = MEDICAL_INFORMATION.GENDER
  1461. this.GENDER_CODE = MEDICAL_INFORMATION.GENDER_CODE
  1462. this.SPECIMEN_NUM = this.SERIESNUM + fillNumber(no + '', 3)
  1463. this.ORDERID = 'JY-' + this.SERIESNUM + fillNumber(no + '', 3)
  1464. }
  1465. }
  1466. class EXAM_REPORT {
  1467. constructor(EXAM_APPLICATION) {
  1468. this.NAME = ''
  1469. this.SERIESNUM = ''
  1470. this.EXAM_REQUESTID = ''
  1471. this.REPORTID = ''
  1472. this.EXAM_ITEMNAME = ''
  1473. this.EXAM_ITEMNAME_CODE = ''
  1474. this.BODYSITE_CATEG = ''
  1475. this.BODYSITE_CATEG_CODE = ''
  1476. this.BODYSITE = ''
  1477. this.OBSERVATIONS_COMMENT = ''
  1478. this.OBSERVATIONS_RESULT = ''
  1479. this.IMAGES = ''
  1480. this.DICOM_INDEXID = ''
  1481. this.ORGCODE = ''
  1482. this.ORGNAME = ''
  1483. this.DEPTNAME = ''
  1484. this.PRACTITIONERNAME = ''
  1485. this.AUDITNAME = ''
  1486. this.REPORTTIME = ''
  1487. this.REPORTSTATUS = ''
  1488. this.AGE = ''
  1489. this.GENDER = ''
  1490. this.GENDER_CODE = ''
  1491. this.DEVICETYPE_CODE = ''
  1492. this.RESULT_STATUS_CODE = ''
  1493. this.STUDYTIME = ''
  1494. this._init(EXAM_APPLICATION)
  1495. }
  1496. _delete() {
  1497. delete this._REPORTTIME
  1498. }
  1499. _init(EXAM_APPLICATION) {
  1500. this._initEXAM_APPLICATION(EXAM_APPLICATION)
  1501. this._initReport()
  1502. this._initTime(EXAM_APPLICATION._REQUESTTIME)
  1503. }
  1504. _initTime(_REQUESTTIME) {
  1505. this._STUDYTIME = getRandomTimestamp(_REQUESTTIME, _REQUESTTIME + 3600 * 1000 * 12)
  1506. this._REPORTTIME = getRandomTimestamp(this._STUDYTIME, this._STUDYTIME + 3600 * 1000 * 12)
  1507. this.STUDYTIME = timestamp2YYYYmmddHHiiss(this._STUDYTIME)
  1508. this.REPORTTIME = timestamp2YYYYmmddHHiiss(this._REPORTTIME)
  1509. }
  1510. _initReport() {
  1511. this.IMAGES = ''
  1512. this.DICOM_INDEXID = 'STUDY-' + this.SERIESNUM
  1513. const report = getRandomReport()
  1514. this.OBSERVATIONS_COMMENT = report.description
  1515. this.OBSERVATIONS_RESULT = report.impression
  1516. this.REPORTSTATUS = '已审核'
  1517. this.RESULT_STATUS_CODE = getRandomVal(['1', '2', '9'])
  1518. this.PRACTITIONERNAME = getRandomName()
  1519. this.AUDITNAME = getRandomName()
  1520. }
  1521. _initEXAM_APPLICATION(EXAM_APPLICATION) {
  1522. this.NAME = EXAM_APPLICATION.NAME
  1523. this.SERIESNUM = EXAM_APPLICATION.SERIESNUM
  1524. this.EXAM_REQUESTID = EXAM_APPLICATION.REQUESTID
  1525. this.EXAM_ITEMNAME = EXAM_APPLICATION.EXAM_ITEMNAME
  1526. this.EXAM_ITEMNAME_CODE = EXAM_APPLICATION.EXAM_ITEMNAME_CODE
  1527. this.BODYSITE_CATEG = EXAM_APPLICATION.BODYSITE_CATEG
  1528. this.BODYSITE_CATEG_CODE = EXAM_APPLICATION.BODYSITE_CATEG_CODE
  1529. this.BODYSITE = EXAM_APPLICATION.BODYSITE
  1530. this.ORGCODE = EXAM_APPLICATION.ORGCODE
  1531. this.ORGNAME = EXAM_APPLICATION.ORGNAME
  1532. this.AGE = EXAM_APPLICATION.AGE
  1533. this.GENDER = EXAM_APPLICATION.GENDER
  1534. this.GENDER_CODE = EXAM_APPLICATION.GENDER_CODE
  1535. this.DEPTNAME = '影像科'
  1536. this.REPORTID = 'BG-' + EXAM_APPLICATION.REQUESTID
  1537. this.DEVICETYPE_CODE = EXAM_APPLICATION.DEVICETYPE_CODE
  1538. }
  1539. }
  1540. class INSPECT_REPORT {
  1541. constructor(MEDICAL_ORDER) {
  1542. this.NAME = ''
  1543. this.SERIESNUM = ''
  1544. this.EXAM_REQUESTID = ''
  1545. this.REPORTID = ''
  1546. this.LAB_ITEMNAME = ''
  1547. this.LAB_ITEMNAME_CODE = ''
  1548. this.LAB_HR_ITEMNAME_CODE = ''
  1549. this.LAB_ITEMNAME_NUMBER = ''
  1550. this.LAB_HR_STATUS = ''
  1551. this.LAB_HR_ITEMNAME = ''
  1552. this.SPECIMEN_TYPE = ''
  1553. this.ORGCODE = ''
  1554. this.ORGNAME = ''
  1555. this.DEPTNAME = ''
  1556. this.PRACTITIONERNAME = ''
  1557. this.AUDITNAME = ''
  1558. this.REPORTTIME = ''
  1559. this.REPORTSTATUS = ''
  1560. this.REPORTSTATUS_CODE = ''
  1561. this.AGE = ''
  1562. this.GENDER = ''
  1563. this.GENDER_CODE = ''
  1564. this.INSPECT_REPORT_ITEMS = []
  1565. this._init(MEDICAL_ORDER)
  1566. }
  1567. _delete() {
  1568. delete this._REPORTTIME
  1569. }
  1570. _init(MEDICAL_ORDER) {
  1571. this._initMEDICAL_ORDER(MEDICAL_ORDER)
  1572. this._initTime(MEDICAL_ORDER._REQUESTTIME)
  1573. this._initReport()
  1574. }
  1575. _initReport() {
  1576. this.PRACTITIONERNAME = getRandomName()
  1577. this.AUDITNAME = getRandomName()
  1578. this.REPORTSTATUS = '已发布'
  1579. this.REPORTSTATUS_CODE = 3
  1580. this._initINSPECT_REPORT_ITEMS()
  1581. }
  1582. _initINSPECT_REPORT_ITEMS() {
  1583. const _this = this
  1584. const LAB_ITEMNAME = this.LAB_ITEMNAME
  1585. const reports = getINSPECT_REPORT_ITEMS(LAB_ITEMNAME)
  1586. this.INSPECT_REPORT_ITEMS = []
  1587. for(const report of reports) {
  1588. this.INSPECT_REPORT_ITEMS.push(
  1589. new INSPECT_REPORT_ITEM(_this, report)
  1590. )
  1591. }
  1592. // while(this.INSPECT_REPORT_ITEMS.length < 20 && getRandomBoolean()) {
  1593. // this.INSPECT_REPORT_ITEMS.push(
  1594. // new INSPECT_REPORT_ITEM(_this)
  1595. // )
  1596. // }
  1597. }
  1598. _initTime(_REQUESTTIME) {
  1599. this._REPORTTIME = getRandomTimestamp(_REQUESTTIME, _REQUESTTIME + 3600 * 1000)
  1600. this.REPORTTIME = timestamp2YYYYmmddHHiiss(this._REPORTTIME)
  1601. }
  1602. _initMEDICAL_ORDER(MEDICAL_ORDER) {
  1603. this.NAME = MEDICAL_ORDER.NAME
  1604. this.SERIESNUM = MEDICAL_ORDER.SERIESNUM
  1605. this.EXAM_REQUESTID = MEDICAL_ORDER.ORDERID
  1606. this.LAB_ITEMNAME = MEDICAL_ORDER.LAB_ITEMNAME
  1607. this.LAB_ITEMNAME_CODE = MEDICAL_ORDER.LAB_ITEMNAME_CODE
  1608. this.SPECIMEN_TYPE = MEDICAL_ORDER.SPECIMEN_TYPE
  1609. this.ORGCODE = MEDICAL_ORDER.ORGCODE
  1610. this.ORGNAME = MEDICAL_ORDER.ORGNAME
  1611. this.AGE = MEDICAL_ORDER.AGE
  1612. this.GENDER = MEDICAL_ORDER.GENDER
  1613. this.GENDER_CODE = MEDICAL_ORDER.GENDER_CODE
  1614. this.LAB_ITEMNAME_NUMBER = MEDICAL_ORDER.LAB_ITEMNAME_CODE
  1615. this.LAB_HR_STATUS = '1'
  1616. this.LAB_HR_ITEMNAME = '互认' + MEDICAL_ORDER.LAB_HR_ITEMNAME
  1617. this.LAB_HR_ITEMNAME_CODE = MEDICAL_ORDER.LAB_HR_ITEMNAME_CODE
  1618. this.DEPTNAME = '检验科'
  1619. this.REPORTID = 'BG-' + MEDICAL_ORDER.ORDERID
  1620. }
  1621. }
  1622. class INSPECT_REPORT_ITEM {
  1623. constructor(INSPECT_REPORT, report) {
  1624. this.EXAM_REQUESTID = ''
  1625. this.REPORTID = ''
  1626. this.ORGCODE = ''
  1627. this.LAB_ITEMDETAILNAME = ''
  1628. this.LAB_ITEMDETAILNAME_EN = ''
  1629. this.LAB_ITEMDETAILNAME_CODE = ''
  1630. this.LAB_ITEMDETAILNAME_NUMBER = ''
  1631. this.LAB_ITEMDETAILVALUE = ''
  1632. this.LAB_ITEMDETAILSPEC = ''
  1633. this.LAB_ITEMDETAILINTERPRETATION = ''
  1634. this.LAB_ITEMDETAILRANGE = ''
  1635. this.CRITICAL_RANGE = ''
  1636. this.LAB_HR_ITEMDETAIL_STATUS = ''
  1637. this.LAB_HR_ITEMDETAILNAME = ''
  1638. this.LAB_HR_ITEMDETAILNAME_CODE = ''
  1639. this._init(INSPECT_REPORT, report)
  1640. }
  1641. _init(INSPECT_REPORT, report) {
  1642. this._initINSPECT_REPORT(INSPECT_REPORT, report)
  1643. this._initReport(report)
  1644. }
  1645. _initReport(report = false) {
  1646. if(!report) {
  1647. report = getRandomINSPECT_REPORT_ITEM()
  1648. }
  1649. this.LAB_ITEMDETAILNAME = report.LAB_ITEMDETAILNAME
  1650. this.LAB_ITEMDETAILNAME_EN = report.LAB_ITEMDETAILNAME_EN
  1651. this.LAB_ITEMDETAILNAME_CODE = report.LAB_ITEMDETAILNAME_CODE
  1652. this.LAB_ITEMDETAILNAME_NUMBER = report.LAB_ITEMDETAILNAME_NUMBER
  1653. this.LAB_ITEMDETAILVALUE = report.LAB_ITEMDETAILVALUE
  1654. this.LAB_ITEMDETAILSPEC = report.LAB_ITEMDETAILSPEC
  1655. this.LAB_ITEMDETAILINTERPRETATION = report.LAB_ITEMDETAILINTERPRETATION
  1656. this.LAB_ITEMDETAILRANGE = report.LAB_ITEMDETAILRANGE
  1657. this.CRITICAL_RANGE = report.CRITICAL_RANGE
  1658. this.LAB_HR_ITEMDETAIL_STATUS = report.LAB_HR_ITEMDETAIL_STATUS
  1659. this.LAB_HR_ITEMDETAILNAME = report.LAB_HR_ITEMDETAILNAME
  1660. this.LAB_HR_ITEMDETAILNAME_CODE = report.LAB_HR_ITEMDETAILNAME_CODE
  1661. }
  1662. _initINSPECT_REPORT(INSPECT_REPORT) {
  1663. this.EXAM_REQUESTID = INSPECT_REPORT.EXAM_REQUESTID
  1664. this.REPORTID = INSPECT_REPORT.REPORTID
  1665. this.ORGCODE = INSPECT_REPORT.ORGCODE
  1666. }
  1667. }
  1668. class DATA {
  1669. constructor(_PATIENT) {
  1670. this.PATIENT = null;
  1671. this.MEDICAL_INFORMATION = null;
  1672. this.DIAGNOSES = [];
  1673. this.EXAM_APPLICATIONS = [];
  1674. this.MEDICAL_ORDERS = [];
  1675. this.EXAM_REPORTS = [];
  1676. this.INSPECT_REPORTS = [];
  1677. this._init(_PATIENT);
  1678. }
  1679. _init(_PATIENT) {
  1680. this._initPATIENT(_PATIENT)
  1681. this._initMEDICAL_INFORMATION()
  1682. this._initDIAGNOSES()
  1683. this._initEXAM_APPLICATIONS()
  1684. this._initMEDICAL_ORDERS()
  1685. this._initEXAM_REPORTS()
  1686. this._initINSPECT_REPORTS()
  1687. }
  1688. _delete() {
  1689. delete this.PATIENT._delete()
  1690. delete this.MEDICAL_INFORMATION._delete()
  1691. }
  1692. _initPATIENT(_PATIENT) {
  1693. if(_PATIENT) {
  1694. this.PATIENT = _PATIENT
  1695. return
  1696. }
  1697. this.PATIENT = new PATIENT()
  1698. }
  1699. _initMEDICAL_INFORMATION() {
  1700. this.MEDICAL_INFORMATION = new MEDICAL_INFORMATION(this.PATIENT)
  1701. }
  1702. _initDIAGNOSES() {
  1703. const diagnoses = getRandomDIAGNOSES()
  1704. this.DIAGNOSES = diagnoses.map(diagnose => new DIAGNOSE(diagnose['DIAGNOSECODE'], diagnose['DIAGNOSENAME']))
  1705. }
  1706. _initEXAM_APPLICATIONS() {
  1707. this.EXAM_APPLICATIONS = [new EXAM_APPLICATION(this.MEDICAL_INFORMATION, this.EXAM_APPLICATIONS.length + 1)];
  1708. while(this.EXAM_APPLICATIONS.length < 10 && getRandomBoolean()) {
  1709. this.EXAM_APPLICATIONS.push(
  1710. new EXAM_APPLICATION(this.MEDICAL_INFORMATION, this.EXAM_APPLICATIONS.length + 1)
  1711. )
  1712. }
  1713. // getRandomEXAM_APPLICATIONS(this.MEDICAL_INFORMATION)
  1714. }
  1715. _initMEDICAL_ORDERS() {
  1716. this.MEDICAL_ORDERS = [new MEDICAL_ORDER(this.MEDICAL_INFORMATION, this.MEDICAL_ORDERS.length + 1)]
  1717. while(this.MEDICAL_ORDERS.length < 5 && getRandomBoolean()) {
  1718. this.MEDICAL_ORDERS.push(
  1719. new MEDICAL_ORDER(this.MEDICAL_INFORMATION, this.MEDICAL_ORDERS.length + 1)
  1720. )
  1721. }
  1722. }
  1723. _initEXAM_REPORTS() {
  1724. this.EXAM_REPORTS = []
  1725. for(const EXAM_APPLICATION of this.EXAM_APPLICATIONS) {
  1726. this.EXAM_REPORTS.push(
  1727. new EXAM_REPORT(EXAM_APPLICATION)
  1728. )
  1729. }
  1730. }
  1731. _initINSPECT_REPORTS() {
  1732. this.INSPECT_REPORTS = []
  1733. for(const MEDICAL_ORDER of this.MEDICAL_ORDERS) {
  1734. this.INSPECT_REPORTS.push(
  1735. new INSPECT_REPORT(MEDICAL_ORDER)
  1736. )
  1737. }
  1738. }
  1739. }
  1740. const datas = []
  1741. const convers = []
  1742. // const tree = JSON.parse(fs.readFileSync('../json/tree.json'))
  1743. const createDatas = () => {
  1744. let i = 0, len = DATA_LENGTH
  1745. while(i < len) {
  1746. createData()
  1747. i++
  1748. }
  1749. }
  1750. const createData = () => {
  1751. let i = 0, len = Math.random() * PATIENT_LENGRH - 1
  1752. const data = createPatient()
  1753. while(i < len) {
  1754. createPatient(data.PATIENT)
  1755. i++;
  1756. }
  1757. }
  1758. const createPatient = (_PATIENT) => {
  1759. const _DATA = new DATA(_PATIENT)
  1760. datas.push({DATA: _DATA})
  1761. return _DATA
  1762. }
  1763. // const converDatas = () => {
  1764. // console.log(datas)
  1765. // for(const data of datas) {
  1766. // // convers.push(_converData(data))
  1767. // }
  1768. // }
  1769. // const _converData = data => {
  1770. // const _DATA = _converObj(data['DATA'], tree['DATA'])
  1771. // return {
  1772. // DATA: _DATA
  1773. // }
  1774. // }
  1775. // const _converObj = (model, tree) => {
  1776. // const tmp = {}
  1777. // for(const key in tree) {
  1778. // if(key === '_config' || key === '_key') {
  1779. // continue
  1780. // }
  1781. // const config = tree[key]
  1782. // const _config = config['_config']
  1783. // const type = _config['type']
  1784. // const mKey = _config['mKey']
  1785. // if(type === 'object') {
  1786. // tmp[mKey] = _converObj(model[key], tree[key])
  1787. // } else if(type === 'Array') {
  1788. // tmp[mKey] = _converArray(model[key], tree[key])
  1789. // } else {
  1790. // tmp[mKey] = model[key]
  1791. // }
  1792. // }
  1793. // return tmp
  1794. // }
  1795. const _converArray = (models, tree) => {
  1796. const tmps = []
  1797. for(const model of models) {
  1798. tmps.push(_converObj(model, tree))
  1799. }
  1800. return tmps;
  1801. }
  1802. const requestDatas = async _datas => {
  1803. let i = 0
  1804. for(const data of _datas) {
  1805. await requestData(data, i++)
  1806. }
  1807. }
  1808. let RequestCount = 0
  1809. let startDate = new Date(), lastDate = new Date()
  1810. const consoleProgress = () => {
  1811. const nowDate = new Date()
  1812. console.log(`
  1813. request: ${RequestCount} / ${datas.length}(${timestamp2YYYYmmddHHiiss(startDate)} ${timestamp2YYYYmmddHHiiss(lastDate)} ${timestamp2YYYYmmddHHiiss(nowDate)} ${nowDate - lastDate} ${(nowDate - startDate) / (RequestCount + 1) / 1000})
  1814. `)
  1815. RequestCount++
  1816. lastDate = nowDate
  1817. }
  1818. const requestData = async (data, ind) => {
  1819. console.log('接口请求进度: 当前任务序号/总任务数(程序开始时间 上次接口请求结束时间 当前时间 上次请求时间间隔(ms) 每个接口平均耗时(s))')
  1820. consoleProgress()
  1821. const url = BASE + '/zskk/patient/addPatient'
  1822. options = {
  1823. url, // 替换为你的API端点
  1824. method: 'POST',
  1825. headers: {
  1826. 'Content-Type': 'application/json' // 指定内容类型为JSON
  1827. },
  1828. body: JSON.stringify(data) // 将JSON对象转换为字符串
  1829. }
  1830. const body = await asyncRequest(options)
  1831. fs.writeFileSync('./out/request/' + fillNumber(ind + '', 7) + '.json', JSON.stringify(body))
  1832. }
  1833. const asyncRequest = (option) => {
  1834. return new Promise((resolve, reject) => {
  1835. request(option, (err, res, body) => {
  1836. if (err) {
  1837. console.log('err', err)
  1838. reject(err);
  1839. }
  1840. resolve(body);
  1841. });
  1842. });
  1843. };
  1844. const _done = async () => {
  1845. datas.length = 0
  1846. // convers.length = 0
  1847. createDatas()
  1848. await _doneDatas()
  1849. // converDatas()
  1850. // console.log(JSON.stringify(convers))
  1851. // return
  1852. // await requestDatas(convers)
  1853. }
  1854. const _doneDatas = async() => {
  1855. let i = 1
  1856. for(const data of datas) {
  1857. await _doneData(data.DATA, i++)
  1858. }
  1859. }
  1860. const _doneData = async (data, ind) => {
  1861. const A = {
  1862. AA: data.PATIENT.NAME,
  1863. AB: '01',
  1864. AC: data.PATIENT.ID_CARDNUM,
  1865. AD: data.PATIENT.GENDER_CODE,
  1866. AE: data.PATIENT.BIRTH_DATE
  1867. }
  1868. const B = {
  1869. BA: data.MEDICAL_INFORMATION.CLASS_CODE,
  1870. BB: data.MEDICAL_INFORMATION.SERIESNUM,
  1871. BC: data.MEDICAL_INFORMATION.ENCOUNTER_CARD_NO,
  1872. BD: data.MEDICAL_INFORMATION.HOS_EMPI,
  1873. BE: data.MEDICAL_INFORMATION.ENCOUNTER_DATE,
  1874. BF: data.MEDICAL_INFORMATION.DEPTNAME,
  1875. BG: data.MEDICAL_INFORMATION.CHIEFCOMPLAINT,
  1876. BH: data.MEDICAL_INFORMATION.AGE,
  1877. BI: data.MEDICAL_INFORMATION.ORGCODE,
  1878. BJ: data.MEDICAL_INFORMATION.ORGNAME,
  1879. BK: data.DIAGNOSES.map(DIAGNOSE => DIAGNOSE.DIAGNOSECODE).join(';'),
  1880. BL: data.DIAGNOSES.map(DIAGNOSE => DIAGNOSE.DIAGNOSENAME).join(';'),
  1881. // todo 接诊医生名称和编号
  1882. BM: data.MEDICAL_INFORMATION.DOCTOR.DOCTORNAME,
  1883. BN: data.MEDICAL_INFORMATION.DOCTOR.DOCTORCODE,
  1884. }
  1885. const JCC = data.EXAM_REPORTS.map(report => {
  1886. return {
  1887. 'CA': report.EXAM_REQUESTID, // 申请单编号/医嘱编号
  1888. 'CB': report.REPORTID, // 报告单编号
  1889. 'CC': report.DEVICETYPE_CODE, // 检查类型
  1890. 'CD': report.EXAM_ITEMNAME, // 检查项目名称
  1891. 'CE': report.EXAM_ITEMNAME_CODE, // 检查项目编码
  1892. 'CF': report.BODYSITE, // 检查部位
  1893. 'CG': report.OBSERVATIONS_COMMENT, // 检查所见/影像所见
  1894. 'CH': report.OBSERVATIONS_RESULT, // 影像诊断/意见
  1895. 'CI': report.RESULT_STATUS_CODE, // 检查结果类别
  1896. 'CJ': 'BZHR', // 互认范围
  1897. 'CK': report.EXAM_ITEMNAME_CODE, // 互认项目编码
  1898. 'CL': report.ORGNAME, // 报告机构
  1899. 'CM': report.ORGCODE, // 报告机构编码
  1900. 'CN': report.DEPTNAME, // 报告科室名称
  1901. 'CO': report.PRACTITIONERNAME, // 报告医生姓名
  1902. 'CP': report.AUDITNAME, // 审核医师姓名
  1903. 'CQ': report.REPORTTIME, // 报告时间
  1904. 'CR': report.STUDYTIME, // 检查时间
  1905. 'CS': '', // 报告单内容
  1906. 'CT': report.EXAM_ITEMNAME, // 互认项目
  1907. }
  1908. })
  1909. const JYC = data.INSPECT_REPORTS.map(report => {
  1910. const D = report.INSPECT_REPORT_ITEMS.map(item => {
  1911. return {
  1912. 'DA': item.LAB_ITEMDETAILNAME, // 检验细项名称/抗生素
  1913. 'DB': item.LAB_ITEMDETAILNAME_EN || '', // 检验细项缩写/英文
  1914. 'DC': item.LAB_ITEMDETAILNAME_NUMBER ?? 0, // 检验细项序号
  1915. 'DD': item.LAB_ITEMDETAILVALUE, // 检验细项测量值
  1916. 'DE': item.LAB_ITEMDETAILSPEC, // 检验细项结果计量单位
  1917. 'DF': item.LAB_ITEMDETAILINTERPRETATION, // 检验细项结果/微生物鉴定结果
  1918. 'DG': '', // 药敏结果
  1919. 'DH': item.LAB_ITEMDETAILRANGE, // 参考值范围
  1920. 'DI': '', // 检测方法
  1921. 'DJ': '', // KB
  1922. 'DK': '', // MIC
  1923. 'DL': '', // 敏感度
  1924. 'DM': item.LAB_HR_ITEMDETAILNAME_CODE, // 互认项目编码
  1925. 'DN': 'BZHR', // 互认范围
  1926. 'DO': item.LAB_HR_ITEMDETAILNAME_CODE ? '*': '', // 互认标识
  1927. 'DP': item.LAB_ITEMDETAILNAME, // 互认项目
  1928. }
  1929. })
  1930. return {
  1931. 'CA': report.REPORTID, // 报告单编号
  1932. 'CB': report.SPECIMEN_TYPE, // 标本类别
  1933. 'CC': report.LAB_ITEMNAME, // 检验项目名称
  1934. 'CD': "1", // 检测项目类型
  1935. 'CE': report.PRACTITIONERNAME, // 报告医生姓名
  1936. 'CF': report.AUDITNAME, // 审核医师姓名
  1937. 'CG': report.ORGNAME, // 报告机构
  1938. 'CH': report.ORGCODE, // 报告机构编码
  1939. 'CI': report.DEPTNAME, // 报告科室名称
  1940. 'CJ': '', // 报告评语
  1941. 'CK': report.REPORTTIME, // 报告时间
  1942. 'CL': '', // 报告单
  1943. 'CM': report.LAB_HR_ITEMNAME_CODE, // 互认项目编码
  1944. 'CN': 'BZHR', // 互认范围
  1945. 'CO': report.LAB_ITEMNAME, // 互认项目
  1946. D
  1947. }
  1948. })
  1949. const JC = {
  1950. A, B, C: JCC
  1951. }
  1952. const JY = {
  1953. A, B, C: JYC
  1954. }
  1955. await requestJCJY('/zskk/api/postExamReport', JC, ind, 1)
  1956. await requestJCJY('/zskk/api/postLabReport', JY, ind, 2)
  1957. }
  1958. let token = null
  1959. const getToken = async() => {
  1960. const url = BASE + '/zskk/api/getToken'
  1961. options = {
  1962. url, // 替换为你的API端点
  1963. method: 'POST',
  1964. headers: {
  1965. 'Content-Type': 'application/json' // 指定内容类型为JSON
  1966. },
  1967. body: JSON.stringify( {
  1968. "request_time": 1,
  1969. "request_no": "17292487376374",
  1970. "data": {
  1971. "clientid": "12371600494581158K",
  1972. "clientsecret": "837ffb03803b72cd99a941770fb6b2be"
  1973. }
  1974. }) // 将JSON对象转换为字符串
  1975. }
  1976. // fs.writeFileSync('./out/request/' + fillNumber(ind + '', 7) + '.json', obj2smString(data))
  1977. const body = await asyncRequest(options)
  1978. token = JSON.parse(body).data.token
  1979. }
  1980. const requestJCJY = async (uri, data, ind, flag) => {
  1981. console.log('接口请求进度: 当前任务序号/总任务数(程序开始时间 上次接口请求结束时间 当前时间 上次请求时间间隔(ms) 每个接口平均耗时(s))')
  1982. consoleProgress()
  1983. const url = BASE + uri
  1984. const _data = obj2smString(data)
  1985. options = {
  1986. url, // 替换为你的API端点
  1987. method: 'POST',
  1988. headers: {
  1989. 'Content-Type': 'application/json', // 指定内容类型为JSON
  1990. 'Authorization': 'Bearer '+ token
  1991. },
  1992. body: JSON.stringify( { data: _data }) // 将JSON对象转换为字符串
  1993. }
  1994. // fs.writeFileSync('./out/request/' + fillNumber(ind + '', 7) + '.json', obj2smString(data))
  1995. const body = await asyncRequest(options)
  1996. fs.writeFileSync('./out/request/' + flag + fillNumber(ind * 10 + 1 + '', 7) + '.html', JSON.stringify(body))
  1997. fs.writeFileSync('./out/request/' + flag + fillNumber(ind * 10 + 2 + '', 7) + '.json', JSON.stringify(data))
  1998. fs.writeFileSync('./out/request/' + flag + fillNumber(ind * 10 + 3 + '', 7) + '.json', _data)
  1999. }
  2000. const key = 'zLxapoeqWYpoeqWY'
  2001. const obj2smString = data => {
  2002. return sm4Encrypt(Buffer.from(JSON.stringify(data)).toString('base64'))
  2003. }
  2004. const crypto = require('crypto');
  2005. function sm4Encrypt(data) {
  2006. // 确保密钥为16字节
  2007. if (key.length !== 16) {
  2008. throw new Error('密钥长度必须为16字节');
  2009. }
  2010. // console.log(crypto.randomBytes(16), Buffer.from([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]))
  2011. // throw Error
  2012. // 创建一个cipher对象
  2013. const cipher = crypto.createCipheriv('sm4-cbc', Buffer.from(key), Buffer.alloc(16, 0));
  2014. // crypto.randomBytes(16));
  2015. // 使用cipher对象加密数据
  2016. let encrypted = cipher.update(data, 'utf8', 'base64');
  2017. encrypted += cipher.final('base64');
  2018. // 返回Base64编码的字符串
  2019. return encrypted;
  2020. }
  2021. // const smCrypto = require('sm-crypto');
  2022. // const sm4 = require('sm-crypto').sm4;
  2023. // import { SM4 } from 'gm-crypto';
  2024. // const sm4 = smCrypto.sm4;
  2025. // const key = Buffer.from('zLxapoeqWYpoeqWY'); // 设置SM4密钥(128位,16字节)
  2026. // const mode = 'cbc'; // 设置SM4加解密模式(ecb、cbc、ctr等)
  2027. // const iv = Buffer.from('0000000000000000'); // 初始化向量
  2028. // const encryptedCBC = SM4.encrypt(plaintext, key, {
  2029. // iv,
  2030. // mode: SM4.constants.CBC,
  2031. // inputEncoding: 'utf8',
  2032. // outputEncoding: 'hex',
  2033. // });
  2034. // const obj2smString = obj => {
  2035. // const json = JSON.stringify(obj)
  2036. // const base = Buffer.from(json).toString('base64')
  2037. // // return sm4.encrypt(base, key, { mode });
  2038. // return sm4.encrypt(base, key, { mode: 'cbc', iv, outputEncoding: 'utf8', });
  2039. // }
  2040. // 生成数据数量,每个数据患者数上限
  2041. const LOOP = 100, DATA_LENGTH = 100, PATIENT_LENGRH = 3
  2042. // 接口请求路由
  2043. const done = async () => {
  2044. let i = 0
  2045. if(!fs.existsSync('./out/request/')) {
  2046. fs.mkdirSync('./out/request/')
  2047. }
  2048. await getToken()
  2049. while(i < LOOP) {
  2050. await _done()
  2051. i++
  2052. }
  2053. }
  2054. const BASE = 'http://127.0.0.1:8000'
  2055. // const BASE = 'http://36.140.148.147:8000'
  2056. done()
  2057. // fs.writeFileSync('./convers.json', JSON.stringify(convers))