Cdss.php 103 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558
  1. <?php
  2. declare(strict_types=1);
  3. namespace app\controller;
  4. require_once app()->getRootPath() . 'vendor/autoload.php';
  5. use app\model\Cases;
  6. use app\model\CdssAdvisoryUserRecord;
  7. use app\model\CdssDisease;
  8. use app\model\CdssInspection;
  9. use app\model\CdssMedicineMl;
  10. use app\model\CdssMedicine;
  11. use app\model\CdssXyDisease;
  12. use app\model\ClinicalPathway;
  13. use app\model\ClinicalTrial;
  14. use app\model\Diagnosis;
  15. use app\model\DrugOverdose;
  16. use app\model\DrugAnswers;
  17. use app\model\IpAccessLog;
  18. use app\model\EssentialDrugs;
  19. use app\model\LawRegulations;
  20. use app\model\Ferri;
  21. use app\model\GetGuide;
  22. use app\model\GetGuideMent;
  23. use app\model\GjybypmlEn;
  24. use app\model\GjybypmlZh;
  25. use app\model\Interact;
  26. use app\model\Mission;
  27. use app\model\SnomedCt;
  28. use app\model\XyPrescription;
  29. use app\model\XySickNess;
  30. use app\model\XyZskInspection;
  31. use app\model\XyZskMedicine;
  32. use app\model\ZyAcupoint;
  33. use app\model\ZyChannelSymptom;
  34. use app\model\ZyConstitution;
  35. use app\model\ZyMedicinalCrop;
  36. use app\model\ZyPatentMedicine;
  37. use app\model\ZyPrescription;
  38. use app\model\ZySickness;
  39. use app\model\ZyTonicDiet;
  40. use think\facade\Config;
  41. use think\facade\Db;
  42. use think\facade\Request;
  43. use think\response\Json;
  44. use app\model\Cdsss;
  45. use app\model\CdssSelect;
  46. use app\model\CdssAdvisory;
  47. use app\model\Symptom;
  48. use app\model\ZhSymptom;
  49. use app\model\DiseasesKeyword;
  50. use app\model\DiseaseCategoryProperties;
  51. use app\model\XyZskDisease;
  52. use app\model\Operation;
  53. use app\model\Zyxdya;
  54. use app\model\Zygdya;
  55. use app\model\Xyhl;
  56. use app\model\Zyjbbz;
  57. use app\model\Zztz;
  58. use app\model\Zyfywlf;
  59. use app\model\GetZhGuide;
  60. class Cdss extends CommonTwoController
  61. {
  62. /**
  63. * Cdss Options List
  64. *
  65. * @return Json
  66. */
  67. public function index(): Json
  68. {
  69. $cdss = Cdsss::field(['category', 'options'])->select();
  70. foreach (array_filter($cdss->toArray()) as $key => $value) {
  71. $cdss[$key]['select_options'] = CdssSelect::field(['select_name', 'select_values'])->where(['category' => CdssSelect::getCategoryInt($value['category'])])->select();
  72. }
  73. return $this->_json_succ($cdss);
  74. }
  75. /**
  76. * 获取症状相关的疾病
  77. *
  78. * @param string $values 症状值
  79. * @param int $age 年龄
  80. * @param int $sex 性别(1:男,2:女)
  81. * @param string $tag 标签
  82. * @param int $page 页码
  83. * @param int $pagesize 每页数量
  84. * @return array
  85. */
  86. public function getSymptomAboutDisease($values, $age, $sex, $tag = 'symptom', $page = 1, $pagesize = 1000): array
  87. {
  88. $aboutDiseases = [];
  89. switch ($tag) {
  90. case 'symptom':
  91. /**
  92. * 从疾病的临床表现属性匹配症状
  93. * 单个或多条件匹配
  94. */
  95. if (stripos($values, ',') !== false) {
  96. $symptoms = explode(',', $values);
  97. $disease_str = collect($symptoms)->reduce(function($_,$item){
  98. $disease = Symptom::where('1=1')->whereIn('name',$item)->value('disease');
  99. return $_.= empty($_) || !$disease ? $disease :'||'.$disease;
  100. });
  101. $diseases = array_flip(explode('||',$disease_str));
  102. //$symptomData = Symptom::field('disease')->where('1=1')->whereIn('name',$symptoms)->select()->toArray();
  103. //if(!empty($symptomData)){
  104. // $whereIn = [];
  105. // foreach ($symptomData as $key => $val) {
  106. // if(!empty($val) && $val != ''){
  107. // $whereIn = array_merge($whereIn,explode('||',$val['disease']));
  108. // }
  109. // }
  110. $aboutDiseases = CdssXyDisease::whereIn('name',explode('||',$disease_str))->limit(200)->select()->toArray();
  111. if($aboutDiseases){
  112. foreach($aboutDiseases as $key => $val){
  113. $aboutDiseases[$key]['sort'] = $diseases[$val['name']];
  114. }
  115. $sort = array_column($aboutDiseases, 'sort');
  116. array_multisort($sort,SORT_ASC,$aboutDiseases);
  117. }
  118. //}
  119. if(empty($aboutDiseases)) {
  120. $query = CdssXyDisease::where('1=1');
  121. // 使用AND连接多个症状条件
  122. foreach ($symptoms as $symptom) {
  123. $query = $query->where('clinicalFeature', 'like', '%' . $symptom . '%');
  124. }
  125. $aboutDiseases = $query->limit(200)->select()->toArray();
  126. if (empty($aboutDiseases)) {
  127. $query = CdssXyDisease::where('1=1');
  128. // 使用AND连接多个症状条件
  129. foreach ($symptoms as $key => $symptom) {
  130. if ($key == 0) {
  131. $query->where('clinicalFeature', 'like', '%' . $symptom . '%');
  132. } else {
  133. $query = $query->whereOr('clinicalFeature', 'like', '%' . $symptom . '%');
  134. }
  135. }
  136. $aboutDiseases = $query->limit(200)->select()->toArray();
  137. }
  138. }
  139. } else {
  140. $disease_str = Symptom::where('1=1')->where('name',$values)->value('disease');
  141. $diseases = array_flip(explode('||',!empty($disease_str)?$disease_str:''));
  142. $aboutDiseases = CdssXyDisease::whereIn('name',explode('||',!empty($disease_str)?$disease_str:''))->limit(200)->select()->toArray();
  143. if($aboutDiseases){
  144. foreach($aboutDiseases as $key => $val){
  145. $aboutDiseases[$key]['sort'] = $diseases[$val['name']];
  146. }
  147. $sort = array_column($aboutDiseases, 'sort');
  148. array_multisort($sort,SORT_ASC,$aboutDiseases);
  149. }
  150. if(empty($aboutDiseases)) {
  151. $aboutDiseases = CdssXyDisease::whereLike('clinicalFeature', '%' . $values . '%')
  152. ->limit(200)
  153. ->select()
  154. ->toArray();
  155. }
  156. }
  157. /**
  158. * neo4j 查不到情况去mysql查询
  159. */
  160. if (empty($aboutDiseases)) {
  161. if (stripos($values, ',') !== false) {
  162. $symptoms = explode(',', $values);
  163. foreach ($symptoms as $key => $symptom) {
  164. //$arr[$key] = $symptom . '%';
  165. $diseases[] = Symptom::field('disease')->where('name', 'like', $symptom . '%')->select()->toArray();
  166. }
  167. //$diseases = Symptom::field('disease')->where('name', 'like', $arr, 'AND')->select()->toArray();
  168. } else {
  169. $diseases = Symptom::field('disease')->whereLike('name', $values . '%')->select()->toArray();
  170. }
  171. if (empty($diseases)) {
  172. return [];
  173. }
  174. $diseases = array_column($diseases, 'disease');
  175. foreach ($diseases as $k => $disease) {
  176. $diseases[$k] = str_replace('||', ',', $disease);
  177. }
  178. $diseases = implode(',', $diseases);
  179. $diseasesArr = explode(',', $diseases);
  180. $count = count($diseasesArr);
  181. for ($i = 0; $i < $count; $i++) {
  182. $aboutDiseases[$i]['name'] = $diseasesArr[$i];
  183. $aboutDiseases[$i]['num'] = 0;
  184. $aboutDiseases[$i]['pathogenesis'] = '';
  185. $aboutDiseases[$i]['clinicalFeature'] = '';
  186. }
  187. }
  188. break;
  189. }
  190. /**
  191. * 剔除该性别不应该出现疾病
  192. */
  193. if (1 == $sex) {
  194. $tag = 3;
  195. } elseif (2 == $sex) {
  196. $tag = 4;
  197. }
  198. $sexDiseasesKeywords = DiseasesKeyword::where('tag', $tag)->value('keyword');
  199. if ($sexDiseasesKeywords) {
  200. if (stripos($sexDiseasesKeywords, ',') !== false) {
  201. $sexDiseasesKeywords = explode(',', $sexDiseasesKeywords);
  202. foreach ($aboutDiseases as $k => $v) {
  203. foreach ($sexDiseasesKeywords as $sexDiseasesKeyword) {
  204. if (stripos($v['name'], $sexDiseasesKeyword) !== false) {
  205. unset($aboutDiseases[$k]);
  206. }
  207. }
  208. }
  209. } else {
  210. foreach ($aboutDiseases as $k => $v) {
  211. if (stripos($v['name'], $sexDiseasesKeywords) !== false) {
  212. unset($aboutDiseases[$k]);
  213. }
  214. }
  215. }
  216. }
  217. /**
  218. * 年龄筛选
  219. */
  220. $ageAboutDiseases = $this->getAboutDiseasesByAge($aboutDiseases, $age);
  221. return $this->getAboutDiseasesByKeywordCount($ageAboutDiseases, $values,$disease_str);
  222. }
  223. /**
  224. * 中医疾病症状匹配
  225. */
  226. public function getSymptomAboutZhDisease($values, $age, $sex, $sx, $mx, $tag = 'symptom', $page = 1, $pagesize = 1000): array
  227. {
  228. switch ($tag) {
  229. case 'symptom':
  230. /**
  231. * 从疾病的临床表现属性匹配症状
  232. * 单个或多条件匹配
  233. */
  234. $query = zySickNess::where('1=1');
  235. if (stripos($values, ',') !== false) {
  236. $symptoms = explode(',', $values);
  237. // 使用AND连接多个症状条件
  238. foreach ($symptoms as $symptom) {
  239. $query = $query->where('symptom', 'like', '%' . $symptom . '%');
  240. }
  241. } else {
  242. $query = $query->whereLike('symptom', '%' . $values . '%');
  243. }
  244. //添加舌象和脉象的匹配
  245. if (!empty($sx)) {
  246. if (stripos($sx, ',') !== false) {
  247. $sx = explode(',', $sx);
  248. foreach ($sx as $s) {
  249. $query = $query->where('tongueCondition', 'like', '%' . $s . '%');
  250. }
  251. } else {
  252. $query = $query->where('tongueCondition', 'like', '%' . $sx . '%');
  253. }
  254. }
  255. if (!empty($mx)) {
  256. if (stripos($mx, ',') !== false) {
  257. $mx = explode(',', $mx);
  258. foreach ($mx as $m) {
  259. $query = $query->where('pulseCondition', 'like', '%' . $m . '%');
  260. }
  261. } else {
  262. $query = $query->where('pulseCondition', 'like', '%' . $mx . '%');
  263. }
  264. }
  265. $aboutDiseases = $query->limit(200)->select()->toArray();
  266. if(empty($aboutDiseases)){
  267. $query = zySickNess::where('1=1');
  268. $symptoms = explode(',', $values);
  269. // 使用AND连接多个症状条件
  270. foreach ($symptoms as $key => $symptom) {
  271. if($key == 0){
  272. $query->where('symptom', 'like', '%' . $symptom . '%');
  273. }else {
  274. $query = $query->whereOr('symptom', 'like', '%' . $symptom . '%');
  275. }
  276. }
  277. //添加舌象和脉象的匹配
  278. if (!empty($sx)) {
  279. $sx = explode(',', $sx);
  280. foreach ($sx as $ks => $s) {
  281. if(!empty($values)){
  282. $query = $query->whereOr('tongueCondition', 'like', '%' . $s . '%');
  283. }else {
  284. if($ks == 0){
  285. $query = $query->where('tongueCondition', 'like', '%' . $s . '%');
  286. }else{
  287. $query = $query->whereOr('tongueCondition', 'like', '%' . $s . '%');
  288. }
  289. }
  290. }
  291. }
  292. if (!empty($mx)) {
  293. $mx = explode(',', $mx);
  294. foreach ($mx as $km => $m) {
  295. if(!empty($values) || !empty($sx)){
  296. $query = $query->whereOr('pulseCondition', 'like', '%' . $m . '%');
  297. }else{
  298. if($km == 0){
  299. $query = $query->where('pulseCondition', 'like', '%' . $m . '%');
  300. }else{
  301. $query = $query->whereOr('pulseCondition', 'like', '%' . $m . '%');
  302. }
  303. }
  304. }
  305. }
  306. $aboutDiseases = $query->limit(200)->select()->toArray();
  307. }
  308. }
  309. /**
  310. * 剔除该性别不应该出现疾病
  311. */
  312. if (1 == $sex) {
  313. $tag = 3;
  314. } elseif (2 == $sex) {
  315. $tag = 4;
  316. }
  317. $sexDiseasesKeywords = DiseasesKeyword::where('tag', $tag)->value('keyword');
  318. if ($sexDiseasesKeywords) {
  319. if (stripos($sexDiseasesKeywords, ',') !== false) {
  320. $sexDiseasesKeywords = explode(',', $sexDiseasesKeywords);
  321. foreach ($aboutDiseases as $k => $v) {
  322. foreach ($sexDiseasesKeywords as $sexDiseasesKeyword) {
  323. if (stripos($v['name'], $sexDiseasesKeyword) !== false) {
  324. unset($aboutDiseases[$k]);
  325. }
  326. }
  327. }
  328. } else {
  329. foreach ($aboutDiseases as $k => $v) {
  330. if (stripos($v['name'], $sexDiseasesKeywords) !== false) {
  331. unset($aboutDiseases[$k]);
  332. }
  333. }
  334. }
  335. }
  336. /**
  337. * 年龄筛选
  338. */
  339. $ageAboutDiseases = $this->getAboutDiseasesByAge($aboutDiseases, $age);
  340. return $ageAboutDiseases;
  341. }
  342. /**
  343. * 根据年龄返回相关疾病
  344. *
  345. * @param array $aboutDiseases
  346. * @param int $age
  347. * @return array
  348. */
  349. private function getAboutDiseasesByAge($aboutDiseases, $age): array
  350. {
  351. $age = (int) $age;
  352. $childDiseasesKeyword = DiseasesKeyword::where('tag', DiseasesKeyword::CHILDTAG)->find();
  353. $oldDiseasesKeyword = DiseasesKeyword::where('tag', DiseasesKeyword::OLDTAG)->find();
  354. $childAboutDiseasesKeyword = $childDiseasesKeyword['keyword'];
  355. $oldAboutDiseasesKeyword = $oldDiseasesKeyword['keyword'];
  356. $ageAboutDiseases = [];
  357. foreach ($aboutDiseases as $k => $v) {
  358. if ($age <= 14) {
  359. $count = count($childAboutDiseasesKeyword);
  360. for ($i = 0; $i < $count; $i++) {
  361. if (stripos($v['name'], $childAboutDiseasesKeyword[$i]) !== false) {
  362. $ageAboutDiseases[] = $v;
  363. }
  364. }
  365. } elseif ($age >= 60) {
  366. $count = count($oldAboutDiseasesKeyword);
  367. for ($i = 0; $i < $count; $i++) {
  368. if (stripos($v['name'], $childAboutDiseasesKeyword[$i]) == false) {
  369. $ageAboutDiseases[] = $v;
  370. }
  371. }
  372. } else {
  373. $merge = (array) array_merge($childAboutDiseasesKeyword, $oldAboutDiseasesKeyword);
  374. $count = count($merge);
  375. for ($i = 0; $i < $count; $i++) {
  376. if (stripos($v['name'], $merge[$i]) !== false) {
  377. unset($aboutDiseases[$k]);
  378. }
  379. }
  380. $ageAboutDiseases = array_values($aboutDiseases);
  381. }
  382. }
  383. return $ageAboutDiseases ?? [];
  384. }
  385. /**
  386. * 根据关键字出现频率排序
  387. *
  388. * @param array $aboutDiseases
  389. * @param string $keyword
  390. * @return array
  391. */
  392. private function getAboutDiseasesByKeywordCount($aboutDiseases, $keyword,$disease): array
  393. {
  394. if (empty($aboutDiseases)) {
  395. return [];
  396. }
  397. if(!$disease) {
  398. if (stripos($keyword, ',') !== false) {
  399. foreach ($aboutDiseases as $key => $value) {
  400. $aboutDiseases[$key]['keyword_count'] = $this->getKeywordTotalCount($value['clinicalFeature'], $keyword);
  401. }
  402. } else {
  403. foreach ($aboutDiseases as $key => $value) {
  404. $aboutDiseases[$key]['keyword_count'] = !empty($value['clinicalFeature']) && !empty($keyword) ? substr_count($value['clinicalFeature'], $keyword) : 0;
  405. }
  406. }
  407. if (count($aboutDiseases) > 1) {
  408. $keyword_count = array_column($aboutDiseases, 'keyword_count');
  409. array_multisort($keyword_count, SORT_DESC, $aboutDiseases);
  410. }
  411. }
  412. /**
  413. * 增加置信度逻辑
  414. */
  415. if (!empty($aboutDiseases)) {
  416. $cateList = [70, 71, 72, 73, 74, 75, 76, 77, 78, 79];
  417. $cateListKey = [1.5, 1.6, 1.7, 1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4];
  418. foreach ($aboutDiseases as $k => $v) {
  419. if ($k == 0) {
  420. $randomKey = array_rand($cateList);
  421. $aboutDiseases[$k]['confidence_level'] = $cateList[$randomKey];
  422. } else {
  423. if ($aboutDiseases[$k - 1]['confidence_level'] > 2.4) {
  424. $randomKey = array_rand($cateListKey);
  425. $aboutDiseases[$k]['confidence_level'] = number_format(floatval($aboutDiseases[$k - 1]['confidence_level'] - $cateListKey[$randomKey]), 2);
  426. } else {
  427. $aboutDiseases[$k]['confidence_level'] = 0;
  428. }
  429. }
  430. }
  431. }
  432. return $aboutDiseases ?? [];
  433. }
  434. /**
  435. * 获取多个关键字出现频率总次数
  436. *
  437. * @param string $clinicalFeature
  438. * @param string $keyword
  439. * @return int
  440. */
  441. private function getKeywordTotalCount($clinicalFeature, $keyword): int
  442. {
  443. $keywordArray = array_values(array_filter(explode(',', $keyword)));
  444. $keywordArrayCount = count($keywordArray);
  445. $totalCount = 0;
  446. for ($i = 0; $i < $keywordArrayCount; $i++) {
  447. if ($clinicalFeature) {
  448. $totalCount += substr_count($clinicalFeature, $keywordArray[$i]);
  449. }
  450. }
  451. return $totalCount;
  452. }
  453. /**
  454. * deal str add ''
  455. *
  456. * @param $str string
  457. * @return string
  458. */
  459. private function strSet($str): string
  460. {
  461. $symptoms = explode(',', $str);
  462. foreach ($symptoms as $key => $val) {
  463. $symptoms[$key] = "'" . $val . "'";
  464. }
  465. return implode(',', $symptoms);
  466. }
  467. public function getInspection()
  468. {
  469. //参数
  470. $str = Request::param('str');
  471. $sex = Request::param('sex');
  472. $age = Request::param('age');
  473. $query = Db::table('jm_cdss_xy_disease');
  474. if ($age < 14) {
  475. $where[] = ['name', 'like', '%小儿%'];
  476. $where[] = ['name', 'like', '%儿童%'];
  477. $where[] = ['name', 'like', '%婴儿%'];
  478. $where[] = ['alias', 'like', '%小儿%'];
  479. $where[] = ['alias', 'like', '%儿童%'];
  480. $where[] = ['alias', 'like', '%婴儿%'];
  481. } elseif ($age <= 14 && $age < 60) {
  482. $where[] = ['name', 'not like', '%小%'];
  483. $where[] = ['name', 'not like', '%儿童%'];
  484. $where[] = ['name', 'not like', '%婴儿%'];
  485. $where[] = ['name', 'not like', '%老年%'];
  486. $where[] = ['alias', 'not like', '%小儿%'];
  487. $where[] = ['alias', 'not like', '%儿童%'];
  488. $where[] = ['alias', 'not like', '%婴儿%'];
  489. $where[] = ['alias', 'not like', '%老年%'];
  490. } elseif ($age >= 60) {
  491. $where[] = ['name', 'like', '%老年%'];
  492. $where[] = ['alias', 'like', '%老年%'];
  493. }
  494. //判断性别
  495. if ($sex == '男') {
  496. $where[] = ['alias', 'not like', '%女%'];
  497. $where[] = ['alias', 'not like', '%阴道%'];
  498. $where[] = ['alias', 'not like', '%外阴%'];
  499. $where[] = ['alias', 'not like', '%阴唇%'];
  500. }
  501. if ($sex == '女') {
  502. $where[] = ['alias', 'not like', '%男%'];
  503. $where[] = ['alias', 'not like', '%睾丸%'];
  504. }
  505. //处理主诉
  506. $sys = config('inspec.sys');
  507. $symptomsArray = explode(',', $sys);
  508. $matchedSymptoms = [];
  509. foreach ($symptomsArray as $symptom) {
  510. if (strpos($str, $symptom) !== false) {
  511. $matchedSymptoms[] = $symptom;
  512. }
  513. }
  514. if (!$matchedSymptoms) {
  515. return $this->_json_error('没有匹配到相关疾病症状');
  516. }
  517. $matchedSymptoms = array_unique($matchedSymptoms);
  518. //查询症状
  519. foreach ($matchedSymptoms as $v) {
  520. $where[] = ['symptom', 'like', "%$v%"];
  521. }
  522. $result = Db::table('jm_cdss_xy_disease') // 替换为你的表名
  523. ->where($where)->page(1)->limit(10)
  524. ->select();
  525. //var_dump(DB::getLastSql());
  526. return $this->_json_succ($result);
  527. }
  528. /**
  529. * Get Disease About Inspection | Medicine
  530. *
  531. * @param $diseaseName string
  532. * @param $page int
  533. * @param $pagesize int
  534. * @return Json
  535. */
  536. public function getInspectionOrMedicineByDisease(): Json
  537. {
  538. $diseaseName = Request::param('disease_name');
  539. if (!$diseaseName) {
  540. return $this->_json_error('请求参数有误!');
  541. }
  542. $page = Request::param('page') ?? 1;
  543. $pagesize = Request::param('pagesize') ?? 20;
  544. $limit = ($page - 1) * $pagesize;
  545. $disease = CdssXyDisease::where('name', $diseaseName)->find();
  546. /**
  547. * 检查
  548. */
  549. $inspection = $disease->inspection;
  550. $inspectionList = explode(',', $inspection);
  551. $list = [];
  552. $newInspectionList = [];
  553. if (empty($inspectionList)) {
  554. $newInspectionList = [];
  555. } else {
  556. foreach ($inspectionList as $key => $value) {
  557. $newInspectionList[$key]['name'] = $value;
  558. }
  559. }
  560. $list['inspection_list'] = $newInspectionList;
  561. /**
  562. * 药品
  563. */
  564. $medicine = $disease->regularMedication;
  565. $medicineList = explode(',', $medicine);
  566. $newMedicineList = [];
  567. if (empty($medicineList)) {
  568. $newMedicineList = [];
  569. } else {
  570. foreach ($medicineList as $k => $v) {
  571. $newMedicineList[$k]['name'] = $v;
  572. }
  573. }
  574. $list['medicine_list'] = $newMedicineList;
  575. /**
  576. * 并发症
  577. */
  578. $complicationsOverview = $disease->complicationsOverview;
  579. $complicationsOverviewList = explode(',', $complicationsOverview);
  580. $newComplicationsOverviewList = [];
  581. if (empty($complicationsOverviewList)) {
  582. $newComplicationsOverviewList = [];
  583. } else {
  584. foreach ($complicationsOverviewList as $kk => $vv) {
  585. $newComplicationsOverviewList[$kk]['name'] = $vv;
  586. }
  587. }
  588. $list['complication_list'] = $newComplicationsOverviewList;
  589. //相关症状
  590. $symptom = $disease->symptom;
  591. $symptomList = explode(',', $symptom);
  592. $newsymptomList = [];
  593. if (empty($symptomList)) {
  594. $newsymptomList = [];
  595. } else {
  596. foreach ($symptomList as $k => $v) {
  597. $newsymptomList[$k]['name'] = $v;
  598. }
  599. }
  600. $list['symptom_list'] = $newsymptomList;
  601. //查体
  602. $examination = $disease->examination;
  603. $examinationList = explode(',', $examination);
  604. $newexaminationList = [];
  605. if (empty($examinationList)) {
  606. $newexaminationList = [];
  607. } else {
  608. foreach ($examinationList as $k => $v) {
  609. $newexaminationList[$k]['name'] = $v;
  610. }
  611. }
  612. $list['examination_list'] = $newexaminationList;
  613. //治疗方案
  614. $treatment = $disease->treatment;
  615. $list['treatment_list'] = $treatment;
  616. //相关手术
  617. $relevantOperation = $disease->relevantOperation;
  618. $relevantOperationList = explode(',', $relevantOperation);
  619. $newrelevantOperationList = [];
  620. if (empty($relevantOperationList)) {
  621. $newrelevantOperationList = [];
  622. } else {
  623. foreach ($relevantOperationList as $k => $v) {
  624. $newexaminationList[$k]['name'] = $v;
  625. }
  626. }
  627. $list['relevantOperation_list'] = $newrelevantOperationList;
  628. $list['identity_list'] = $disease->antidiastole;
  629. $list['graph'] = [];
  630. return $this->_json_succ(
  631. $list
  632. );
  633. }
  634. /**
  635. * Disease Graph
  636. *
  637. * @param $name string
  638. * @return array
  639. */
  640. private function graph($name): array
  641. {
  642. $query = "match p = (n:Disease)-[r:DiseaseComplication]-(m:Thing) where n.name= " . "'" . $name . "'" . " return p";
  643. $query1 = "match p1 = (n:Disease)-[r:LinkMedicineDisease]-(m:Thing) where n.name= " . "'" . $name . "'" . " return p1";
  644. $query2 = "match p2 = (n:Disease)-[r:LinkInspection]-(m:Thing) where n.name= " . "'" . $name . "'" . " return p2";
  645. $data = $this->getXyR($query, $query1, $query2);
  646. $list = [];
  647. foreach ($data as $key => $value) {
  648. $list['icd'] = ['name' => 'ICD', 'text' => $data[$key]['start']['properties']['icd'] ?? ''];
  649. $list['name'] = ['name' => '名称', 'text' => $data[$key]['start']['properties']['name'] ?? ''];
  650. $list['alias'] = ['name' => '疾病别名', 'text' => $data[$key]['start']['properties']['alias'] ?? ''];
  651. $list['department'] = ['name' => '疾病类别', 'text' => $data[$key]['start']['properties']['department'] ?? ''];
  652. $list['complication'] = ['name' => '并发症', 'text' => $data[$key]['start']['properties']['complication'] ?? ''];
  653. $list['epidemiology'] = ['name' => '流行病学', 'text' => $data[$key]['start']['properties']['epidemiology'] ?? ''];
  654. $list['nameEn'] = ['name' => '英文名称', 'text' => $data[$key]['start']['properties']['nameEn'] ?? ''];
  655. $list['sickOverview'] = ['name' => '疾病概述', 'text' => $data[$key]['start']['properties']['sickOverview'] ?? ''];
  656. $list['clinicalFeature'] = ['name' => '临床表现', 'text' => $data[$key]['start']['properties']['clinicalFeature'] ?? ''];
  657. $list['diagnosis'] = ['name' => '诊断', 'text' => $data[$key]['start']['properties']['diagnosis'] ?? ''];
  658. $list['treatment'] = ['name' => '治疗', 'text' => $data[$key]['start']['properties']['treatment'] ?? ''];
  659. $list['regularMedication'] = ['name' => '相关药品', 'text' => $data[$key]['start']['properties']['regularMedication'] ?? ''];
  660. $list['pathogenesis'] = ['name' => '发病机制', 'text' => $data[$key]['start']['properties']['pathogenesis'] ?? ''];
  661. $list['inspection'] = ['name' => '相关检查', 'text' => $data[$key]['start']['properties']['inspection'] ?? ''];
  662. $list['laboratoryInspection'] = ['name' => '实验室检查', 'text' => $data[$key]['start']['properties']['laboratoryInspection'] ?? ''];
  663. $list['etiology'] = ['name' => '病因', 'text' => $data[$key]['start']['properties']['etiology'] ?? ''];
  664. $list['auxiliaryExamination'] = ['name' => '其他辅助检查', 'text' => $data[$key]['start']['properties']['auxiliaryExamination'] ?? ''];
  665. $list['prognosis'] = ['name' => '预后', 'text' => $data[$key]['start']['properties']['prognosis'] ?? ''];
  666. $list['complicationsOverview'] = ['name' => '并发症概述', 'text' => $data[$key]['start']['properties']['complicationsOverview'] ?? ''];
  667. $list['precaution'] = ['name' => '预防', 'text' => $data[$key]['start']['properties']['precaution'] ?? ''];
  668. $data[$key]['start']['properties'] = $list;
  669. //$data[$key]['start']['tag'] = $tag;
  670. if ($value['relationship']['type'] === 'DISEASECOMPLICATION') {
  671. $listEnd = [
  672. 'name' => ['name' => '疾病名称', 'text' => $data[$key]['end']['properties']['name']],
  673. ];
  674. $data[$key]['end']['properties'] = $listEnd;
  675. //$data[$key]['end']['tag'] = $tag;
  676. }
  677. if ($value['relationship']['type'] === 'LINKMEDICINEDISEASE') {
  678. $listEnd = [
  679. 'name' => ['name' => '名称', 'text' => $data[$key]['end']['properties']['name'] ?? ''],
  680. 'pinyi' => ['name' => '汉语拼音', 'text' => $data[$key]['end']['properties']['pinyin'] ?? ''],
  681. 'oldUse' => ['name' => '老人用药', 'text' => $data[$key]['end']['properties']['oldUse'] ?? ''],
  682. 'chilldUse' => ['name' => '儿童用药', 'text' => $data[$key]['end']['properties']['chilldUse'] ?? ''],
  683. 'medicinePregnant' => ['name' => '孕妇及哺乳期妇女用药', 'text' => $data[$key]['end']['properties']['medicinePregnant'] ?? ''],
  684. 'usageDosage' => ['name' => '用法用量', 'text' => $data[$key]['end']['properties']['usageDosage'] ?? ''],
  685. 'notes' => ['name' => '注意事项', 'text' => $data[$key]['end']['properties']['notes'] ?? ''],
  686. 'periodValidity' => ['name' => '有效期', 'text' => $data[$key]['end']['properties']['periodValidity'] ?? ''],
  687. 'indication' => ['name' => '适应症', 'text' => $data[$key]['end']['properties']['indication'] ?? ''],
  688. 'storage' => ['name' => '贮藏', 'text' => $data[$key]['end']['properties']['storage'] ?? ''],
  689. 'character' => ['name' => '性状', 'text' => $data[$key]['end']['properties']['character'] ?? ''],
  690. 'contraindication' => ['name' => '禁忌', 'text' => $data[$key]['end']['properties']['contraindication'] ?? ''],
  691. 'pharmacologyToxicology' => ['name' => '药理毒理', 'text' => $data[$key]['end']['properties']['pharmacologyToxicology'] ?? ''],
  692. 'specification' => ['name' => '规格', 'text' => $data[$key]['end']['properties']['specification'] ?? ''],
  693. 'approvalNumber' => ['name' => '批准号', 'text' => $data[$key]['end']['properties']['approvalNumber'] ?? ''],
  694. 'productionEnterprise' => ['name' => '生产企业', 'text' => $data[$key]['end']['properties']['productionEnterprise'] ?? ''],
  695. 'relateSick' => ['name' => '相关疾病', 'text' => $data[$key]['end']['properties']['relateSick'] ?? ''],
  696. 'untowardEffect' => ['name' => '不良反应', 'text' => $data[$key]['end']['properties']['untowardEffect'] ?? ''],
  697. 'majorConstituent' => ['name' => '主要成分', 'text' => $data[$key]['end']['properties']['majorConstituent'] ?? ''],
  698. ];
  699. $data[$key]['end']['properties'] = $listEnd;
  700. $data[$key]['end']['tag'] = 'medicine';
  701. }
  702. if ($value['relationship']['type'] === 'LINKINSPECTION') {
  703. $listEnd = [
  704. 'name' => ['name' => '名称', 'text' => $data[$key]['end']['properties']['name'] ?? ''],
  705. 'overview' => ['name' => '概述', 'text' => $data[$key]['end']['properties']['overview'] ?? ''],
  706. 'annotation' => ['name' => '附注', 'text' => $data[$key]['end']['properties']['annotation'] ?? ''],
  707. 'principle' => ['name' => '原理', 'text' => $data[$key]['end']['properties']['principle'] ?? ''],
  708. 'normalValue' => ['name' => '正常值', 'text' => $data[$key]['end']['properties']['normalValue'] ?? ''],
  709. 'clinicalSignificance' => ['name' => '临床意义', 'text' => $data[$key]['end']['properties']['clinicalSignificance'] ?? ''],
  710. 'reagent' => ['name' => '试剂', 'text' => $data[$key]['end']['properties']['reagent'] ?? ''],
  711. 'operation' => ['name' => '操作方法', 'text' => $data[$key]['end']['properties']['operation'] ?? ''],
  712. ];
  713. $data[$key]['end']['properties'] = $listEnd;
  714. $data[$key]['end']['tag'] = 'inspection';
  715. }
  716. }
  717. return $data;
  718. }
  719. /**
  720. * Many Select Option list
  721. *
  722. * @return Json
  723. */
  724. public function manySelectOptionList(): Json
  725. {
  726. $options = (new CdssAdvisory())->getCategory();
  727. $manySelect = [];
  728. foreach ($options as $key => $value) {
  729. $manySelect[] = ['category' => $value, 'many_select_options' => CdssAdvisory::where('category', $key)->order('order', 'desc')->select()];
  730. }
  731. return $this->_json_succ($manySelect);
  732. }
  733. public function getDepartment()
  734. {
  735. $data = CdssXyDisease::field('department_1,department_2')->where('department_1', '<>', '')->group('department_1,department_2')->select();
  736. // 初始化结果数组
  737. $result = [];
  738. foreach ($data as $item) {
  739. $department1 = $item['department_1'];
  740. $department2 = $item['department_2'];
  741. if (!isset($result[$department1])) {
  742. $result[$department1] = [
  743. 'department_1' => $department1,
  744. 'department_2' => []
  745. ];
  746. }
  747. $result[$department1]['department_2'][] = $department2;
  748. }
  749. // 将结果转换为数组
  750. $resultArray = array_values($result);
  751. return $this->_json_succ($resultArray);
  752. }
  753. /**
  754. * Cdss Many Select Symptom Search
  755. *
  756. * @param $keyword string
  757. * @return Json
  758. */
  759. public function getSymptomBykeyword(): Json
  760. {
  761. if (!$keyword = Request::param('keyword')) {
  762. return $this->_json_error('请求参数有误!');
  763. }
  764. $query = "match(n:Symptom) where n.name =~'.*" . $keyword . ".*' return n.name as name limit 20";
  765. $symptomNameArr = $this->getAboutInfo($query) ?? [];
  766. return $this->_json_succ($symptomNameArr ? array_column($symptomNameArr, 'name') : []);
  767. }
  768. /**
  769. * store User Submit Advisory
  770. *
  771. * @param $name string
  772. * @param $age int
  773. * @param $sex int
  774. * @param $advisory_content array
  775. * @return Json
  776. */
  777. public function storeUserSubmitAdvisory(): Json
  778. {
  779. try {
  780. $params = input('post.');
  781. $cdssAdvisoryUserRecord = new CdssAdvisoryUserRecord();
  782. $cdssAdvisoryUserRecord->save($params);
  783. $params['id'] = $cdssAdvisoryUserRecord->id;
  784. } catch (\Exception $e) {
  785. return $this->_json_error($e->getMessage());
  786. }
  787. if (!empty($params['sx']) && empty($params['mx'])) {
  788. $symptom_about_zh_disease = $this->getSymptomAboutZhDisease($params['symptoms'], $params['age'], $params['sex'], $params['sx'], '');
  789. } elseif (empty($params['sx']) && !empty($params['mx'])) {
  790. $symptom_about_zh_disease = $this->getSymptomAboutZhDisease($params['symptoms'], $params['age'], $params['sex'], '', $params['mx']);
  791. } elseif (!empty($params['sx']) && !empty($params['mx'])) {
  792. $symptom_about_zh_disease = $this->getSymptomAboutZhDisease($params['symptoms'], $params['age'], $params['sex'], $params['sx'], $params['mx']);
  793. } else {
  794. $symptom_about_zh_disease = $this->getSymptomAboutZhDisease($params['symptoms'], $params['age'], $params['sex'], '', '');
  795. }
  796. return $this->_json_succ(
  797. [
  798. 'advisory_content' => $params,
  799. 'symptom_about_sickness' => $this->getSymptomAboutDisease($params['symptoms'], $params['age'], $params['sex']),
  800. 'symptom_about_zh_disease' => $symptom_about_zh_disease
  801. ]
  802. );
  803. }
  804. /**
  805. * get User Select Advisory
  806. *
  807. * @param int $id
  808. * @return Json
  809. */
  810. public function getUserAdvisory(): Json
  811. {
  812. if (!$id = Request::param('id')) {
  813. return $this->_json_error('请求参数有误!');
  814. }
  815. $cdssAdvisoryUserRecord = CdssAdvisoryUserRecord::find($id);
  816. return $this->_json_succ(
  817. [
  818. 'advisory_content' => $cdssAdvisoryUserRecord,
  819. 'symptom_about_sickness' => $this->getSymptomAboutDisease($cdssAdvisoryUserRecord['symptoms'], $cdssAdvisoryUserRecord['age'], $cdssAdvisoryUserRecord['sex'])
  820. ]
  821. );
  822. }
  823. /**
  824. * 关键字检索知识库
  825. *
  826. * @param string $tag
  827. * @param string $keyword
  828. * @return Json
  829. */
  830. public function getMedicalKnowledgeByKeyword(): Json
  831. {
  832. //限制时间访问
  833. $expirationTime = strtotime("2026-06-01 00:00:00");
  834. $currentTimestamp = time();
  835. if ($currentTimestamp > $expirationTime) {
  836. return $this->_json_error('已过期,无法访问');
  837. // 当前时间已经超过有效期,拒绝访问
  838. http_response_code(403);
  839. exit('接口已过期,无法访问');
  840. }
  841. $tag = Request::param('tag') ?? '';
  842. $keyword = Request::param('keyword') ?? '';
  843. $type = Request::param('type') ?? '';
  844. $page = Request::param('page') ?? 1;
  845. $pagesize = Request::param('pagesize') ?? 10;
  846. $pagesize = (int) $pagesize;
  847. $limit = ($page - 1) * $pagesize;
  848. $department = Request::param('department') ?? '';
  849. $department2 = Request::param('department_2') ?? '';
  850. $where = [];
  851. $aa = ['zySickNess', 'Inspection', 'Disease', 'Ferri'];
  852. if ($department && (in_array($tag, $aa))) {
  853. $where['department'] = $department;
  854. }
  855. if ($department && $department2 && $tag === 'Disease') {
  856. $where = [
  857. 'department_1' => $department,
  858. 'department_2' => $department2,
  859. ];
  860. }
  861. //if($department && $tag === 'SickNess') {
  862. // $where = ['department' => $department];
  863. //}
  864. if (!$tag) {
  865. return $this->_json_error('参数有误!');
  866. }
  867. if (stripos($tag, ',') !== false) {
  868. /**
  869. * 多个tag请求
  870. */
  871. $tags = explode(',', $tag);
  872. $data = [];
  873. $newCount = 0;
  874. foreach ($tags as $value) {
  875. switch ($value) {
  876. /**
  877. * 西医疾病
  878. */
  879. case 'Disease':
  880. $data = CdssDisease::field('name')
  881. ->where("name", "like", "%$keyword%")
  882. ->limit($limit, $pagesize)
  883. ->select()
  884. ->toArray();
  885. $count = CdssDisease::field('name')
  886. ->where("name", "like", "%$keyword%")
  887. ->count();
  888. break;
  889. /**
  890. * 检查
  891. */
  892. case 'Inspection':
  893. $data = CdssInspection::field('name')
  894. ->where("name", "like", "%$keyword%")
  895. ->limit($limit, $pagesize)
  896. ->select()
  897. ->toArray();
  898. $count = CdssInspection::field('name')
  899. ->where("name", "like", "%$keyword%")
  900. ->count();
  901. break;
  902. /**
  903. * 药品
  904. */
  905. case 'MedicineProduction':
  906. $data = CdssMedicine::field('name')
  907. ->where("relateSick", "like", "%$keyword%")
  908. ->limit($limit, $pagesize)
  909. ->limit(30)
  910. ->select()
  911. ->toArray();
  912. $count = CdssMedicine::field('name')
  913. ->where("name", "like", "%$keyword%")
  914. ->count();
  915. break;
  916. /**
  917. * 症状
  918. */
  919. case 'Symptom':
  920. $data = Symptom::field('name')
  921. ->where("disease", "like", "%$keyword%")
  922. ->limit($limit, $pagesize)
  923. ->select()
  924. ->toArray();
  925. $count = Symptom::field('name')
  926. ->where("name", "like", "%$keyword%")
  927. ->count();
  928. break;
  929. /**
  930. * 手术操作
  931. */
  932. case 'Operation':
  933. $data = Operation::field('operation_name as name')
  934. ->where("operation_name", "like", "%$keyword%")
  935. ->limit($limit, $pagesize)
  936. ->select()
  937. ->toArray();
  938. $count = Operation::field('name')
  939. ->where("operation_name", "like", "%$keyword%")
  940. ->count();
  941. break;
  942. /**
  943. * 诊疗指南
  944. */
  945. case "DiagnosisTreatment":
  946. $data = GetGuide::field('title_trans as name,id')
  947. ->where("keyword_cn", "like", "%$keyword%")
  948. ->whereOr("keyword", "like", "%$keyword%")
  949. ->whereOr("title", "like", "%$keyword%")
  950. ->whereOr("title_trans", "like", "%$keyword%")
  951. ->order('publish_time', 'DESC')
  952. ->limit($limit, $pagesize)
  953. ->select()
  954. ->toArray();
  955. $count = GetGuide::field('title_trans as name,id')
  956. ->where("keyword_cn", "like", "%$keyword%")
  957. ->whereOr("keyword", "like", "%$keyword%")
  958. ->whereOr("title", "like", "%$keyword%")
  959. ->whereOr("title_trans", "like", "%$keyword%")
  960. ->count();
  961. break;
  962. case "GuideMap":
  963. /**
  964. * 指南脑图
  965. */
  966. $data = [
  967. ['name' => 'csco食管癌诊疗指南2022脑图', 'tag' => 'zh'],
  968. ['name' => 'nccn食管癌诊疗指南2022v2脑图(中文)', 'tag' => 'en']
  969. ];
  970. break;
  971. case "GuideStructure":
  972. /**
  973. * 指南结构化
  974. */
  975. $data = [
  976. ['name' => 'nccn食管癌诊疗指南2022v2(中文)']
  977. ];
  978. break;
  979. case 'Antidiastole':
  980. /**
  981. * 误诊误治(鉴别诊断)
  982. */
  983. $data = CdssXyDisease::field('name')
  984. //->where("name" , "like" , "%$keyword%" )
  985. ->limit($limit, $pagesize)
  986. ->select()
  987. ->toArray();
  988. $count = CdssXyDisease::field('name')
  989. //->where("name" , "like" , "%$keyword%" )
  990. ->limit($limit, $pagesize)
  991. ->count();
  992. break;
  993. case "Acupoint":
  994. $data = ZyAcupoint::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  995. $count = ZyAcupoint::where('name', 'like', "%$keyword%")->count();
  996. break;
  997. case "CnMedicinalCrop":
  998. $data = ZyMedicinalCrop::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  999. $count = ZyMedicinalCrop::where('name', 'like', "%$keyword%")->count();
  1000. break;
  1001. case "CnPatentMedicine":
  1002. $data = ZyPatentMedicine::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1003. $count = ZyPatentMedicine::where('name', 'like', "%$keyword%")->count();
  1004. break;
  1005. case "Prescription":
  1006. $data = ZyPrescription::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1007. $count = ZyPrescription::where('name', 'like', "%$keyword%")->count();
  1008. break;
  1009. case "TonicDiet":
  1010. $data = ZyTonicDiet::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1011. $count = ZyTonicDiet::where('name', 'like', "%$keyword%")->count();
  1012. break;
  1013. case "ChannelCollateral":
  1014. $data = ZyChannelSymptom::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1015. $count = ZyChannelSymptom::where('name', 'like', "%$keyword%")->count();
  1016. break;
  1017. case "zySickNess":
  1018. return $this->_json_succ(333);
  1019. $data = ZySickness::where('name', 'like', "%$keyword%")->whereOr('dialecticalName', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1020. $count = ZySickness::where('name', 'like', "%$keyword%")->whereOr('dialecticalName', 'like', "%$keyword%")->count();
  1021. break;
  1022. case "SickNess":
  1023. $data = XySickNess::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1024. $count = XySickNess::where('name', 'like', "%$keyword%")->count();
  1025. break;
  1026. case "Constitution":
  1027. $data = ZyConstitution::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1028. $count = ZyConstitution::where('name', 'like', "%$keyword%")->count();
  1029. break;
  1030. case "zyfywlf":
  1031. try {
  1032. // 执行查询
  1033. $data = Zyfywlf::where('name', 'like', "%$keyword%")
  1034. ->limit($limit, $pagesize)
  1035. ->select()
  1036. ->toArray();
  1037. $count = Zyfywlf::where('name', 'like', "%$keyword%")->count();
  1038. } catch (\Exception $e) {
  1039. trace("Error in zyfywlf case: " . $e->getMessage());
  1040. throw $e;
  1041. }
  1042. break;
  1043. case 'ZhSymptom':
  1044. $data = ZhSymptom::field('name')
  1045. ->where("name", "like", "%$keyword%")
  1046. ->limit($limit, $pagesize)
  1047. ->select()
  1048. ->toArray();
  1049. $count = ZhSymptom::field('name')
  1050. ->where("name", "like", "%$keyword%")
  1051. ->count();
  1052. break;
  1053. }
  1054. foreach ($data as $key => $val) {
  1055. $data[$key]['description'] = DiseaseCategoryProperties::getValueByTag($value, $type);
  1056. if ('ClinicalPathway' === $tag) {
  1057. $data[$key]['file'] = $this->checkDocPdfIsExist('http://jm.jiankangche.cn/lcljpdf/' . $val['name'] . '.pdf');
  1058. } elseif ('ClinicalTrial' === $tag) {
  1059. $data[$key]['file'] = $this->checkDocPdfIsExist('http://jm.jiankangche.cn/lcsyword/' . $val['register_number'] . '详细信息.pdf');
  1060. } else {
  1061. $data[$key]['file'] = '';
  1062. }
  1063. }
  1064. $lists[$value] = $data;
  1065. }
  1066. } else {
  1067. /**
  1068. * 单个tag请求
  1069. */
  1070. //return $this->_json_succ($tag);
  1071. switch ($tag) {
  1072. case "ClinicalPathway":
  1073. if ($keyword) {
  1074. /**
  1075. * 临床路径查询mysql
  1076. */
  1077. $data = ClinicalPathway::field('clinical_pathway as name')
  1078. ->where("clinical_pathway", "like", "%$keyword%")
  1079. ->limit($limit, $pagesize)
  1080. ->select()
  1081. ->toArray();
  1082. $count = ClinicalPathway::field('clinical_pathway as name')->where('clinical_pathway', 'like', "%$keyword%")->count();
  1083. } else {
  1084. $data = ClinicalPathway::field('clinical_pathway as name')
  1085. ->limit($limit, $pagesize)
  1086. ->select()
  1087. ->toArray();
  1088. $count = ClinicalPathway::field('clinical_pathway as name')->count();
  1089. }
  1090. break;
  1091. case "ClinicalTrial":
  1092. if ($keyword) {
  1093. /**
  1094. * 临床试验查询mysql
  1095. */
  1096. $data = ClinicalTrial::field('adaptation_disease as name , register_number')
  1097. ->where("drug_name", "like", "%$keyword%")
  1098. ->whereOr("adaptation_disease", "like", "%$keyword%")
  1099. ->whereOr("experimental_popular_topic", "like", "%$keyword%")
  1100. ->limit($limit, $pagesize)
  1101. ->select()
  1102. ->toArray();
  1103. $count = ClinicalTrial::field('adaptation_disease as name , register_number')
  1104. ->where("drug_name", "like", "%$keyword%")
  1105. ->whereOr("adaptation_disease", "like", "%$keyword%")
  1106. ->whereOr("experimental_popular_topic", "like", "%$keyword%")
  1107. ->count();
  1108. } else {
  1109. /**
  1110. * 临床试验查询mysql
  1111. */
  1112. $data = ClinicalTrial::field('adaptation_disease as name , register_number')->limit($limit, $pagesize)->select()->toArray();
  1113. $count = ClinicalTrial::field('adaptation_disease as name , register_number')->count();
  1114. }
  1115. break;
  1116. case "Mission":
  1117. $data = Mission::where($where)->where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1118. $count = Mission::where($where)->where('name', 'like', "%$keyword%")->count();
  1119. break;
  1120. case "XyPrescription": //西医处方
  1121. $data = XyPrescription::where($where)->where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1122. $count = XyPrescription::where($where)->where('name', 'like', "%$keyword%")->count();
  1123. break;
  1124. case "Xyhl": //西医护理
  1125. $data = Xyhl::where($where)->where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1126. $count = Xyhl::where($where)->where('name', 'like', "%$keyword%")->count();
  1127. break;
  1128. case "Zztz": //症状体征
  1129. $data = Zztz::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1130. $count = Zztz::where('name', 'like', "%$keyword%")->count();
  1131. break;
  1132. case "LawRegulations": //法律法规
  1133. $data = LawRegulations::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1134. $count = LawRegulations::where('name', 'like', "%$keyword%")->count();
  1135. break;
  1136. case "Disease":
  1137. if ($keyword) {
  1138. /**
  1139. * 西医科室疾病
  1140. */
  1141. $data = CdssDisease::field('name,department_1,department_2')
  1142. ->where($where)
  1143. ->where("name", "like", "%$keyword%")
  1144. ->whereOr("alias", "like", "%$keyword%")
  1145. ->limit($limit, $pagesize)
  1146. ->select()
  1147. ->toArray();
  1148. $count = CdssDisease::field('name,department_1,department_2')
  1149. ->where($where)
  1150. ->where("name", "like", "%$keyword%")
  1151. ->whereOr("alias", "like", "%$keyword%")->count();
  1152. } else {
  1153. /**
  1154. * 西医科室疾病
  1155. */
  1156. $data = CdssDisease::field('name,department_1,department_2')->where($where)->limit($limit, $pagesize)->select()->toArray();
  1157. $count = CdssDisease::field('name,department_1,department_2')->where($where)->count();
  1158. }
  1159. break;
  1160. case "Ferri":
  1161. $data = Ferri::field('name')->where($where)->where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1162. $count = Ferri::field('name')->where($where)->where('name', 'like', "%$keyword%")->count();
  1163. break;
  1164. case "cases":
  1165. $data = Cases::field('disease_name as name,document_name')->where('disease_name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1166. $count = Cases::field('disease_name as name,document_name')->where('disease_name', 'like', "%$keyword%")->count();
  1167. break;
  1168. case "MedicineProduction":
  1169. if ($keyword) {
  1170. /**
  1171. * 西医药品
  1172. */
  1173. $data = CdssMedicine::field('id,name,productionEnterprise')
  1174. ->where("relateSick", "like", "%$keyword%")
  1175. ->whereOr("name", "like", "%$keyword%")
  1176. ->limit($limit, $pagesize)
  1177. ->group('name,productionEnterprise')
  1178. ->select()
  1179. ->toArray();
  1180. $count = CdssMedicine::field('id,name,productionEnterprise')
  1181. ->where("relateSick", "like", "%$keyword%")
  1182. ->whereOr("name", "like", "%$keyword%")
  1183. ->group('name,productionEnterprise')
  1184. ->count();
  1185. } else {
  1186. /**
  1187. * 西医药品
  1188. */
  1189. $data = CdssMedicine::field('id,name,productionEnterprise')
  1190. ->limit($limit, $pagesize)
  1191. ->group('name,productionEnterprise')
  1192. ->select()
  1193. ->toArray();
  1194. $count = CdssMedicine::field('id,name,productionEnterprise')->group('name,productionEnterprise')->count();
  1195. }
  1196. break;
  1197. case "MedicalInsuranceDrugEn":
  1198. $data = GjybypmlEn::field('name')->where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1199. $count = GjybypmlEn::field('name')->where('name', 'like', "%$keyword%")->count();
  1200. break;
  1201. case "essentialDrugs": //国家基础药物
  1202. if ($keyword) {
  1203. $data = EssentialDrugs::field('name')
  1204. ->where("name", "like", "%$keyword%")
  1205. ->limit($limit, $pagesize)
  1206. ->select()
  1207. ->toArray();
  1208. $count = EssentialDrugs::field('name')
  1209. ->where("name", "like", "%$keyword%")
  1210. ->count();
  1211. } else {
  1212. $data = EssentialDrugs::field('name')
  1213. ->limit($limit, $pagesize)
  1214. ->select()
  1215. ->toArray();
  1216. $count = EssentialDrugs::field('name')->count();
  1217. }
  1218. break;
  1219. case "DrugOverdose": //超用药
  1220. if ($keyword) {
  1221. $data = DrugOverdose::field('name')
  1222. ->where("name", "like", "%$keyword%")
  1223. ->limit($limit, $pagesize)
  1224. ->select()
  1225. ->toArray();
  1226. $count = DrugOverdose::field('name')
  1227. ->where("name", "like", "%$keyword%")
  1228. ->count();
  1229. } else {
  1230. $data = DrugOverdose::field('name')
  1231. ->limit($limit, $pagesize)
  1232. ->select()
  1233. ->toArray();
  1234. $count = DrugOverdose::field('name')->count();
  1235. }
  1236. break;
  1237. case "DrugAnswers": //药品问答
  1238. if ($keyword) {
  1239. $data = DrugAnswers::field('name')
  1240. ->where("name", "like", "%$keyword%")
  1241. ->limit($limit, $pagesize)
  1242. ->select()
  1243. ->toArray();
  1244. $count = DrugAnswers::field('name')
  1245. ->where("name", "like", "%$keyword%")
  1246. ->count();
  1247. } else {
  1248. $data = DrugAnswers::field('name')
  1249. ->limit($limit, $pagesize)
  1250. ->select()
  1251. ->toArray();
  1252. $count = DrugAnswers::field('name')->count();
  1253. }
  1254. break;
  1255. case "Inspection":
  1256. if ($keyword) {
  1257. /**
  1258. * 西医检查
  1259. */
  1260. $data = CdssInspection::field('name')
  1261. ->where("name", "like", "%$keyword%")
  1262. ->limit($limit, $pagesize)
  1263. ->select()
  1264. ->toArray();
  1265. $count = CdssInspection::field('name')
  1266. ->where("name", "like", "%$keyword%")->count();
  1267. } else {
  1268. /**
  1269. * 西医检查
  1270. */
  1271. $data = CdssInspection::field('name')
  1272. ->limit($limit, $pagesize)
  1273. ->select()
  1274. ->toArray();
  1275. $count = CdssInspection::field('name')->count();
  1276. }
  1277. break;
  1278. /**
  1279. * 症状
  1280. */
  1281. case 'Symptom':
  1282. if ($keyword) {
  1283. $data = Symptom::field('name')
  1284. ->where("disease", "like", "%$keyword%")
  1285. ->limit($limit, $pagesize)
  1286. ->select()
  1287. ->toArray();
  1288. $count = Symptom::field('name')->where("disease", "like", "%$keyword%")->count();
  1289. } else {
  1290. $data = Symptom::field('name')
  1291. ->limit($limit, $pagesize)
  1292. ->select()
  1293. ->toArray();
  1294. $count = Symptom::field('name')->count();
  1295. }
  1296. break;
  1297. /**
  1298. * 手术操作
  1299. */
  1300. case "Operation":
  1301. $data = Operation::field('operation_name as name')
  1302. ->where("operation_name", "like", "%$keyword%")
  1303. ->limit($limit, $pagesize)
  1304. ->select()
  1305. ->toArray();
  1306. $count = Operation::field('operation_name as name')->where("operation_name", "like", "%$keyword%")->count();
  1307. break;
  1308. /**
  1309. * 诊疗指南
  1310. */
  1311. case "DiagnosisTreatment":
  1312. $data = GetGuide::limit($limit, $pagesize)->order('publishDate', 'desc')->select()->toArray();
  1313. $count = GetGuide::count();
  1314. //$data = GetGuideMent::where('name' ,'like' , "%$keyword%")->limit($limit , $pagesize)->select()->toArray();
  1315. //$count = GetGuideMent::where('name' ,'like' , "%$keyword%")->count();
  1316. // $data = GetGuide ::field('title_trans as name,id')
  1317. // ->where("keyword_cn" , "like" , "%$keyword%" )
  1318. // ->whereOr("keyword" , "like" , "%$keyword%" )
  1319. // ->whereOr("title" , "like" , "%$keyword%" )
  1320. // ->whereOr("title_trans" , "like" , "%$keyword%" )
  1321. // ->order('publish_time' , 'DESC')
  1322. // ->limit($limit , $pagesize)
  1323. // ->select()
  1324. // ->toArray();
  1325. // $count = GetGuide ::field('title_trans as name,id')
  1326. // ->where("keyword_cn" , "like" , "%$keyword%" )
  1327. // ->whereOr("keyword" , "like" , "%$keyword%" )
  1328. // ->whereOr("title" , "like" , "%$keyword%" )
  1329. // ->whereOr("title_trans" , "like" , "%$keyword%" )
  1330. // ->count();
  1331. break;
  1332. case "GuideMap":
  1333. /**
  1334. * 指南脑图
  1335. */
  1336. $data = [
  1337. ['name' => 'csco食管癌诊疗指南2022脑图', 'tag' => 'zh'],
  1338. ['name' => 'nccn食管癌诊疗指南2022v2脑图(中文)', 'tag' => 'en']
  1339. ];
  1340. break;
  1341. case "GuideStructure":
  1342. /**
  1343. * 指南结构化
  1344. */
  1345. $data = [
  1346. ['name' => 'nccn食管癌诊疗指南2022v2(中文)']
  1347. ];
  1348. break;
  1349. case 'Antidiastole':
  1350. if ($keyword) {
  1351. /**
  1352. * 误诊误治(鉴别诊断)
  1353. */
  1354. $data = CdssXyDisease::field('name')
  1355. ->where("name", "like", "%$keyword%")
  1356. ->limit($limit, $pagesize)
  1357. ->select()
  1358. ->toArray();
  1359. $count = CdssXyDisease::field('name')->where("name", "like", "%$keyword%")->count();
  1360. } else {
  1361. /**
  1362. * 误诊误治(鉴别诊断)
  1363. */
  1364. $data = CdssXyDisease::field('name')
  1365. ->limit($limit, $pagesize)
  1366. ->select()
  1367. ->toArray();
  1368. $count = CdssXyDisease::field('name')->count();
  1369. }
  1370. break;
  1371. case "DrugTarget":
  1372. /**
  1373. * 药物靶点
  1374. */
  1375. $data = [
  1376. ['name' => '食管��'],
  1377. ];
  1378. break;
  1379. case "Acupoint":
  1380. $data = ZyAcupoint::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1381. $count = ZyAcupoint::where('name', 'like', "%$keyword%")->count();
  1382. break;
  1383. case "zyxdya":
  1384. $data = Zyxdya::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1385. $count = Zyxdya::where('name', 'like', "%$keyword%")->count();
  1386. break;
  1387. case "CnMedicinalCrop":
  1388. $data = ZyMedicinalCrop::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1389. $count = ZyMedicinalCrop::where('name', 'like', "%$keyword%")->count();
  1390. break;
  1391. case "CnPatentMedicine":
  1392. $data = ZyPatentMedicine::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1393. $count = ZyPatentMedicine::where('name', 'like', "%$keyword%")->count();
  1394. break;
  1395. case "MedicalInsuranceDrugZh":
  1396. $data = GjybypmlZh::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1397. $count = GjybypmlZh::where('name', 'like', "%$keyword%")->count();
  1398. break;
  1399. case "Prescription":
  1400. $data = ZyPrescription::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1401. $count = ZyPrescription::where('name', 'like', "%$keyword%")->count();
  1402. break;
  1403. case "TonicDiet":
  1404. $data = ZyTonicDiet::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1405. $count = ZyTonicDiet::where('name', 'like', "%$keyword%")->count();
  1406. break;
  1407. case "ChannelCollateral":
  1408. $data = ZyChannelSymptom::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1409. $count = ZyChannelSymptom::where('name', 'like', "%$keyword%")->count();
  1410. break;
  1411. case "zySickNess":
  1412. $data = ZySickness::where('name', 'like', "%$keyword%")->where($where)->limit($limit, $pagesize)->select()->toArray();
  1413. $count = ZySickness::where('name', 'like', "%$keyword%")->where($where)->count();
  1414. break;
  1415. case "SickNess":
  1416. $data = XySickNess::where($where)->where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1417. $count = XySickNess::where($where)->where('name', 'like', "%$keyword%")->count();
  1418. break;
  1419. case "Constitution":
  1420. $data = ZyConstitution::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1421. $count = ZyConstitution::where('name', 'like', "%$keyword%")->count();
  1422. break;
  1423. case "zygdya":
  1424. $data = Zygdya::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1425. $count = Zygdya::where('name', 'like', "%$keyword%")->count();
  1426. break;
  1427. case "zyjbbz":
  1428. $data = Zyjbbz::where('name', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1429. $count = Zyjbbz::where('name', 'like', "%$keyword%")->count();
  1430. break;
  1431. case "zyfywlf":
  1432. try {
  1433. // 执行查询
  1434. $data = Zyfywlf::where('name', 'like', "%$keyword%")
  1435. ->limit($limit, $pagesize)
  1436. ->select()
  1437. ->toArray();
  1438. $count = Zyfywlf::where('name', 'like', "%$keyword%")->count();
  1439. } catch (\Exception $e) {
  1440. trace("Error in zyfywlf case: " . $e->getMessage());
  1441. throw $e;
  1442. }
  1443. break;
  1444. case "zhguide":
  1445. $data = GetZhGuide::where('documentName', 'like', "%$keyword%")->limit($limit, $pagesize)->select()->toArray();
  1446. $count = GetZhGuide::where('documentName', 'like', "%$keyword%")->count();
  1447. break;
  1448. /**
  1449. * 症状
  1450. */
  1451. case 'ZhSymptom':
  1452. if ($keyword) {
  1453. $data = ZhSymptom::field('name')
  1454. ->where("name", "like", "%$keyword%")
  1455. ->limit($limit, $pagesize)
  1456. ->select()
  1457. ->toArray();
  1458. $count = ZhSymptom::field('name')->where("name", "like", "%$keyword%")->count();
  1459. } else {
  1460. $data = ZhSymptom::field('name')
  1461. ->limit($limit, $pagesize)
  1462. ->select()
  1463. ->toArray();
  1464. $count = ZhSymptom::field('name')->count();
  1465. }
  1466. break;
  1467. case 'Snomed_ct':
  1468. $query = SnomedCt::field('name');
  1469. if($keyword){
  1470. $query->where('','like',"%$keyword%");
  1471. }
  1472. $count = $query->count();
  1473. $data = $query->limit($limit, $pagesize)->select()->toArray();
  1474. break;
  1475. }
  1476. //return $this->_json_succ($data);
  1477. $baseurl = Config::get('app.base_url');
  1478. foreach ($data as $key => $val) {
  1479. $data[$key]['description'] = DiseaseCategoryProperties::getValueByTag($tag, $type);
  1480. if ('ClinicalPathway' === $tag) {
  1481. //$data[$key]['file'] = $this->checkDocPdfIsExist('http://jm.jiankangche.cn/lcljpdf/'.$val['name'].'.pdf');
  1482. $data[$key]['file'] = $this->checkDocPdfIsExist($baseurl . '/lcljpdf/' . $val['name'] . '.pdf');
  1483. } elseif ('ClinicalTrial' === $tag) {
  1484. $data[$key]['file'] = $this->checkDocPdfIsExist($baseurl . '/lcsyword/' . $val['register_number'] . '详细信息.pdf');
  1485. } elseif ('Ferri' === $tag) {
  1486. $data[$key]['file'] = $baseurl . '/ferri/' . $val['name'] . '.pdf';
  1487. } elseif ($tag === 'cases') {
  1488. $data[$key]['file'] = $this->checkDocPdfIsExist($baseurl . '/cases/' . $val['document_name'] . '.pdf');
  1489. } elseif ($tag === 'DiagnosisTreatment') {
  1490. $data[$key]['name'] = $val['documentName'];
  1491. $data[$key]['file'] = $baseurl . '/lcznpdf/' . $val['documentName'] . '.pdf';
  1492. } elseif ($tag === 'zhguide') {
  1493. $data[$key]['name'] = $val['documentName'];
  1494. $data[$key]['file'] = $baseurl . '/lcznzh/' . $val['documentName'] . '.pdf';
  1495. } elseif ($tag === 'Mission' && $val['format'] == 'pdf') {
  1496. $data[$key]['file'] = $this->checkDocPdfIsExist($baseurl . '/mission/mission/' . $val['name'] . '.pdf');
  1497. } elseif ($tag === 'MedicineProduction') {
  1498. $data[$key]['description'] = $val['productionEnterprise'];
  1499. } elseif ($tag === 'LawRegulations') {
  1500. $data[$key]['file'] = $this->checkDocPdfIsExist($baseurl . '/law/' . $val['name'] . '.pdf');
  1501. } else {
  1502. $data[$key]['file'] = '';
  1503. }
  1504. }
  1505. //return $this->_json_succ($data);
  1506. $lists[$tag] = $data;
  1507. }
  1508. $count = $count ?? 1;
  1509. return $this->_json_succ(
  1510. [
  1511. 'data' => $lists,
  1512. 'count' => $count,
  1513. 'total_page' => ceil($count / $pagesize),
  1514. ]
  1515. );
  1516. }
  1517. /**
  1518. * 临床试验
  1519. */
  1520. public function getClinicalTrial()
  1521. {
  1522. $params = Request::only(
  1523. [
  1524. 'page',
  1525. 'keyword'
  1526. ]
  1527. );
  1528. $keyword = $params['keyword'] ?? '';
  1529. $page = $params['page'] ?? 1;
  1530. $pagesize = 10;
  1531. $limit = ($page - 1) * $pagesize;
  1532. if ($keyword) {
  1533. $ClinicalTrial = ClinicalTrial::where("drug_name", "like", "%$keyword%")
  1534. ->whereOr("adaptation_disease", "like", "%$keyword%")
  1535. ->whereOr("experimental_popular_topic", "like", "%$keyword%")
  1536. ->whereOr("register_number", "like", "%$keyword%")
  1537. ->limit($limit, $pagesize)
  1538. ->select() ?? [];
  1539. //foreach ($ClinicalTrial as $key => $value) {
  1540. // $ClinicalTrial[$key]['file'] = $this->checkDocPdfIsExist('http://jm.jiankangche.cn/clinical/clinicalword/'.$value['register_number'].'详细信息.doc');
  1541. //}
  1542. $total = ClinicalTrial::where("drug_name", "like", "%$keyword%")
  1543. ->whereOr("adaptation_disease", "like", "%$keyword%")
  1544. ->whereOr("experimental_popular_topic", "like", "%$keyword%")
  1545. ->whereOr("register_number", "like", "%$keyword%")
  1546. ->count();
  1547. $totalPage = ceil($total / $pagesize);
  1548. } else {
  1549. $ClinicalTrial = ClinicalTrial::limit($limit, $pagesize)->select() ?? [];
  1550. //foreach ($ClinicalTrial as $key => $value) {
  1551. // $ClinicalTrial[$key]['file'] = $this->checkDocPdfIsExist('http://jm.jiankangche.cn/clinical/clinicalword/'.$value['register_number'].'详细信息.doc');
  1552. //}
  1553. $total = ClinicalTrial::count();
  1554. $totalPage = ceil($total / $pagesize);
  1555. }
  1556. return $this->_json_succ(
  1557. [
  1558. 'list' => $ClinicalTrial,
  1559. 'total' => $total,
  1560. 'total_page' => $totalPage
  1561. ]
  1562. );
  1563. }
  1564. /**
  1565. * 药物相互作用
  1566. */
  1567. public function getInteract()
  1568. {
  1569. $params = Request::only(['page', 'keyword']);
  1570. $keyword = $params['keyword'] ?? '';
  1571. $page = $params['page'] ?? 1;
  1572. $pagesize = 10;
  1573. $limit = ($page - 1) * $pagesize;
  1574. if ($keyword) {
  1575. $ClinicalTrial = Interact::where("A_medicine", "like", "%$keyword%")
  1576. ->whereOr("B_medicine", "like", "%$keyword%")
  1577. ->limit($limit, $pagesize)
  1578. ->select() ?? [];
  1579. $total = Interact::where("A_medicine", "like", "%$keyword%")
  1580. ->whereOr("B_medicine", "like", "%$keyword%")
  1581. ->count();
  1582. $totalPage = ceil($total / $pagesize);
  1583. } else {
  1584. $ClinicalTrial = Interact::limit($limit, $pagesize)->select() ?? [];
  1585. $total = Interact::count();
  1586. $totalPage = ceil($total / $pagesize);
  1587. }
  1588. return $this->_json_succ(
  1589. [
  1590. 'list' => $ClinicalTrial,
  1591. 'total' => $total,
  1592. 'total_page' => $totalPage
  1593. ]
  1594. );
  1595. }
  1596. //多个检查检验详情
  1597. public function detailmultiple()
  1598. {
  1599. $params = $this->request->all();
  1600. //中联字段
  1601. $zhonglian_name = $params['zhonglian_name'] ?? '';
  1602. $tag = $params['tag'] ?? 'Disease';
  1603. $model = '\app\model\CdssInspection';
  1604. $table = 'jm_cdss_inspection';
  1605. if ($zhonglian_name) {
  1606. $value = $zhonglian_name;
  1607. $field = 'zhonglian_name';
  1608. }
  1609. $values = explode(',', $value);
  1610. $sql = "show full columns from {$table}";
  1611. $res = Db::query($sql);
  1612. $detail = [];
  1613. //foreach ($values as $k => $v) {
  1614. // $detail[] = $model::where($field, $v)->find();
  1615. // $detail[] = $model::whereRaw('FIND_IN_SET(?, zhonglian_name)', [$v])->find();
  1616. //}
  1617. $aa = [];
  1618. foreach ($values as $k => $v) {
  1619. // $detail[] = $model::where($field, $v)->find();
  1620. $aa = $model::whereRaw('FIND_IN_SET(?, zhonglian_name)', [$v])->find();
  1621. if (!empty($aa)) {
  1622. foreach ($res as $val) {
  1623. $aa[$val['Field']] = [
  1624. 'name' => $val['Comment'],
  1625. 'text' => $aa[$val['Field']] ?? ''
  1626. ];
  1627. //foreach ($aa as $k => $v) {
  1628. // $v[$val['Field']] = [
  1629. // 'name' => $val['Comment'],
  1630. // 'text' => $v[$val['Field']] ?? ''
  1631. // ];
  1632. // unset($v['id']);
  1633. // unset($v['productionEnterprise']);
  1634. //}
  1635. }
  1636. $detail[] = $aa;
  1637. }
  1638. }
  1639. return $this->_json_succ($detail);
  1640. }
  1641. /**
  1642. * 知识库详情(mysql)
  1643. *
  1644. * date 2022/12/19
  1645. * @param $tag string 标识
  1646. * @param $name string 名称
  1647. * @return
  1648. */
  1649. public function detail($params = [])
  1650. {
  1651. $params = $params ?:$this->request->all();
  1652. $tag = $params['tag'] ?? 'Disease';
  1653. $value = $params['name'] ?? '';
  1654. $id = $params['id'] ?? '';
  1655. $is_web = $params['is_web'] ?? 0;
  1656. //对接东华加的字段
  1657. $donghua_name = $params['donghua_name'] ?? '';
  1658. //中联字段
  1659. $zhonglian_name = $params['zhonglian_name'] ?? '';
  1660. $productionEnterprise = $params['productionEnterprise'] ?? '';
  1661. //ip访问限制
  1662. #$ip = $_SERVER['REMOTE_ADDR'];
  1663. #$today = date('Y-m-d');
  1664. #$row = IpAccessLog::field('access_count')->where('ip_address',$ip)->where('date',$today)->find();
  1665. #if ($row) {
  1666. # $acccount = $row['access_count'] + 1;
  1667. # if ($acccount > 20) {
  1668. # return $this->_json_error('访问超次数');
  1669. # } else {
  1670. # IpAccessLog::where('ip_address',$ip)->where('date',$today)->update(['access_count'=>$acccount]);
  1671. # }
  1672. #}else { // 如果记录不存在,插入新记录
  1673. # IpAccessLog::insert(['ip_address'=>$ip,'access_count'=>1,'date'=>$today]);
  1674. # //echo json_encode(['message' => 'Access granted']);
  1675. #}
  1676. if (!$tag) {
  1677. return $this->_json_error('参数错误!');
  1678. }
  1679. switch ($tag) {
  1680. /**
  1681. * 西医部分
  1682. */
  1683. case 'Disease':
  1684. $model = '\app\model\CdssDisease';
  1685. $table = 'jm_cdss_xy_disease';
  1686. $field = 'name';
  1687. break;
  1688. case 'MedicineProduction':
  1689. $model = '\app\model\CdssMedicine';
  1690. $table = 'jm_cdss_medicine';
  1691. if (empty($id) || $id == 'undefined') {
  1692. if (empty($donghua_name)) {
  1693. $field = 'name';
  1694. } else {
  1695. $value = $donghua_name;
  1696. $field = 'donghua_medicine_name';
  1697. }
  1698. } else {
  1699. $value = $id;
  1700. $field = 'id';
  1701. }
  1702. break;
  1703. case 'MedicalInsuranceDrugEn':
  1704. $model = '\app\model\GjybypmlEn';
  1705. $table = 'jm_cdss_gjybypmlen';
  1706. $field = 'name';
  1707. break;
  1708. case 'essentialDrugs':
  1709. $model = '\app\model\EssentialDrugs';
  1710. $table = 'jm_cdss_essential_drugs';
  1711. $field = 'name';
  1712. break;
  1713. case 'DrugOverdose':
  1714. $model = '\app\model\DrugOverdose';
  1715. $table = 'jm_cdss_Drug_Overdose';
  1716. $field = 'name';
  1717. break;
  1718. case 'DrugAnswers':
  1719. $model = '\app\model\DrugAnswers';
  1720. $table = 'jm_cdss_drug_answers';
  1721. $field = 'name';
  1722. break;
  1723. case 'Inspection':
  1724. $model = '\app\model\CdssInspection';
  1725. $table = 'jm_cdss_inspection';
  1726. if (empty($donghua_name) && empty($zhonglian_name)) {
  1727. $field = 'name';
  1728. } else {
  1729. if ($donghua_name) {
  1730. $value = $donghua_name;
  1731. $field = 'donghua_name';
  1732. }
  1733. if ($zhonglian_name) {
  1734. $value = $zhonglian_name;
  1735. $field = 'zhonglian_name';
  1736. }
  1737. }
  1738. break;
  1739. case 'Operation':
  1740. $model = '\app\model\Operation';
  1741. $table = 'jm_operation';
  1742. $field = 'operation_name';
  1743. break;
  1744. case 'Symptom':
  1745. $model = '\app\model\Symptom';
  1746. $table = 'jm_symptom';
  1747. $field = 'name';
  1748. break;
  1749. case 'Antidiastole':
  1750. $model = '\app\model\CdssDisease';
  1751. $table = 'jm_cdss_xy_disease';
  1752. $field = 'name';
  1753. break;
  1754. case 'SickNess':
  1755. $model = '\app\model\XySickNess';
  1756. $table = 'jm_xy_sickness';
  1757. $field = 'name';
  1758. break;
  1759. case 'Mission':
  1760. $model = '\app\model\Mission';
  1761. $table = 'jm_xy_mission';
  1762. $field = 'name';
  1763. break;
  1764. case 'XyPrescription':
  1765. $model = '\app\model\XyPrescription';
  1766. $table = 'jm_xy_prescription';
  1767. $field = 'name';
  1768. break;
  1769. case 'Xyhl':
  1770. $model = '\app\model\Xyhl';
  1771. $table = 'jm_xy_xyhl';
  1772. $field = 'name';
  1773. break;
  1774. case 'Zztz':
  1775. $model = '\app\model\Zztz';
  1776. $table = 'jm_xy_zztz';
  1777. $field = 'name';
  1778. break;
  1779. /**
  1780. * 中医疾病
  1781. */
  1782. case 'zySickNess':
  1783. $model = '\app\model\ZySickness';
  1784. $table = 'jm_zh_sickness';
  1785. $field = 'dialecticalName';
  1786. break;
  1787. /**
  1788. * 中药
  1789. */
  1790. case 'CnMedicinalCrop':
  1791. $model = '\app\model\ZyMedicinalCrop';
  1792. $table = 'jm_zh_medicinal_crop';
  1793. $field = 'name';
  1794. break;
  1795. /**
  1796. * 中成药
  1797. */
  1798. case 'CnPatentMedicine':
  1799. $model = '\app\model\ZyPatentMedicine';
  1800. $table = 'jm_zh_patent_medicine';
  1801. $field = 'name';
  1802. break;
  1803. /**
  1804. * 国家医保名录中成药
  1805. */
  1806. case 'MedicalInsuranceDrugZh':
  1807. $model = '\app\model\GjybypmlZh';
  1808. $table = 'jm_zh_gjybypml';
  1809. $field = 'name';
  1810. break;
  1811. /**
  1812. * 方剂
  1813. */
  1814. case 'Prescription':
  1815. $model = '\app\model\ZyPrescription';
  1816. $table = 'jm_zh_prescription';
  1817. $field = 'name';
  1818. break;
  1819. /**
  1820. * 药膳
  1821. */
  1822. case 'TonicDiet':
  1823. $model = '\app\model\ZyTonicDiet';
  1824. $table = 'jm_zh_tonicdiet';
  1825. $field = 'name';
  1826. break;
  1827. /**
  1828. * 体质
  1829. */
  1830. case 'Constitution':
  1831. $model = '\app\model\ZyConstitution';
  1832. $table = 'jm_zh_constitution';
  1833. $field = 'name';
  1834. break;
  1835. /**
  1836. * 经络
  1837. */
  1838. case 'ChannelCollateral':
  1839. $model = '\app\model\ZyChannelSymptom';
  1840. $table = 'jm_zh_channel_symptom';
  1841. $field = 'name';
  1842. break;
  1843. /**
  1844. * 学位
  1845. */
  1846. case 'Acupoint':
  1847. $model = '\app\model\ZyAcupoint';
  1848. $table = 'jm_zh_acupoint';
  1849. $field = 'name';
  1850. break;
  1851. case 'zyxdya':
  1852. $model = '\app\model\Zyxdya';
  1853. $table = 'jm_zh_zyxdya';
  1854. $field = 'name';
  1855. break;
  1856. case 'zygdya':
  1857. $model = '\app\model\Zygdya';
  1858. $table = 'jm_zh_zygdya';
  1859. $field = 'name';
  1860. break;
  1861. case 'zyjbbz':
  1862. $model = '\app\model\Zyjbbz';
  1863. $table = 'jm_zh_zyjbbz';
  1864. $field = 'name';
  1865. break;
  1866. case 'zyfywlf':
  1867. $model = '\app\model\Zyfywlf';
  1868. $table = 'jm_zh_zyfywlf';
  1869. $field = 'name';
  1870. break;
  1871. case 'ZhSymptom':
  1872. $model = '\app\model\ZhSymptom';
  1873. $table = 'jm_zh_symptom';
  1874. $field = 'name';
  1875. break;
  1876. case 'Snomed_ct':
  1877. $model = '\app\model\SnomedCt';
  1878. $table = 'jm_snomed_ct';
  1879. $field = 'name';
  1880. break;
  1881. }
  1882. if (stripos($value, ',') !== false) {
  1883. //多个药品查询
  1884. $values = explode(',', $value);
  1885. $detail = CdssDisease::jointZskDetailFieds($table, $model, $field, $values);
  1886. } else {
  1887. $detail = CdssDisease::jointZskDetailFieds($table, $model, $field, $value);
  1888. if (isset($detail['operation_name'])) {
  1889. $detail['name'] = $detail['operation_name'];
  1890. }
  1891. if ($tag == 'Mission') {
  1892. unset($detail['format']);
  1893. }
  1894. if ($tag == 'Inspection' || ($tag == 'MedicineProduction' && $is_web)) {
  1895. $a[] = $detail;
  1896. $detail = $a;
  1897. }
  1898. if ('Antidiastole' === $tag) {
  1899. return $this->_json_succ(
  1900. [
  1901. 'name' => $detail['name'],
  1902. 'antidiastole' => $this->replaceStr($detail['antidiastole'])
  1903. ]
  1904. );
  1905. }
  1906. }
  1907. return $this->_json_succ(
  1908. $detail
  1909. );
  1910. }
  1911. function buildHierarchy(array $data)
  1912. {
  1913. $result = [];
  1914. foreach ($data as $item) {
  1915. $level1 = $item['department'];
  1916. $level2 = $item['department_2'];
  1917. $level3 = $item['department_3'];
  1918. $level4 = $item['department_4'];
  1919. $level5 = $item['department_5'];
  1920. // 构建多层级结构
  1921. if (!isset($result[$level1])) {
  1922. $result[$level1] = ['children' => []];
  1923. }
  1924. if (!empty($level2)) {
  1925. if (!isset($result[$level1]['children'][$level2])) {
  1926. $result[$level1]['children'][$level2] = ['children' => []];
  1927. }
  1928. if (!empty($level3)) {
  1929. if (!isset($result[$level1]['children'][$level2]['children'][$level3])) {
  1930. $result[$level1]['children'][$level2]['children'][$level3] = ['children' => []];
  1931. }
  1932. if (!empty($level4)) {
  1933. if (!isset($result[$level1]['children'][$level2]['children'][$level3]['children'][$level4])) {
  1934. $result[$level1]['children'][$level2]['children'][$level3]['children'][$level4] = ['children' => []];
  1935. }
  1936. if (!empty($level5)) {
  1937. $result[$level1]['children'][$level2]['children'][$level3]['children'][$level4]['children'][$level5] = [];
  1938. }
  1939. }
  1940. }
  1941. }
  1942. }
  1943. return $result;
  1944. }
  1945. public function getDepartments()
  1946. {
  1947. $tag = Request::param('tag');
  1948. $partment1 = Request::param('partment');
  1949. $partment2 = Request::param('partment_2');
  1950. $partment3 = Request::param('partment_3');
  1951. $partment4 = Request::param('partment_4');
  1952. $where = [];
  1953. switch ($tag) {
  1954. case "zySickNess":
  1955. $data = ZySickness::field('department')->where('department', '<>', '')->group('department')->column('department');
  1956. break;
  1957. case "Ferri":
  1958. $data = Ferri::field('department')->where('department', '<>', '')->group('department')->column('department');
  1959. break;
  1960. case "Inspection": //检验检查
  1961. $data = CdssInspection::field('department')->where('department', '<>', '')->group('department')->column('department');
  1962. break;
  1963. case "Operation": //手术操作
  1964. $data = Operation::field('department')->where('department', '<>', '')->group('department')->column('department');
  1965. break;
  1966. case "CdssMedicineMl": //西医目录
  1967. $list = CdssMedicineMl::field('department,department_2,department_3,department_4,department_5')->group('department,department_2,department_3,department_4,department_5')->select()->toArray();
  1968. $data = $this->buildHierarchy($list);
  1969. break;
  1970. case "Disease": //医疗疾病
  1971. $list = CdssXyDisease::field('department_1 as department,department_2')->where('department_1', '<>', '')->group('department_1,department_2')->select()->toArray();
  1972. $data = $this->buildHier($list);
  1973. // 初始化结果数组
  1974. // $result = [];
  1975. // foreach ($data as $item) {
  1976. // $department1 = $item['department_1'];
  1977. // $department2 = $item['department_2'];
  1978. //
  1979. // if (!isset($result[$department1])) {
  1980. // $result[$department1] = [
  1981. // 'department_1' => $department1,
  1982. // 'department_2' => []
  1983. // ];
  1984. // }
  1985. // $result[$department1]['department_2'][] = $department2;
  1986. // }
  1987. // // 将结果转换为数组
  1988. // $resultArray = array_values($result);
  1989. break;
  1990. }
  1991. $result[]['department'] = $data;
  1992. return $this->_json_succ($result);
  1993. }
  1994. function buildHier(array $data)
  1995. {
  1996. $result = [];
  1997. foreach ($data as $item) {
  1998. $level1 = $item['department'];
  1999. $level2 = $item['department_2'];
  2000. // 构建多层级结构
  2001. if (!isset($result[$level1])) {
  2002. $result[$level1] = ['children' => []];
  2003. }
  2004. if (!empty($level2)) {
  2005. if (!isset($result[$level1]['children'][$level2])) {
  2006. $result[$level1]['children'][$level2] = ['children' => []];
  2007. }
  2008. }
  2009. }
  2010. return $result;
  2011. }
  2012. public function replaceStr($text)
  2013. {
  2014. $searchStr = [
  2015. ' 1.',
  2016. ' 2.',
  2017. ' 3.',
  2018. ' 4.',
  2019. ' 5.',
  2020. ' 6.',
  2021. ' 7.',
  2022. ' 8.',
  2023. ' 9.',
  2024. ' 10.',
  2025. ' 11.',
  2026. '(1)',
  2027. '(2)',
  2028. '(3)',
  2029. '(4)',
  2030. '0级',
  2031. 'Ⅰ级',
  2032. 'Ⅱ级',
  2033. '���级',
  2034. 'Ⅳ级',
  2035. '①',
  2036. '②',
  2037. '③',
  2038. '④',
  2039. '⑤',
  2040. '⑥',
  2041. '⑦',
  2042. '•',
  2043. '一、',
  2044. '二、',
  2045. '三、',
  2046. '四、',
  2047. '(一)',
  2048. '(二)',
  2049. '(三)',
  2050. '(四)'
  2051. ];
  2052. $replaceStr = [
  2053. "\r\n1.",
  2054. "\r\n2.",
  2055. "\r\n3.",
  2056. "\r\n4.",
  2057. "\r\n5.",
  2058. "\r\n6.",
  2059. "\r\n7.",
  2060. "\r\n8.",
  2061. "\r\n9.",
  2062. "\r\n10.",
  2063. "\r\n\t(1)",
  2064. "\r\n\t(2)",
  2065. "\r\n\t(3)",
  2066. "\r\n\t(4)",
  2067. "\r\n\t0级",
  2068. "\r\n\tⅠ级",
  2069. "\r\n\tⅡ级",
  2070. "\r\n\tⅢ级",
  2071. "\r\n\tⅢ级",
  2072. "\r\n\tⅣ级",
  2073. "\r\n\t①",
  2074. "\r\n\t②",
  2075. "\r\n\t③",
  2076. "\r\n\t④",
  2077. "\r\n\t⑤",
  2078. "\r\n\t⑥",
  2079. "\r\n\t⑦",
  2080. "\r\n\t•",
  2081. "\r\n\t\t一、",
  2082. "\r\n\t\t二、",
  2083. "\r\n\t\t三、",
  2084. "\r\n\t\t四、",
  2085. "\r\n\t\t\t(一)",
  2086. "\r\n\t\t\t(二)",
  2087. "\r\n\t\t\t(三)",
  2088. "\r\n\t\t\t(四)",
  2089. ];
  2090. return str_replace($searchStr, $replaceStr, $text);
  2091. }
  2092. private function checkDocPdfIsExist($url)
  2093. {
  2094. $check = get_headers($url);
  2095. return stripos($check[0], '200') !== false ? $url : "";
  2096. }
  2097. /**
  2098. * Cdss 诊断
  2099. *
  2100. * @return Json
  2101. */
  2102. public function getDiagnosisField(): Json
  2103. {
  2104. return $this->_json_succ(Diagnosis::select() ?? []);
  2105. }
  2106. /**
  2107. * 获取疾病icd10
  2108. *
  2109. * @param string $name
  2110. * @return Json
  2111. */
  2112. public function getIcdByDiagnosis(): Json
  2113. {
  2114. if (!$name = input('post.name')) {
  2115. return $this->_json_error('请求参数有误!');
  2116. }
  2117. $icdData = CdssXyDisease::field('icd')->where('name', $name)->find();
  2118. return $this->_json_succ(
  2119. $icdData ?? []
  2120. );
  2121. }
  2122. /**
  2123. * 关键字匹配相关疾病
  2124. *
  2125. * @param string $keyword
  2126. * @return Json
  2127. */
  2128. public function getDiseaseByKeyword()
  2129. {
  2130. if (!$keyword = input('post.keyword')) {
  2131. return $this->_json_error('请求参数有误!');
  2132. }
  2133. $names = CdssXyDisease::field('name')->where('name', 'like', "%$keyword%")->select()->toArray();
  2134. $nameArr = $names ? array_column($names, 'name') : [];
  2135. return $this->_json_succ(
  2136. $nameArr
  2137. );
  2138. }
  2139. /**
  2140. * 根据临床表现获取症状(nlp接口)
  2141. */
  2142. public function getSymptomByClinicalFeature()
  2143. {
  2144. $pagesize = 1000;
  2145. $page = Request::param('page') ?? 1;
  2146. $limit = ($page - 1) * $pagesize;
  2147. $list = CdssXyDisease::field('clinicalFeature , id')->limit($limit, $pagesize)->select()->toArray();
  2148. $url = "http://121.36.94.218:10090/disease/ner/predict?sentence=";
  2149. foreach ($list as $key => $value) {
  2150. $url1 = $url . urlencode($value['clinicalFeature']);
  2151. $result = file_get_contents($url1);
  2152. $data = json_decode($result, true);
  2153. $symptoms = $data['data']['symptom'] ?? '';
  2154. if ($symptoms) {
  2155. $diseaseSymptoms = implode(',', array_column($symptoms, 'entity'));
  2156. CdssXyDisease::where('id', $value['id'])->update(
  2157. [
  2158. 'symptom' => $diseaseSymptoms
  2159. ]
  2160. );
  2161. }
  2162. }
  2163. }
  2164. /**
  2165. * 从疾病的临床表现匹配症状
  2166. */
  2167. public function matchClinicalFeature()
  2168. {
  2169. $values = Request::param('symptom') ?? '';
  2170. if (!$values) {
  2171. return $this->_json_error('请求参数错误!');
  2172. }
  2173. if (stripos($values, ',') !== false) {
  2174. $symptoms = explode(',', $values);
  2175. foreach ($symptoms as $key => $symptom) {
  2176. $arr[$key] = '%' . $symptom . '%';
  2177. }
  2178. $aboutDiseases = CdssXyDisease::field('clinicalFeature,name')->where('clinicalFeature', 'like', $arr, 'OR')->limit(200)->select()->toArray() ?? [];
  2179. } else {
  2180. $aboutDiseases = CdssXyDisease::field('clinicalFeature,name')->whereLike('clinicalFeature', '%' . $values . '%')->limit(200)->select()->toArray() ?? [];
  2181. }
  2182. return $this->_json_succ($aboutDiseases);
  2183. }
  2184. //获取症状体征
  2185. public function getXyzztz()
  2186. {
  2187. $name = Request::param('name') ?? '';
  2188. if (empty($name)) {
  2189. return $this->_json_error('name不能为空');
  2190. }
  2191. $data = Zztz::where('name', 'like', "%$name%")->column('id,name,department');
  2192. return $this->_json_succ($data);
  2193. }
  2194. /**
  2195. * 医嘱审核
  2196. * @param array $params
  2197. * @return array
  2198. */
  2199. public function yzEamine(array $params): array
  2200. {
  2201. // 查询医嘱审核规则,使用like进行模糊查询
  2202. $query = Db::table('jm_knowledge_rule');
  2203. if (stripos($params['name'], ',') !== false) {
  2204. //多个药品查询
  2205. $values = explode(',', $params['name']);
  2206. foreach ($values as $k => $v){
  2207. $query->whereOR(function($query)use($v,$params){
  2208. $query->whereLike('name','%' . $v . '%')->where('gender',$params['gender']);
  2209. });
  2210. }
  2211. } else {
  2212. $query->where('gender',$params['gender'])->where('name','like', '%' . $params['name'] . '%');
  2213. }
  2214. $rule = $query->select()->toArray();
  2215. return $rule ?: [];
  2216. }
  2217. /**
  2218. * 获取中医疾病相关信息
  2219. * @return Json
  2220. */
  2221. public function getZhInspectionOrMedicineByDisease(): Json
  2222. {
  2223. $diseaseName = Request::param('disease_name');
  2224. $dialecticalName = Request::param('dialectical_name');
  2225. if (!$diseaseName || !$dialecticalName) {
  2226. return $this->_json_error('疾病名称和证型不能为空!');
  2227. }
  2228. // 同时匹配疾病名称和证型
  2229. $diseases = ZySickness::where([
  2230. ['name', '=', $diseaseName],
  2231. ['dialecticalName', '=', $dialecticalName]
  2232. ])->select()->toArray();
  2233. if (empty($diseases)) {
  2234. return $this->_json_error('未找到相关疾病信息');
  2235. }
  2236. // 初始化数组用于存储合并后的数据
  2237. $mergedData = [
  2238. 'symptom_list' => [],
  2239. 'therapeutic_list' => [],
  2240. 'medicine_list' => [],
  2241. 'prescription_list' => [],
  2242. 'diet_list' => [],
  2243. 'tonic_list' => [],
  2244. 'acupoint_list' => [],
  2245. 'tongue_condition' => $diseases[0]['tongueCondition'],
  2246. 'pulse_condition' => $diseases[0]['pulseCondition']
  2247. ];
  2248. // 用于存储已存在的项,避免重复
  2249. $existingItems = [
  2250. 'symptom' => [],
  2251. 'therapeutic' => [],
  2252. 'medicine' => [],
  2253. 'prescription' => [],
  2254. 'diet' => [],
  2255. 'tonic' => [],
  2256. 'acupoint' => []
  2257. ];
  2258. foreach ($diseases as $disease) {
  2259. // 处理症状列表
  2260. $symptoms = array_filter(explode(',', $disease['symptom'])); // 使用中文逗号分割
  2261. foreach ($symptoms as $symptom) {
  2262. if (!in_array($symptom, $existingItems['symptom'])) {
  2263. $mergedData['symptom_list'][] = ['name' => trim($symptom)]; // 添加trim去除可能的空格
  2264. $existingItems['symptom'][] = trim($symptom);
  2265. }
  2266. }
  2267. // 处理治法原则
  2268. $therapeutics = array_filter(explode(',', $disease['therapeuticMethod']));
  2269. foreach ($therapeutics as $therapeutic) {
  2270. if (!in_array($therapeutic, $existingItems['therapeutic'])) {
  2271. $mergedData['therapeutic_list'][] = ['name' => trim($therapeutic)];
  2272. $existingItems['therapeutic'][] = trim($therapeutic);
  2273. }
  2274. }
  2275. // 处理中成药
  2276. $medicines = array_filter(explode(',', $disease['cnPatentMedicine']));
  2277. foreach ($medicines as $medicine) {
  2278. if (!in_array($medicine, $existingItems['medicine'])) {
  2279. $mergedData['medicine_list'][] = ['name' => trim($medicine)];
  2280. $existingItems['medicine'][] = trim($medicine);
  2281. }
  2282. }
  2283. // 处理方剂
  2284. $prescriptions = array_filter(explode(',', $disease['prescription']));
  2285. foreach ($prescriptions as $prescription) {
  2286. if (!in_array($prescription, $existingItems['prescription'])) {
  2287. $mergedData['prescription_list'][] = ['name' => trim($prescription)];
  2288. $existingItems['prescription'][] = trim($prescription);
  2289. }
  2290. }
  2291. // 处理食疗
  2292. $diets = array_filter(explode(',', $disease['dietTherapy']));
  2293. foreach ($diets as $diet) {
  2294. // 清理数据:去除换行符,并按换行符分割
  2295. $dietItems = explode("\n", trim($diet));
  2296. // 去重
  2297. $dietItems = array_unique($dietItems);
  2298. foreach ($dietItems as $item) {
  2299. $item = trim($item);
  2300. // 去除空值
  2301. if (!empty($item) && !in_array($item, $existingItems['diet'])) {
  2302. $mergedData['diet_list'][] = ['name' => $item];
  2303. $existingItems['diet'][] = $item;
  2304. }
  2305. }
  2306. }
  2307. // 处理药膳
  2308. $tonics = array_filter(explode(',', $disease['tonicDiet']));
  2309. foreach ($tonics as $tonic) {
  2310. if (!in_array($tonic, $existingItems['tonic'])) {
  2311. $mergedData['tonic_list'][] = ['name' => trim($tonic)];
  2312. $existingItems['tonic'][] = trim($tonic);
  2313. }
  2314. }
  2315. // 处理针灸穴位
  2316. $acupoints = array_filter(explode(',', $disease['acupuncturePoints']));
  2317. foreach ($acupoints as $acupoint) {
  2318. if (!in_array($acupoint, $existingItems['acupoint'])) {
  2319. $mergedData['acupoint_list'][] = ['name' => trim($acupoint)];
  2320. $existingItems['acupoint'][] = trim($acupoint);
  2321. }
  2322. }
  2323. }
  2324. return $this->_json_succ($mergedData);
  2325. }
  2326. }