Cdss.php 99 KB

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