Cdss.php 106 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596
  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. if(isset($detail['treatment']) && isset($detail['antidiastole'])){
  1908. $detail['treatment'] = str_replace('1.', '<p>' . '1.', $detail['treatment']);
  1909. $detail['treatment'] = str_replace('2.', '<p>' . '2.', $detail['treatment']);
  1910. $detail['treatment'] = str_replace('3.', '<p>' . '3.', $detail['treatment']);
  1911. $detail['treatment'] = str_replace('4.', '<p>' . '4.', $detail['treatment']);
  1912. $detail['treatment'] = str_replace('5.', '<p>' . '5.', $detail['treatment']);
  1913. $detail['treatment'] = str_replace('6.', '<p>' . '6.', $detail['treatment']);
  1914. $detail['treatment'] = str_replace('7.', '<p>' . '7.', $detail['treatment']);
  1915. $detail['treatment'] = str_replace('8.', '<p>' . '8.', $detail['treatment']);
  1916. $detail['treatment'] = str_replace('9.', '<p>' . '9.', $detail['treatment']);
  1917. $detail['treatment'] = str_replace('(1)', '<p>' . '(1)', $detail['treatment']);
  1918. $detail['treatment'] = str_replace('(2)', '<p>' . '(2)', $detail['treatment']);
  1919. $detail['treatment'] = str_replace('(3)', '<p>' . '(3)', $detail['treatment']);
  1920. $detail['treatment'] = str_replace('(4)', '<p>' . '(4)', $detail['treatment']);
  1921. $detail['treatment'] = str_replace('(5)', '<p>' . '(5)', $detail['treatment']);
  1922. $detail['treatment'] = str_replace('(6)', '<p>' . '(6)', $detail['treatment']);
  1923. $detail['treatment'] = str_replace('(7)', '<p>' . '(7)', $detail['treatment']);
  1924. $detail['treatment'] = str_replace('(8)', '<p>' . '(8)', $detail['treatment']);
  1925. $detail['treatment'] = str_replace('(9)', '<p>' . '(9)', $detail['treatment']);
  1926. $detail['antidiastole'] = str_replace('1.', '<p>' . '1.', $detail['antidiastole']);
  1927. $detail['antidiastole'] = str_replace('2.', '<p>' . '2.', $detail['antidiastole']);
  1928. $detail['antidiastole'] = str_replace('3.', '<p>' . '3.', $detail['antidiastole']);
  1929. $detail['antidiastole'] = str_replace('4.', '<p>' . '4.', $detail['antidiastole']);
  1930. $detail['antidiastole'] = str_replace('5.', '<p>' . '5.', $detail['antidiastole']);
  1931. $detail['antidiastole'] = str_replace('6.', '<p>' . '6.', $detail['antidiastole']);
  1932. $detail['antidiastole'] = str_replace('7.', '<p>' . '7.', $detail['antidiastole']);
  1933. $detail['antidiastole'] = str_replace('8.', '<p>' . '8.', $detail['antidiastole']);
  1934. $detail['antidiastole'] = str_replace('9.', '<p>' . '9.', $detail['antidiastole']);
  1935. $detail['antidiastole'] = str_replace('(1)', '<p>' . '(1)', $detail['antidiastole']);
  1936. $detail['antidiastole'] = str_replace('(2)', '<p>' . '(2)', $detail['antidiastole']);
  1937. $detail['antidiastole'] = str_replace('(3)', '<p>' . '(3)', $detail['antidiastole']);
  1938. $detail['antidiastole'] = str_replace('(4)', '<p>' . '(4)', $detail['antidiastole']);
  1939. $detail['antidiastole'] = str_replace('(5)', '<p>' . '(5)', $detail['antidiastole']);
  1940. $detail['antidiastole'] = str_replace('(6)', '<p>' . '(6)', $detail['antidiastole']);
  1941. $detail['antidiastole'] = str_replace('(7)', '<p>' . '(7)', $detail['antidiastole']);
  1942. $detail['antidiastole'] = str_replace('(8)', '<p>' . '(8)', $detail['antidiastole']);
  1943. $detail['antidiastole'] = str_replace('(9)', '<p>' . '(9)', $detail['antidiastole']);
  1944. }
  1945. return $this->_json_succ(
  1946. $detail
  1947. );
  1948. }
  1949. function buildHierarchy(array $data)
  1950. {
  1951. $result = [];
  1952. foreach ($data as $item) {
  1953. $level1 = $item['department'];
  1954. $level2 = $item['department_2'];
  1955. $level3 = $item['department_3'];
  1956. $level4 = $item['department_4'];
  1957. $level5 = $item['department_5'];
  1958. // 构建多层级结构
  1959. if (!isset($result[$level1])) {
  1960. $result[$level1] = ['children' => []];
  1961. }
  1962. if (!empty($level2)) {
  1963. if (!isset($result[$level1]['children'][$level2])) {
  1964. $result[$level1]['children'][$level2] = ['children' => []];
  1965. }
  1966. if (!empty($level3)) {
  1967. if (!isset($result[$level1]['children'][$level2]['children'][$level3])) {
  1968. $result[$level1]['children'][$level2]['children'][$level3] = ['children' => []];
  1969. }
  1970. if (!empty($level4)) {
  1971. if (!isset($result[$level1]['children'][$level2]['children'][$level3]['children'][$level4])) {
  1972. $result[$level1]['children'][$level2]['children'][$level3]['children'][$level4] = ['children' => []];
  1973. }
  1974. if (!empty($level5)) {
  1975. $result[$level1]['children'][$level2]['children'][$level3]['children'][$level4]['children'][$level5] = [];
  1976. }
  1977. }
  1978. }
  1979. }
  1980. }
  1981. return $result;
  1982. }
  1983. public function getDepartments()
  1984. {
  1985. $tag = Request::param('tag');
  1986. $partment1 = Request::param('partment');
  1987. $partment2 = Request::param('partment_2');
  1988. $partment3 = Request::param('partment_3');
  1989. $partment4 = Request::param('partment_4');
  1990. $where = [];
  1991. switch ($tag) {
  1992. case "zySickNess":
  1993. $data = ZySickness::field('department')->where('department', '<>', '')->group('department')->column('department');
  1994. break;
  1995. case "Ferri":
  1996. $data = Ferri::field('department')->where('department', '<>', '')->group('department')->column('department');
  1997. break;
  1998. case "Inspection": //检验检查
  1999. $data = CdssInspection::field('department')->where('department', '<>', '')->group('department')->column('department');
  2000. break;
  2001. case "Operation": //手术操作
  2002. $data = Operation::field('department')->where('department', '<>', '')->group('department')->column('department');
  2003. break;
  2004. case "CdssMedicineMl": //西医目录
  2005. $list = CdssMedicineMl::field('department,department_2,department_3,department_4,department_5')->group('department,department_2,department_3,department_4,department_5')->select()->toArray();
  2006. $data = $this->buildHierarchy($list);
  2007. break;
  2008. case "Disease": //医疗疾病
  2009. $list = CdssXyDisease::field('department_1 as department,department_2')->where('department_1', '<>', '')->group('department_1,department_2')->select()->toArray();
  2010. $data = $this->buildHier($list);
  2011. // 初始化结果数组
  2012. // $result = [];
  2013. // foreach ($data as $item) {
  2014. // $department1 = $item['department_1'];
  2015. // $department2 = $item['department_2'];
  2016. //
  2017. // if (!isset($result[$department1])) {
  2018. // $result[$department1] = [
  2019. // 'department_1' => $department1,
  2020. // 'department_2' => []
  2021. // ];
  2022. // }
  2023. // $result[$department1]['department_2'][] = $department2;
  2024. // }
  2025. // // 将结果转换为数组
  2026. // $resultArray = array_values($result);
  2027. break;
  2028. }
  2029. $result[]['department'] = $data;
  2030. return $this->_json_succ($result);
  2031. }
  2032. function buildHier(array $data)
  2033. {
  2034. $result = [];
  2035. foreach ($data as $item) {
  2036. $level1 = $item['department'];
  2037. $level2 = $item['department_2'];
  2038. // 构建多层级结构
  2039. if (!isset($result[$level1])) {
  2040. $result[$level1] = ['children' => []];
  2041. }
  2042. if (!empty($level2)) {
  2043. if (!isset($result[$level1]['children'][$level2])) {
  2044. $result[$level1]['children'][$level2] = ['children' => []];
  2045. }
  2046. }
  2047. }
  2048. return $result;
  2049. }
  2050. public function replaceStr($text)
  2051. {
  2052. $searchStr = [
  2053. ' 1.',
  2054. ' 2.',
  2055. ' 3.',
  2056. ' 4.',
  2057. ' 5.',
  2058. ' 6.',
  2059. ' 7.',
  2060. ' 8.',
  2061. ' 9.',
  2062. ' 10.',
  2063. ' 11.',
  2064. '(1)',
  2065. '(2)',
  2066. '(3)',
  2067. '(4)',
  2068. '0级',
  2069. 'Ⅰ级',
  2070. 'Ⅱ级',
  2071. '���级',
  2072. 'Ⅳ级',
  2073. '①',
  2074. '②',
  2075. '③',
  2076. '④',
  2077. '⑤',
  2078. '⑥',
  2079. '⑦',
  2080. '•',
  2081. '一、',
  2082. '二、',
  2083. '三、',
  2084. '四、',
  2085. '(一)',
  2086. '(二)',
  2087. '(三)',
  2088. '(四)'
  2089. ];
  2090. $replaceStr = [
  2091. "\r\n1.",
  2092. "\r\n2.",
  2093. "\r\n3.",
  2094. "\r\n4.",
  2095. "\r\n5.",
  2096. "\r\n6.",
  2097. "\r\n7.",
  2098. "\r\n8.",
  2099. "\r\n9.",
  2100. "\r\n10.",
  2101. "\r\n\t(1)",
  2102. "\r\n\t(2)",
  2103. "\r\n\t(3)",
  2104. "\r\n\t(4)",
  2105. "\r\n\t0级",
  2106. "\r\n\tⅠ级",
  2107. "\r\n\tⅡ级",
  2108. "\r\n\tⅢ级",
  2109. "\r\n\tⅢ级",
  2110. "\r\n\tⅣ级",
  2111. "\r\n\t①",
  2112. "\r\n\t②",
  2113. "\r\n\t③",
  2114. "\r\n\t④",
  2115. "\r\n\t⑤",
  2116. "\r\n\t⑥",
  2117. "\r\n\t⑦",
  2118. "\r\n\t•",
  2119. "\r\n\t\t一、",
  2120. "\r\n\t\t二、",
  2121. "\r\n\t\t三、",
  2122. "\r\n\t\t四、",
  2123. "\r\n\t\t\t(一)",
  2124. "\r\n\t\t\t(二)",
  2125. "\r\n\t\t\t(三)",
  2126. "\r\n\t\t\t(四)",
  2127. ];
  2128. return str_replace($searchStr, $replaceStr, $text);
  2129. }
  2130. private function checkDocPdfIsExist($url)
  2131. {
  2132. $check = get_headers($url);
  2133. return stripos($check[0], '200') !== false ? $url : "";
  2134. }
  2135. /**
  2136. * Cdss 诊断
  2137. *
  2138. * @return Json
  2139. */
  2140. public function getDiagnosisField(): Json
  2141. {
  2142. return $this->_json_succ(Diagnosis::select() ?? []);
  2143. }
  2144. /**
  2145. * 获取疾病icd10
  2146. *
  2147. * @param string $name
  2148. * @return Json
  2149. */
  2150. public function getIcdByDiagnosis(): Json
  2151. {
  2152. if (!$name = input('post.name')) {
  2153. return $this->_json_error('请求参数有误!');
  2154. }
  2155. $icdData = CdssXyDisease::field('icd')->where('name', $name)->find();
  2156. return $this->_json_succ(
  2157. $icdData ?? []
  2158. );
  2159. }
  2160. /**
  2161. * 关键字匹配相关疾病
  2162. *
  2163. * @param string $keyword
  2164. * @return Json
  2165. */
  2166. public function getDiseaseByKeyword()
  2167. {
  2168. if (!$keyword = input('post.keyword')) {
  2169. return $this->_json_error('请求参数有误!');
  2170. }
  2171. $names = CdssXyDisease::field('name')->where('name', 'like', "%$keyword%")->select()->toArray();
  2172. $nameArr = $names ? array_column($names, 'name') : [];
  2173. return $this->_json_succ(
  2174. $nameArr
  2175. );
  2176. }
  2177. /**
  2178. * 根据临床表现获取症状(nlp接口)
  2179. */
  2180. public function getSymptomByClinicalFeature()
  2181. {
  2182. $pagesize = 1000;
  2183. $page = Request::param('page') ?? 1;
  2184. $limit = ($page - 1) * $pagesize;
  2185. $list = CdssXyDisease::field('clinicalFeature , id')->limit($limit, $pagesize)->select()->toArray();
  2186. $url = "http://121.36.94.218:10090/disease/ner/predict?sentence=";
  2187. foreach ($list as $key => $value) {
  2188. $url1 = $url . urlencode($value['clinicalFeature']);
  2189. $result = file_get_contents($url1);
  2190. $data = json_decode($result, true);
  2191. $symptoms = $data['data']['symptom'] ?? '';
  2192. if ($symptoms) {
  2193. $diseaseSymptoms = implode(',', array_column($symptoms, 'entity'));
  2194. CdssXyDisease::where('id', $value['id'])->update(
  2195. [
  2196. 'symptom' => $diseaseSymptoms
  2197. ]
  2198. );
  2199. }
  2200. }
  2201. }
  2202. /**
  2203. * 从疾病的临床表现匹配症状
  2204. */
  2205. public function matchClinicalFeature()
  2206. {
  2207. $values = Request::param('symptom') ?? '';
  2208. if (!$values) {
  2209. return $this->_json_error('请求参数错误!');
  2210. }
  2211. if (stripos($values, ',') !== false) {
  2212. $symptoms = explode(',', $values);
  2213. foreach ($symptoms as $key => $symptom) {
  2214. $arr[$key] = '%' . $symptom . '%';
  2215. }
  2216. $aboutDiseases = CdssXyDisease::field('clinicalFeature,name')->where('clinicalFeature', 'like', $arr, 'OR')->limit(200)->select()->toArray() ?? [];
  2217. } else {
  2218. $aboutDiseases = CdssXyDisease::field('clinicalFeature,name')->whereLike('clinicalFeature', '%' . $values . '%')->limit(200)->select()->toArray() ?? [];
  2219. }
  2220. return $this->_json_succ($aboutDiseases);
  2221. }
  2222. //获取症状体征
  2223. public function getXyzztz()
  2224. {
  2225. $name = Request::param('name') ?? '';
  2226. if (empty($name)) {
  2227. return $this->_json_error('name不能为空');
  2228. }
  2229. $data = Zztz::where('name', 'like', "%$name%")->column('id,name,department');
  2230. return $this->_json_succ($data);
  2231. }
  2232. /**
  2233. * 医嘱审核
  2234. * @param array $params
  2235. * @return array
  2236. */
  2237. public function yzEamine(array $params): array
  2238. {
  2239. // 查询医嘱审核规则,使用like进行模糊查询
  2240. $query = Db::table('jm_knowledge_rule');
  2241. if (stripos($params['name'], ',') !== false) {
  2242. //多个药品查询
  2243. $values = explode(',', $params['name']);
  2244. foreach ($values as $k => $v){
  2245. $query->whereOR(function($query)use($v,$params){
  2246. $query->whereLike('name','%' . $v . '%')->where('gender',$params['gender']);
  2247. });
  2248. }
  2249. } else {
  2250. $query->where('gender',$params['gender'])->where('name','like', '%' . $params['name'] . '%');
  2251. }
  2252. $rule = $query->select()->toArray();
  2253. return $rule ?: [];
  2254. }
  2255. /**
  2256. * 获取中医疾病相关信息
  2257. * @return Json
  2258. */
  2259. public function getZhInspectionOrMedicineByDisease(): Json
  2260. {
  2261. $diseaseName = Request::param('disease_name');
  2262. $dialecticalName = Request::param('dialectical_name');
  2263. if (!$diseaseName || !$dialecticalName) {
  2264. return $this->_json_error('疾病名称和证型不能为空!');
  2265. }
  2266. // 同时匹配疾病名称和证型
  2267. $diseases = ZySickness::where([
  2268. ['name', '=', $diseaseName],
  2269. ['dialecticalName', '=', $dialecticalName]
  2270. ])->select()->toArray();
  2271. if (empty($diseases)) {
  2272. return $this->_json_error('未找到相关疾病信息');
  2273. }
  2274. // 初始化数组用于存储合并后的数据
  2275. $mergedData = [
  2276. 'symptom_list' => [],
  2277. 'therapeutic_list' => [],
  2278. 'medicine_list' => [],
  2279. 'prescription_list' => [],
  2280. 'diet_list' => [],
  2281. 'tonic_list' => [],
  2282. 'acupoint_list' => [],
  2283. 'tongue_condition' => $diseases[0]['tongueCondition'],
  2284. 'pulse_condition' => $diseases[0]['pulseCondition']
  2285. ];
  2286. // 用于存储已存在的项,避免重复
  2287. $existingItems = [
  2288. 'symptom' => [],
  2289. 'therapeutic' => [],
  2290. 'medicine' => [],
  2291. 'prescription' => [],
  2292. 'diet' => [],
  2293. 'tonic' => [],
  2294. 'acupoint' => []
  2295. ];
  2296. foreach ($diseases as $disease) {
  2297. // 处理症状列表
  2298. $symptoms = array_filter(explode(',', $disease['symptom'])); // 使用中文逗号分割
  2299. foreach ($symptoms as $symptom) {
  2300. if (!in_array($symptom, $existingItems['symptom'])) {
  2301. $mergedData['symptom_list'][] = ['name' => trim($symptom)]; // 添加trim去除可能的空格
  2302. $existingItems['symptom'][] = trim($symptom);
  2303. }
  2304. }
  2305. // 处理治法原则
  2306. $therapeutics = array_filter(explode(',', $disease['therapeuticMethod']));
  2307. foreach ($therapeutics as $therapeutic) {
  2308. if (!in_array($therapeutic, $existingItems['therapeutic'])) {
  2309. $mergedData['therapeutic_list'][] = ['name' => trim($therapeutic)];
  2310. $existingItems['therapeutic'][] = trim($therapeutic);
  2311. }
  2312. }
  2313. // 处理中成药
  2314. $medicines = array_filter(explode(',', $disease['cnPatentMedicine']));
  2315. foreach ($medicines as $medicine) {
  2316. if (!in_array($medicine, $existingItems['medicine'])) {
  2317. $mergedData['medicine_list'][] = ['name' => trim($medicine)];
  2318. $existingItems['medicine'][] = trim($medicine);
  2319. }
  2320. }
  2321. // 处理方剂
  2322. $prescriptions = array_filter(explode(',', $disease['prescription']));
  2323. foreach ($prescriptions as $prescription) {
  2324. if (!in_array($prescription, $existingItems['prescription'])) {
  2325. $mergedData['prescription_list'][] = ['name' => trim($prescription)];
  2326. $existingItems['prescription'][] = trim($prescription);
  2327. }
  2328. }
  2329. // 处理食疗
  2330. $diets = array_filter(explode(',', $disease['dietTherapy']));
  2331. foreach ($diets as $diet) {
  2332. // 清理数据:去除换行符,并按换行符分割
  2333. $dietItems = explode("\n", trim($diet));
  2334. // 去重
  2335. $dietItems = array_unique($dietItems);
  2336. foreach ($dietItems as $item) {
  2337. $item = trim($item);
  2338. // 去除空值
  2339. if (!empty($item) && !in_array($item, $existingItems['diet'])) {
  2340. $mergedData['diet_list'][] = ['name' => $item];
  2341. $existingItems['diet'][] = $item;
  2342. }
  2343. }
  2344. }
  2345. // 处理药膳
  2346. $tonics = array_filter(explode(',', $disease['tonicDiet']));
  2347. foreach ($tonics as $tonic) {
  2348. if (!in_array($tonic, $existingItems['tonic'])) {
  2349. $mergedData['tonic_list'][] = ['name' => trim($tonic)];
  2350. $existingItems['tonic'][] = trim($tonic);
  2351. }
  2352. }
  2353. // 处理针灸穴位
  2354. $acupoints = array_filter(explode(',', $disease['acupuncturePoints']));
  2355. foreach ($acupoints as $acupoint) {
  2356. if (!in_array($acupoint, $existingItems['acupoint'])) {
  2357. $mergedData['acupoint_list'][] = ['name' => trim($acupoint)];
  2358. $existingItems['acupoint'][] = trim($acupoint);
  2359. }
  2360. }
  2361. }
  2362. return $this->_json_succ($mergedData);
  2363. }
  2364. }