Cdss.php 102 KB

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